Как в СКД рассчитать итог по реквизиту и вывести его в таблице без дублирования в периодах?

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

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

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

Выясним причину поведения СКД и задвоения данных

Рассмотрим внутреннюю механику работы компоновщика данных. Здесь действуют два жестких правила:

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

Способ 1. Исправление набора данных и запроса

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

  1. В первой части запроса выбираем уникальные данные по договорам: поля Контрагент, Договор, СуммаДоговора, а поля периодических оборотов заполняем нулями. Поле Период оставляем пустым (значение NULL или пустая дата).
  2. Во второй части запроса выбираем периодические обороты: поля Контрагент, Договор, Период, СуммаПоступлений, СуммаАктов, а для поля СуммаДоговора передаем 0.
  3. Объединяем эти ветки. В результате сумма договора присутствует в выборке ровно один раз на каждый договор и не умножается на количество движений в периодах.

Способ 2. Вычисление итогов через язык выражений СКД

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

Для поля СуммаДоговора зададим формулу агрегации с использованием массива уникальных значений:


Сумма(ВычислитьВыражениеСГруппировкойМассив("Максимум(СуммаДоговора)", "Договор"))

Разберем подробнее, как работает данная конструкция: функция ВычислитьВыражениеСГруппировкойМассив берет максимальное (то есть единичное истинное) значение суммы по каждому конкретному договору, формирует из них массив на уровне вышестоящих группировок (например, Контрагент) и общего итога, после чего внешняя функция Сумма складывает элементы этого массива. Это гарантирует правильный итог даже при дублировании строк в детальных записях.

Способ 3. Настройка структуры таблицы и видимости колонок

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

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

Способ 4. Ограничение расчета ресурса по группировкам

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

  1. Добавим строку для ресурса СуммаДоговора.
  2. В поле «Рассчитывать по...» укажем группировки Контрагент, Договор, а также ОбщийИтог.
  3. Поле Период в этот список включать не будем.

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

← На главную