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