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