При разработке отчетов на системе компоновки данных (СКД) часто возникает задача, когда стандартное суммирование по всем детальным записям не подходит — есть инструментарий разработчика с консолью СКД. Типичный пример: на уровне вложенной группировки нам нужно найти максимальное значение, а на уровне выше — просуммировать эти максимумы. В этой статье мы подробно разберем, как реализовать такие расчеты, используя как стандартные механизмы ресурсов, так и мощные функции языка выражений СКД.
Рассмотрим ситуацию: у нас есть группировка Организация, внутри нее группировка Номенклатура, а ниже — детальные записи с ценами. Нам нужно получить максимальную цену для каждой номенклатуры, а по организации вывести сумму этих максимальных цен. Если мы просто укажем для поля ресурс Сумма(Цена), СКД сложит абсолютно все детальные записи, игнорируя наши требования к логике «сумма максимумов». Если укажем Максимум(Цена), то и на уровне организации мы увидим лишь самую большую цену среди всех товаров. Нам же нужен комбинированный алгоритм.
Разберем самый простой вариант, который подходит для разделения логики, но имеет свои ограничения. В конструкторе схемы компоновки данных на закладке Ресурсы можно добавить одно и то же поле несколько раз с разными агрегатными функциями.
Для реализации этого метода выполним следующие шаги:
Максимум(ИмяПоля) и в колонке Рассчитывать по... укажем только вложенную группировку.Сумма(ИмяПоля) и укажем для расчета только вышестоящую группировку и Общий итог.Важный нюанс: этот метод заставит СКД вычислять сумму на верхнем уровне все равно по детальным записям, если не прибегнуть к хитрости с вложенными выражениями. Он идеален, когда алгоритмы просто разные (например, среднее по товарам и сумма по складу), но не связаны иерархической зависимостью «агрегат от агрегата». Для реализации подобных задач можно изучить материал по настройке разного расчета итогов для группировок в СКД.
Проанализируем более сложный и универсальный инструмент — функцию ВычислитьВыражениеСГруппировкойМассив. Это основной способ реализации сценария «сумма максимумов» в одном поле ресурса. Суть метода заключается в том, что мы сначала заставляем систему собрать массив нужных нам показателей (максимумов) по внутренним группировкам, а затем суммируем этот массив на верхнем уровне.
Рассмотрим пример выражения для ресурса:
Сумма(ВычислитьВыражениеСГруппировкойМассив("Максимум(Продажи)", "Номенклатура"))
Разберем по шагам, что происходит в этой формуле:
Выясним, как поступить, если расчет зависит от нескольких полей. Например, нам нужно просуммировать произведения максимума цены на минимальный остаток по каждой позиции. В этом случае на помощь приходит функция ВычислитьВыражениеСГруппировкойТаблицаЗначений.
Синтаксис будет похожим, но вместо одного выражения мы передаем структуру:
Сумма(ВычислитьВыражениеСГруппировкойМассив("Максимум(Цена) * Минимум(Остаток)", "Номенклатура"))
Хотя функция называется «...Массив», она прекрасно справляется с вычислением сложных выражений внутри каждой итерации по группировке.
При использовании сложных агрегатов следует учитывать несколько критически важных моментов:
ВычислитьВыражение заставляет систему выполнять дополнительные проходы по данным. Если в вашем отчете сотни тысяч записей, это может замедлить время формирования."Иерархия" позволит корректно обрабатывать узлы.
Пример:
ВычислитьВыражениеСГруппировкойМассив("Сумма(Поле)", "Номенклатура", , "Иерархия")
ВЫБОР КОГДА, используйте вкладку Условное оформление в настройках компоновки. Там можно указать конкретную область (группировку) и установить текст «пустая строка» для ресурса.Часто программисты пытаются смешать обычные поля и агрегатные функции без контекста — поможет нейросеть-помощник для разработки и проверки синтаксиса BSL. Посмотрим на ошибочный пример:
Сумма(Цена * Максимум(Количество)) — это выражение выдаст ошибку, так как СКД не понимает, в каком контексте брать Цена (для каждой строки или для группы).
Правильный подход при использовании групповых функций всегда требует четкого указания, по какому «срезу» данных мы собираем массив или таблицу значений. Только после того, как данные собраны в массив функцией ВычислитьВыражениеСГруппировкойМассив, мы можем применять к ним итоговое суммирование.
Таким образом, комбинируя стандартные настройки ресурсов и функции вычисления выражений по группировкам, мы можем реализовать практически любой алгоритм расчета итогов, требуемый бизнес-логикой заказчика — для этого подойдёт конструктор управленческой аналитики и финансовых моделей.