При разработке отчетов на системе компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда для поля, рассчитанного с помощью функции ВычислитьВыражение, перестает выводиться общий итог или итог по группировкам. Даже если поле корректно добавлено на вкладку Ресурсы со стандартным выражением Сумма(Поле), ячейка итоговой строки остается пустой.
Разберем причины такого поведения платформы 1С:Предприятие и рассмотрим по шагам несколько надежных способов получения корректных итоговых сумм.
Выясним причину проблемы. Функция ВычислитьВыражение вычисляется в контексте конкретной детальной записи или группировки. В строке общего итога контекст детальных записей теряется. По этой причине стандартная агрегатная функция Сумма(ПолеВычисляемое) не может обойти промежуточные значения строк и возвращает пустое значение или NULL.
Кроме того, если в выражении используются относительные смещения к предыдущим или следующим строкам, на первой или последней записи выборки функция возвращает NULL, что при обычном суммировании также приводит к обнулению общего результата.
Рассмотрим основной и самый универсальный способ суммирования значений вычисляемых полей. Чтобы получить сумму строк на уровне группировки или общего итога, необходимо собрать все значения детальных записей в массив и сложить их.
Для этого перейдем на вкладку Ресурсы и зададим специальное выражение с использованием функции ВычислитьВыражениеСГруппировкойМассив:
Сумма(ВычислитьВыражениеСГруппировкойМассив("ПолеВычисляемое", "ИмяГруппировкиНижнегоУровня"))
Разберем по шагам, как работает данная конструкция:
ВычислитьВыражениеСГруппировкойМассив обходит записи указанной группировки нижнего уровня и формирует массив значений поля ПолеВычисляемое.Сумма складывает все элементы полученного массива, формируя корректный результат для вышестоящей группировки или общего итога.Проанализируем альтернативный вариант, когда логика расчета детальных записей и итогов отличается. В СКД предусмотрена возможность задавать различные формулы расчета ресурса для разных уровней отчета с помощью колонки Рассчитывать по....
Если в вычисляемом поле используется смещение (например, обращение к предыдущей строке), первая строка вернет NULL. Чтобы это значение не ломало расчет итогов, обернем выражение в функцию ЕстьNULL.
Посмотрим на пример корректной конструкции вычисляемого поля:
ЕстьNULL(ВычислитьВыражение("Поле1", , "ОбщийИтог", "Предыдущая", "Предыдущая"), 0)
Такой подход гарантирует, что на границах выборки вместо пустого значения будет подставлен ноль, и агрегатные функции в итогах отработают штатно.
Иногда отсутствие итога связано с настройками структуры отчета. Проконтролируем следующие параметры:
Конец или Начало.