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