При переходе с обычных форм на управляемые у многих разработчиков возникает вопрос: как правильно открыть внешнюю обработку (файл .epf) программно? Если в обычных формах достаточно было создать объект и вызвать метод получения формы, то в управляемом приложении (клиент-серверная архитектура) этот процесс требует понимания механизма передачи файлов между клиентом и сервером. Рассмотрим подробно, как решить эту задачу, разберем необходимые методы и проанализируем примеры кода.
Рассмотрим ситуацию, когда у нас есть файл внешней обработки, расположенный на диске (например, на компьютере пользователя или в сетевой папке), и нам необходимо открыть его основную форму по нажатию кнопки в интерфейсе программы. Мы не можем просто создать объект обработки на клиенте, так как тип ВнешняяОбработкаОбъект доступен только на сервере. Кроме того, прямой доступ к файловой системе с сервера может быть ограничен.
Чтобы успешно выполнить задачу, нам предстоит реализовать следующую схему:
ОткрытьФорму.Давайте разберем этот процесс по шагам и напишем универсальный код.
В первую очередь, нам нужно получить двоичные данные файла. Если файл выбирает пользователь, мы используем диалог выбора файла. Если путь известен заранее, мы можем сразу приступить к помещению файла в хранилище. Обратите внимание, что метод ПоместитьВоВременноеХранилище может работать по-разному в зависимости от того, где находится файл.
Разберем пример функции на клиенте, которая инициирует процесс. Предположим, путь к файлу у нас уже есть в переменной АдресФайлаНаДиске.
&НаКлиенте
Процедура ОткрытьВнешнююОбработку(Команда)
АдресФайлаНаДиске = "C:\Обработки\МояОбработка.epf"; // Пример пути
// Помещаем файл во временное хранилище
// Это создает "мост" для передачи данных на сервер
АдресХранилища = "";
ПоместитьФайл(АдресХранилища, АдресФайлаНаДиске, , Ложь);
// Теперь вызываем серверную функцию для подключения
ИмяОбработки = ПодключитьОбработкуНаСервере(АдресХранилища);
// Формируем навигационную ссылку для открытия формы
// Ключ уникальности (последний параметр) важен, чтобы открывать новые окна, а не активировать старые
КлючУникальности = Новый УникальныйИдентификатор;
ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма", , , КлючУникальности);
КонецПроцедуры
В данном примере мы используем метод ПоместитьФайл. В более новых версиях платформы или при работе с асинхронностью следует использовать НачатьПомещениеФайла, однако для понимания сути процесса синхронный вызов более нагляден. Главное, что мы получаем АдресХранилища — строку вида "e1cib/tempstorage/...", по которой сервер сможет найти наш файл.
Теперь перейдем к самой важной части — серверной процедуре. Здесь мы будем использовать менеджер ВнешниеОбработки и его метод Подключить. Этот метод регистрирует обработку в системе на время сеанса и возвращает имя, под которым она была зарегистрирована.
Проанализируем код серверной функции:
&НаСервере
Функция ПодключитьОбработкуНаСервере(АдресХранилища)
// Подключаем обработку, используя адрес во временном хранилище
// Параметр "Ложь" означает небезопасный режим (если обработке нужны полные права)
// В некоторых случаях лучше использовать Истина (БезопасныйРежим)
Попытка
ИмяОбработки = ВнешниеОбработки.Подключить(АдресХранилища, , Ложь);
Исключение
// Если файл "битый" или это не обработка, выводим ошибку
Сообщить("Ошибка подключения обработки: " + ОписаниеОшибки());
Возврат "";
КонецПопытки;
Возврат ИмяОбработки;
КонецФункции
Давайте разберем параметры метода ВнешниеОбработки.Подключить:
Ложь, обработка будет выполняться без ограничений безопасности (сможет писать файлы, обращаться к COM-объектам). Если Истина — возможности будут ограничены профилем безопасности.Начиная с версий платформы 8.3.17 и выше, в 1С усилена защита от опасных действий. Даже если вы укажете БезопасныйРежим = Ложь, система может выдать предупреждение пользователю при попытке подключить внешнюю обработку ("Предупреждение безопасности").
Чтобы программно подавить это (если вы уверены в источнике файла), необходимо использовать объект ПараметрыПодключенияВнешнихОбработок. Рассмотрим, как модифицировать серверный код для новых версий платформ:
&НаСервере
Функция ПодключитьОбработкуНаСервере_V2(АдресХранилища)
// Этот код актуален для свежих релизов платформы 1С
ИмяОбработки = "";
Попытка
// Создаем параметры для подключения
ПараметрыПодключения = ВнешниеОбработки.СоздатьПараметрыПодключенияВнешнейОбработки();
ПараметрыПодключения.БезопасныйРежим = Ложь;
// Отключаем защиту от опасных действий для этой конкретной операции
// Внимание: делайте это только для доверенных файлов!
ПараметрыПодключения.ЗащитаОтОпасныхДействий = Ложь;
ИмяОбработки = ВнешниеОбработки.Подключить(АдресХранилища, , ПараметрыПодключения);
Исключение
Сообщить("Не удалось подключить обработку: " + ОписаниеОшибки());
КонецПопытки;
Возврат ИмяОбработки;
КонецФункции
Часто бывает необходимо не просто открыть форму, но и передать в нее какие-то начальные данные (например, ссылку на документ или дату). Для этого мы используем второй параметр метода ОткрытьФорму.
Посмотрим на пример вызова с параметрами:
&НаКлиенте
Процедура ОткрытьСПараметрами(ИмяОбработки)
// Создаем структуру параметров
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ДатаНачала", НачалоДня(ТекущаяДата()));
ПараметрыФормы.Вставить("Организация", Объект.Организация);
// Открываем форму с параметрами
ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма", ПараметрыФормы);
КонецПроцедуры
В самой внешней обработке, в модуле формы, эти параметры можно будет "поймать" в процедуре ПриСозданииНаСервере.
В процессе реализации данного функционала мы можем столкнуться с рядом ошибок. Разберем наиболее частые из них:
Обычно возникает, если вы пытаетесь передать локальный путь (например, C:\Temp\file.epf) в серверный метод Подключить. Сервер "не видит" диски клиентской машины. Решение: всегда используйте ПоместитьВоВременноеХранилище перед передачей на сервер.
Возникает, если вы пытаетесь вызвать ВнешниеОбработки.Подключить на клиенте. Этот менеджер доступен только на сервере. Решение: вынесите логику подключения в серверную функцию без контекста (&НаСервереБезКонтекста или &НаСервере).
Если у внешней обработки несколько форм, метод ОткрытьФорму по умолчанию откроет ту, которая назначена "Основной". Если нужно открыть конкретную форму, укажите её имя явно: "ВнешняяОбработка." + ИмяОбработки + ".Форма.ФормаНастройки".
Иногда нам не нужно открывать визуальную форму, а требуется лишь выполнить какой-то код из модуля объекта внешней обработки. В этом случае после подключения обработки мы должны создать её объект.
Рассмотрим пример выполнения экспортного метода:
&НаСервере
Процедура ВыполнитьМетодОбработки(АдресХранилища)
ИмяОбработки = ВнешниеОбработки.Подключить(АдресХранилища, , Ложь);
// Создаем объект обработки
ОбъектОбработки = ВнешниеОбработки.Создать(ИмяОбработки);
// Теперь можно вызывать экспортные методы из модуля объекта обработки
// Предположим, в обработке есть процедура "РассчитатьДанные()"
ОбъектОбработки.РассчитатьДанные();
КонецПроцедуры
Таким образом, мы рассмотрели полный цикл работы с внешними файлами обработок в управляемом приложении. Основной принцип, который нужно запомнить: файлы "живут" на клиенте, но исполняются (подключаются) на сервере, а мостом между ними служит временное хранилище.