Как рассчитать формулу только на уровне группировки в СКД?

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

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

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

Способ 1. Настройка формулы на вкладке «Ресурсы» с агрегатными функциями

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

Рассмотрим порядок настройки нового расчетного показателя:

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

ЕСТЬNULL(СУММА(СуммаПоступления), 0) - ЕСТЬNULL(СУММА(СуммаРасхода), 0)

Если требуется рассчитать отношение показателей (например, среднюю цену или коэффициент), обязательно добавим проверку деления на ноль:


ВЫБОР 
    КОГДА ЕСТЬNULL(СУММА(Количество), 0) = 0 ТОГДА 0 
    ИНАЧЕ ЕСТЬNULL(СУММА(Сумма), 0) / СУММА(Количество) 
КОНЕЦ

Способ 2. Ограничение области расчета ресурса по конкретной группировке

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

Для точного управления уровнем расчета выполним следующие действия:

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

Чтобы скрыть пустое поле из строк детальных записей в самом отчете, перейдем на вкладку Настройки, выберем элемент структуры Детальные записи, перейдем на вкладку Выбранные поля, снимем флаг Автополе и перенесем вручную только те поля, которые должны отображаться в строках документов.

Способ 3. Использование функции «ВычислитьВыражение»

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

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


ВычислитьВыражение("Сумма(СуммаПоступления)", "Номенклатура") - ВычислитьВыражение("Сумма(СуммаРасхода)", "Номенклатура")

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


ВЫБОР 
    КОГДА ВычислитьВыражение("Сумма(Сумма)", "ОбщийИтог") = 0 ТОГДА 0 
    ИНАЧЕ Сумма / ВычислитьВыражение("Сумма(Сумма)", "ОбщийИтог") * 100 
КОНЕЦ

Типичные ошибки при настройке выражений и их устранение

Выясним причины распространенных ошибок, возникающих при работе с формулами группировок:

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