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

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

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

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

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

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

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

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

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

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

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

Универсальный способ для управляемых форм; не блокирует интерфейс, результат получают через оповещение

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

Блокирует родительскую форму и сразу возвращает результат; не работает в веб-клиенте без настройки, не рекомендуется для новых разработок

Стандартные диалоги (ПоказатьВводЗначения и др.)

Подходят для простых значений — числа, строки, даты; не заменяют открытие произвольной формы

Открываем форму методом ОткрытьФорму: базовый синтаксис

Метод имеет следующие основные параметры: имя формы, структура параметров, владелец, ключ уникальности. Имя формы строится по шаблону: для справочника «Номенклатура» основная форма элемента — Справочник.Номенклатура.Форма.ФормаЭлемента. Если нужна форма, выбранная по умолчанию, достаточно указать Справочник.Номенклатура.ФормаОбъекта — платформа подставит основную форму сама.

Пример кода в обработчике команды формы списка, который открывает карточку текущего элемента:

&НаКлиенте

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

ТекущиеДанные = Элементы.Список.ТекущиеДанные;

Если ТекущиеДанные = Неопределено Тогда

Возврат;

КонецЕсли;

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

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

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

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

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

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

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

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

Пример: открываем форму списка с отбором по контрагенту и передаём произвольный параметр-флаг:

&НаКлиенте

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

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

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

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

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

ПараметрыФормы.Вставить("СкрытьГруппировки", Истина);

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

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

В открываемой форме нестандартный параметр читается так:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Параметры.Свойство("СкрытьГруппировки") И Параметры.СкрытьГруппировки Тогда

Элементы.ГруппаГруппировок.Видимость = Ложь;

КонецЕсли;

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

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

Получаем результат: ожидание закрытия формы через оповещение

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

&НаКлиенте

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

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

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

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

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

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

&НаКлиенте

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

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

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

КонецЕсли;

Склад = Результат;

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

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

Чтобы открываемая форма вернула значение, она должна закрываться вызовом Закрыть(ВыбранноеЗначение). Для форм выбора с установленным РежимВыбора платформа делает это автоматически при двойном щелчке или команде «Выбрать».

Порядок действий для выбора с возвратом результата
  1. 1
    В форме-источнике создайте ОписаниеОповещения с именем процедуры-обработчика
  2. 2
    Вызовите ОткрытьФорму с параметром РежимВыбора = Истина и передайте оповещение седьмым параметром
  3. 3
    В обработчике проверьте результат на Неопределено — пользователь мог закрыть форму без выбора
  4. 4
    Присвойте полученное значение реквизиту формы и при необходимости установите Модифицированность = Истина
  5. 5
    Протестируйте оба сценария: выбор значения и закрытие формы крестиком

Открытие формы внешней обработки и программное создание объекта

Открыть форму внешней обработки из формы конфигурации можно, указав путь к файлу: ОткрытьФорму("ВнешняяОбработка.ИмяОбработки.Форма") — но сначала обработка должна быть подключена через ВнешниеОбработки.Подключить() на сервере или зарегистрирована в справочнике дополнительных отчётов и обработок. Для файловых обработок в толстом клиенте допустим прямой путь к epf-файлу.

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

ЗначенияЗаполнения = Новый Структура;

ЗначенияЗаполнения.Вставить("Организация", Организация);

ЗначенияЗаполнения.Вставить("Контрагент", Контрагент);

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

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

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

Документ при этом ещё не записан в базу — он существует только в открытой форме. Если пользователь закроет её без записи, данные не сохранятся. Это нормальное поведение, но о нём стоит помнить при проектировании сценариев.

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

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

Вторая группа проблем связана с оповещениями: процедура-обработчик без директивы Экспорт не будет найдена, а если форма-источник закрыта раньше открытой — оповещение не сработает. Также нельзя передавать в параметрах формы несериализуемые значения: таблицы значений, COM-объекты, ссылки на временные хранилища, созданные без учёта времени жизни формы. Для таблиц используйте ПоместитьВоВременноеХранилище() и передавайте адрес.

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

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

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

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

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

Форма открывается без ошибок, отображает переданные данные

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

Ошибка 'Форма не найдена' или пустые поля — проверьте имя формы и параметры

Возврат результата
Норма

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

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

Ничего не происходит — проверьте Экспорт у обработчика и вызов Закрыть(Значение)

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

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

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

Открываются дубли окон — передайте четвёртый параметр ОткрытьФорму

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

Как открыть форму списка с отбором по нескольким полям?

Передайте в параметрах структуру Отбор, где ключи — имена полей динамического списка, а значения — искомые данные или массивы для отбора «в списке». Отбор применится к стандартной форме списка автоматически, если поля входят в её запрос.

Можно ли открыть форму и сразу записать объект?

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

Почему оповещение о закрытии не срабатывает?

Три основные причины: процедура-обработчик объявлена без Экспорт; форма-источник закрыта раньше открытой; открываемая форма закрывается без передачи значения и без установленного оповещения на стороне вызова. Проверьте также, что оповещение передано именно седьмым параметром.

Как открыть форму из общего модуля?

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

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

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

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

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

Итог

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

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