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

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

Как открыть обработку из программы в 1С

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

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

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

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

Как выбрать способ открытия обработки

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

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

Маршрут решения

Как выбрать действие

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

Открытие внешней обработки через ОткрытьФорму

Это основной способ для управляемого приложения (тонкий, толстый и веб-клиент). Сначала файл подключается на сервере, затем форма открывается по полному имени.

bsl
&НаСервере
Процедура ПодключитьОбработкуНаСервере()
    АдресХранилища = ВнешниеОбработки.Подключить("C:\Обработки\МояОбработка.epf", , Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьОбработку(Команда)
    ПодключитьОбработкуНаСервере();
    ОткрытьФорму("ВнешняяОбработка.МояОбработка.Форма");
КонецПроцедуры

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

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

Передача параметров и управление открытием

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

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

ОткрытьФорму("ВнешняяОбработка.МояОбработка.Форма", ПараметрыФормы, ЭтотОбъект, Новый УникальныйИдентификатор);

Третий параметр — владелец формы: если передать ЭтотОбъект, открытая обработка закроется вместе с родительской формой. Четвёртый — ключ уникальности: передав новый уникальный идентификатор, вы разрешите открывать несколько экземпляров одной обработки одновременно; без него повторный вызов просто активирует уже открытое окно.

Для модального открытия (когда нужен результат из обработки) используйте ОткрытьФормуМодально() в обычном приложении или ОткрытьФорму() с описанием оповещения о закрытии в управляемом:

bsl
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияОбработки", ЭтотОбъект);
ОткрытьФорму("ВнешняяОбработка.МояОбработка.Форма", , ЭтотОбъект, , , , Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

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

bsl
// Вариант 1: сразу получить и открыть форму
Форма = ВнешниеОбработки.ПолучитьФорму("C:\Обработки\МояОбработка.epf");
Форма.Открыть();

// Вариант 2: работа через объект обработки
Обработка = ВнешниеОбработки.Создать("C:\Обработки\МояОбработка.epf", Ложь);
Форма = Обработка.ПолучитьФорму();
Форма.ОткрытьМодально();

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

Второй параметр Создать() — признак безопасного режима. В безопасном режиме обработке запрещены операции с файловой системой, COM-объектами и внешними компонентами. Перед открытием файла из недоверенного источника включайте безопасный режим.

Открытие обработки из справочника дополнительных отчетов и обработок

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

bsl
&НаСервере
Функция ПодключитьДопОбработку(СсылкаНаОбработку)
    Возврат ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку(СсылкаНаОбработку);
КонецФункции

&НаКлиенте
Процедура ОткрытьДопОбработку(Команда)
    ИмяОбработки = ПодключитьДопОбработку(СсылкаНаЭлементСправочника);
    ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма");
КонецПроцедуры

Такой подход сохраняет контроль прав: если у пользователя нет доступа к элементу справочника, подключение не выполнится. Кроме того, при обновлении обработки администратором код открытия менять не потребуется — ссылка остаётся прежней.

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

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

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

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

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

Окно обработки появилось, параметры переданы корректно

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

Ошибка «Метаданные не найдены» — неверное имя обработки в строке формы

Путь к файлу
Норма

Файл доступен с сервера 1С (для серверного подключения)

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

Ошибка «Файл не обнаружен» — путь указан относительно клиентской машины

Права пользователя
Норма

Обработка открывается под целевой ролью

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

«Нарушение прав доступа» — нет права на внешние обработки или на элемент справочника

Повторное открытие
Норма

Активируется существующее окно или открывается новый экземпляр по ключу уникальности

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

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

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

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

Как открыть обработку, если имя её метаданных неизвестно?

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

Почему ОткрытьФорму работает в файловой базе, но не в клиент-серверной?

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

Можно ли открыть обработку из макета или из двоичных данных?

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

Как открыть обработку модально и получить из неё результат?

В управляемом приложении модальность реализуется через описание оповещения: передайте его в ОткрытьФорму() и установите режим БлокироватьОкноВладельца. Результат вернётся в указанную процедуру при закрытии формы через Закрыть(Результат).

Почему обработка открывается только один раз, а повторный вызов ничего не делает?

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

Итог

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

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