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