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