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

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

Как открыть форму из формы в 1С

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

Открытие одной формы из другой — базовая задача при разработке на платформе 1С:Предприятие 8. Так строятся подборы товаров в документ, выбор значений из справочника, диалоги настройки отчёта и вспомогательные окна с детальной информацией. Для этого используется метод глобального контекста ОткрытьФорму() и его вариации, а также обработчики ожидания результата закрытия.

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

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

Синтаксис метода ОткрытьФорму

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

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

Имя формы строится по шаблону: тип объекта, имя объекта, слово «Форма», имя формы. Если имя формы не указано, откроется форма по умолчанию для данного объекта. Например, ОткрытьФорму("Справочник.Контрагенты.ФормаСписка") и ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаСписка") дадут одинаковый результат, если форма списка назначена основной.

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

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

ПараметрыФормы.Вставить("Организация", Организация);

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

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

ПараметрыФормы, ЭтаФорма);

Передача параметров в открываемую форму

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

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

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

Отбор = Новый Структура;

Отбор.Вставить("Владелец", Контрагент);

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

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

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

ПараметрыФормы, ЭтаФорма);

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

Режимы открытия: независимый, блокирующий, модальный

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

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

ОткрытьФорму("Обработка.ПодборТоваров.Форма.ФормаПодбора",

ПараметрыФормы, ЭтаФорма, , , , ,

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

Сравнение режимов

Независимый

Подходит для справочных окон; пользователь свободно переключается между формами.

БлокироватьОкноВладельца

Стандарт для выбора и подбора; родительская форма недоступна до закрытия дочерней.

БлокироватьВесьИнтерфейс

Для критичных диалогов; блокирует весь сеанс, используйте редко.

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

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

Так как вызов асинхронный, результат выбора или ввода обрабатывается в отдельной процедуре, указанной через ОписаниеОповещения. Это седьмой параметр метода. В описании оповещения задаётся имя процедуры, модуль (ЭтаФорма) и, при необходимости, структура дополнительных параметров.

&НаКлиенте

Процедура ПодборНажатие(Команда)

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

ОткрытьФорму("Обработка.ПодборТоваров.Форма.ФормаПодбора",

, ЭтаФорма, , , , Оповещение,

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

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

&НаКлиенте

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

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

Возврат; // пользователь закрыл форму без выбора

КонецЕсли;

Для Каждого Строка Из Результат.Товары Цикл

НоваяСтрока = Объект.Товары.Добавить();

НоваяСтрока.Номенклатура = Строка.Номенклатура;

НоваяСтрока.Количество = Строка.Количество;

КонецЦикла;

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

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

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

Открытие формы конкретного объекта

Чтобы открыть форму существующего элемента справочника или документа, передайте параметр Ключ со ссылкой на объект. Платформа сама определит, какую форму использовать, если основная форма объекта назначена в конфигурации.

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

ПараметрыФормы.Вставить("Ключ", ТекущийДоговор);

ОткрытьФорму("Справочник.Договоры.ФормаОбъекта",

ПараметрыФормы, ЭтаФорма);

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

Уникальность (четвёртый параметр) управляет повторным открытием: если передать Истина или уникальный ключ, повторный вызов с тем же ключом не откроет вторую копию, а активирует уже открытую форму. Это полезно, чтобы не плодить одинаковые окна одного и того же объекта.

Альтернативы: оповещения и обработка выбора

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

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

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

Как выбрать механизм

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

Типичные ошибки и ограничения

Самая частая ошибка — попытка получить результат сразу после вызова ОткрытьФорму(). Код продолжает выполняться, форма ещё не закрыта, и переменная остаётся пустой. Результат доступен только в процедуре, указанной в описании оповещения.

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

Третья проблема — отсутствие владельца. Если не передать ЭтаФорма владельцем, дочернее окно не закроется при закрытии родительского, а штатные оповещения между формами работать не будут. Также помните, что ОткрытьФорму() доступен только на клиенте: вызов из серверной процедуры невозможен, логику нужно выносить в клиентский контекст.

Типичные ошибки
01
Ожидание результата сразу после ОткрытьФорму — вызов асинхронный, данные приходят только в процедуру оповещения
02
Опечатка в имени формы — исключение при вызове; сверяйте имя с конфигуратором
03
Отсутствие владельца — дочернее окно не закрывается с родительским и не участвует в оповещениях
04
Вызов ОткрытьФорму на сервере — метод доступен только в клиентском контексте
05
Передача ДанныеФормыСтруктура через Закрыть() — преобразуйте данные в структуру

Проверка результата и отладка

После внедрения сценария проверьте три ветки поведения: пользователь сделал выбор и закрыл форму, пользователь закрыл форму без выбора (крестик, Esc), пользователь повторно нажал кнопку открытия при уже открытой форме. Во втором случае в обработчик придёт Неопределено — без проверки на это значение код упадёт с ошибкой.

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

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

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

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

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

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

Исключение об имени формы или пустые параметры

Результат закрытия
Норма

В процедуру оповещения приходит ожидаемая структура или Неопределено при отмене

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

Ошибка обращения к полям Неопределено

Повторное открытие
Норма

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

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

Открываются дубликаты одного окна

Итог

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

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

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

Как открыть форму и дождаться её закрытия, как в обычных формах?

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

Почему параметры не попадают в открываемую форму?

Чаще всего параметры читаются не в том обработчике: они доступны в ПриСозданииНаСервере через объект Параметры. Также проверьте, что структура передаётся именно вторым параметром метода, а не смещена из-за пропущенных запятых.

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

Передайте в параметрах структуру ЗначенияЗаполнения с нужными реквизитами или параметр Основание со ссылкой на документ-основание, если в конфигурации реализовано заполнение на основании через ОбработкаЗаполнения.

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

Нет, ОткрытьФорму доступен только на клиенте. Если данные для параметров готовятся на сервере, сделайте серверную функцию, которая вернёт структуру параметров, а сам вызов выполните в клиентской процедуре после её завершения.

Как запретить открытие нескольких копий одной формы?

Передайте четвёртым параметром значение уникальности: Истина или произвольный уникальный ключ (например, ссылку на объект). Повторный вызов с тем же ключом активирует уже открытую форму вместо создания новой.

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

Ничего возвращать не нужно: при закрытии формы крестиком или клавишей Esc в обработчик оповещения автоматически приходит Неопределено. Достаточно в начале обработчика проверить Результат на Неопределено и завершить выполнение.