Как в СКД правильно настроить сумму по итогам нижестоящей группировки?

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

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

Суть проблемы: почему СКД суммирует «не то»?

Основная сложность заключается в том, что по умолчанию СКД при расчете агрегатной функции Сумма() обращается ко всей выборке данных, доступной в контексте текущей группировки. Если вы строите отчет с иерархией (например, Номенклатура -> Заказ), то при попытке вычислить сумму на уровне Номенклатура, система просто «видит» все детальные записи, которые входят в эту номенклатуру, и суммирует их. Если в детальных записях содержатся данные, которые уже были агрегированы на уровне Заказ, вы получаете «задвоение» или «затроение» итогов, так как система игнорирует промежуточный результат и считает всё заново по исходной таблице.

Решение: использование функции ВычислитьВыражениеСГруппировкойМассив

Чтобы заставить СКД учитывать уже вычисленные промежуточные итоги, нам потребуется функция ВычислитьВыражениеСГруппировкойМассив. Она позволяет собрать значения из определенной группировки в массив и уже над этим массивом произвести арифметические операции. Рассмотрим, как это реализовать на практике.

Для настройки ресурсов в СКД выполним следующие шаги:

  1. Откроем вкладку Ресурсы в настройках СКД.
  2. В колонке Поле выберем нужный нам показатель, например, ВЗаказеКоличество.
  3. В колонке Выражение пропишем формулу, которая принудительно укажет системе, как именно нужно собирать данные.

Для расчета суммы по группировке Номенклатура на основе итогов вложенной группировки Ссылка (или Документ), воспользуемся следующим выражением:

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

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

Разбор настройки расчета ресурсов

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

Альтернативные методы решения

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

Использование функций ВычислитьВыражение

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

ВычислитьВыражение("Сумма(пиКОбеспечению)", , "ГруппировкаНижняя")

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

Особенности работы с наборами данных

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

Заключение и рекомендации

При настройке итогов в СКД придерживайтесь следующих правил:

Следуя этим рекомендациям, вы сможете добиться корректного отображения итоговых сумм в любых, даже самых сложных отчетах 1С.

← На главную