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