При разработке отчетов и обработок в 1С часто возникает задача получить единый оборот или остаток по счету верхнего уровня (например, по счету 02 «Амортизация основных средств»), исключив разбивку по подчиненным субсчетам (02.01, 02.02 и т. д.).
Если разработчик указывает в условии виртуальной таблицы Счет В ИЕРАРХИИ (&Счет) и выбирает поле Счет, платформа возвращает отдельные строки по каждому листовому субсчету. Разберем причины такого поведения платформы и подробно рассмотрим корректные способы получения свернутого результата.
Проанализируем механику работы планов счетов и регистра бухгалтерии в платформе 1С:
Счет В ИЕРАРХИИ (&Счет) служит исключительно фильтром, отбирающим записи по всем вложенным субсчетам указанной группы. Сама виртуальная таблица не выполняет автоматическую группировку до уровня родительского счета и возвращает данные в разрезе тех счетов, по которым физически записаны итоги.ОстаткиИОбороты с периодичностью (например, Авто или Период) дополнительно разбивает итоги на строки по периодам возникновения движений.Если в запросе требуется получить одну свернутую строку по заранее известному счету-родителю, который передан через параметр &Счет, наиболее простым и надежным решением является явное суммирование ресурсов с выводом параметра в качестве поля счета.
Посмотрим на пример запроса:
ВЫБРАТЬ
&Счет КАК Счет,
СУММА(ХозрасчетныйОбороты.СуммаОборотКт) КАК СуммаОборотКт
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(&Нач, &Кон, , Счет В ИЕРАРХИИ (&Счет), , , , ) КАК ХозрасчетныйОбороты
СГРУППИРОВАТЬ ПО
&Счет
Разберем ключевые особенности этого подхода:
ХозрасчетныйОбороты.Счет на литерал параметра &Счет КАК Счет. Таким образом, в результат запроса сразу подставляется счет верхнего уровня.СУММА() и секцию СГРУППИРОВАТЬ ПО, чтобы сложить числовые показатели всех субсчетов в одну итоговую строку.ОстаткиИОбороты используем Обороты (если остатки на начало и конец периода не нужны). Таблица оборотов работает быстрее и не требует указания периодичности.Иногда разработчики обращаются к родительскому счету через точку: ХозрасчетныйОстаткиИОбороты.Счет.Родитель. Посмотрим, как выглядит такой запрос:
ВЫБРАТЬ
ХозрасчетныйОстаткиИОбороты.Счет.Родитель КАК Счет,
СУММА(ХозрасчетныйОстаткиИОбороты.СуммаОборотКт) КАК СуммаОборотКт
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&Нач, КОНЕЦПЕРИОДА(&Кон, ДЕНЬ), , , Счет В ИЕРАРХИИ (&Счет), , ) КАК ХозрасчетныйОстаткиИОбороты
СГРУППИРОВАТЬ ПО
ХозрасчетныйОстаткиИОбороты.Счет.Родитель
Важное ограничение: данный метод корректно сработает только в том случае, если глубина иерархии плана счетов строго фиксирована (субсчет первого уровня является прямым потомком группы). Если структура плана счетов содержит многоуровневую иерархию (например, счет -> субсчет -> субсчет 2-го уровня), выражение Счет.Родитель вернет промежуточный субсчет, а не корневую группу.
Если в отчет необходимо вывести список нескольких счетов верхнего уровня со всеми их субсчетами в свернутом виде, оптимально соединить таблицу счетов-групп с таблицей оборотов по иерархическому условию.
Рассмотрим пример реализации:
ВЫБРАТЬ
СчетаВерхнегоУровня.Ссылка КАК Счет,
СУММА(ЕСТЬNULL(ХозрасчетныйОбороты.СуммаОборотКт, 0)) КАК СуммаОборотКт
ИЗ
ПланСчетов.Хозрасчетный КАК СчетаВерхнегоУровня
ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Обороты(&Нач, &Кон, , , , , , ) КАК ХозрасчетныйОбороты
ПО (ХозрасчетныйОбороты.Счет В ИЕРАРХИИ (СчетаВерхнегоУровня.Ссылка))
ГДЕ
СчетаВерхнегоУровня.Ссылка В(&МассивСчетов)
СГРУППИРОВАТЬ ПО
СчетаВерхнегоУровня.Ссылка
В данном запросе условие В ИЕРАРХИИ в секции соединения связывает каждую детальную проводку с соответствующим счетом верхнего уровня, независимо от количества уровней вложенности, а секция СГРУППИРОВАТЬ ПО сворачивает все суммы в одну строку по каждому счету из переданного массива.
Если запрос разрабатывается для отчета на базе СКД, ручная группировка в тексте запроса не требуется:
ХозрасчетныйОбороты.Счет и числовые ресурсы.Сумма(СуммаОборотКт).Счет и устанавливаем тип группировки «Иерархия» (или «Только иерархия»).Платформа 1С самостоятельно выполнит расчет промежуточных итогов по всем уровням структуры плана счетов.