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