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