Как реализовать нарастающий итог в СКД с группировкой по менеджеру или отделу?

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

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

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

Постановка задачи и анализ ситуации

Представим, что у нас есть отчет с иерархией: Отдел — Менеджер — Заказ клиента. Нам нужно добавить поле СуммаНарастающимИтогом. Основная сложность заключается в том, что в рамках одного менеджера сумма должна расти от заказа к заказу, но как только начинается секция нового менеджера, расчет должен начаться заново с нуля.

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

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

Для реализации нарастающего итога в 1С используется мощная функция ВычислитьВыражение. Рассмотрим ее синтаксис в контексте нашей задачи:

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

Давайте проанализируем ключевые параметры, которые помогут нам ограничить расчет рамками текущей группировки:

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

Настройка ресурсов: Ключевой этап

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

Проанализируем шаги настройки:

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

Пример реализации нарастающего итога внутри группы

Рассмотрим более сложный вариант, когда нам нужно гарантировать корректность данных при наличии нескольких уровней вложенности. Мы можем использовать конкретное имя группировки во втором параметре функции, чтобы жестко привязать расчет к родителю.

Допустим, наша группировка называется ГруппировкаМенеджер. Тогда выражение ресурса для детальных записей будет выглядеть так:


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

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

Типичные ошибки при работе с ВычислитьВыражение

Разберем основные ошибки, с которыми сталкиваются разработчики:

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

Итоги и рекомендации

Для того чтобы нарастающий итог в СКД работал корректно и обнулялся при смене группы (менеджера или отдела), мы должны выполнить три условия:

Во-первых, использовать функцию ВычислитьВыражение с параметрами "Первая" и "Текущая". Это создает механизм накопления суммы.

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

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

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

← На главную