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