Как программно свернуть уровень группировки в СКД и управлять отображением значков свертки

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

При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с требованиями пользователей по оптимизации интерфейса. Одной из популярных задач является управление отображением группировок при формировании отчета. Например, по умолчанию отчет должен открываться в свернутом виде до определенного уровня, чтобы пользователь не «тонул» в детальных записях сразу после нажатия кнопки «Сформировать». Другая частая задача — скрыть кнопки свертки и развертки («плюсики» и «минусы»), чтобы зафиксировать структуру строк.

В рамках этой статьи мы подробно разберем, как решить эти задачи программным путем. Мы проанализируем причины популярных ошибок компиляции, рассмотрим методы работы с табличным документом и научимся управлять интерфейсом группировок динамически.

Часть 1. Программное свертывание группировок определенного уровня

Часто разработчики ищут настройки свертывания внутри схемы компоновки данных или настроек компоновщика. Однако за визуальное представление структуры строк отвечает не сама СКД, а результирующий объект типа ТабличныйДокумент, в который выводится готовый отчет. Обычно на форме отчета этот реквизит называется Результат или ДокументРезультат.

Для управления видимостью уровней иерархии у объекта ТабличныйДокумент существует стандартный метод ПоказатьУровеньГруппировокСтрок(). Он принимает в качестве параметра числовой индекс уровня, который необходимо отобразить (все уровни глубже указанного будут автоматически свернуты).

Рассмотрим подробнее пример кода, который вызывается после формирования отчета:


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

Важно помнить, что индексация уровней в методе ПоказатьУровеньГруппировокСтрок() начинается с нуля:

  1. 0 — развернут только самый верхний уровень (как правило, общие итоги или первая группировка).
  2. 1 — развернуты первый и второй уровни группировок.
  3. 2 — развернуты уровни с первого по третий, а все последующие (четвертый и далее) свернуты.

Часть 2. Исправление ошибок компиляции «Тип не определен»

При программном выводе отчета СКД разработчики иногда копируют готовые процедуры формирования из общих модулей или интернет-ресурсов в модуль формы и получают ошибки следующего вида:

{Отчет.АнализПродажИерархический.Форма.ФормаОтчета.Форма(5,27)}: Тип не определен (КомпоновщикМакетаКомпоновкиДанных)

{Отчет.АнализПродажИерархический.Форма.ФормаОтчета.Форма(7,30)}: Тип не определен (ПроцессорКомпоновкиДанных)

Выясним причину этой проблемы. Данные ошибки указывают на нарушение контекста выполнения кода. Объекты, отвечающие за генерацию и компоновку данных (такие как КомпоновщикМакетаКомпоновкиДанных, ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент), доступны исключительно на стороне сервера. Попытка инициализировать их в процедуре с директивой выполнения &НаКлиенте приводит к ошибке компиляции платформы.

Разберем по шагам правильную структуру вызова процедур формирования отчета на форме:


&НаКлиенте
Процедура СформироватьОтчет(Команда)
    
    // Очищаем табличный документ перед формированием на клиенте
    Результат.Очистить();
    
    // Вызываем серверный контекст для выполнения тяжелых операций компоновки
    СформироватьОтчетНаСервере();
    
    // На клиенте сворачиваем группировки до нужного уровня
    Результат.ПоказатьУровеньГруппировокСтрок(2);
    
КонецПроцедуры

