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

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

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

Программный вывод отчета на СКД: Базовая структура

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


// 1. Получаем схему из макета отчета
СхемаКомпоновкиДанных = Отчеты.мОтчетПоНеоплаченнымСчетам.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");        
        
// 2. Получаем настройки по умолчанию
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;    
        
// 3. Установка параметров данных
ПараметрОрганизация = Настройки.ПараметрыДанных.Элементы.Найти("Организация");
Если ПараметрОрганизация <> Неопределено Тогда
    ПараметрОрганизация.Значение = Справочники.Организации.НайтиПоКоду("00-000002");
    ПараметрОрганизация.Использование = Истина;
КонецЕсли;

// 4. Инициализация процессоров
Расшифровка = Новый ДанныеРасшифровкиКомпоновкиДанных;    
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;    
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, Расшифровка);    

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

// 5. Вывод в табличный документ
Таб = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; 
ПроцессорВывода.УстановитьДокумент(Таб);      
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных, Истина);    

Обратите внимание на метод ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных, Истина). Второй параметр Истина критически важен: он указывает системе, что в результирующем табличном документе необходимо создавать иерархию (группировки). Если передать туда Ложь, кнопки «плюс/минус» не появятся, и свернуть строки будет невозможно физически.

Решение: Использование метода ПоказатьУровеньГруппировокСтрок

Для того чтобы отчет выгружался в свернутом виде, необходимо использовать метод табличного документа ПоказатьУровеньГруппировокСтрок(). Однако здесь кроется главная ловушка для новичков: этот метод нужно вызывать строго после того, как данные были выведены в документ.

Рассмотрим правильную последовательность действий:

  1. Выполняем компоновку данных.
  2. Выводим данные в ТабличныйДокумент с помощью процессора вывода.
  3. Вызываем метод управления уровнем иерархии у объекта ТабличныйДокумент.

Пример корректного завершения процедуры:


ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных, Истина);   

// Сворачиваем до 2-го уровня (например, Организация и Контрагент видны, Счета свернуты)
Таб.ПоказатьУровеньГруппировокСтрок(1); 

Возврат Таб;

Значение параметра в методе ПоказатьУровеньГруппировокСтрок определяет, сколько уровней группировок оставить развернутыми:

Типичные ошибки при реализации

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

  1. Вызов до вывода данных: Если вызвать Таб.ПоказатьУровеньГруппировокСтрок(0) до метода ПроцессорВывода.Вывести(), то команда применится к пустому документу. Когда процессор вывода начнет заполнять таблицу, он будет отрисовывать строки в соответствии со своими внутренними алгоритмами, игнорируя предыдущую команду.
  2. Потеря контекста при выгрузке: При вызове цепочки функций типа ВыгрузитьТДвФайл(Таб.ПоказатьУровеньГруппировокСтрок(2), ...) возникает ошибка, так как метод ПоказатьУровеньГруппировокСтрок не возвращает объект "Табличный документ", а возвращает Неопределено (это процедура).

Особенности работы с Excel (XLSX)

Выясним причину, по которой отчет может оставаться развернутым при сохранении в файл Excel, даже если в 1С он отображается корректно. Платформа 1С при методе Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX) передает структуру группировок, но состояние «свернутости» (expand/collapse) в старых версиях платформы или при определенных настройках табличного документа может игнорироваться.

Практические советы для гарантированной свертки в Excel:

Дополнительные возможности: Группировки колонок и точечная свертка

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

Таб.ПоказатьУровеньГруппировокКолонок(1);

Также рассмотрим ситуацию, когда нужно свернуть не все группы до определенного уровня, а только конкретную область. Для этого мы можем использовать объект Область:


// Свернуть конкретную область по координатам
ОбластьДляСвертки = Таб.Область(5, , 10, ); // Строки с 5 по 10
ОбластьДляСвертки.Свернуть(Истина); // Истина - свернуть, Ложь - развернуть

Этот метод Свернуть() работает более гибко, так как позволяет программно анализировать содержимое ячеек и принимать решение о сворачивании конкретной ветки иерархии прямо в цикле обхода табличного документа.

Резюме

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

← На главную