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