На днях мне пришлось разрабатывать документ, целью которого, в том числе, было закрытие остатков по счету. Задача известная и много раз решаемая. У меня в дальних архивах лежит процедура, которую я делал еще для 7.7, называется она очень просто УниверсальнаяСвертка, и в ней я использую рекурсию для обхода остатков по счету в разрезе субконто. Но в подходе, о котором пойдет речь рекурсия не используется. Восьмерка предоставляет пользователю очень удобный инструмент в виде построителя запроса, которым мы и воспользуемся.
И так есть счет и надо получить остатки с детализацией до субконто. Для этого нам понадобится универсальная процедура, которая бы не зависела от количества субконто у выбранного счета. Пишем следующий запрос.
Текст="ВЫБРАТЬ
| Остатки.Счет,
| Остатки.Организация,
| Остатки.Валюта,
| Остатки.КоличествоОстаток КАК Количество,
| Остатки.ВалютнаяСуммаОстаток КАК ВалютнаяСумма,
| Остатки.СуммаОстаток КАК Сумма,
| &Переоценка КАК ПрочиеДоходыИРасходы
|{ВЫБРАТЬ
| Остатки.Субконто1.*,
| Остатки.Субконто2.*,
| Остатки.Субконто3.*}
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&вхДата, Счет = &Счет, , {(Организация)}) КАК Остатки";
Обратим внимание на участок запроса, выделенный жирным шрифтом. В фигурных скобках мы перечисляем возможные поля, которые будут в нашем запросе, поскольку изначально нам не известно количество субконто счета, который предстоит закрывать. Следующий шаг - добавить нужные поля в запрос.
функция глВернутьСубконтоСчета(вхСчет) Экспорт
мСтруктура=новый структура;
для каждого знч из вхСчет.ВидыСубконто цикл
субк=знч.ВидСубконто;
имя=глВернутьИмяСубконто(субк);
мСтруктура.Вставить(имя);
конеццикла;
возврат мСтруктура;
КонецФункции
запрос=новый ПостроительЗапроса;
запрос.Текст=Текст;
мСубкИсточник=глВернутьСубконтоСчета(мСчетИсточник);
н=0;
для каждого запись из мСубкИсточник цикл
н=н+1;
запрос.ВыбранныеПоля.Добавить("Субконто"+н,запись.Ключ);
конеццикла;
Дадим пояснение к приведенному тексту. В данной задаче мы используем вспомогательную функцию глВернутьСубконтоСчета(вхСчет), которая возвращает структуру, каждая запись которой содержит имя субконто счета, переданного в качестве параметра. Функция глВернутьИмяСубконто приводится в предыдущей статье «Полезные мелочи». Теперь, когда мы знаем количество субконто счета и имя каждого субконто, добавим в объект запрос, который имеет тип ПостроительЗапроса, дополнительные поля с помощью метода Добавить реквизита ВыбранныеПоля. Теперь дело за малым. Надо обойти все остатки по счету и сформировать движения по регистру бухгалтерского учета. Я применяю процедуру глПроводка, которая построена с помощью методики, изложенной в уже называвшейся статье «Полезные мелочи».
запрос.Выполнить(); Выборка=запрос.Результат.Выбрать(); пока Выборка.Следующий() цикл ЗаполнитьЗначенияСвойств(мСубкИсточник,Выборка); ЗаполнитьЗначенияСвойств(мСубкПриемник,Выборка); глПроводка(вхДокумент,мСчетПриемник,мСубкПриемник, мСчетИсточник,мСубкИсточник, Выборка.Сумма,Выборка.Количество, Выборка.ВалютнаяСумма,Выборка.Валюта,ТекстПроводки); Конеццикла;
В данном коде интересно то, что и Выборка и структура мСубкИсточник содержат поля с именами субконто счета. Поэтому присвоение производится с помощью метода ЗаполнитьЗначенияСвойств. Полученный код является универсальным и применим для счета с любым количеством субконто. К чему мы и стремились.
Отчет по статьям движения денежных средств (отчет по Административно-хозяйственныз расходам) УТ10.3