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

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

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

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

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

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

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

Определите режим: управляемое или обычное приложение

Перед написанием кода нужно понять, в каком режиме работает конфигурация. От этого зависит весь синтаксис открытия формы. Управляемое приложение используется в большинстве современных конфигураций (УТ 11, ERP, БП 3.0, ЗУП 3), обычное — в старых решениях (УТ 10.3, УПП 1.3) и при запуске тонкого клиента в режиме обычного приложения.

Быстрая проверка режима выполняется через свойство конфигурации «Режим использования модальности» и «Основной режим запуска» в конфигураторе. Программно режим можно определить через вычисление выражения Вычислить("ТекущийРежимЗапуска()") в толстом клиенте или по наличию управляемых форм в обработке.

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

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

Глобальный контекст управляемого приложения предоставляет функцию ОткрытьФорму(ИмяФормы, Параметры, Владелец, Уникальность, Окно, НавигационнаяСсылка, ОписаниеОповещенияОЗакрытии, РежимОткрытияОкна). Для внешней обработки имя формы формируется по шаблону: ВнешняяОбработка.<ИмяОбработки>.Форма.<ИмяФормы>, где имя обработки — это имя файла без расширения или имя, заданное при подключении через механизм дополнительных отчетов и обработок.

Пример открытия основной формы обработки «МояОбработка.epf» из модуля формы другого объекта:

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

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

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

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

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

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

ПараметрыФормы.Вставить("РежимВыбора", Истина);

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

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

В открываемой форме параметры читаются так:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Параметры.Свойство("ДокументОснование") Тогда

ДокументОснование = Параметры.ДокументОснование;

КонецЕсли;

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

Получение результата через описание оповещения

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

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

ОткрытьФорму("ВнешняяОбработка.МояОбработка.Форма.Форма", , ЭтотОбъект,

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

&НаКлиенте

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

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

Сообщить("Выбрано: " + Результат);

КонецЕсли;

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

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

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

Обработка = ВнешниеОбработки.Создать("C:\Обработки\МояОбработка.epf");

ФормаОбработки = Обработка.ПолучитьФорму("Форма");

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

Если нужно получить результат выбора, используется модальное открытие — оно допустимо в обычном приложении:

Результат = ФормаОбработки.ОткрытьМодально();

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

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

КонецЕсли;

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

Открытие формы из модуля самой внешней обработки

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

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

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

ПараметрыФормы, ЭтотОбъект);

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

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

Типичные ошибки и их устранение

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

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

Третья группа проблем — открытие формы на сервере. Функции ОткрытьФорму и ПолучитьФорму доступны только на клиенте. Если вызов находится в серверной процедуре, платформа выдаст ошибку. Открытие формы всегда выполняйте в клиентском контексте — в обработчиках команд формы с директивой &НаКлиенте.

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

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

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

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

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

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

Открытие формы
Норма

Форма появляется без ошибок, заголовок соответствует ожидаемому

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

Сообщение «Недопустимое значение» или форма не появляется

Передача параметров
Норма

В ПриСозданииНаСервере Параметры.Свойство() возвращает Истина

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

Параметры пусты — проверьте имя ключа структуры

Возврат результата
Норма

Процедура оповещения вызывается, Результат заполнен

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

Оповещение не срабатывает — проверьте Экспорт и Закрыть(Результат)

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

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

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

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

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

Можно ли открыть форму обработки, лежащей на диске, без сохранения в базу?

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

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

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

Как открыть форму так, чтобы пользователь не мог работать с основным окном?

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

Итог

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

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