Как программно свернуть группировки строк в отчете СКД после нажатия кнопки Сформировать?

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

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

Способ 1: Полный контроль через создание собственной команды

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

Для реализации этого метода выполним следующие действия:

  1. Удалим стандартную кнопку «Сформировать» с командной панели формы.
  2. Создадим свою команду, например, с именем СформироватьОтчет.
  3. В модуле формы напишем процедуру, которая вручную выполняет все этапы компоновки.

Рассмотрим пример кода для такой процедуры:


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

Использование этого метода гарантирует, что Результат.ПоказатьУровеньГруппировокСтрок(1) выполнится в контексте завершения вывода данных, и платформа не будет производить повторную перерисовку, которая сбрасывает настройки.

Способ 2: Использование обработчика ожидания

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

Для этого в процедуре ПриКомпоновкеРезультата мы просто подключаем обработчик ожидания:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    // Подключаем разовый обработчик ожидания через 0.1 секунды
    ПодключитьОбработчикОжидания("СвернутьГруппировкиОтчета", 0.1, Истина);
КонецПроцедуры

Процедура СвернутьГруппировкиОтчета() Экспорт
    Элементы.Результат.ПоказатьУровеньГруппировокСтрок(1);
КонецПроцедуры

Этот метод очень эффективен, так как позволяет формам 1С корректно завершить процесс вывода ТабличныйДокумент, и только после этого применить наши настройки группировок.

Важные рекомендации при работе с табличным документом

В процессе работы обращайте внимание на следующие технические аспекты:

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

← На главную