Как настроить вывод разных итогов на разных уровнях группировок в СКД?

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

При построении отчетов в системе компоновки данных (СКД) часто возникает ситуация, когда показатель задваивается в детальных записях из-за соединения таблиц «один ко многим» в едином запросе. В результате стандартное применение функции Сумма() на верхних уровнях и в общем итоге дает неверный результат. Рассмотрим, как правильно настроить отчёт, чтобы на детальном уровне выводить 0 (или скрывать значение), на уровне группировки выводить показатель по контрагенту, а в общем итоге — корректную сумму значений.

Выясним причину проблемы

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

Способ 1. Исключение ресурса из детальных записей

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

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

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

Способ 2. Разделение формул ресурсов по уровням и использование ВычислитьВыражениеСГруппировкойМассив

Разберем ситуацию, когда необходимо жестко зафиксировать правила расчета: на детальном уровне выводить 0, на уровне группировки по полю Контрагент — значение показателя, а на уровне общего итога — сумму по контрагентам без повторов.

Для этого настроим вкладку «Ресурсы» в схеме компоновки данных, добавляя одно и то же поле с разными выражениями для соответствующих группировок (колонка «Рассчитывать по»):

  1. Для детальных записей: в колонке Рассчитывать по укажем детальные записи, а в поле выражения напишем 0 (или NULL).
  2. Для группировки «Контрагент»: в колонке Рассчитывать по выберем группировку Контрагент, а выражение зададим через агрегатную функцию, например: Максимум(Показатель)
  3. Для общего итога: в колонке Рассчитывать по укажем Общий итог и примени функции СКД для пересчета массива значений:
    
    Сумма(ВычислитьВыражениеСГруппировкойМассив("Максимум(Показатель)", "Контрагент"))
    

Посмотрим, как работает это выражение: функция ВычислитьВыражениеСГруппировкойМассив сначала берет значение Максимум(Показатель) для каждого контрагента и формирует массив этих значений. Затем внешняя функция Сумма() складывает полученные элементы массива, обеспечивая точный общий итог отчета.

Способ 3. Использование нескольких наборов данных и связей

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

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

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

Ограничения и нюансы

Проанализируем важные особенности работы описанных методов:

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