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

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

Как открыть управляемую форму в 1С 8

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

Управляемые формы — основной тип интерфейса в современных конфигурациях 1С 8.3, работающих в режиме управляемого приложения. Открыть такую форму можно из кода на встроенном языке несколькими способами: через ОткрытьФорму, ПолучитьФорму, ОткрытьФормуМодально и механизм оповещений. Выбор метода зависит от того, нужно ли дождаться результата работы формы, передавать ли параметры и где выполняется код — на клиенте или на сервере.

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

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

Какие способы открытия формы существуют

Платформа 1С 8.3 предоставляет несколько методов открытия управляемых форм, и у каждого своё назначение. Основной и рекомендуемый — ОткрытьФорму. Он открывает форму асинхронно, не блокируя интерфейс, и позволяет передать параметры, указать владельца и настроить уникальность.

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

Метод ОткрытьФормуМодально открывает форму в модальном режиме и возвращает результат после её закрытия. Однако модальные вызовы заблокированы в веб-клиенте и считаются устаревшим подходом — вместо них следует использовать ОткрытьФорму с описанием оповещения о закрытии.

Сравнение способов открытия формы

ОткрытьФорму

Универсальный рекомендуемый способ. Асинхронный, поддерживает параметры и оповещения, работает во всех клиентах.

ПолучитьФорму + Открыть

Нужен, если требуется доступ к объекту формы до отображения. Код сложнее, чаще источник ошибок.

ОткрытьФормуМодально

Возвращает результат напрямую, но не работает в веб-клиенте и противоречит современным стандартам разработки.

Как открыть форму методом ОткрытьФорму

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

Имя формы строится по шаблону: тип объекта, имя объекта, затем Форма и имя конкретной формы. Например: «Справочник.Номенклатура.Форма.ФормаЭлемента» или «Документ.РеализацияТоваровУслуг.Форма.ФормаСписка». Если имя формы не указано явно, откроется основная форма объекта: «Справочник.Номенклатура.ФормаОбъекта» или «Справочник.Номенклатура.ФормаСписка».

Пример простого открытия формы списка справочника из клиентской процедуры:

&НаКлиенте

Процедура ОткрытьСписокНоменклатуры(Команда)

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

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

После выполнения этого кода у пользователя откроется форма списка номенклатуры в новом окне или вкладке — в зависимости от настроек клиентского приложения.

1c
&НаКлиенте
Процедура ОткрытьКарточку(Команда)
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Ключ", ТекущийЭлемент);
	ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", ПараметрыФормы);
КонецПроцедуры

Как передать параметры в открываемую форму

Второй параметр метода ОткрытьФорму — структура с параметрами. Самый частый параметр — «Ключ», через который передаётся ссылка на объект, чью форму нужно открыть. Если ключ не передан, откроется форма нового элемента.

Помимо ключа можно передавать произвольные параметры, если в модуле формы они объявлены через конструкцию Параметры.ИмяПараметра в обработчике ПриСозданииНаСервере. Для этого в форме-получателе параметр должен быть описан в палитре свойств формы на закладке «Параметры» — иначе обращение к нему вызовет ошибку.

Пример открытия формы с отбором и дополнительным параметром:

&НаКлиенте

Процедура ОткрытьСОтбором(Команда)

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

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

ОткрытьФорму("Документ.ЗаказПокупателя.ФормаСписка", ПараметрыФормы);

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

Стандартный параметр «Отбор» автоматически применяется к динамическому списку формы — это удобный способ показать пользователю только нужные записи без доработки самой формы.

Как получить результат после закрытия формы

Так как ОткрытьФорму работает асинхронно, код после вызова выполняется сразу, не дожидаясь закрытия формы. Чтобы получить результат — например, выбранное пользователем значение — используется описание оповещения.

Механизм такой: создаётся объект ОписаниеОповещения с именем процедуры-обработчика, который передаётся в ОткрытьФорму седьмым параметром. Когда форма закроется, платформа вызовет указанную процедуру и передаст в неё результат закрытия.

&НаКлиенте

Процедура ВыбратьКонтрагента(Команда)

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

ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", , , , , , Оповещение);

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

&НаКлиенте

Процедура ПослеВыбораКонтрагента(Результат, ДополнительныеПараметры) Экспорт

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

Контрагент = Результат;

КонецЕсли;

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

Обратите внимание: процедура-обработчик должна быть экспортной (с ключевым словом Экспорт), иначе платформа не сможет её вызвать. Форма выбора при закрытии возвращает выбранное значение автоматически; для собственных форм результат возвращается методом Закрыть(ЗначениеРезультата).

Порядок открытия формы с результатом
  1. 1
    Создайте экспортную клиентскую процедуру-обработчик результата
  2. 2
    Сформируйте объект ОписаниеОповещения с именем этой процедуры
  3. 3
    Вызовите ОткрытьФорму, передав оповещение седьмым параметром
  4. 4
    В открываемой форме возвращайте значение через Закрыть(Результат)
  5. 5
    Проверьте в обработчике, что результат не равен Неопределено

Уникальность, владелец и режим открытия окна

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

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

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

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

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

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

Формы общих форм конфигурации открываются по имени «ОбщаяФорма.ИмяФормы». Формы записей регистров сведений — «РегистрСведений.ИмяРегистра.ФормаЗаписи» с передачей ключа записи в параметре «Ключ».

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

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

Как выбрать способ открытия

Нужно просто показать форму без результатаИспользуйте ОткрытьФорму с именем формы и параметрами
Нужен выбранный пользователем результатОткрытьФорму с ОписаниемОповещения и экспортным обработчиком
Нужно заблокировать родительское окноОткрытьФорму с РежимОткрытияОкна.БлокироватьОкноВладельца
Нужно предотвратить дубли оконПередайте параметр Уникальность
Код выполняется на сервереОткрытие невозможно — перенесите вызов в клиентскую процедуру

Как проверить, что форма открылась корректно

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

Полезный приём отладки — временно вывести в обработчике оповещения значение результата через Сообщить() или СообщениеПользователю. Если обработчик не вызывается, первым делом проверьте наличие слова Экспорт и правильность имени процедуры в описании оповещения.

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

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

Форма открывается
Норма

Окно появляется без ошибок, данные соответствуют переданному ключу

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

Ошибка "Форма не найдена" или пустая форма нового элемента вместо существующего

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

Параметры доступны в ПриСозданииНаСервере формы-получателя

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

Ошибка обращения к параметру — он не объявлен в свойствах формы

Оповещение о закрытии
Норма

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

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

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

Работа в веб-клиенте
Норма

Форма открывается и возвращает результат

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

Используется ОткрытьФормуМодально — вызов недоступен

Итог

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

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

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

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

Причина почти всегда в неверно указанном имени формы. Проверьте полный путь: тип объекта, имя объекта, слово «Форма» и точное имя формы из конфигуратора. Убедитесь, что форма существует у объекта, а не переименована или удалена. Для основных форм можно использовать короткие имена: ФормаОбъекта, ФормаСписка, ФормаВыбора.

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

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

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

Передайте в параметрах структуру «ЗначенияЗаполнения» с нужными значениями: ПараметрыФормы.Вставить("ЗначенияЗаполнения", Новый Структура("Организация", ТекОрганизация)). Форма нового объекта автоматически заполнит указанные реквизиты при создании.

Чем заменить ОткрытьФормуМодально в веб-клиенте?

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

Как открыть уже открытую форму, а не создавать дубликат?

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

Как передать в форму несколько значений для отбора списка?

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