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

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

Как получить форму клиентского приложения 1С

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

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

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

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

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

Первый аргумент обеих функций — строковый путь к форме. Он строится по единому шаблону: вид объекта метаданных, имя объекта, тип формы и, при необходимости, имя конкретной формы. Например, "Справочник.Номенклатура.ФормаОбъекта" — основная форма элемента справочника, а "Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента" — конкретная именованная форма документа.

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

Как получить форму функцией ПолучитьФорму

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

&НаКлиенте

Процедура ОткрытьКарточку(Команда)

ПараметрыФормы = Новый Структура("Ключ", ТекущийЭлемент);

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

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

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

Полученный объект имеет тип «УправляемаяФорма». До вызова Открыть() или ОткрытьМодально() форма остаётся невидимой, но уже существует: можно обращаться к её реквизитам, экспортным процедурам модуля формы и элементам. Это удобно, когда нужно программно заполнить данные или выполнить предварительные настройки.

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

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

Как открыть форму без получения объекта: ОткрытьФорму и ОткрытьФормуМодально

Метод ОткрытьФорму() объединяет создание и показ формы в одном вызове. Он возвращает ссылку на открытую форму, поэтому при необходимости объект всё равно доступен. Сигнатура: ОткрытьФорму(ИмяФормы, Параметры, Владелец, Уникальность, Окно, НавигационнаяСсылка, ОписаниеОповещенияОЗакрытии, РежимОткрытияОкна).

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

&НаКлиенте

Процедура ВыбратьКонтрагента(Команда)

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

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

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

&НаКлиенте

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

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

// обработка выбранного значения

КонецЕсли;

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

Как передать параметры, владельца и управлять уникальностью формы

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

Третий аргумент — владелец формы. Если указать текущую форму (ЭтотОбъект), открытая форма закроется вместе с владельцем и будет располагаться поверх него. Четвёртый аргумент «Уникальность» определяет, будет ли создана новая форма или активирована уже открытая с тем же ключом. Передача Новый УникальныйИдентификатор гарантирует открытие отдельного экземпляра, что полезно при одновременной работе с несколькими однотипными формами.

Ключ переданОткроется существующий объект

Проверьте, что ссылка не пустая и объект не помечен на удаление

Уникальность = НеопределеноПовторный вызов активирует уже открытую форму

Если нужен новый экземпляр — передайте уникальный идентификатор

Владелец заданФорма закроется вместе с владельцем

Убедитесь, что владельцем является форма, а не элемент управления другого типа

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

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

Второй способ — оповещения. Форма рассылает событие через Оповестить("ИмяСобытия", Параметр, Источник), а заинтересованные формы обрабатывают его в ОбработкаОповещения. Это стандартный механизм обмена данными между открытыми формами без жёстких связей. Третий вариант — из формы-владельца обратиться к подчинённой через коллекцию ПолучитьПодчиненныеФормы() недоступно напрямую; вместо этого владелец сам регистрирует открытые им формы в собственной структуре.

Маршрут решения

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

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

Где код будет работать: ограничения контекста и клиентов

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

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

Типичные ошибки и как проверить результат

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

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

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

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

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

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

Возвращённое значение вызова
Норма

Объект типа УправляемаяФорма

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

Неопределено или исключение при вызове

Состояние после Открыть()
Норма

Метод Открыта() возвращает Истина

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

Форма не отображается, метод возвращает Ложь

Данные формы
Норма

Заголовок и реквизиты соответствуют переданному ключу

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

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

Итог

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

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

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

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

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

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

Нет. Форма — клиентский объект, на сервере её не существует. Серверная логика должна вернуть клиенту имя формы и параметры, а само открытие выполняется в процедуре с директивой &НаКлиенте.

Как открыть форму внешней обработки?

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

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

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

Почему повторный вызов не открывает новую форму, а активирует старую?

По умолчанию уникальность формы определяется путём и ключевыми параметрами. Если нужен отдельный экземпляр, передайте в четвёртый аргумент новый уникальный идентификатор: ПолучитьФорму(Путь, Параметры, Владелец, Новый УникальныйИдентификатор).

Как узнать, что пользователь закрыл форму, и получить результат?

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