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

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

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

Проблема «раскрытия всего дерева»

Многие разработчики сталкиваются с тем, что даже если программно свернуть отчет после формирования, нажатие пользователем на «плюсик» приводит к разворачиванию всех вложенных строк. Это происходит потому, что состояние вложенных уровней в памяти табличного документа остается «развернутым». Чтобы добиться пошагового раскрытия, необходимо правильно инициализировать структуру документа в момент его формирования.

Способ 1. Программный вывод в модуле отчета

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

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


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

Важный нюанс: Сохранение пользовательских настроек

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

Способ 2. Управление сверткой через форму отчета

Если вы не хотите переопределять процедуру компоновки в модуле объекта, можно воздействовать на уже готовый табличный документ в модуле формы. Это удобно, если нужно добавить на командную панель кнопки быстрого переключения уровней («Свернуть всё», «Уровень 1», «Уровень 2»).

Разберем пример обработчика нажатия кнопки, который устанавливает уровень свертки:


&НаКлиенте
Процедура УстановитьУровеньСвертки(Команда)
    // Предположим, имя команды содержит номер уровня, например "Уровень1"
    НужныйУровень = 1; 
    Результат.ПоказатьУровеньГруппировокСтрок(НужныйУровень);
КонецПроцедуры

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

  1. 0 — максимально возможная свертка (часто скрывает даже заголовок);
  2. 1 — отображение только первой группировки;
  3. 2 и далее — отображение соответствующих уровней вложенности.

Как предотвратить сворачивание параметров и заголовка?

Выясним причину, по которой при вызове ПоказатьУровеньГруппировокСтрок(0) пропадают параметры отчета. Платформа 1С включает область заголовка и параметров в общую иерархию строк. Если мы сворачиваем документ до «нулевого» уровня, скрывается всё, что находится внутри первой (самой верхней) логической группы строк.

Чтобы избежать этого эффекта, можно воспользоваться следующими приемами:

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

Имитация «умного» разворачивания

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


// Сначала принудительно разворачиваем дерево до глубокого уровня
Результат.ПоказатьУровеньГруппировокСтрок(10); 
// Затем сворачиваем его до верхнего уровня
Результат.ПоказатьУровеньГруппировокСтрок(0);

Такая «протряска» документа позволяет сбросить внутренние флаги состояния строк. В некоторых версиях платформы это помогает добиться того, что при нажатии на «+» открывается именно одна ветка, а не вся вложенная структура. Однако стоит помнить, что поведение может зависеть от версии платформы и режима работы (обычные или управляемые формы).

Заключение

Мы рассмотрели основные способы управления группировками в СКД. Подведем итог: для корректной работы всегда используйте КомпоновщикНастроек.ПолучитьНастройки(), а для управления визуальным состоянием — метод ПоказатьУровеньГруппировокСтрок(). Сочетание этих инструментов позволит вам создавать удобные и профессиональные отчеты, которые не пугают пользователя огромными простынями данных при первом запуске.

← На главную