Как получить форму внешней обработки в 1С на управляемых формах без предварительного интерактивного открытия?

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

При интеграции различных внешних сервисов (например, сервисов электронного документооборота СБИС) разработчики часто сталкиваются с необходимостью вызывать экспортные функции формы или модуля внешней обработки из своего кода. Однако при попытке прямого вызова ПолучитьФорму возникает ошибка: Неизвестное имя формы. При этом, если пользователь хотя бы один раз за сеанс открыл нужную внешнюю обработку вручную через интерфейс, последующие программные вызовы начинают работать корректно. Разберем причины такого поведения платформы 1С и рассмотрим правильные варианты решения этой задачи.

Выясним причину ошибки платформы

Проанализируем, почему платформа 1С не может найти форму по строке вида ВнешняяОбработка.СБИС.Форма.ВнешнийИнтерфейс сразу после запуска программы.

Когда обработка добавлена в информационную базу (например, в справочник ДополнительныеОтчетыИОбработки) или хранится в виде двоичных данных, платформа 1С на момент старта клиентского сеанса ничего не знает о составе ее метаданных и форм. Регистрация нового типа внешней обработки происходит динамически только в момент фактической загрузки файла обработки в память текущего сеанса.

Если обработка не была открыта пользователем интерактивно или не подключена программно, во временной коллекции метаданных текущего сеанса тип ВнешняяОбработка.<Имя> попросту отсутствует. Именно поэтому функция ПолучитьФорму завершается аварийно.

Способ 1. Программное подключение через Библиотеку Стандартных Подсистем (БСП)

Если конфигурация разработана на основе БСП и внешняя обработка уже зарегистрирована в справочнике ДополнительныеОтчетыИОбработки, рассмотрим наиболее универсальный и рекомендуемый путь.

В БСП реализован специальный механизм, который извлекает двоичные данные обработки из базы, регистрирует ее во временном хранилище сеанса и возвращает уникальное системное имя для обращения к объекту.

Разберем по шагам, как построить логику работы:

  1. На сервере получаем ссылку на элемент справочника дополнительных обработок и вызываем метод подключения БСП.
  2. Возвращенное имя подключения передаем на клиент.
  3. На клиенте формируем полное имя формы и открываем ее либо вызываем требуемые экспортные методы.

Посмотрим на пример реализации кода:


&НаСервере
Функция ПодключитьОбработкуНаСервере(СсылкаНаОбработку)
    // Подключаем внешнюю обработку средствами БСП
    ИмяПодключения = ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку(СсылкаНаОбработку);
    Возврат ИмяПодключения;
КонецФункции

&НаКлиенте
Процедура ВыполнитьДействиеВнешнейОбработки(Команда)
    // 1. Получаем имя подключенной обработки
    ИмяПодключения = ПодключитьОбработкуНаСервере(СсылкаНаВнешнююОбработку);
    
    // 2. Формируем путь к нужной форме
    ИмяФормы = "ВнешняяОбработка." + ИмяПодключения + ".Форма.ВнешнийИнтерфейс";
    
    // 3. Получаем форму и вызываем экспортный метод
    ФормаОбработки = ПолучитьФорму(ИмяФормы);
    Кэш = ФормаОбработки.сбисПодготовитьКэш();
КонецПроцедуры

Подсистема БСП автоматически кэширует подключенные обработки. Поэтому повторный вызов метода ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку в рамках одного и того же сеанса выполняется мгновенно без повторного чтения файла.

Способ 2. Подключение внешнего файла напрямую средствами платформы 1С

Рассмотрим ситуацию, когда конфигурация не содержит БСП либо внешняя обработка хранится во внешнем файле на диске или в специальном реквизите типа ХранилищеЗначения.

В этом случае необходимо использовать методы глобального контекста ВнешниеОбработки.Подключить на стороне сервера. Разберем по шагам:

  1. Если обработка хранится в базе в виде двоичных данных, выгружаем ее во временный файл на сервере с помощью ПолучитьИмяВременногоФайла("epf").
  2. Вызываем метод ВнешниеОбработки.Подключить, передавая путь к файлу. Метод регистрирует обработку и возвращает строковый идентификатор.
  3. Удаляем временный файл с диска через УдалитьФайлы, так как после регистрации файл платформе больше не требуется.
  4. Возвращаем идентификатор на клиент и получаем форму стандартным методом ПолучитьФорму.

Посмотрим на пример серверного и клиентского кода:


&НаСервере
Функция ЗарегистрироватьОбработкуИзФайла(ДвоичныеДанныеОбработки)
    ВременныйФайл = ПолучитьИмяВременногоФайла("epf");
    ДвоичныеДанныеОбработки.Записать(ВременныйФайл);
    
    // Подключаем внешнюю обработку в сеансе (безопасный режим = Ложь для интеграционных задач)
    ИмяПодключения = ВнешниеОбработки.Подключить(ВременныйФайл, , Ложь);
    
    // Удаляем временный файл
    УдалитьФайлы(ВременныйФайл);
    
    Возврат ИмяПодключения;
КонецФункции

&НаКлиенте
Процедура ОткрытьФормуВнешнейОбработки()
    ИмяПодключения = ЗарегистрироватьОбработкуИзФайла(ПолучитьДвоичныеДанныеОбработкиНаСервере());
    
    ИмяФормы = "ВнешняяОбработка." + ИмяПодключения + ".Форма.ВнешнийИнтерфейс";
    ФормаИнтерфейса = ПолучитьФорму(ИмяФормы);
    ФормаИнтерфейса.Открыть();
КонецПроцедуры

Важные нюансы работы с безопасным режимом и сеансами

При реализации вызовов внешних обработок обратим внимание на следующие технические особенности:

  1. Безопасный режим: Внешние обработки интеграции (СБИС, Диадок и др.) часто используют работу с файловой системой, криптографическими утилитами, COM-объектами или внешними компонентами. Если при вызове метода Подключить включен безопасный режим (БезопасныйРежим = Истина), эти операции будут заблокированы платформой. Для интеграционных обработок безопасный режим, как правило, отключают, передавая Ложь.
  2. Область действия подключения: Любое подключение внешней обработки действует исключительно в рамках текущего клиент-серверного сеанса. При перезапуске программы регистрацию необходимо выполнять заново.
  3. Вызов серверных методов: Если требуемая функциональность находится не в форме, а в модуле объекта обработки, то получать саму форму необязательно. Достаточно после регистрации создать объект с помощью ВнешниеОбработки.Создать(ИмяПодключения) и вызвать требуемую экспортную процедуру модуля.
← На главную