Как в СКД рассчитать сумму по вышестоящим группировкам на основе промежуточных итогов?

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

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

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

Анализ ошибки при настройке ресурсов

Проанализируем распространенную ошибку. Разработчик настраивает вкладку Ресурсы следующим образом:

  1. Для поля ВыполнениеКоличество задает выражение Максимум(ВыполнениеКоличество) с ограничением Рассчитать по: ФокусныйПоказатель.
  2. Добавляет вторую строку ресурса для вышестоящих группировок с выражением:
    
    Сумма(ВычислитьВыражениеСГруппировкойМассив("Сумма(ВыполнениеКоличество)", "ФокусныйПоказатель"))
    

Выясним причину, почему такой расчет не дает ожидаемого результата. Функция ВычислитьВыражениеСГруппировкойМассив вычисляет переданное в первом параметре выражение для каждого элемента группировки, указанной во втором параметре. Если внутри функции передано выражение "Сумма(ВыполнениеКоличество)", компоновщик данных сначала просуммирует дублирующиеся детальные строки для каждого показателя, а затем сложит эти завышенные суммы. Внутренняя агрегация должна строго соответствовать логике, заложенной в расчет подчиненной строки.

Правильное решение: согласование агрегатных функций в ресурсах

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

Разберем по шагам правильную настройку ресурсов отчета:

  1. Перейдем на закладку Ресурсы в схеме компоновки данных.
  2. Добавим ресурс для группировки ФокусныйПоказатель:

    Поле: ВыполнениеКоличество

    Выражение: Максимум(ВыполнениеКоличество)

    Рассчитать по: ФокусныйПоказатель

  3. Добавим вторую строку ресурса для всех вышестоящих группировок и общего итога:

    Поле: ВыполнениеКоличество

    Выражение:

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

    Рассчитать по: выберите Партнер, Территория, Супервайзер и Общий итог.

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

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

Посмотрим на важные нюансы, которые необходимо учитывать при использовании функций работы с массивами в СКД:

  1. Обработка пустых значений (NULL): Если в детальных записях встречаются значения NULL, результат работы агрегатной функции может стать неопределенным. Рекомендуется защищать вычисляемые поля с помощью конструкции ЕстьNULL(ВыполнениеКоличество, 0) как на уровне запроса, так и в выражениях ресурсов.
  2. Составные группировки: Если строка подчиненного уровня определяется несколькими полями (например, показатель привязан к конкретному периоду или проекту), во втором параметре необходимо перечислять все ключевые поля через запятую: "ФокусныйПоказатель, Период". Иначе массив свернется некорректно.
  3. Производительность: Вычисление массивов по группировкам выполняется процессором компоновки данных в оперативной памяти после выборки всех записей. На отчетах с сотнями тысяч строк это может вызывать замедление формирования отчета.

Альтернативный вариант: предварительная агрегация в запросе

Если отчет строится по большим массивам данных, рассмотрим альтернативный подход без использования тяжелых функций компоновщика. Проблему дублирования записей можно решить непосредственно в тексте запроса схемы компоновки данных:

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

Такой подход переносит вычислительную нагрузку на СУБД, гарантирует высокую скорость построения отчета и упрощает дальнейшую поддержку схемы компоновки данных.

← На главную