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