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