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

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

Как открыть управляемую форму в 1С

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

Управляемые формы — основа интерфейса современных конфигураций 1С на платформе 8.2 и 8.3. В отличие от обычных форм, они создаются на сервере, а на клиент передаётся только их описание, поэтому способы открытия и передачи данных между формами устроены иначе. Разработчику важно понимать, какой метод выбрать: простое программное открытие, открытие с параметрами, модальный вызов или асинхронное ожидание результата.

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

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

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

Главный инструмент — метод ОткрытьФорму(), доступный в клиентском контексте. В простейшем виде достаточно указать полное имя формы:

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

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

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

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

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

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

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

ПараметрыФормы, ЭтаФорма, Новый УникальныйИдентификатор);

Метод возвращает ссылку на открытую форму. Если форма с таким же ключом уникальности уже открыта, вместо создания новой активируется существующая — это защищает от дублирования окон одного и того же объекта.

Передача параметров при открытии

Параметры передаются вторым аргументом в виде структуры. В открываемой форме они доступны через свойство Параметры в обработчике ПриСозданииНаСервере. Есть два вида параметров: стандартные (описанные в редакторе формы на закладке «Параметры») и произвольные.

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

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

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

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

ЗначенияЗаполнения.Вставить("Склад", ОсновнойСклад);

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

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

Для форм выбора полезен параметр Отбор — структура с условиями отбора динамического списка, а также РежимВыбора = Истина и ЗакрыватьПриВыборе = Истина. Так открывается подбор с уже установленным фильтром.

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

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

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

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

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

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

&НаКлиенте

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

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

Объект.Контрагент = Результат;

КонецЕсли;

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

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

Открытие формы существующего объекта и ПолучитьФорму

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

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

ФормаОбъекта = ПолучитьФорму("Документ.ЗаказКлиента.Форма.ФормаДокумента",

Новый Структура("Ключ", СсылкаНаДокумент));

ФормаОбъекта.Открыть();

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

Сравнение способов

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

Универсальный способ с параметрами, владельцем и оповещением. Подходит почти всегда.

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

Быстрое открытие объекта по ссылке без указания имени формы. Не позволяет передать произвольные параметры.

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

Нужен доступ к объекту формы до показа. Требует аккуратности с уникальностью и памятью.

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

Только для старого кода при разрешённой модальности. В новых разработках не применять.

Ключ уникальности и повторное открытие

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

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

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

Типичные ошибки и их диагностика

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

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

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

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

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

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

Для отладки асинхронной цепочки поставьте точки останова в ПриСозданииНаСервере открываемой формы и в процедуре-обработчике оповещения. Если обработчик не вызывается, проверьте, что форма закрывается через Закрыть(Результат), а не стандартной кнопкой с пустым результатом, и что описание оповещения создано с директивой Экспорт у процедуры.

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

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

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

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

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

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

Параметры переданы
Норма

В ПриСозданииНаСервере Параметры.Свойство возвращает Истина и значение корректно

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

Свойство отсутствует или значение Неопределено

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

Процедура оповещения вызывается, Результат содержит выбранное значение

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

Обработчик не срабатывает или Результат = Неопределено

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

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

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

Плодятся одинаковые окна одного объекта

Итог

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

Используйте ОткрытьФорму с параметрами-структурой, владельцем и ключом уникальности. Результат получайте через ОписаниеОповещения, а не через модальные методы. Параметры читайте в ПриСозданииНаСервере, вызов выполняйте только на клиенте и проверяйте поведение в целевом виде клиента.

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

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

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

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

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

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

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

Почему ОткрытьФорму не работает в фоновом задании?

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

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

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

Можно ли открыть форму из внешней обработки?

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