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

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

1С: управляемая форма — как открыть внешнюю обработку

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

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

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

Способы открытия внешней обработки: что выбрать

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

Выбор зависит от режима работы. В толстом клиенте обычного приложения доступен прямой вызов ПолучитьФорму с полным путем к файлу. В управляемом приложении (тонкий, веб-клиент) этот путь не работает, потому что форма должна быть известна серверу. Поэтому универсальный вариант — подключить обработку на сервере и открыть ее форму по зарегистрированному имени.

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

ОткрытьФорму по имени после подключения

Универсально для тонкого и веб-клиента; требует серверного вызова ВнешниеОбработки.Создать()

ПолучитьФорму по пути к файлу

Просто, но работает только в толстом клиенте и при доступе к файловой системе

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

Не требует кода и прав разработчика; подходит только для конфигураций на БСП

Открытие через ОткрытьФорму после подключения на сервере

Это основной способ для управляемых форм. Логика такая: на сервере вызывается ВнешниеОбработки.Создать() с путем к файлу или с данными из временного хранилища — этот вызов регистрирует обработку в сеансе. Затем на клиенте вызывается ОткрытьФорму с именем вида «ВнешняяОбработка.ИмяОбработки.Форма» или «ВнешняяОбработка.ИмяОбработки.Форма.ИмяФормы» для неосновной формы.

Имя обработки, которое видит платформа, — это не имя файла на диске, а имя, заданное в свойствах обработки при ее создании в конфигураторе. Если файл называется «ЗагрузкаДанных.epf», а внутреннее имя объекта — «ЗагрузкаДанныхИзExcel», то в ОткрытьФорму нужно указывать именно внутреннее имя. Расхождение этих имен — самая частая причина ошибки «Ошибка при вызове метода контекста (ОткрытьФорму): Недопустимое имя формы».

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

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

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

Передача файла с клиента на сервер

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

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

Открытие обработки, встроенной в конфигурацию или хранящейся в базе

Если обработка добавлена в состав конфигурации (ветка «Обработки» в конфигураторе), никакого подключения не требуется: форма открывается напрямую — ОткрытьФорму("Обработка.ИмяОбработки.Форма"). Это самый надежный вариант, но он требует изменения конфигурации и снятия ее с полной поддержки, что не всегда допустимо.

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

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

Открытие конкретной формы и передача параметров

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

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

Типичные ошибки и их диагностика

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

Ошибка доступа к файлу на сервере возникает, когда путь указывает на диск клиента, а код выполняется на сервере (или наоборот). Признак — в тексте ошибки путь вида «C:\...», который существует только у пользователя. Решение — передача через временное хранилище, а не по пути.

Отдельный случай — отказ в безопасном режиме. Если обработка использует COM-объекты, внешние компоненты или обращение к файловой системе, а подключена с БезопасныйРежим = Истина, она будет падать с ошибками доступа. Либо подключайте без безопасного режима (в файловой базе), либо переписывайте проблемные участки обработки.

Типичные ошибки
01
Указание имени файла вместо внутреннего имени обработки — форма не находится, ошибка при ОткрытьФорму
02
Попытка открыть файл по пути с диска клиента из серверного кода — ошибка доступа к файлу
03
Подключение в одном сеансе и попытка открыть форму в другом — обработка не зарегистрирована
04
Использование модальных методов в конфигурации с запретом модальности — код не выполняется в веб-клиенте

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

Признак успешного открытия — форма обработки появилась на экране, а в ее ПриСозданииНаСервере переданные параметры имеют ожидаемые значения. Если форма открылась, но поля пустые, проверяйте соответствие имен ключей структуры параметров и обращений к ним в модуле формы обработки.

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

Итог

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

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

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

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

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

Почему ОткрытьФорму выдает ошибку «Недопустимое имя формы»?

Чаще всего указано имя файла вместо внутреннего имени объекта обработки либо обработка не подключена в текущем сеансе. Получите имя программно: ВнешниеОбработки.Создать(Путь).Метаданные().Имя — и используйте его в строке вида «ВнешняяОбработка.Имя.Форма».

Как открыть обработку модально, чтобы дождаться результата?

В управляемых формах модальные вызовы часто запрещены. Используйте ОткрытьФорму с описанием оповещения: передайте объект ОписаниеОповещения, и процедура-обработчик выполнится после закрытия формы обработки. Результат обработка возвращает через Закрыть(ЗначениеРезультата).

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

Да, цепочка «временное хранилище — серверное подключение — ОткрытьФорму» работает в веб-клиенте. Ограничения касаются самой обработки: если она обращается к локальным файлам или COM-объектам на клиенте, эти функции в браузере работать не будут.

Чем отличается открытие внешнего отчета (.erf) от обработки (.epf)?

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

Нужны ли пользователю особые права для запуска внешней обработки?

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