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