Как рассчитать нарастающий итог в разрезе группировки в СКД 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов на базе Системы компоновки данных (СКД) в 1С программисты часто сталкиваются с задачей вычисления накопительного или нарастающего итога. Классический пример: необходимо вывести продажи по дням или месяцам, но при этом показывать, как росла сумма продаж со временем. Ситуация усложняется, когда этот итог нужно считать не глобально по всему отчету, а отдельно для каждого объекта группировки — например, сбрасывать накопленную сумму и начинать расчет заново для каждого нового менеджера, склада или контрагента.

В этой статье мы подробно разберем, как правильно реализовать нарастающий итог в разрезе группировки в СКД, проанализируем типичные ошибки разработчиков и выясним, почему популярные «обходные» формулы могут работать некорректно.

Постановка задачи и анализ проблемы

Представим структуру отчета, в которой присутствуют два уровня группировки:

  1. Менеджер (родительская группировка).
  2. Период (дочерняя группировка, например, месяц или дата).

Нам необходимо получить отчет следующего вида:

Если использовать простую формулу нарастающего итога без указания контекста группировки, СКД будет суммировать данные непрерывно по всему отчету. В результате показатели второго менеджера начнут складываться с конечным итогом первого, что является грубой методологической ошибкой.

Решение проблемы: использование функции ВычислитьВыражение

Для решения этой задачи в языке выражений СКД предусмотрена мощная встроенная функция ВычислитьВыражение. Она позволяет вычислять выражения в контексте других строк или группировок компоновки данных.

Рассмотрим синтаксис этой функции:

ВычислитьВыражение(Выражение, Группировка, ТипРасчета, Начало, Конец, Сортировка, Фильтр)

Чтобы рассчитать нарастающий итог, который автоматически сбрасывается при переходе к новой родительской группировке (в нашем примере — к новому менеджеру), на вкладке «Ресурсы» в поле выражения необходимо написать следующую формулу:

ВычислитьВыражение("Сумма(ЗаПериод)", , "Группировка", "Первая", "Текущая")

Разберем по шагам каждый параметр этой формулы, чтобы понять логику работы платформы:

  1. "Сумма(ЗаПериод)" (первый параметр) — это выражение, которое мы хотим рассчитывать. В данном случае мы суммируем ресурс нашего отчета ЗаПериод.
  2. Пропущенный второй параметр (передано пустое значение) — указывает системе, что расчет должен производиться в контексте текущей группировки (по строкам детальных записей или периодов).
  3. "Группировка" (третий параметр — тип расчета) — это самый важный параметр для решения нашей задачи. Значение "Группировка" предписывает СКД производить вычисления строго в пределах текущей родительской группировки. Как только в строке отчета меняется менеджер, СКД понимает, что границы родительской группировки нарушены, и начинает расчет нарастающего итога заново с нуля.
  4. "Первая" (четвертый параметр) — определяет начало интервала расчета. Указывает, что суммирование нужно начинать с самой первой строки текущей группы.
  5. "Текущая" (пятый параметр) — определяет конец интервала расчета. Указывает, что суммирование нужно производить до текущей обрабатываемой строки включительно.

Важная деталь: Разделение формул для разных уровней группировки

Профессиональная настройка отчета в СКД требует понимания того, как ресурсы отображаются на разных уровнях иерархии. Если мы применим выражение ВычислитьВыражение("Сумма(ЗаПериод)", , "Группировка", "Первая", "Текущая") абсолютно ко всем группировкам, то на уровне общих итогов или на уровне самого менеджера мы получим некорректные или пустые значения.

В СКД предусмотрена возможность настраивать разные формулы расчета ресурса для разных уровней группировок. Давайте посмотрим, как правильно заполнить таблицу на вкладке «Ресурсы»:

  1. Строка 1 (для детальных записей и периодов):

    • Имя поля: НарастающийИтог
    • Выражение: ВычислитьВыражение("Сумма(ЗаПериод)", , "Группировка", "Первая", "Текущая")
    • Рассчитывать по...: Выберите вашу детальную группировку (например, Период).
  2. Строка 2 (для группировки «Менеджер»):

    • На уровне самого менеджера нарастающий итог по периодам не имеет математического смысла. Здесь должна выводиться просто общая сумма продаж этого менеджера за весь период.
    • Имя поля: НарастающийИтог
    • Выражение: Сумма(ЗаПериод)
    • Рассчитывать по...: Выберите группировку Менеджер.
  3. Строка 3 (для Общих итогов):

    • В самом низу отчета в строке «Итого» должна выводиться общая сумма продаж по всей компании.
    • Имя поля: НарастающийИтог
    • Выражение: Сумма(ЗаПериод)
    • Рассчитывать по...: Выберите Общие итоги.

Благодаря такому разделению ваш отчет будет выглядеть аккуратно, а итоговые строки по менеджерам и отчету в целом не будут содержать путаницы.

Анализ распространенной ошибки

В процессе обсуждения подобных задач на форумах часто всплывает альтернативное выражение, которое неопытные разработчики ошибочно принимают за рабочее решение:

Сумма(ВычислитьВыражениеСГруппировкойМассив("Сумма(ЗаПериод)","Менеджер"))

Проанализируем, почему эта формула не является решением задачи нарастающего итога, даже если автор темы на форуме посчитал ее «идеально работающей»:

Особенности расчета в кросс-таблицах (горизонтальный нарастающий итог)

Иногда структура отчета спроектирована в виде кросс-таблицы (матрицы), где менеджеры расположены в строках, а периоды (например, месяцы) — в колонках. В этом случае нарастающий итог должен рассчитываться горизонтально — слева направо.

Для такой структуры синтаксис формулы в ресурсах немного изменится. Нам потребуется явно передать имя группировки колонок во второй параметр функции:

ВычислитьВыражение("Сумма(ЗаПериод)", "Период", , "Первая", "Текущая")

В этой формуле указание "Период" во втором параметре заставляет систему производить последовательные вычисления горизонтально по колонкам периодов в рамках строки каждого конкретного менеджера. При этом третий параметр (тип расчета) можно оставить пустым, так как контекст строки менеджера ограничивает вычисления естественным образом.

Резюме

Для правильной реализации нарастающего итога в СКД с разбиением по группам всегда используйте связку параметров "Группировка", "Первая", "Текущая" внутри встроенной функции ВычислитьВыражение. Четко разделяйте формулы расчета ресурсов для детальных записей, группировок верхнего уровня и общих итогов на вкладке «Ресурсы». Это гарантирует высокую производительность отчета и математическую точность выводимых данных.

← На главную