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