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

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

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

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

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

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

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

Основной способ: метод ОткрытьФорму()

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

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

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

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

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

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

Типичный пример — открытие формы списка с отбором по владельцу:

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

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

Открытие формы конкретного объекта: ОткрытьЗначение()

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

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

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

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

Полный контроль: параметры, владелец, оповещение о закрытии, режим окна. Подходит для подборов, настроек и нестандартных сценариев.

ОткрытьЗначение()

Быстрое открытие карточки существующего объекта по ссылке. Не позволяет передать параметры и получить результат выбора.

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

Только обычные формы (толстый клиент). В управляемом приложении ПолучитьФорму недоступен на клиенте.

Блокирующее открытие и получение результата

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

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

&НаКлиенте
Процедура ПослеВыбораТовара(Результат, ДопПараметры) Экспорт
    Если Результат <> Неопределено Тогда
        Объект.Товар = Результат;
    КонецЕсли;
КонецПроцедуры

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

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

Открытие формы в обычном приложении

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

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

Типичные ошибки и как их избежать

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

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

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

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

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

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

Форма открылась с нужными данными
Норма

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

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

Пустая форма нового объекта или список без отбора — параметры не дошли

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

После закрытия формы срабатывает процедура из ОписаниеОповещения

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

Процедура не вызывается — форма не делает ОповеститьОВыборе или не передан владелец

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

При заданной уникальности активируется существующее окно

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

Открываются дубли окон — уникальность не задана

FAQ

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

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

Почему ОткрытьФорму работает на тонком клиенте, но падает в веб-клиенте?

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

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

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

Можно ли открыть форму из общего модуля?

Да, если общий модуль имеет признак «Клиент (управляемое приложение)» или «Клиент (обычное приложение)». Серверные общие модули открывать формы не могут. Практичный приём — вынести типовые открытия форм в клиентский общий модуль и вызывать их из любых форм конфигурации.

Как закрыть текущую форму и сразу открыть другую?

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

Итог

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

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