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