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