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