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

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

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

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

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

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

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

Как определить, какой метод подходит в вашем случае

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

От ответов зависит маршрут решения. Ошибка на этом этапе приводит к тому, что код, отлично работающий на тестовом толстом клиенте, падает у пользователей на тонком клиенте с ошибкой «Операция не поддерживается».

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

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

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

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

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

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

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

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

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

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

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

// Серверная процедура

Функция ПодключитьОбработку(АдресДвоичныхДанных)

Возврат ВнешниеОбработки.Подключить(АдресДвоичныхДанных, , Ложь);

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

// Клиентская часть

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

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

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

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

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

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

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

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

ПараметрыФормы.Вставить("Организация", ТекущаяОрганизация);

ПараметрыФормы.Вставить("Период", ТекущаяДатаСеанса());

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

ПараметрыФормы, ЭтотОбъект, Новый УникальныйИдентификатор);

Чтобы параметр был доступен в форме, его нужно объявить в палитре параметров формы в конфигураторе внешней обработки (закладка «Параметры» в редакторе формы) с признаком «Ключевой параметр» при необходимости. Передача в структуре параметра, который не объявлен в форме, не вызовет ошибку, но и значение будет недоступно.

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

Получение результата из формы обработки

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

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

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

ПараметрыФормы, ЭтотОбъект, , , , Оповещение,

РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

&НаКлиенте

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

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

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

КонецЕсли;

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

Обратите внимание: процедура-обработчик оповещения обязательно должна быть объявлена с директивой Экспорт, иначе платформа не сможет ее вызвать, и вы получите ошибку «Процедура не обнаружена» в момент закрытия формы.

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

Типичные ошибки и их причины

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

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

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

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

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

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

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

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

Открытие формы под обычным пользователем
Норма

Форма открылась без ошибок прав

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

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

Параметры в открытой форме
Норма

Значения видны в ПриСозданииНаСервере

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

Параметры неопределены — не объявлены в свойствах формы

Повторный вызов
Норма

Поведение соответствует ключу уникальности

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

Открываются дубли окон или активируется чужое окно

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

Итог

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

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

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

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

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

Как открыть форму обработки, встроенной в конфигурацию?

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

Почему ОткрытьФорму выдает ошибку «Форма не найдена»?

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

Как открыть форму внешней обработки модально?

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

Работает ли подключение внешних обработок в фоновом задании?

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

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

Проверьте роль «Интерактивное открытие внешних отчетов и обработок» и настройки профиля группы доступа. Если права давать нельзя, альтернатива — подключить обработку в привилегированном серверном коде и открыть форму, либо встроить функциональность в конфигурацию через расширение.