Как в отчете 1С объединить данные по нескольким субсчетам в один общий счет без потери детальности по остальным

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

В практике разработки на платформе 1С:Предприятие 8.3 часто возникает ситуация, когда типовой отчет по бухгалтерскому регистру не удовлетворяет требованиям заказчика в части иерархии счетов. Например, бухгалтер хочет видеть детальную аналитику по субсчетам счета 10.01, 10.02 и 10.05, но при этом требует, чтобы специфические субсчета, такие как 10.17.1 и 10.17.2, отображались единой суммой по родительскому счету 10.17. В этой статье мы подробно разберем, как реализовать такую логику «выборочного схлопывания» счетов, используя механизмы запросов и Систему Компоновки Данных (СКД).

Анализ проблемы и выбор стратегии

Стандартная виртуальная таблица ОстаткиИОбороты регистра бухгалтерии позволяет выводить данные в разрезе счетов. Однако, если мы просто включим иерархию в настройках отчета, система выведет и родительские счета, и все их дочерние субсчета. Наша задача сложнее: нам нужно изменить саму структуру группировки так, чтобы для определенных счетов уровнем детальности стал их «родитель», а для остальных — сам субсчет. Рассмотрим несколько способов решения этой задачи, начиная от простых манипуляций в тексте запроса и заканчивая гибкими настройками в СКД.

Метод 1. Подмена счета через конструкцию ВЫБОР в запросе

Это самый прямолинейный метод. Мы создаем в запросе вычисляемое поле, которое будет содержать либо сам счет, либо его родителя, в зависимости от условий. Проанализируем пример реализации такого подхода:


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

Рассмотрим подробнее, что здесь происходит. Мы проверяем, входит ли текущий субсчет в список тех, которые «не хотят видеть разложенными». Если условие выполняется, мы подставляем Счет.Родитель. Важно помнить, что при использовании такого подхода в СКД или обычном запросе, необходимо обязательно наложить группировку по полю СчетДляГруппировки, иначе суммы по субсчетам 10.17.1 и 10.17.2 выведутся разными строками, хотя в колонке «Счет» у обеих будет написано 10.17.

Метод 2. Использование вычисляемых полей СКД

Если отчет строится на СКД, мы можем вынести логику определения «отображаемого счета» за пределы основного запроса. Это позволит сохранить запрос «чистым» и даст больше гибкости при настройке иерархии. Выясним причину, почему это удобно: в вычисляемых полях СКД можно обращаться к функциям общих модулей, что позволяет реализовать сложную логику проверки уровней вложенности счетов.

Разберем по шагам настройку вычисляемого поля:

  1. Перейдем на закладку Вычисляемые поля в схеме компоновки данных.
  2. Добавим новое поле с именем СчетОтображения.
  3. В выражении напишем проверку. Если мы знаем конкретные счета, можно использовать их коды, но лучше работать с объектами:

ВЫБОР 
    КОГДА Счет В (&СписокИсключений) ТОГДА Счет.Родитель 
    ИНАЧЕ Счет 
КОНЕЦ

После этого в настройках отчета (закладка Настройки) мы заменяем стандартную группировку по полю Счет на группировку по нашему новому полю СчетОтображения. Система автоматически просуммирует ресурсы (остатки и обороты) для всех записей, у которых СчетОтображения совпал.

Метод 3. Создание таблицы соответствий (Мэппинг)

Проанализируем ситуацию, когда счетов для исключения много или они часто меняются. В этом случае жестко прописывать их в коде запроса или параметрах СКД — плохая практика. Профессиональное решение заключается в создании временной таблицы соответствий. Мы можем заранее подготовить таблицу, где каждой ссылке реального счета будет соответствовать ссылка на «счет представления».

Рассмотрим пример кода для подготовки такой таблицы:


// Создаем таблицу значений для соответствия
ТаблицаСоответствия = Новый ТаблицаЗначений;
ТаблицаСоответствия.Колонки.Добавить("РеальныйСчет", Новый ОписаниеТипов("ПланСчетовСсылка.Хозрасчетный"));
ТаблицаСоответствия.Колонки.Добавить("СчетПредставления", Новый ОписаниеТипов("ПланСчетовСсылка.Хозрасчетный"));

// Заполняем логику: для всех 10.17.* ставим 10.17, для остальных - сам счет
// Это можно сделать циклом по Плану счетов или запросом

Затем в основном запросе СКД мы соединяем виртуальную таблицу ОстаткиИОбороты с этой временной таблицей. Посмотрим на пример соединения в запросе:


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

Этот метод является наиболее производительным для больших баз данных, так как он избегает многократных обращений через точку к родителям счета (Счет.Родитель.Родитель), что в SQL-запросе порождает тяжелые соединения (JOIN).

Важные нюансы и типичные ошибки

При реализации сворачивания субсчетов необходимо учитывать несколько критических моментов:

  1. Проблема дублирования сумм: Если вы используете в СКД роль поля Счет как «Иерархия», и при этом пытаетесь вручную подменять счета, суммы могут задвоиться. Всегда проверяйте настройки ролей полей на закладке «Наборы данных». Для поля СчетДляОтчета роли иерархии быть не должно.
  2. Аналитика (Субконто): Помните, что у родительского счета (например, 10.17) может быть меньше видов субконто, чем у его дочерних субсчетов. Если в отчете выводится разрез по номенклатуре или складам, «схлопывание» счетов пройдет успешно, но только если эти измерения присутствуют на всех объединяемых субсчетах.
  3. Предопределенные счета: Вместо использования строковых кодов вида "10.17.1" в запросах, всегда используйте ссылки на предопределенные значения: ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.МатериалыПереданныеВПереработку). Это защитит ваш код от поломок при изменении кодов счетов в режиме «1С:Предприятие».

Итоги

Мы рассмотрели три эффективных способа управления визуализацией субсчетов в бухгалтерской отчетности. Для простых задач идеально подойдет конструкция ВЫБОР в запросе. Если вы стремитесь к гибкости и используете мощь Системы Компоновки Данных, лучше применить вычисляемые поля. Для высоконагруженных систем с большим объемом данных оптимальным выбором станет метод временных таблиц соответствий. Выбор конкретного метода зависит от требований к производительности и того, насколько часто бухгалтерии требуется менять правила группировки счетов.

← На главную