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

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

При переходе с обычных форм на управляемые у многих разработчиков возникает вопрос: как правильно открыть внешнюю обработку (файл .epf) программно? Если в обычных формах достаточно было создать объект и вызвать метод получения формы, то в управляемом приложении (клиент-серверная архитектура) этот процесс требует понимания механизма передачи файлов между клиентом и сервером. Рассмотрим подробно, как решить эту задачу, разберем необходимые методы и проанализируем примеры кода.

Постановка задачи и архитектурные особенности

Рассмотрим ситуацию, когда у нас есть файл внешней обработки, расположенный на диске (например, на компьютере пользователя или в сетевой папке), и нам необходимо открыть его основную форму по нажатию кнопки в интерфейсе программы. Мы не можем просто создать объект обработки на клиенте, так как тип ВнешняяОбработкаОбъект доступен только на сервере. Кроме того, прямой доступ к файловой системе с сервера может быть ограничен.

Чтобы успешно выполнить задачу, нам предстоит реализовать следующую схему:

  1. Передать файл обработки с клиента во временное хранилище (чтобы он стал доступен серверу).
  2. На сервере подключить эту обработку, используя данные из временного хранилища.
  3. Получить уникальное имя подключенной обработки.
  4. Вернуть это имя на клиент и использовать метод ОткрытьФорму.

Давайте разберем этот процесс по шагам и напишем универсальный код.

Шаг 1: Подготовка файла и помещение во временное хранилище

В первую очередь, нам нужно получить двоичные данные файла. Если файл выбирает пользователь, мы используем диалог выбора файла. Если путь известен заранее, мы можем сразу приступить к помещению файла в хранилище. Обратите внимание, что метод ПоместитьВоВременноеХранилище может работать по-разному в зависимости от того, где находится файл.

Разберем пример функции на клиенте, которая инициирует процесс. Предположим, путь к файлу у нас уже есть в переменной АдресФайлаНаДиске.


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

КонецПроцедуры

В данном примере мы используем метод ПоместитьФайл. В более новых версиях платформы или при работе с асинхронностью следует использовать НачатьПомещениеФайла, однако для понимания сути процесса синхронный вызов более нагляден. Главное, что мы получаем АдресХранилища — строку вида "e1cib/tempstorage/...", по которой сервер сможет найти наш файл.

Шаг 2: Подключение обработки на сервере

Теперь перейдем к самой важной части — серверной процедуре. Здесь мы будем использовать менеджер ВнешниеОбработки и его метод Подключить. Этот метод регистрирует обработку в системе на время сеанса и возвращает имя, под которым она была зарегистрирована.

Проанализируем код серверной функции:


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

Давайте разберем параметры метода ВнешниеОбработки.Подключить:

Нюанс: Защита от опасных действий

Начиная с версий платформы 8.3.17 и выше, в 1С усилена защита от опасных действий. Даже если вы укажете БезопасныйРежим = Ложь, система может выдать предупреждение пользователю при попытке подключить внешнюю обработку ("Предупреждение безопасности").

Чтобы программно подавить это (если вы уверены в источнике файла), необходимо использовать объект ПараметрыПодключенияВнешнихОбработок. Рассмотрим, как модифицировать серверный код для новых версий платформ:


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

КонецФункции

Передача параметров в открываемую форму

Часто бывает необходимо не просто открыть форму, но и передать в нее какие-то начальные данные (например, ссылку на документ или дату). Для этого мы используем второй параметр метода ОткрытьФорму.

Посмотрим на пример вызова с параметрами:


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

В самой внешней обработке, в модуле формы, эти параметры можно будет "поймать" в процедуре ПриСозданииНаСервере.

Типичные ошибки и их решение

В процессе реализации данного функционала мы можем столкнуться с рядом ошибок. Разберем наиболее частые из них:

  1. Ошибка "Файл не обнаружен" при вызове Подключить.

    Обычно возникает, если вы пытаетесь передать локальный путь (например, C:\Temp\file.epf) в серверный метод Подключить. Сервер "не видит" диски клиентской машины. Решение: всегда используйте ПоместитьВоВременноеХранилище перед передачей на сервер.

  2. Ошибка "Метод объекта не обнаружен (Подключить)".

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

  3. Открывается не та форма.

    Если у внешней обработки несколько форм, метод ОткрытьФорму по умолчанию откроет ту, которая назначена "Основной". Если нужно открыть конкретную форму, укажите её имя явно: "ВнешняяОбработка." + ИмяОбработки + ".Форма.ФормаНастройки".

Использование менеджера внешних обработок для вызова экспортных методов

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

Рассмотрим пример выполнения экспортного метода:


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

Таким образом, мы рассмотрели полный цикл работы с внешними файлами обработок в управляемом приложении. Основной принцип, который нужно запомнить: файлы "живут" на клиенте, но исполняются (подключаются) на сервере, а мостом между ними служит временное хранилище.

← На главную