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

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

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

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

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

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

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

Что такое форма и зачем её «получать» программно

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

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

Синтаксис метода ПолучитьФорму

Метод имеет четыре параметра, из которых обязательный только первый:

Форма = ПолучитьФорму(ИмяФормы, Параметры, Владелец, КлючУникальности);
  • ИмяФормы — строка вида "Справочник.Номенклатура.Форма.ФормаЭлемента" или "ОбщаяФорма.ФормаПодбора". Для основной формы объекта можно использовать краткий путь: "Справочник.Номенклатура.ФормаОбъекта".
  • Параметры — структура с параметрами формы, которые доступны в обработчике ПриСозданииНаСервере через коллекцию Параметры.
  • Владелец — форма-владелец, относительно которой открывается новое окно; влияет на блокировку и время жизни.
  • КлючУникальности — произвольное значение (обычно ссылка или строка), по которому платформа ищет уже открытый экземпляр.

Минимальный пример получения и открытия формы элемента справочника:

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

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

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

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

Обратите внимание: пока не вызван Открыть(), пользователь ничего не увидит. Это удобно, когда нужно сначала программно настроить форму — установить реквизиты, изменить видимость элементов — и только потом показать её.

bsl
Форма = ПолучитьФорму("Документ.РеализацияТоваров.Форма.ФормаДокумента", ПараметрыФормы, , СсылкаНаДокумент);
Если Форма.Открыта() Тогда
    Форма.Активизировать();
Иначе
    Форма.Открыть();
КонецЕсли;

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

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

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

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

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

Если Форма.Открыта() Тогда

Форма.Активизировать();

Иначе

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

КонецЕсли;

Метод Открыта() возвращает Истина, если форма уже показана пользователю. В этом случае вместо повторного открытия достаточно вызвать Активизировать() — окно выйдет на передний план.

Как найти открытую форму через список окон

Если ключ уникальности неизвестен или форма была открыта без него, можно перебрать все окна клиентского приложения. В управляемом приложении для этого служит метод ПолучитьОкна():

Окна = ПолучитьОкна();

Для Каждого Окно Из Окна Цикл

Если Окно.ПолучитьСодержимое() <> Неопределено Тогда

Сообщить(Окно.Заголовок);

КонецЕсли;

КонецЦикла;

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

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

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

Ключ уникальности

Быстрый и надёжный поиск открытой формы. Требует, чтобы ключ был задан при первом открытии.

ПолучитьОкна()

Перебор всех окон клиента. Подходит, когда ключ неизвестен, но работает только на клиенте.

ОткрытьФорму с ключом

Совмещает получение и открытие; если форма уже есть, она активизируется автоматически.

ОткрытьФорму как короткая альтернатива

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

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

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

ПараметрыФормы, ЭтотОбъект, , , , Оповещение,

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

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

Выбор между двумя методами прост: нужен промежуточный доступ к объекту формы до показа — используйте ПолучитьФорму и Открыть(); нужно просто показать форму и обработать результат — используйте ОткрытьФорму с оповещением.

Порядок действий
  1. 1
    Определите полное имя нужной формы в конфигураторе
  2. 2
    Сформируйте структуру параметров, включая Ключ при работе со ссылкой
  3. 3
    Вызовите ПолучитьФорму с ключом уникальности
  4. 4
    Проверьте Форма.Открыта(): если Истина — вызовите Активизировать(), иначе Открыть()
  5. 5
    Проверьте, что повторный вызов не создаёт дубликат окна

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

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

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

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

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

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

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

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

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

Первый вызов
Норма

Открылось новое окно с нужными данными

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

Окно не появилось — забыли Открыть()

Повторный вызов с тем же ключом
Норма

Существующее окно активизировалось

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

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

Параметры формы
Норма

Параметры доступны в ПриСозданииНаСервере

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

Параметры пусты — ошибка в имени структуры

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

Чем ПолучитьФорму отличается от ОткрытьФорму?

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

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

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

Можно ли получить форму другого сеанса или другого пользователя?

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

Почему форма не находится по ключу уникальности?

Чаще всего ключ при повторном вызове отличается типом или значением — например, в первый раз передана ссылка, а во второй строка с тем же GUID. Ключи должны совпадать точно. Также проверьте, что оба раза запрашивается одно и то же имя формы.

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

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

Работает ли ПолучитьФорму на сервере?

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

Итог

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

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