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