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