&НаСервере
Процедура СформироватьОтчетНаСервере()
    
    // Получаем схему компоновки данных
    СхемаКомпоновкиДанных = ОтчетОбъект.ПолучитьСхемуКомпоновкиДанных();
     Настройки = Отчет.КомпоновщикНастроек.ПолучитьНастройки();
    
    // На сервере инициализируем объекты СКД
    КомпоновщикМакет = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакет.Выполнить(СхемаКомпоновкиДанных, Настройки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(Результат);
    
    // Выводим результат в ТабличныйДокумент "Результат"
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

Благодаря такому разделению все тяжелые операции СКД происходят на сервере, а клиентская часть отвечает лишь за инициацию процесса и последующее визуальное сворачивание строк.

Часть 3. Скрытие и отображение значков свертки («плюсиков»)

Иногда бизнес-логика требует ограничить пользователя в возможности интерактивно управлять структурой отчета: скрыть кнопки свертки и развертки строк, оставив при этом саму иерархическую структуру («отступы» строк) нетронутой.

Способ 1. Полное скрытие панели группировок

Если необходимо убрать значки «+» и «-» абсолютно для всех строк отчета, у объекта ТабличныйДокумент существует простое свойство ОтображатьГруппировки. По умолчанию оно принимает значение Истина.

Для скрытия всей панели достаточно написать следующую строку кода:

Результат.ОтображатьГруппировки = Ложь;

При этом структура отчета (отступы дочерних элементов) сохранится, но раскрыть или закрыть уровни вручную пользователь больше не сможет.

Способ 2. Выборочное скрытие значка свертки у конкретной группировки

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

Для этого используются методы Разгруппировать() и Сгруппировать() применительно к выбранным областям табличного документа.

Алгоритм скрытия «плюсика» для диапазона строк (Разгруппировать):

Если у вас есть строки определенного уровня (например, документы), которые сгруппированы и имеют слева значок свертки, вы можете программно убрать эту связь. Для этого нужно получить область строк и вызвать метод Разгруппировать(). Строки перестанут быть подчиненной группой, и «плюсик» исчезнет:


// Определяем область строк, у которых нужно убрать возможность свертки
// Параметры метода Область(НачалоСтроки, НачалоКолонки, КонецСтроки, КонецКолонки)
ОбластьСтрок = Результат.Область(10, , 15, ); // Диапазон строк с 10 по 15
ОбластьСтрок.Разгруппировать();

Алгоритм возврата «плюсика» (Сгруппировать):

Если по нажатию кнопки на форме вам требуется вернуть структуру группировок обратно, к той же области строк применяется метод Сгруппировать():


ОбластьСтрок = Результат.Область(10, , 15, );
// Метод Сгруппировать принимает необязательный параметр - Имя группы
ОбластьСтрок.Сгруппировать("ГруппаДокументы");

Реализация динамического переключателя на форме

Проанализируем пример реализации кнопки на форме, которая при первом нажатии скрывает значки свертки для определенных строк, а при повторном — возвращает их обратно. Для этого на форме отчета создадим реквизит типа Булево с именем ГруппировкаСвернута.

Код обработчика команды кнопки на форме будет выглядеть следующим образом:


&НаКлиенте
Процедура ПереключитьОтображениеГруппировки(Команда)
    
    // Переключаем состояние флага
    ГруппировкаСвернута = Не ГруппировкаСвернута;
    
    // Вызываем серверную процедуру для изменения структуры табличного документа
    ПереключитьГруппировкуНаСервере(ГруппировкаСвернута);
    
КонецПроцедуры

&НаСервере
Процедура ПереключитьГруппировкуНаСервере(Знач Свернуть)
    
    // Нам необходимо знать номера строк, которые мы хотим разгруппировать/сгруппировать.
    // В реальном отчете эти номера можно найти поиском по тексту ячеек
    // или при обходе строк во время вывода данных.
    НачалоДиапазона = 8;
    КонецДиапазона = 18;
    
    ОбластьГруппы = Результат.Область(НачалоДиапазона, , КонецДиапазона, );
    
    Если Свернуть Тогда
        // Убираем группировку (удаляем плюсик)
        Попытка
            ОбластьГруппы.Разгруппировать();
        Исключение
            // Исключение может возникнуть, если область уже не сгруппирована
        КонецПопытки;
    Иначе
        // Восстанавливаем группировку (возвращаем плюсик)
        Попытка
            ОбластьГруппы.Сгруппировать("Документы");
        Исключение
             // Обработка возможных ошибок работы с областями
        КонецПопытки;
    КонецЕсли;
    
КонецПроцедуры

Использование связки методов Разгруппировать() и Сгруппировать() совместно со свойством ОтображатьГруппировки предоставляет разработчику полный контроль над интерфейсом и поведением иерархических списков в отчетах любой сложности.

← На главную