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

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

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

Анализ типовой ошибки при программном управлении

Проанализируем ситуацию, с которой часто сталкиваются разработчики при попытке переопределить структуру отчета в процедуре ПриКомпоновкеРезультата. Попытка управлять группировкой через обращение к коллекциям ВыбранныеПоля или ДоступныеПоляГруппировок не дает желаемого результата:

  1. Коллекция ДоступныеПоляГруппировок хранит метаданные схемы (список полей, по которым в принципе разрешено группировать результат) и предназначена только для чтения.
  2. Коллекция Выбор.Элементы отвечает за состав колонок, выводимых в отчет, но не управляет иерархической структурой строк и таблиц.
  3. Управление выводом конкретного уровня иерархии в СКД осуществляется через свойство Использование самого элемента структуры отчета (ГруппировкаКомпоновкиДанных или строк/колонок таблицы ТаблицаКомпоновкиДанных).

Способ 1. Штатный механизм пользовательских настроек (без программирования)

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

  1. Откроем схему компоновки данных (СКД) нужного отчета и перейдем на вкладку Настройки.
  2. В окне структуры отчета выделим группировку, выводом которой требуется управлять (например, группировку по полю Партия).
  3. В командной панели структуры или в свойствах элемента нажмем кнопку Свойства элемента пользовательских настроек.
  4. В открывшемся диалоге установим флаг Включать в пользовательские настройки.
  5. В поле Режим редактирования выберем значение Быстрый доступ.
  6. При необходимости укажем понятное пользователю представление (например, Выводить партии).

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

Способ 2. Программное управление структурой группировок в СКД

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


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

Посмотрим на пример применения данной процедуры в модуле объекта отчета в предопределенном обработчике ПриКомпоновкеРезультата:


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

Важные особенности взаимодействия настроек

Выясним важный нюанс работы с объектом КомпоновщикНастроек. Если группировка уже добавлена разработчиком в Пользовательские настройки, то прямое изменение свойства КомпоновщикНастроек.Настройки в коде формы будет перезаписано при формировании отчета значениями из коллекции ПользовательскиеНастройки.

В таких случаях управление состоянием элементов выполняется через поиск в коллекции КомпоновщикНастроек.ПользовательскиеНастройки.Элементы по уникальному идентификатору пользовательской настройки (ИдентификаторПользовательскойНастройки).

← На главную