Как получить сумму нарастающим итогом для группировки в СКД

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

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

Разбор основной проблемы

Представим ситуацию: у нас есть иерархический отчет или отчет с несколькими уровнями группировок (например, «Основная номенклатура» и вложенная в нее «Номенклатура»). Нам нужно, чтобы в строке «Основная номенклатура 1» вывелась её сумма, а в строке «Основная номенклатура 2» — сумма первой и второй группировок вместе. При этом детальные записи внутри группировок не должны участвовать в нарастающем итоге или должны отображать только свои собственные значения.

Типичная ошибка начинающего разработчика — попытка прописать формулу в Вычисляемых полях. Проанализируем ситуацию: вычисляемые поля рассчитываются до того, как компоновщик данных начнет группировать записи и рассчитывать итоги. Поэтому для получения корректного нарастающего итога нам необходимо работать исключительно с закладкой Ресурсы.

Шаг 1. Перенос логики в Ресурсы

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

Добавим наше поле (например, НарастающийИтог) в таблицу ресурсов. В колонке «Выражение» мы будем использовать функцию ВычислитьВыражение. Это мощный инструмент, который позволяет заглядывать «вперед» и «назад» по строкам отчета.

Шаг 2. Использование функции ВычислитьВыражение

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

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

Проанализируем параметры этой функции:

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

Шаг 3. Исключение детальных записей

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

В настройках ресурса НарастающийИтог в колонке «Рассчитывать по» выберите только те группировки, для которых этот итог актуален (например, ОсновнаяНоменклатура и ОбщийИтог). Снимите флажок с поля <Детальные записи>. Если вам все же нужно показывать что-то в детальных записях, вы можете добавить еще одну строку в ресурсы для этого же поля, но с выражением 0 или просто Сумма(КоличествоОборот), указав расчет только по детальным записям.

Шаг 4. Нарастающий итог со сбросом внутри родителя

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

В этом случае мы модифицируем второй параметр функции:

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

Указав вторым параметром имя группировки "Склад", мы сообщаем системе, что границы вычисления ограничены текущим значением склада. Как только склад в отчете изменится, расчет нарастающего итога начнется с нуля.

Шаг 5. Работа со сложными группировками и иерархией

Посмотрим на пример, когда стандартное суммирование не подходит (например, при использовании иерархии номенклатуры). В иерархических справочниках суммы могут дублироваться на разных уровнях. Для таких случаев рекомендуется использовать более сложную, но надежную конструкцию с массивом:


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

Рассмотрим подробнее, что здесь происходит:

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

Этот метод гарантирует, что мы складываем уже готовые итоги группировок, не обращая внимания на внутреннюю структуру каждой из них.

Важные замечания по сортировке

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

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

← На главную