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