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