Как получить макет внешней обработки на сервере без контекста в 1С?

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

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

Понимание проблемы

Основная сложность заключается в том, что серверный контекст без доступа к форме не «видит» экземпляр внешней обработки, загруженной в текущем сеансе. Методы платформы для работы с макетами, такие как ПолучитьМакет(), привязаны к объекту обработки. Если мы находимся в процедуре &НаСервереБезКонтекста, у нас нет доступа к переменным формы, хранящим ссылку на объект обработки.

Решение 1: Получение макета через экземпляр обработки (универсальный подход)

Если нам необходимо работать с макетом внешней обработки в процедуре без контекста, мы можем программно подключить эту обработку, создать её экземпляр и извлечь нужный макет. Важно помнить об использовании ОписаниеЗащитыОтОпасныхДействий, чтобы платформа не блокировала выполнение кода.

Рассмотрим пример реализации:


Функция ПолучитьМакетВнешнейОбработки(ПутьКФайлу, ИмяМакета)
    ДвоичныеДанныеОбработки = Новый ДвоичныеДанные(ПутьКФайлу);
    АдресВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеОбработки);
    
    ОписаниеЗащиты = Новый ОписаниеЗащитыОтОпасныхДействий;
    ОписаниеЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь;
    
    // Подключаем внешнюю обработку
    ИмяОбъекта = ВнешниеОбработки.Подключить(АдресВХранилище, , Ложь, ОписаниеЗащиты);
    
    // Создаем экземпляр и получаем макет
    Обработка = ВнешниеОбработки.Создать(ИмяОбъекта);
    Возврат Обработка.ПолучитьМакет(ИмяМакета);
КонецФункции

Решение 2: Получение макета, если мы находимся внутри формы обработки

Если задача стоит в получении макета самой обработки, в форме которой мы сейчас находимся, самым простым и логичным способом является получение объекта через реквизит формы. Поскольку форма имеет контекст, мы можем обратиться к данным объекта на сервере:


// В серверной процедуре с контекстом формы
Процедура ПолучитьМакетДляРаботы()
    ОбъектОбработки = РеквизитФормыВЗначение("Объект");
    Макет = ОбъектОбработки.ПолучитьМакет("ИмяВашегоМакета");
    // Далее передаем нужные данные из макета в процедуру без контекста
КонецПроцедуры

Если макет необходимо передать в процедуру &НаСервереБезКонтекста, выполните получение объекта в процедуре с контекстом, а затем передайте результат (или необходимые данные из макета) параметром в целевую функцию. Это наиболее производительный и безопасный способ, так как он исключает повторное подключение файла обработки.

Важные рекомендации при работе с макетами

  1. Оптимизация производительности: Чтение больших табличных документов (ТабличныйДокумент) на клиенте крайне не рекомендуется. Все манипуляции с чтением макетов и их заполнением следует выполнять исключительно на сервере.
  2. Безопасность: При программном подключении внешних файлов всегда используйте ОписаниеЗащитыОтОпасныхДействий. Это позволит избежать интерактивных запросов платформы, которые невозможны в фоновых процессах или серверных процедурах.
  3. БСП (Библиотека стандартных подсистем): Если обработка подключена к системе как «Дополнительная обработка», используйте штатные функции БСП для получения двоичных данных макета из хранилища. Это предпочтительный путь для типовых конфигураций, так как он избавляет от необходимости работать с файловой системой напрямую.
  4. Передача параметров: Старайтесь передавать в процедуры без контекста не сам объект обработки, а сериализуемые данные. Если вам нужен только макет, передавайте структуру данных или параметры, необходимые для заполнения, а сам макет получайте непосредственно в той серверной функции, где это необходимо.

Следуя этим правилам, вы сможете организовать гибкую и безопасную работу с внешними отчетами и обработками, избегая ошибок доступа к файлам и избыточной нагрузки на сервер.

← На главную