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