Как программно переключить макет СКД в типовой форме отчета БСП?

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

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

Решение через события формы БСП

Рассмотрим по шагам типовой прием, который иногда используется в конфигурациях (например, в 1С:ЗУП 3.1 КОРП). Этот метод позволяет корректно подключить другую схему компоновки данных, сохранив работоспособность механизмов формы.

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

Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
    
    Настройки.События.ПередЗагрузкойНастроекВКомпоновщик = Истина;
    
КонецПроцедуры

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


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

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

Альтернативные варианты реализации

Если смена макета через механизмы БСП вызывает конфликты с интерфейсом или пользовательскими настройками, проанализируем альтернативные подходы:

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

Ограничения платформы и возможные проблемы при переключении

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

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