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