При разработке отчетов на системе компоновки данных (СКД) часто возникает задача: отчет должен открываться компактно, со свернутыми группировками верхнего уровня, чтобы пользователь мог самостоятельно разворачивать нужные ветки данных. В схеме компоновки данных нет штатной декларативной настройки, позволяющей задать начальное состояние группировок как «свернуто». По умолчанию 1С всегда формирует и выводит результат с полностью раскрытыми уровнями.
Создавать собственную форму отчета и использовать клиентские обработчики ожидания только ради сворачивания строк — неоптимальный путь, требующий лишней поддержки. Разберем, как решить эту задачу правильно и универсально на уровне модуля отчета.
Многие разработчики пробуют в модуле отчета переопределить событие ПриКомпоновкеРезультата, просто вызвав метод управления табличным документом:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
ДокументРезультат.ПоказатьУровеньГруппировокСтрок(0);
КонецПроцедуры
В этом случае ничего не происходит, так как на момент вызова процедуры отчет еще не сформирован платформой. Если же установить параметр СтандартнаяОбработка = Ложь; и не выполнить компоновку вручную, на выходе получится абсолютно пустой табличный документ. Для получения свернутого дерева строк необходимо полностью перехватить процесс формирования и программно скомпоновать отчет.
Рассмотрим стандартный и наиболее надежный способ. Перейдем в модуль объекта отчета и пропишем алгоритм ручной компоновки данных в процедуре ПриКомпоновкеРезультата:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Получаем актуальные пользовательские настройки отчета
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// Инициализируем макет компоновки
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
// Формируем процессор компоновки данных
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
// Выводим результат в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Сворачиваем группировки строк
ДокументРезультат.ПоказатьУровеньГруппировокСтрок(0);
КонецПроцедуры
Обратите внимание на получение настроек: мы используем вызов КомпоновщикНастроек.ПолучитьНастройки(), а не свойство КомпоновщикНастроек.Настройки. Это критически важно, так как метод ПолучитьНастройки() возвращает структуру с учетом пользовательских отборов, параметров и сортировок, заданных пользователем на форме перед нажатием кнопки формирования.
Разберем важную особенность поведения метода ПоказатьУровеньГруппировокСтрок(N). По правилам платформы 1С данный метод:
N.N.N.Если передать в метод просто ноль (ДокументРезультат.ПоказатьУровеньГруппировокСтрок(0)), то при разворачивании пользователем верхнего уровня все нижележащие вложенные группировки окажутся сразу раскрытыми.
Если по условиям задачи требуется, чтобы все уровни открывались строго по очереди (каждый уровень изначально был свернут), свернем их в цикле от самого глубокого к верхнему:
ВсегоУровней = ДокументРезультат.КоличествоУровнейГруппировокСтрок();
Для Сч = 1 По ВсегоУровней Цикл
ДокументРезультат.ПоказатьУровеньГруппировокСтрок(ВсегоУровней - Сч);
КонецЦикла;
Если отчет представляет собой кросс-таблицу или содержит несколько уровней группировок колонок, применим аналогичный подход для горизонтальных уровней:
ВсегоУровнейКолонок = ДокументРезультат.КоличествоУровнейГруппировокКолонок();
Для Сч = 1 По ВсегоУровнейКолонок Цикл
ДокументРезультат.ПоказатьУровеньГруппировокКолонок(ВсегоУровнейКолонок - Сч);
КонецЦикла;
В современных типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП) формирование отчетов происходит на стороне сервера в фоновом задании. Результат из ДокументРезультат полностью сериализуется и передается на клиент вместе с установленными уровнями видимости строк. Никаких дополнительных доработок управляемой формы, передачи параметров через контекст или обработчиков ожидания на клиенте не требуется.