В процессе разработки отчетов на базе Системы компоновки данных (СКД) часто возникает задача вывода дополнительных итоговых показателей, которые не ограничиваются простым суммированием. Одной из таких задач является поиск максимального значения среди ресурсов в строке или по определенной группировке (например, найти максимальный остаток за период или выбрать наибольшее количество из нескольких колонок). Разберем подробно, как реализовать этот механизм, используя встроенные функции СКД и правильную настройку ролей полей.
Для решения задачи, когда нам нужно найти максимум по определенному набору данных (например, по номенклатуре в разрезе дат), стандартной агрегатной функции МАКСИМУМ(Поле) в ресурсах может быть недостаточно, если логика требует предварительного агрегирования. В этом случае мы воспользуемся мощным инструментом — функцией ВычислитьВыражениеСГруппировкойМассив. Рассмотрим синтаксис выражения, которое необходимо прописать в колонке "Выражение" на закладке "Ресурсы":
МАКСИМУМ(ВычислитьВыражениеСГруппировкойМассив("СУММА(Количество)", "Номенклатура, Дата"))
Проанализируем, как работает эта конструкция:
Важным моментом является колонка "Рассчитать по...". Если мы хотим, чтобы это поле считалось для всех уровней отчета одинаково, это поле можно оставить пустым, либо указать конкретные группировки, для которых данный расчет актуален.
Чтобы функции вычисления выражений работали корректно, особенно при работе с временными рядами (датами, месяцами, периодами), необходимо правильно настроить схему компоновки данных на закладке "Набор данных". Проанализируем ситуацию: если наш максимум должен искаться по периодам, то у поля периода (например, Дата или Месяц) должна быть правильно заполнена колонка "Роль".
Рассмотрим шаги по настройке роли:
Если поле является измерением, система будет использовать его для создания уникальных ключей группировки при формировании массива значений для функции ВычислитьВыражениеСГруппировкойМассив.
Иногда задача стоит иначе: в строке отчета есть несколько разных ресурсов (например, ОстатокСклад1, ОстатокСклад2, ОстатокСклад3), и нужно вывести в отдельную колонку максимальное значение среди них. В этом случае мы будем использовать другой подход — создание Вычисляемого поля.
Перейдем на закладку "Вычисляемые поля" и добавим новое поле МаксимальныйОстаток. В выражении напишем:
Максимум(ЕстьNull(ОстатокСклад1, 0), ЕстьNull(ОстатокСклад2, 0), ЕстьNull(ОстатокСклад3, 0))
Обратите внимание на использование функции ЕстьNull. Проанализируем причину: если один из ресурсов будет содержать NULL (например, не было движений по складу), то обычное сравнение может вернуть некорректный результат или также NULL. Приведение к нулю гарантирует математическую точность сравнения.
В отчетах типа "Таблица", где ресурсы располагаются в колонках (например, продажи по месяцам), расчет максимума по строке (горизонтальный итог) часто вызывает затруднения. Чтобы найти максимум среди колонок таблицы, выражение в ресурсах должно обращаться к измерению, которое идет в колонки.
Допустим, в колонках у нас поле ПериодМесяц. Тогда выражение ресурса МаксимумПоПериодам будет выглядеть так:
Максимум(ВычислитьВыражениеСГруппировкойМассив("Сумма(Продажи)", "ПериодМесяц"))
Это позволит системе собрать все значения продаж по месяцам для текущей строки (например, для конкретной номенклатуры) в массив и выбрать из них максимальное. Выясним важный нюанс: такое поле нужно добавить в ресурсы, но в настройках отчета (закладка "Выбранные поля") его следует размещать вне структуры колонок, чтобы оно отображалось как общий итог строки.
Чтобы сделать отчет более читаемым, мы можем не только вывести значение максимума в отдельную колонку, но и подсветить ячейки, которые соответствуют этому максимуму, непосредственно в основной части отчета. Разберем, как это сделать через Условное оформление:
Поле [Количество] Равно [ПолеМаксимум].Количество.Таким образом, пользователь сразу увидит, в каком периоде или на каком складе был достигнут максимальный показатель, без необходимости сверяться с итоговой колонкой.
Проанализируем влияние таких расчетов на скорость работы системы. Важно понимать, что функции ВычислитьВыражение... выполняются на уровне процессора компоновки данных 1С, а не на уровне SQL-запроса. Это означает, что:
Если в вашем отчете сотни тысяч строк, использование сложных вложенных функций в ресурсах может значительно замедлить формирование. В таких случаях мы рекомендуем предварительно рассчитывать максимальные значения еще на уровне запроса, используя временные таблицы и группировки SQL, и передавать уже готовые цифры в компоновку.
Однако для большинства операционных отчетов стандартных механизмов ВычислитьВыражениеСГруппировкойМассив более чем достаточно. Главное — следить за тем, чтобы выражения не были избыточными и не дублировали расчеты, которые можно выполнить проще.