Разработка и Конфигурация · 12 мин
Как программно открыть внешнюю обработку в 1С
Как программно открыть внешнюю обработку в 1С: методы ОткрытьФорму и ПолучитьФорму, работа в управляемом и обычном приложении, передача параметров, типичные ошибки.
Внешние обработки (файлы с расширением .epf) часто нужно запускать не вручную через «Файл → Открыть», а из кода: по кнопке в форме документа, по расписанию регламентного задания или из другой обработки. В управляемом приложении для этого используется метод ОткрытьФорму с указанием пути к файлу, в обычном приложении — ПолучитьФорму через объект ВнешниеОбработки.
Главная сложность — различие между управляемым и обычным режимами, а также ограничения безопасного режима и модального вызова. В тонком клиенте и веб-клиенте работа с файловой системой ограничена, поэтому путь к файлу обработки должен быть доступен серверу или передаваться через временное хранилище.
Ниже разобраны рабочие варианты кода для обоих режимов, способы передачи параметров в открываемую обработку, проверка результата и типичные ошибки, из-за которых форма не открывается или падает с исключением.
Базовый принцип: где выполняется код и почему это важно
В клиент-серверной архитектуре 1С код делится на клиентский и серверный. Файл внешней обработки физически лежит на диске, и важно, с какой стороны к нему обращается код. Если файл лежит на компьютере пользователя, а подключение выполняется на сервере, сервер его не увидит — возникнет ошибка «Файл не обнаружен».
Поэтому типовая схема в управляемом приложении двухэтапная: на клиенте файл помещается во временное хранилище (или путь известен серверу), на сервере обработка подключается методом ВнешниеОбработки.Подключить(), который возвращает имя подключенной обработки, и уже по этому имени открывается форма.
Открытие внешней обработки в управляемом приложении
Управляемое приложение — основной режим современных конфигураций (УТ 11, ERP, БП 3.0 и другие). Здесь нельзя напрямую открыть файл по пути: сначала обработку нужно подключить на сервере.
Последовательность такая. На клиенте получаем путь к файлу или помещаем файл во временное хранилище. Затем вызываем серверную функцию, которая выполняет ВнешниеОбработки.Подключить() и возвращает имя подключенной обработки. После этого на клиенте вызываем ОткрытьФорму с именем вида «ВнешняяОбработка.ИмяОбработки.Форма».
&НаКлиенте
Процедура ОткрытьОбработку(Команда)
ПутьКФайлу = "C:\Обработки\МояОбработка.epf";
ИмяОбработки = ПодключитьОбработкуНаСервере(ПутьКФайлу);
Если Не ПустаяСтрока(ИмяОбработки) Тогда
ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма");
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПодключитьОбработкуНаСервере(ПутьКФайлу)
Возврат ВнешниеОбработки.Подключить(ПутьКФайлу, , Ложь);
КонецФункции
Обратите внимание: путь C:\Обработки\... в этом примере должен существовать на сервере 1С, а не на машине пользователя. Если база файловая, путь совпадает с локальным, и код работает напрямую. Для клиент-серверного варианта файл либо кладут в каталог, доступный серверу, либо передают через временное хранилище.
Передача файла через временное хранилище
Когда файл выбирает пользователь на своём компьютере, а база клиент-серверная, путь к локальному файлу серверу бесполезен. В этом случае файл помещается во временное хранилище методом НачатьПомещениеФайла, а на сервере извлекается из хранилища, записывается во временный файл и подключается.
&НаКлиенте
Процедура ВыбратьИОткрыть(Команда)
НачатьПомещениеФайла(
Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект),
, , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, АдресХранилища, ВыбранноеИмя, ДопПараметры) Экспорт
Если Результат Тогда
ИмяОбработки = ПодключитьИзХранилища(АдресХранилища);
ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма");
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПодключитьИзХранилища(АдресХранилища)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
ИмяФайла = ПолучитьИмяВременногоФайла("epf");
ДвоичныеДанные.Записать(ИмяФайла);
Возврат ВнешниеОбработки.Подключить(ИмяФайла, , Ложь);
КонецФункции
Такой подход универсален: он работает и в файловой, и в клиент-серверной базе, и не зависит от того, где лежит исходный файл. Платформа сама заботится об очистке временных файлов при завершении сеанса, хотя в нагруженных системах стоит удалять их явно после подключения.
- 1Определите режим работы: управляемое или обычное приложение, файловая или клиент-серверная база
- 2Убедитесь, что файл .epf доступен серверу, или передайте его через временное хранилище
- 3На сервере вызовите ВнешниеОбработки.Подключить() и получите имя обработки
- 4На клиенте вызовите ОткрытьФорму с именем вида ВнешняяОбработка.Имя.Форма
- 5Проверьте, что форма открылась и обработка выполняет ожидаемое действие
Открытие в обычном приложении
В обычном приложении (режим толстого клиента, характерный для конфигураций на платформе 8.2 и ранних версий 8.3) всё проще: код выполняется на клиенте, и файл доступен напрямую. Используется метод ВнешниеОбработки.ПолучитьФорму().
ФормаОбработки = ВнешниеОбработки.ПолучитьФорму("C:\Обработки\МояОбработка.epf");
ФормаОбработки.Открыть();
Метод ПолучитьФорму возвращает объект формы, с которым можно работать до открытия: установить значения реквизитов, вызвать экспортные процедуры. Если нужно не открывать форму, а только выполнить код обработки, используют ВнешниеОбработки.Создать(ПутьКФайлу) — полученный объект позволяет вызывать экспортные методы модуля объекта.
Ограничение обычного приложения — оно работает только в толстом клиенте. Если конфигурация запускается в тонком или веб-клиенте, этот способ недоступен, и нужно применять схему управляемого приложения.
Передача параметров в открываемую обработку
Часто обработке нужно передать контекст: ссылку на документ, дату, настройки. В управляемом приложении параметры передаются вторым аргументом ОткрытьФорму в виде структуры. В открываемой обработке они доступны через объект Параметры в обработчике ПриСозданииНаСервере.
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ДокументОснование", СсылкаНаДокумент);
ПараметрыФормы.Вставить("РежимПросмотра", Истина);
ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма", ПараметрыФормы);
Чтобы форма обработки могла принять параметры, в её модуле должен быть обработчик ПриСозданииНаСервере, где значения читаются из Параметры.ИмяПараметра. Если параметр объявлен ключевым в свойствах формы, он обязателен — без него форма не откроется. Для необязательных параметров проверяйте наличие через Параметры.Свойство("ИмяПараметра").
Получение результата после закрытия обработки
Если внешняя обработка что-то выбирает или рассчитывает, а результат нужен в вызывающем коде, передавайте в ОткрытьФорму описание оповещения. При закрытии формы обработка вызывает Закрыть(Результат), и это значение попадёт в ваш обработчик.
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияОбработки", ЭтотОбъект);
ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма", , ЭтотОбъект, , , , Оповещение);
&НаКлиенте
Процедура ПослеЗакрытияОбработки(Результат, ДопПараметры) Экспорт
Если Результат <> Неопределено Тогда
// обработка результата
КонецЕсли;
КонецПроцедуры
Модальное открытие (ОткрытьМодально) в современных конфигурациях запрещено настройками совместимости, поэтому оповещения — единственный корректный способ дождаться результата. Проверяйте свойство конфигурации «Режим использования модальности», если переносите старый код.
Проверка результата и ограничения
После открытия убедитесь, что форма действительно появилась и обработка работает с нужными данными. Если ОткрытьФорму не выдаёт ошибку, но формы нет, чаще всего причина в том, что у обработки нет основной формы или имя формы указано неверно (по умолчанию она называется «Форма», но разработчик мог назвать её иначе).
Дополнительные ограничения: в безопасном режиме (третий параметр Подключить = Истина) обработке недоступны операции с файловой системой и COM-объектами. В веб-клиенте работа с файлами требует расширения работы с файлами в браузере. Также учитывайте права пользователя: право «Интерактивное открытие внешних обработок» должно быть включено, иначе открытие будет заблокировано.
Как проверить результат
Форма видна пользователю, реквизиты заполнены переданными параметрами
Ошибка «Объект не найден» или форма открылась пустой
В ПриСозданииНаСервере обработки Параметры содержат переданные значения
Параметры пусты — проверьте имена ключей структуры
ВнешниеОбработки.Подключить() вернул непустое имя
Исключение о недоступности файла или метода
Альтернативы: регистрация в справочнике дополнительных обработок
Если обработка используется постоянно, программное открытие по пути к файлу — не лучший вариант. В конфигурациях на БСП (Библиотека стандартных подсистем) есть справочник «Дополнительные отчеты и обработки»: файл загружается в базу один раз, и обработка запускается из интерфейса или программно через подсистему ДополнительныеОтчетыИОбработки.
Такой подход снимает проблему доступности файла, централизует права доступа и позволяет привязывать обработки к командам форм. Программный запуск выполняется через получение ссылки на элемент справочника и вызов методов подсистемы, без работы с файловой системой вообще.
Сравнение вариантов
Быстро для разовых задач и отладки; требует доступности файла серверу и прав на внешние обработки
Работает в клиент-серверной базе с локальными файлами пользователей; больше кода, расход памяти на передачу
Простой код, но только обычное приложение и толстый клиент
Промышленный вариант для постоянного использования; требует конфигурации на БСП
Частые вопросы
Можно ли открыть внешнюю обработку без открытия формы, просто выполнить код?
Да. Используйте ВнешниеОбработки.Создать(ПутьКФайлу) — полученный объект позволяет вызывать экспортные процедуры и функции модуля объекта обработки. Форма при этом не создаётся. Это стандартный способ запуска обработок в регламентных заданиях.
Почему возникает ошибка «Метод объекта не обнаружен: Подключить»?
Метод ВнешниеОбработки.Подключить() доступен только на сервере. Если код с этим вызовом выполняется в клиентской процедуре тонкого или веб-клиента, будет такая ошибка. Вынесите подключение в серверную функцию общего модуля или в серверную часть формы.
Как открыть обработку, если у неё форма называется не «Форма»?
Укажите реальное имя формы в строке вызова: «ВнешняяОбработка.ИмяОбработки.Форма.ИмяФормы». Узнать имя можно, открыв обработку в конфигураторе и посмотрев список форм объекта. Если форма назначена основной, достаточно короткого варианта без имени формы.
Работает ли этот способ в веб-клиенте?
Да, схема с подключением на сервере и ОткрытьФорму работает в веб-клиенте. Ограничение касается только доступа к файлам: для помещения файла в хранилище потребуется расширение работы с файлами в браузере, либо файл должен быть заранее доступен серверу.
Как открыть обработку в безопасном режиме?
Передайте третьим параметром ВнешниеОбработки.Подключить(Путь, , Истина) значение Истина — обработка подключится в безопасном режиме. Учтите, что в нём запрещены операции с файловой системой, COM, внешними компонентами, поэтому обработка, использующая эти возможности, будет выдавать ошибки.
Что делать, если у пользователя нет права на открытие внешних обработок?
Нужно включить право «Интерактивное открытие внешних отчетов и обработок» в роли пользователя. Альтернатива — зарегистрировать обработку в справочнике дополнительных обработок БСП: тогда доступ контролируется настройками подсистемы, а не общим правом на внешние файлы.
Что важно запомнить
В управляемом приложении внешняя обработка открывается в два шага: подключение на сервере через ВнешниеОбработки.Подключить() и ОткрытьФорму на клиенте. Файл должен быть доступен серверу или передан через временное хранилище. Результат из обработки получают через оповещение о закрытии, а для постоянного использования обработку лучше зарегистрировать в справочнике дополнительных обработок.