Как в отчете 1С посчитать количество различных номенклатурных позиций и просуммировать их в вышестоящих группировках?

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

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

Выясним причину ограничения платформы в языке запросов

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

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

Решение задачи в Системе компоновки данных (СКД)

Для реализации разноуровневого расчета в СКД применяется специализированная функция языка выражений СКД — ВычислитьВыражениеСГруппировкойМассив. Она позволяет обойти прямое агрегирование и получить массив результатов для подчиненных строк с их последующим суммированием.

Разберем по шагам два способа настройки такого отчета.

Способ 1. Использование функции в вычисляемых полях и ресурсах

Рассмотрим вариант, при котором для расчета уникальных позиций создается дополнительное вычисляемое поле, которое затем суммируется в ресурсах отчета:

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

Способ 2. Настройка формул расчета непосредственно на вкладке «Ресурсы»

Посмотрим на альтернативный вариант, который не требует создания отдельного вычисляемого поля и позволяет настроить индивидуальные формулы расчета для каждого уровня отчета напрямую в таблице ресурсов:

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

Особенности и ограничения использования функции

Рассмотрим подробнее важные нюансы, которые необходимо учитывать при использовании функции ВычислитьВыражениеСГруппировкойМассив:

  1. Зависимость от структуры отчета: Список группировок во втором параметре функции передается в виде текстовой строки. Если пользователь в пользовательском режиме изменит состав, иерархию или отключит одну из указанных группировок, выражение не сможет корректно вычислить результат и вернет 0 либо пустое значение.
  2. Использование оперативной памяти: Функция формирует промежуточные массивы значений в памяти для каждой расчетной строки. При обработке больших объемов данных с высокой степенью вложенности это может увеличивать время формирования отчета.

Альтернативное решение: предварительная группировка во временной таблице

Если требуется сохранить отчет на обычном запросе или «Построителе отчета» без перехода на СКД, можно использовать предварительное сворачивание данных:

  1. В первом пакете запроса группируем данные до уникального сочетания всех аналитических полей и номенклатуры с помощью секции СГРУППИРОВАТЬ ПО, добавляя поле-константу: 1 КАК КоличествоSKU.
  2. Помещаем этот результат во временную таблицу.
  3. Во втором пакете строим основной запрос к временной таблице с использованием стандартного суммирования: ИТОГИ СУММА(КоличествоSKU) ПО ....

Такой подход обеспечивает корректное суммирование уникальных записей снизу вверх по всей иерархии группировок как в стандартных запросах, так и в любых вариантах универсальных отчетов.

← На главную