Как в СКД рассчитать максимум по дочерней группировке, а затем сумму по родительской?

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

Разбор задачи и принципа ее решения

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

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

Способ 1. Использование функции «ВычислитьВыражениеСГруппировкойМассив» в ресурсах СКД

Проанализируем наиболее универсальный вариант, который не требует изменения схемы запроса и настраивается непосредственно на вкладке «Ресурсы» схемы компоновки данных.

Разберем по шагам порядок настройки ресурсов:

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

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

Важные нюансы и ограничения данного метода:

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

Способ 2. Использование вычисляемого поля или агрегации в запросе

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

Вариант А: Вычисляемое поле

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

Вариант Б: Группировка на уровне запроса

Если отчет основывается на наборе данных «Запрос», наиболее эффективным способом с точки зрения производительности будет сгруппировать данные еще до передачи их в СКД:

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

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

← На главную