К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как программно открыть внешнюю обработку в 1С

Как программно открыть внешнюю обработку в 1С: методы ОткрытьФорму и ПолучитьФорму, работа в управляемом и обычном приложении, передача параметров, типичные ошибки.

Внешние обработки (файлы с расширением .epf) часто нужно запускать не вручную через «Файл → Открыть», а из кода: по кнопке в форме документа, по расписанию регламентного задания или из другой обработки. В управляемом приложении для этого используется метод ОткрытьФорму с указанием пути к файлу, в обычном приложении — ПолучитьФорму через объект ВнешниеОбработки.

Главная сложность — различие между управляемым и обычным режимами, а также ограничения безопасного режима и модального вызова. В тонком клиенте и веб-клиенте работа с файловой системой ограничена, поэтому путь к файлу обработки должен быть доступен серверу или передаваться через временное хранилище.

Ниже разобраны рабочие варианты кода для обоих режимов, способы передачи параметров в открываемую обработку, проверка результата и типичные ошибки, из-за которых форма не открывается или падает с исключением.

Базовый принцип: где выполняется код и почему это важно

В клиент-серверной архитектуре 1С код делится на клиентский и серверный. Файл внешней обработки физически лежит на диске, и важно, с какой стороны к нему обращается код. Если файл лежит на компьютере пользователя, а подключение выполняется на сервере, сервер его не увидит — возникнет ошибка «Файл не обнаружен».

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

Открытие внешней обработки в управляемом приложении

Управляемое приложение — основной режим современных конфигураций (УТ 11, ERP, БП 3.0 и другие). Здесь нельзя напрямую открыть файл по пути: сначала обработку нужно подключить на сервере.

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

&НаКлиенте

Процедура ОткрытьОбработку(Команда)

ПутьКФайлу = "C:\Обработки\МояОбработка.epf";

ИмяОбработки = ПодключитьОбработкуНаСервере(ПутьКФайлу);

Если Не ПустаяСтрока(ИмяОбработки) Тогда

ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма");

КонецЕсли;

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

&НаСервереБезКонтекста

Функция ПодключитьОбработкуНаСервере(ПутьКФайлу)

Возврат ВнешниеОбработки.Подключить(ПутьКФайлу, , Ложь);

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

Обратите внимание: путь C:\Обработки\... в этом примере должен существовать на сервере 1С, а не на машине пользователя. Если база файловая, путь совпадает с локальным, и код работает напрямую. Для клиент-серверного варианта файл либо кладут в каталог, доступный серверу, либо передают через временное хранилище.

Передача файла через временное хранилище

Когда файл выбирает пользователь на своём компьютере, а база клиент-серверная, путь к локальному файлу серверу бесполезен. В этом случае файл помещается во временное хранилище методом НачатьПомещениеФайла, а на сервере извлекается из хранилища, записывается во временный файл и подключается.

&НаКлиенте

Процедура ВыбратьИОткрыть(Команда)

НачатьПомещениеФайла(

Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект),

, , Истина, УникальныйИдентификатор);

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

&НаКлиенте

Процедура ПослеПомещенияФайла(Результат, АдресХранилища, ВыбранноеИмя, ДопПараметры) Экспорт

Если Результат Тогда

ИмяОбработки = ПодключитьИзХранилища(АдресХранилища);

ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма");

КонецЕсли;

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

&НаСервереБезКонтекста

Функция ПодключитьИзХранилища(АдресХранилища)

ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);

ИмяФайла = ПолучитьИмяВременногоФайла("epf");

ДвоичныеДанные.Записать(ИмяФайла);

Возврат ВнешниеОбработки.Подключить(ИмяФайла, , Ложь);

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

Такой подход универсален: он работает и в файловой, и в клиент-серверной базе, и не зависит от того, где лежит исходный файл. Платформа сама заботится об очистке временных файлов при завершении сеанса, хотя в нагруженных системах стоит удалять их явно после подключения.

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

Открытие в обычном приложении

В обычном приложении (режим толстого клиента, характерный для конфигураций на платформе 8.2 и ранних версий 8.3) всё проще: код выполняется на клиенте, и файл доступен напрямую. Используется метод ВнешниеОбработки.ПолучитьФорму().

ФормаОбработки = ВнешниеОбработки.ПолучитьФорму("C:\Обработки\МояОбработка.epf");

ФормаОбработки.Открыть();

Метод ПолучитьФорму возвращает объект формы, с которым можно работать до открытия: установить значения реквизитов, вызвать экспортные процедуры. Если нужно не открывать форму, а только выполнить код обработки, используют ВнешниеОбработки.Создать(ПутьКФайлу) — полученный объект позволяет вызывать экспортные методы модуля объекта.

Ограничение обычного приложения — оно работает только в толстом клиенте. Если конфигурация запускается в тонком или веб-клиенте, этот способ недоступен, и нужно применять схему управляемого приложения.

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

Часто обработке нужно передать контекст: ссылку на документ, дату, настройки. В управляемом приложении параметры передаются вторым аргументом ОткрытьФорму в виде структуры. В открываемой обработке они доступны через объект Параметры в обработчике ПриСозданииНаСервере.

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("ДокументОснование", СсылкаНаДокумент);

ПараметрыФормы.Вставить("РежимПросмотра", Истина);

ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма", ПараметрыФормы);

