Как вывести данные групп в иерархическом дереве СКД без автоматического суммирования

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

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

В этой статье мы подробно разберем, как настроить отчет таким образом, чтобы соблюдалась правильная иерархия, а данные отображались именно те, которые хранятся в регистре для конкретного узла дерева.

Метод 1. Настройка связей наборов данных для построения иерархии

Рассмотрим ситуацию, когда стандартная группировка «Иерархия» работает некорректно или дублирует данные. В этом случае мы можем применить метод использования двух наборов данных или одного набора с настройкой иерархической связи «самого на себя».

Проанализируем шаги настройки:

  1. В схеме компоновки данных создаем Набор данных - запрос, который выбирает данные из регистра (например, поле Номенклатура и поле План).
  2. Переходим на вкладку «Связи наборов данных». Здесь мы можем описать, как строится дерево.
  3. В качестве источника и приемника связи указываем один и тот же набор данных.
  4. Устанавливаем соответствие полей: Номенклатура (Источник) и Родитель (Приемник).
  5. Важный момент: обязательно устанавливаем галочку в колонке «Иерархическая связь».

Такой подход заставляет СКД самостоятельно достраивать недостающие узлы справочника в дереве, даже если по ним нет записей в регистре планов. Это позволяет сохранить визуальную структуру справочника Номенклатура.

Метод 2. Управление агрегацией ресурсов через функцию «Рассчитывать по...»

Если нам нужно, чтобы значение группы не суммировалось с планами дочерних элементов, а выводилось «как есть», мы должны пересмотреть настройки на вкладке «Ресурсы». Выясним, как управлять расчетом итогов.

Посмотрим на стандартное выражение ресурса:

Сумма(План)

Чтобы избежать сложения, мы можем изменить выражение или ограничить область его действия:

  1. Вместо функции Сумма можно использовать Максимум или Среднее, если мы уверены, что для каждой группы в регистре существует только одна запись.
  2. Используйте колонку «Рассчитывать по...». Если указать там конкретную группировку (например, Номенклатура), то ресурс будет рассчитываться только для этого уровня, не затрагивая общие итоги или иерархические уровни выше, если это требуется по бизнес-логике.
  3. Если нужно вывести значение только для самой группы, можно создать отдельное выражение для иерархической записи, оставив поле выражения пустым для общего итога.

Метод 3. Использование функции «ВычислитьВыражение»

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

Разберем пример выражения для ресурса План:

ВычислитьВыражение("Сумма(План)", , "Группировка", "Текущая", "Текущая")

Рассмотрим, что дают эти параметры:

Именно этот метод часто является «спасительным», когда нужно вывести данные из регистра, привязанные к группе, и при этом не превратить отчет в кашу из просуммированных цифр.

Метод 4. Построение запроса от Справочника (Левое соединение)

Зачастую корень проблемы кроется в самом запросе. Если мы строим запрос только по Регистру Сведений, то мы видим только те группы, по которым внесены данные. Для построения полноценного дерева лучше использовать справочник как основу.

Рассмотрим структуру правильного запроса:


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Номенклатура,
    ЕСТЬNULL(ПланыПродаж.План, 0) КАК План
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ
    РегистрСведений.ПланыПродаж КАК ПланыПродаж
ПО
    Номенклатура.Ссылка = ПланыПродаж.Номенклатура
ГДЕ
    Номенклатура.ЭтоГруппа

После этого в настройках СКД для поля Номенклатура мы устанавливаем тип группировки «Иерархия». Благодаря левому соединению, все узлы дерева будут на месте, а данные планов подтянутся только там, где они реально существуют в регистре.

Метод 5. Вывод плана как реквизита, а не ресурса

Если математические операции (итоги) по полю План вообще не требуются в данном отчете, самый простой способ — не добавлять это поле в список ресурсов. Проанализируем, как это реализовать:

  1. Оставляем поле План просто как выбранное поле.
  2. В настройках отчета добавляем его в список группировок сразу после поля Номенклатура.
  3. В свойствах этой детальной записи или группировки указываем тип вывода «Отдельно» (или настраиваем расположение полей в одной строке).

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

Заключение

Мы рассмотрели пять различных подходов к решению задачи вывода иерархии с данными групп. Выбор конкретного метода зависит от требований к итогам отчета:

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

← На главную