При настройке отчетов в системе компоновки данных (СКД) нередко возникает потребность рассчитать пользовательский показатель, который опирается на количество уникальных объектов (например, сотрудников, документов или номенклатурных позиций), а затем получить по нему корректную сумму в вышестоящих группировках и общем итоге. Однако при попытке просуммировать такие данные пользователи и разработчики часто сталкиваются с сообщением об ошибке: «Использование вложенных агрегатных функций не допустимо», либо с ситуацией, когда итоговые строки выводят неверные значения.
Разберем детально, почему платформа 1С выдает такое сообщение, как работает механизм агрегации и какими способами можно обойти данное ограничение для получения корректных итогов.
Проанализируем механику работы языка выражений СКД. Когда мы пытаемся записать формулу вида Сумма(Количество(Различные Сотрудник)), платформа блокирует выполнение отчета. Это происходит потому, что в СКД жестко запрещена вложенная агрегация: агрегатная функция (в данном случае Сумма) может применяться только к полям набора данных или простым выражениям, но не к результату работы другой агрегатной функции (Количество).
Если же мы оставляем выражение без внешней суммы и указываем просто Количество(Различные Сотрудник) на уровне пользовательского поля или ресурса, итоги рассчитываются по другим правилам платформы:
Рассмотрим проверенные способы решения этой задачи, начиная от базовой доработки запроса и заканчивая возможностями выражений СКД.
Самым надежным и производительным решением является перенос агрегации уникальных значений непосредственно в текст запроса набора данных. Выясним, как это сделать по шагам:
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ...). Поле перестанет быть агрегатом на уровне СКД и станет простым числовым полем набора данных.Сумма(ИмяПоля).Посмотрим на пример структуры запроса:
ВЫБРАТЬ
Начисления.Подразделение КАК Подразделение,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Начисления.Сотрудник) КАК КоличествоСотрудников
ПОМЕСТИТЬ ВТ_КоличествоПоПодразделениям
ИЗ
РегистрНакопления.ВзаиморасчетыСРаботниками КАК Начисления
СГРУППИРОВАТЬ ПО
Начисления.Подразделение
;
ВЫБРАТЬ
ВТ.Подразделение КАК Подразделение,
ВТ.КоличествоСотрудников КАК КоличествоСотрудников,
ВТ.КоличествоСотрудников * &НормаВыработкиНаЧеловека КАК НормаВыработки
ИЗ
ВТ_КоличествоПоПодразделениям КАК ВТ
В такой конфигурации на вкладке «Ресурсы» поле НормаВыработки легко суммируется стандартной функцией Сумма(НормаВыработки), не вызывая конфликтов вложенности и обеспечивая точное совпадение итогов со строками.
Если доступ к изменению текста запроса ограничен или расчет требуется настроить через пользовательские поля и ресурсы схемы, применим встроенную функцию СКД для работы с массивами группировок. Разберем синтаксис этой конструкции:
Сумма(ВычислитьВыражениеСГруппировкойМассив("Количество(Различные Сотрудник)", "Сотрудник"))
Рассмотрим подробнее принцип работы этой функции:
ВычислитьВыражениеСГруппировкойМассив обходит все записи указанной группировки (второй параметр) и вычисляет для каждой из них выражение из первого параметра.Сумма последовательно складывает полученные элементы массива, формируя правильный арифметический итог для вышестоящей группировки или общего итога.Важное ограничение: имя группировки, передаваемое во второй параметр функции, должно строго совпадать с именем поля группировки в настройках отчета. Если пользователь переименует или удалит указанную группировку из структуры отчета, платформа вернет ошибку компоновки.
Когда требуется выводить разную логику на детальном уровне и на уровне общих итогов, разберем настройку полей через вкладку Ресурсы с использованием колонки Рассчитывать по...:
Сотрудник) и зададим выражение для одной строки.Сумма(ВычислитьВыражениеСГруппировкойМассив("НормаВыработки", "Сотрудник")).При таком подходе мы исключаем ошибку вложенной агрегации и сохраняем прозрачный расчет итогов как по строкам отчета, так и в итоговых сводных показателях.