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

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

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

Постановка задачи: почему обычная сумма не всегда работает

Рассмотрим ситуацию: у нас есть группировка Организация, внутри нее группировка Номенклатура, а ниже — детальные записи с ценами. Нам нужно получить максимальную цену для каждой номенклатуры, а по организации вывести сумму этих максимальных цен. Если мы просто укажем для поля ресурс Сумма(Цена), СКД сложит абсолютно все детальные записи, игнорируя наши требования к логике «сумма максимумов». Если укажем Максимум(Цена), то и на уровне организации мы увидим лишь самую большую цену среди всех товаров. Нам же нужен комбинированный алгоритм.

Способ 1. Использование колонки «Рассчитывать по...» в ресурсах

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

Для реализации этого метода выполним следующие шаги:

  1. Добавим поле в список ресурсов первый раз, выберем выражение Максимум(ИмяПоля) и в колонке Рассчитывать по... укажем только вложенную группировку.
  2. Добавим это же поле второй раз, выберем выражение Сумма(ИмяПоля) и укажем для расчета только вышестоящую группировку и Общий итог.

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

Способ 2. Функция ВычислитьВыражениеСГруппировкойМассив

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

Рассмотрим пример выражения для ресурса:


Сумма(ВычислитьВыражениеСГруппировкойМассив("Максимум(Продажи)", "Номенклатура"))

Разберем по шагам, что происходит в этой формуле:

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

Способ 3. Работа со сложными показателями через таблицу значений

Выясним, как поступить, если расчет зависит от нескольких полей. Например, нам нужно просуммировать произведения максимума цены на минимальный остаток по каждой позиции. В этом случае на помощь приходит функция ВычислитьВыражениеСГруппировкойТаблицаЗначений.

Синтаксис будет похожим, но вместо одного выражения мы передаем структуру:


Сумма(ВычислитьВыражениеСГруппировкойМассив("Максимум(Цена) * Минимум(Остаток)", "Номенклатура"))

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

Технические тонкости и оптимизация

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

  1. Порядок расчета: СКД рассчитывает ресурсы «снизу вверх». Однако использование функций семейства ВычислитьВыражение заставляет систему выполнять дополнительные проходы по данным. Если в вашем отчете сотни тысяч записей, это может замедлить время формирования.
  2. Иерархические справочники: Если вы строите отчет по иерархии (например, группы номенклатуры), данные могут задвоиться. Чтобы этого избежать, используйте четвертый параметр функции — ТипРасчета. Значение "Иерархия" позволит корректно обрабатывать узлы.

    Пример:

    ВычислитьВыражениеСГруппировкойМассив("Сумма(Поле)", "Номенклатура", , "Иерархия")
  3. Условное оформление вместо ВЫБОР КОГДА: Иногда на определенных уровнях итог вообще не должен выводиться. Вместо того чтобы загромождать формулу конструкциями ВЫБОР КОГДА, используйте вкладку Условное оформление в настройках компоновки. Там можно указать конкретную область (группировку) и установить текст «пустая строка» для ресурса.

Типичные ошибки при написании выражений

Часто программисты пытаются смешать обычные поля и агрегатные функции без контекста — поможет нейросеть-помощник для разработки и проверки синтаксиса BSL. Посмотрим на ошибочный пример:

Сумма(Цена * Максимум(Количество)) — это выражение выдаст ошибку, так как СКД не понимает, в каком контексте брать Цена (для каждой строки или для группы).

Правильный подход при использовании групповых функций всегда требует четкого указания, по какому «срезу» данных мы собираем массив или таблицу значений. Только после того, как данные собраны в массив функцией ВычислитьВыражениеСГруппировкойМассив, мы можем применять к ним итоговое суммирование.

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

← На главную