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

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

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

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

Анализ причин поведения СКД

Проанализируем внутренние механизмы компоновки данных, чтобы выяснить причину:

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

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

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

  1. Перейдем на вкладку Настройки в схеме компоновки данных.
  2. В окне структуры отчета удалим элемент Детальные записи.
  3. Добавим новую группировку и перенесем в список Поля группировки все измерения отчета: Контрагент, Договор, ОсновноеСредство.
  4. Если требуется выводить отчет в виде плоской таблицы без иерархических сдвигов, укажем для группировки тип Без иерархии (или Элементы).
  5. На вкладке Выбранные поля этой группировки укажем Автополе или выберем нужные колонки и ресурс ЗадолженностьВРублях.

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

Способ 2. Создание предопределенных вариантов отчета

Если пользователям требуются разные уровни детализации данных (например, сводный отчет только по контрагентам и договорам, либо подробный с учетом основных средств), создадим несколько вариантов отчета прямо в схеме компоновки данных:

  1. На вкладке Настройки добавим новый вариант отчета.
  2. В первом варианте настроим группировку по полям: Контрагент, Договор, ОсновноеСредство.
  3. Во втором варианте настроим группировку только по полям: Контрагент, Договор.

В этом случае пользователи смогут переключать варианты отчета в режиме 1С:Предприятие, получая гарантированно свернутые данные с рассчитанными итогами.

Способ 3. Программная подготовка и свертка таблицы значений

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


// Сворачиваем исходную таблицу по нужным измерениям с суммированием ресурса
ТаблицаДанных.Свернуть("Контрагент, Договор", "ЗадолженностьВРублях");

// Передаем подготовленную таблицу во внешний набор данных СКД
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ТаблицаДанных", ТаблицаДанных);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);

Использование метода Свернуть() у объекта ТаблицаЗначений исключает появление дублирующихся строк еще на этапе формирования данных перед компоновкой.

← На главную