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

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

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

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

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

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

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

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

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

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

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

Сравнение вариантов

ОткрытьФорму без блокировки

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

ОткрытьФорму с БлокироватьОкноВладельца

Подходит для подбора и диалогов. Результат возвращается через ОписаниеОповещения.

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

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

Базовый вызов: ОткрытьФорму с параметрами

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

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

&НаКлиенте

Процедура ПоказатьЭлементы(Команда)

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

ПараметрыФормы.Вставить("Отбор", Новый Структура("Владелец", ТекущийВладелец));

ОткрытьФорму("Справочник.ЕдиницыИзмерения.ФормаСписка", ПараметрыФормы, ЭтотОбъект);

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

Третий параметр — владелец формы. Указание ЭтотОбъект связывает окна: при закрытии родителя закроется и дочерняя форма, а также появится возможность получать оповещения. Четвёртый параметр — ключ уникальности: если передать ссылку или строку, повторный вызов с тем же ключом не откроет дубликат окна, а активирует существующее.

Открытие формы объекта и создание нового элемента

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

&НаКлиенте

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

ПараметрыФормы = Новый Структура("Ключ", ВыбраннаяСсылка);

ОткрытьФорму("Документ.РеализацияТоваров.ФормаОбъекта", ПараметрыФормы);

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

Для создания нового элемента с предзаполнением используется параметр ЗначенияЗаполнения. В открываемой форме эти значения попадут в обработчик ОбработкаЗаполнения на сервере. Так удобно вводить документы на основании или новые элементы справочника с уже заданным владельцем:

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

ПараметрыФормы.Вставить("ЗначенияЗаполнения",

Новый Структура("Владелец, Наименование", Контрагент, "Основной договор"));

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

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

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

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

&НаКлиенте

Процедура ПодобратьТовар(Команда)

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

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

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

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

&НаКлиенте

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

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

Объект.Товар = Результат;

КонецЕсли;

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

В форме выбора достаточно в обработчике выбора написать ОповеститьОВыборе(ВыбранноеЗначение) — платформа сама закроет форму и передаст значение в обработчик. Если нужно вернуть произвольную структуру (несколько полей), используйте Закрыть(СтруктураРезультата).

Обратите внимание: процедура-обработчик оповещения должна быть с ключевым словом Экспорт и иметь два параметра — результат и дополнительные параметры. Отсутствие Экспорт — одна из самых частых причин ошибки «процедура не обнаружена».

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

Модальный вызов и почему его избегают

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

Результат = ОткрытьФормуМодально("Справочник.Номенклатура.ФормаВыбора", , ЭтотОбъект);

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

Объект.Товар = Результат;

КонецЕсли;

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

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

Обмен данными без закрытия формы

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

// В форме подбора при выборе строки

Оповестить("ПодборНоменклатуры", ТекущаяСтрока.Номенклатура, ЭтотОбъект);

// В форме документа

&НаКлиенте

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

Если ИмяСобытия = "ПодборНоменклатуры" Тогда

ДобавитьСтрокуТовара(Параметр);

КонецЕсли;

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

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

Типичные ошибки и их признаки

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

Вторая группа ошибок — потеря результата: форма открылась, но обработчик не срабатывает. Причины почти всегда в отсутствии Экспорт у процедуры, неверном числе параметров обработчика или в том, что форма закрывается без ОповеститьОВыборе и Закрыть(Результат) — тогда в обработчик приходит Неопределено.

Третья проблема — обращение к реквизитам открытой формы напрямую. В управляемом приложении нельзя получить форму и прочитать её поля как в обычном приложении; обмен данными идёт только через параметры при открытии, оповещения и контекст сервера.

Типичные ошибки
01
Нет Экспорт у процедуры-обработчика оповещения — ошибка «процедура не обнаружена» при закрытии формы
02
Не передан владелец ЭтотОбъект — ОповеститьОВыборе не доходит до родителя, результат теряется
03
Не задан ключ уникальности — открываются дубли одних и тех же окон
04
Используется ОткрытьФормуМодально при запрещённой модальности — исключение при вызове
05
Нет проверки результата на Неопределено — ошибка, когда пользователь закрыл форму без выбора
Контрольные точки

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

Открытие формы
Норма

Форма открылась с нужным отбором или заполнением

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

Ошибка «форма не найдена» или пустой список без отбора

Возврат значения
Норма

После выбора обработчик получает значение и заполняет реквизит

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

Обработчик не вызывается или приходит Неопределено

Блокировка интерфейса
Норма

Родительское окно недоступно до закрытия дочернего

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

Можно переключиться обратно, минуя диалог выбора

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

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

Получите ссылку из текущей строки табличной части (Элементы.Товары.ТекущиеДанные.Номенклатура) и передайте её в параметре Ключ при вызове ОткрытьФорму или просто выполните ОткрытьЗначение(Ссылка). Второй способ короче, если не нужны дополнительные параметры.

Можно ли открыть форму на сервере?

Нет. ОткрытьФорму доступен только на клиенте, потому что это интерактивная операция с интерфейсом. Серверные процедуры могут лишь подготовить данные (структуру параметров), а сам вызов выполняется в клиентском контексте.

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

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

Почему ОповеститьОВыборе не работает?

Проверьте три вещи: при открытии указан владелец (ЭтотОбъект), у формы выбора не сброшено свойство «РежимОткрытияОкна» в неподходящее значение, и в обработчике оповещения родителя вы действительно обрабатываете именно выбор, а не только событие по имени. Для форм выбора также убедитесь, что вызов идёт через механизм выбора, а не обычное закрытие.

Как открыть одну и ту же форму только один раз?

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

Чем отличается Закрыть(Результат) от ОповеститьОВыборе?

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

Итог

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

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