Как программно управлять уровнями группировок в отчетах СКД на обычных формах

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

При работе с отчетами на базе системы компоновки данных (СКД) пользователи часто сталкиваются с необходимостью быстрого управления визуальным представлением данных. Стандартное разворачивание каждой группировки вручную через "плюсики" крайне неудобно, если уровней вложенности много. Рассмотрим, как реализовать удобные кнопки управления уровнями группировок непосредственно на форме отчета, чтобы сделать работу пользователя более эффективной.

Основы программного вывода отчета СКД

Для того чтобы иметь полный контроль над результатом компоновки, нам необходимо перехватить стандартный процесс формирования отчета. Это делается в модуле объекта отчета. Разберем по шагам, как подготовить фундамент для управления группировками. Проанализируем процедуру ПриКомпоновкеРезультата, где мы вручную описываем цикл вывода данных в табличный документ.

Посмотрим на пример кода, который позволяет инициализировать все необходимые объекты СКД (сократить этот код в несколько раз поможет СКДБилдер):


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

В данном коде ключевым методом является ПоказатьУровеньГруппировокСтрок(). Важно помнить, что нумерация уровней начинается с нуля. Если мы передаем 0, отчет отобразится в максимально свернутом виде (только самые верхние уровни). Если нам нужно развернуть всё — передается максимально возможное число уровней.

Создание пользовательских кнопок на форме

Теперь выясним причину, по которой простого кода в модуле объекта недостаточно: пользователю нужно менять уровень "на лету", уже после того как отчет сформирован. Для этого нам потребуется добавить кнопки на форму отчета. Выберем для этого командную панель или разместим кнопки непосредственно над полем табличного документа.

Проанализируем алгоритм создания таких кнопок:

  1. Откроем форму отчета в конфигураторе.
  2. Добавим на командную панель несколько кнопок с заголовками "1", "2", "3" или "Свернуть все" / "Развернуть все".
  3. Для каждой кнопки создадим обработчик действия.

Рассмотрим пример кода обработчика для кнопки "Уровень 2":


Процедура КоманднаяПанельУровень2(Кнопка)
    // ЭлементыФормы.Результат - это имя поля табличного документа на форме
    ЭлементыФормы.Результат.ПоказатьУровеньГруппировокСтрок(1);
КонецПроцедуры

Важный момент: если вы хотите динамически определять количество уровней, используйте свойство табличного документа КоличествоУровнейГруппировокСтрок(). Это позволит не гадать, сколько уровней вложенности в данный момент сформировалось в отчете.

Решение проблемы с расшифровкой (Drill-down)

При переходе на ручное формирование отчета (через программный вывод) часто возникает ситуация, когда стандартная расшифровка (двойной клик по ячейке) перестает работать. Это происходит из-за того, что связь между ДокументРезультат и объектом ДанныеРасшифровки не устанавливается автоматически. Проанализируем ситуацию подробнее.

Чтобы расшифровка работала корректно (особенно если вами реализована пользовательская СКД), необходимо выполнить три условия:

  1. В модуле объекта при вызове метода Инициализировать процессора компоновки обязательно передавать переменную ДанныеРасшифровки.
  2. В свойствах элемента формы "Поле табличного документа" (где отображается отчет) в параметре ДанныеРасшифровки должно быть указано имя переменной (обычно это строка "ДанныеРасшифровки").
  3. Если вы используете полностью кастомный вывод, в модуле формы необходимо прописать обработчик события ОбработкаРасшифровки.

Рассмотрим пример обработки расшифровки в модуле формы:


Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // Мы сами управляем процессом
    
    // Создаем объект для стандартной обработки расшифровки СКД
    Обработка = Новый СтандартнаяОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, ИсполнительОтчетов);
    
    // Вызываем стандартное меню выбора действия (Открыть, Отфильтровать и т.д.)
    Обработка.ВыбратьДействие(Расшифровка);
    
КонецПроцедуры

Перехват стандартной кнопки "Сформировать"

Иногда возникают трудности с тем, как "повесить" свой код на встроенную кнопку "Сформировать" в обычных формах. Рассмотрим два варианта решения этой задачи:

Вариант 1: Своя кнопка. Мы отключаем автозаполнение командной панели формы, создаем свою кнопку "Сформировать" и в её обработчике вызываем метод СкомпоноватьРезультат() или вручную прописываем весь цикл вывода, который мы разобрали выше. Это наиболее гибкий путь, позволяющий управлять интерфейсом до и после формирования.

Вариант 2: Использование событий формы. Если мы хотим оставить стандартную кнопку, можно использовать событие формы ПриОткрытии, чтобы программно изменить действие стандартной кнопки. Однако на обычных формах это реализуется сложнее, чем просто создание собственного элемента управления.

Дополнительные советы по интерфейсу

Для создания действительно профессионального отчета, разберем еще несколько полезных приемов:

Подводя итог, можно сказать, что управление группировками в СКД — это не только вызов одной функции, но и правильная организация процесса вывода данных. Соблюдение правил инициализации ДанныеРасшифровки и использование метода ПоказатьУровеньГруппировокСтрок позволит вам создавать отчеты, которые будут максимально удобны для конечного пользователя.

← На главную