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