Как в запросе 1С получить обороты счета без детализации по субсчетам?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При разработке отчетов и обработок в 1С часто возникает задача получить единый оборот или остаток по счету верхнего уровня (например, по счету 02 «Амортизация основных средств»), исключив разбивку по подчиненным субсчетам (02.01, 02.02 и т. д.).

Если разработчик указывает в условии виртуальной таблицы Счет В ИЕРАРХИИ (&Счет) и выбирает поле Счет, платформа возвращает отдельные строки по каждому листовому субсчету. Разберем причины такого поведения платформы и подробно рассмотрим корректные способы получения свернутого результата.

Почему условие «В ИЕРАРХИИ» не сворачивает строки автоматически?

Проанализируем механику работы планов счетов и регистра бухгалтерии в платформе 1С:

  1. Проводки формируются только по конечным счетам. В проводках документов участвуют только те счета, которые не имеют подчиненных субсчетов (листовые узлы дерева счетов). По счетам-группам непосредственные записи в таблицах движений отсутствуют.
  2. Назначение условия в параметрах виртуальной таблицы. Конструкция Счет В ИЕРАРХИИ (&Счет) служит исключительно фильтром, отбирающим записи по всем вложенным субсчетам указанной группы. Сама виртуальная таблица не выполняет автоматическую группировку до уровня родительского счета и возвращает данные в разрезе тех счетов, по которым физически записаны итоги.
  3. Периодичность виртуальной таблицы. Использование таблицы ОстаткиИОбороты с периодичностью (например, Авто или Период) дополнительно разбивает итоги на строки по периодам возникновения движений.

Способ 1. Агрегация с подстановкой параметра счета

Если в запросе требуется получить одну свернутую строку по заранее известному счету-родителю, который передан через параметр &Счет, наиболее простым и надежным решением является явное суммирование ресурсов с выводом параметра в качестве поля счета.

Посмотрим на пример запроса:


ВЫБРАТЬ
    &Счет КАК Счет,
    СУММА(ХозрасчетныйОбороты.СуммаОборотКт) КАК СуммаОборотКт
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(&Нач, &Кон, , Счет В ИЕРАРХИИ (&Счет), , , , ) КАК ХозрасчетныйОбороты

СГРУППИРОВАТЬ ПО
    &Счет

Разберем ключевые особенности этого подхода:

  1. Мы заменяем поле ХозрасчетныйОбороты.Счет на литерал параметра &Счет КАК Счет. Таким образом, в результат запроса сразу подставляется счет верхнего уровня.
  2. Используем агрегатную функцию СУММА() и секцию СГРУППИРОВАТЬ ПО, чтобы сложить числовые показатели всех субсчетов в одну итоговую строку.
  3. Вместо таблицы ОстаткиИОбороты используем Обороты (если остатки на начало и конец периода не нужны). Таблица оборотов работает быстрее и не требует указания периодичности.

Способ 2. Выборка через реквизит «Родитель» и ее ограничения

Иногда разработчики обращаются к родительскому счету через точку: ХозрасчетныйОстаткиИОбороты.Счет.Родитель. Посмотрим, как выглядит такой запрос:


ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Счет.Родитель КАК Счет,
    СУММА(ХозрасчетныйОстаткиИОбороты.СуммаОборотКт) КАК СуммаОборотКт
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&Нач, КОНЕЦПЕРИОДА(&Кон, ДЕНЬ), , , Счет В ИЕРАРХИИ (&Счет), , ) КАК ХозрасчетныйОстаткиИОбороты

СГРУППИРОВАТЬ ПО
    ХозрасчетныйОстаткиИОбороты.Счет.Родитель

Важное ограничение: данный метод корректно сработает только в том случае, если глубина иерархии плана счетов строго фиксирована (субсчет первого уровня является прямым потомком группы). Если структура плана счетов содержит многоуровневую иерархию (например, счет -> субсчет -> субсчет 2-го уровня), выражение Счет.Родитель вернет промежуточный субсчет, а не корневую группу.

Способ 3. Свертка списка счетов произвольной вложенности

Если в отчет необходимо вывести список нескольких счетов верхнего уровня со всеми их субсчетами в свернутом виде, оптимально соединить таблицу счетов-групп с таблицей оборотов по иерархическому условию.

Рассмотрим пример реализации:


ВЫБРАТЬ
    СчетаВерхнегоУровня.Ссылка КАК Счет,
    СУММА(ЕСТЬNULL(ХозрасчетныйОбороты.СуммаОборотКт, 0)) КАК СуммаОборотКт
ИЗ
    ПланСчетов.Хозрасчетный КАК СчетаВерхнегоУровня
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Обороты(&Нач, &Кон, , , , , , ) КАК ХозрасчетныйОбороты
        ПО (ХозрасчетныйОбороты.Счет В ИЕРАРХИИ (СчетаВерхнегоУровня.Ссылка))
ГДЕ
    СчетаВерхнегоУровня.Ссылка В(&МассивСчетов)

СГРУППИРОВАТЬ ПО
    СчетаВерхнегоУровня.Ссылка

В данном запросе условие В ИЕРАРХИИ в секции соединения связывает каждую детальную проводку с соответствующим счетом верхнего уровня, независимо от количества уровней вложенности, а секция СГРУППИРОВАТЬ ПО сворачивает все суммы в одну строку по каждому счету из переданного массива.

Способ 4. Иерархическая группировка в Системе компоновки данных (СКД)

Если запрос разрабатывается для отчета на базе СКД, ручная группировка в тексте запроса не требуется:

  1. В запросе выбираем детальный счет ХозрасчетныйОбороты.Счет и числовые ресурсы.
  2. На вкладке «Ресурсы» настраиваем суммирование числовых полей по формуле Сумма(СуммаОборотКт).
  3. В настройках структуры отчета добавляем группировку по полю Счет и устанавливаем тип группировки «Иерархия» (или «Только иерархия»).

Платформа 1С самостоятельно выполнит расчет промежуточных итогов по всем уровням структуры плана счетов.

← На главную