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