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