Почему пропадают значения при использовании функции Максимум с ВычислитьВыражениеСГруппировкойМассив в СКД?

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

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

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

Почему СКД возвращает пустое значение?

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

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

Правильный синтаксис и вложенность функций

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

Синтаксис должен выглядеть следующим образом:


Максимум(ВычислитьВыражениеСГруппировкойМассив("Максимум(ЕстьNull(ОкладТарифМакс, 0))", "Позиция"))

Важные нюансы, на которые нужно обратить внимание:

  1. Использование функции ЕстьNull: Мы оборачиваем наше поле в ЕстьNull прямо внутри текстового параметра. Это гарантирует, что в массив не попадут значения, которые сломают внешний агрегат Максимум.
  2. Экранирование кавычек: Если вы используете вложенные функции ВычислитьВыражениеСГруппировкойМассив внутри других таких же функций, внутренние кавычки необходимо удваивать. В противном случае СКД не сможет скомпилировать выражение. Пример сложной конструкции:

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

Альтернативный способ: использование ВычислитьВыражение

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

Пример настройки ресурса без использования массива:

Максимум(ВычислитьВыражение("Максимум(ОкладТарифМакс)", "Позиция"))

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

Решение проблемы иерархии подразделений

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

Чтобы решить эту проблему, следует обратить внимание на четвертый параметр функции ВычислитьВыражениеСГруппировкойМассив — Условие связи / Иерархия. Если данные должны собираться абсолютно со всех уровней вложенности, часто помогает передача пустой строки во второй параметр или явное указание области расчета.

Кроме того, обязательно проверьте вкладку «Ресурсы» в настройках схемы СКД. В колонке «Рассчитывать по...» убедитесь, что для группировки «Подразделение» и для общего итога формула прописана явно. Иногда настройка расчета "по всем группировкам" срабатывает некорректно для сложных выражений.

Практический совет: как отлаживать вычисления СКД

Если вы написали формулу, но поле все равно остается пустым, проанализируем, что именно возвращает массив до применения агрегатной функции. Для этого временно измените формулу ресурса, использовав функцию СоединитьСтроки.

Пример отладочного выражения:


СоединитьСтроки(ВычислитьВыражениеСГруппировкойМассив("ОкладТарифМакс", "Позиция"), "; ")

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

← На главную