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