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