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