Чтобы форма обработки могла принять параметры, в её модуле должен быть обработчик ПриСозданииНаСервере, где значения читаются из Параметры.ИмяПараметра. Если параметр объявлен ключевым в свойствах формы, он обязателен — без него форма не откроется. Для необязательных параметров проверяйте наличие через Параметры.Свойство("ИмяПараметра").

Получение результата после закрытия обработки

Если внешняя обработка что-то выбирает или рассчитывает, а результат нужен в вызывающем коде, передавайте в ОткрытьФорму описание оповещения. При закрытии формы обработка вызывает Закрыть(Результат), и это значение попадёт в ваш обработчик.

Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияОбработки", ЭтотОбъект);

ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма", , ЭтотОбъект, , , , Оповещение);

&НаКлиенте

Процедура ПослеЗакрытияОбработки(Результат, ДопПараметры) Экспорт

Если Результат <> Неопределено Тогда

// обработка результата

КонецЕсли;

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

Модальное открытие (ОткрытьМодально) в современных конфигурациях запрещено настройками совместимости, поэтому оповещения — единственный корректный способ дождаться результата. Проверяйте свойство конфигурации «Режим использования модальности», если переносите старый код.

Типичные ошибки
01
Вызов ВнешниеОбработки.Подключить() на клиенте в тонком клиенте — метод доступен только на сервере, код падает с ошибкой
02
Передача локального пути пользователя в серверную процедуру в клиент-серверной базе — сервер не видит файл, ошибка «Файл не обнаружен»
03
Открытие формы по имени до подключения обработки — ошибка «Объект не найден», сначала нужен Подключить()
04
Использование ОткрытьМодально при запрещённой модальности в конфигурации — исключение при выполнении
05
Ожидание результата сразу после ОткрытьФорму — вызов асинхронный, результат нужно получать через оповещение

Проверка результата и ограничения

После открытия убедитесь, что форма действительно появилась и обработка работает с нужными данными. Если ОткрытьФорму не выдаёт ошибку, но формы нет, чаще всего причина в том, что у обработки нет основной формы или имя формы указано неверно (по умолчанию она называется «Форма», но разработчик мог назвать её иначе).

Дополнительные ограничения: в безопасном режиме (третий параметр Подключить = Истина) обработке недоступны операции с файловой системой и COM-объектами. В веб-клиенте работа с файлами требует расширения работы с файлами в браузере. Также учитывайте права пользователя: право «Интерактивное открытие внешних обработок» должно быть включено, иначе открытие будет заблокировано.

Контрольные точки

Как проверить результат

Форма обработки открылась
Норма

Форма видна пользователю, реквизиты заполнены переданными параметрами

Тревожный признак

Ошибка «Объект не найден» или форма открылась пустой

Передача параметров
Норма

В ПриСозданииНаСервере обработки Параметры содержат переданные значения

Тревожный признак

Параметры пусты — проверьте имена ключей структуры

Подключение на сервере
Норма

ВнешниеОбработки.Подключить() вернул непустое имя

Тревожный признак

Исключение о недоступности файла или метода

Альтернативы: регистрация в справочнике дополнительных обработок

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

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

Сравнение вариантов

ОткрытьФорму + Подключить по пути

Быстро для разовых задач и отладки; требует доступности файла серверу и прав на внешние обработки

Передача через временное хранилище

Работает в клиент-серверной базе с локальными файлами пользователей; больше кода, расход памяти на передачу

ВнешниеОбработки.ПолучитьФорму

Простой код, но только обычное приложение и толстый клиент

Справочник дополнительных обработок БСП

Промышленный вариант для постоянного использования; требует конфигурации на БСП

Частые вопросы

Можно ли открыть внешнюю обработку без открытия формы, просто выполнить код?

Да. Используйте ВнешниеОбработки.Создать(ПутьКФайлу) — полученный объект позволяет вызывать экспортные процедуры и функции модуля объекта обработки. Форма при этом не создаётся. Это стандартный способ запуска обработок в регламентных заданиях.

Почему возникает ошибка «Метод объекта не обнаружен: Подключить»?

Метод ВнешниеОбработки.Подключить() доступен только на сервере. Если код с этим вызовом выполняется в клиентской процедуре тонкого или веб-клиента, будет такая ошибка. Вынесите подключение в серверную функцию общего модуля или в серверную часть формы.

Как открыть обработку, если у неё форма называется не «Форма»?

Укажите реальное имя формы в строке вызова: «ВнешняяОбработка.ИмяОбработки.Форма.ИмяФормы». Узнать имя можно, открыв обработку в конфигураторе и посмотрев список форм объекта. Если форма назначена основной, достаточно короткого варианта без имени формы.

Работает ли этот способ в веб-клиенте?

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

Как открыть обработку в безопасном режиме?

Передайте третьим параметром ВнешниеОбработки.Подключить(Путь, , Истина) значение Истина — обработка подключится в безопасном режиме. Учтите, что в нём запрещены операции с файловой системой, COM, внешними компонентами, поэтому обработка, использующая эти возможности, будет выдавать ошибки.

Что делать, если у пользователя нет права на открытие внешних обработок?

Нужно включить право «Интерактивное открытие внешних отчетов и обработок» в роли пользователя. Альтернатива — зарегистрировать обработку в справочнике дополнительных обработок БСП: тогда доступ контролируется настройками подсистемы, а не общим правом на внешние файлы.

Итог

Что важно запомнить

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