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