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