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

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

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

Почему происходит разбиение и задвоение сумм

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

Способ 1. Использование ресурсов и функции ВычислитьВыражениеСГруппировкойМассив

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

  1. Перейдем на вкладку «Вычисляемые поля». Если поле уже создано, укажем в колонке «Выражение» нейтральное значение — 0, либо оставим его базовым полем набора данных.
  2. Перейдем на вкладку «Ресурсы» и добавим наше поле в список.
  3. В колонке «Выражение» пропишем агрегатную формулу, которая корректно соберет сумму договора без учета повторов по строкам документов и вычтет общий оборот:

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

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

Способ 2. Ограничение уровней расчета ресурса в колонке «Рассчитывать по...»

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

  1. На вкладке «Ресурсы» добавим рассчитываемое поле.
  2. Зададим выражение для агрегации, например: Максимум(СуммаДоговора) - Сумма(СуммаОборотДТ).
  3. В колонке «Рассчитывать по...» снимем признак со значения «Все поля» и отметим только нужные группировки: Договор (или Контрагент, Договор) и Общий итог.

При такой настройке платформа рассчитает значение только для указанных итоговых строк. Для подчиненной группировки Субконто3 расчет производиться не будет, и ячейка останется пустой.

Способ 3. Настройка состава выбранных полей подчиненной группировки

Посмотрим на ситуацию со стороны визуального вывода данных в структуре отчета. По умолчанию подчиненная группировка выводит все поля, выбранные в родительской ветке, так как в ней включен системный элемент «Авто».

  1. Перейдем на вкладку «Настройки» в окне схемы компоновки данных.
  2. В структуре отчета выделим группировку документов расчетов (Субконто3).
  3. В нижней части окна перейдем на вкладку «Выбранные поля».
  4. Удалим элемент «Авто».
  5. Вручную добавим в список только те поля, которые должны относиться непосредственно к документу: Субконто3 и СуммаОборотДТ.

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

Способ 4. Архитектурное разделение запросов через связи наборов данных

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

  1. Набор данных 1 (Запрос): выбирает данные по договорам, контрагентам и сумму договора. Каждая строка набора представляет собой уникальный договор.
  2. Набор данных 2 (Запрос): обращается к регистру бухгалтерии и выбирает движения по счету 62 с полями Договор, Субконто3 и СуммаОборотДТ.
  3. На вкладке «Связи наборов данных» свяжем первый набор со вторым по полю Договор.

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

← На главную