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

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

Как получить форму объекта в 1С: способы и примеры

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

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

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

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

Что значит «получить форму объекта» в 1С

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

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

Получение формы в управляемом приложении

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

// Получить форму элемента справочника

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

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

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

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

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

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

Получение формы нового объекта

Чтобы открыть форму для создания нового элемента, параметр Ключ не передают. Вместо этого можно передать заполняемые значения через параметр ЗначенияЗаполнения или основание копирования через ЗначениеКопирования:

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

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

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

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

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

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

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

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

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

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

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

Получение формы в обычном приложении

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

// Через менеджер справочника

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

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

// Через ссылку — откроется форма конкретного элемента

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

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

// Через объект данных

Объект = СсылкаНаЭлемент.ПолучитьОбъект();

Форма = Объект.ПолучитьФорму();

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

Разница между вызовом у менеджера и у ссылки принципиальна: Справочники.Номенклатура.ПолучитьФорму() откроет пустую форму (или форму нового элемента), а Ссылка.ПолучитьФорму() — форму с загруженными данными конкретного элемента. Частая ошибка новичков — получить форму через менеджер и удивляться, почему она пустая.

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

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

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

ПолучитьФорму() (глобальный)

Управляемое приложение, когда форму нужно получить как значение — например, для вложенной формы или нестандартного сценария. Требует отдельного вызова Открыть().

Ссылка.ПолучитьФорму()

Только обычное приложение. Открывает форму конкретного объекта, удобно для быстрого доступа из кода.

Передача параметров и обработка закрытия формы

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

Чтобы получить результат работы пользователя с формой (например, выбранное значение), используется описание оповещения о закрытии:

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

ПараметрыФормы = Новый Структура("РежимВыбора", Истина);

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

&НаКлиенте

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

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

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

КонецЕсли;

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

Типичные ошибки и их устранение

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

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

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

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

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

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

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

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

Содержимое открывшейся формы
Норма

Поля показывают данные объекта, ссылка которого передана в Ключ

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

Форма пустая или показывает другой объект — проверьте параметр Ключ

Контекст выполнения
Норма

Вызов находится в клиентской процедуре (директива &НаКлиенте)

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

Ошибка «Метод недоступен» — код выполняется на сервере

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

Повторный вызов активирует уже открытую форму

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

Открываются дубликаты — задайте параметр Уникальность

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

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

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

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

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

Почему возникает ошибка «Форма не найдена»?

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

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

Нет. ПолучитьФорму и ОткрытьФорму доступны только на клиенте. В серверном коде с формами работают иначе — через данные формы и методы вроде ПолучитьФорму в контексте модуля формы. Открытие формы всегда инициируется клиентской процедурой.

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

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

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

Открывайте форму с параметром РежимВыбора = Истина и передавайте описание оповещения о закрытии. Выбранное значение придёт в первый параметр процедуры-обработчика после закрытия формы.

Итог

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

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