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

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

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

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

Почему добавление строки через пользовательский макет не работает?

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

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

Способ 1. Искусственная группировка строк и условный расчет ресурса (рекомендуемый)

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

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

ВЫБОР
    КОГДА ВидИтога = "Нарастающий" ТОГДА
        ВычислитьВыражение("Сумма(СуммаОборот)", "КолонкиПериода",, "Первая", "Текущая")
    ИНАЧЕ
        Сумма(СуммаОборот)
КОНЕЦ

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

Способ 2. Разделение строк через объединение в запросе

Если структура строк фиксирована, надежнее всего разделить потоки данных непосредственно на уровне набора данных запроса. Разберем этот вариант по шагам:

  1. В основном запросе набора данных объединяем выборку саму с собой через ОБЪЕДИНИТЬ ВСЕ, добавляя поле признака строки ТипСтроки:

ВЫБРАТЬ
    1 КАК НомерСтроки,
    "Оборот за период" КАК ТипСтроки,
    Продажи.Период КАК Период,
    Продажи.СуммаОборот КАК Сумма
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Месяц,,) КАК Продажи

ОБЪЕДИНИТЬ ВСЕ

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

ВЫБОР
    КОГДА ТипСтроки = "Нарастающий итог" ТОГДА
        ВычислитьВыражение("Сумма(Сумма)", "Период",, "Первая", "Текущая")
    ИНАЧЕ
        Сумма(Сумма)
КОНЕЦ

Способ 3. Использование отдельной детальной группировки

Посмотрим еще один вариант решения без изменения текста запроса — создание отдельной подчиненной или смежной группировки строк:

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

Важные нюансы настройки

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

  1. Сортировка колонок: границы "Первая" и "Текущая" суммируют значения строго в порядке следования колонок слева направо. Порядок колонок должен быть явно задан в сортировке группировки периода.
  2. Имена группировок: всегда задавайте имя группировки колонок в палитре свойств СКД на латинице или кириллице без пробелов и передавайте его в функцию в кавычках. Использование системных имен гарантирует правильный расчет контекста агрегации.
← На главную