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