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

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

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

Как получить владельца формы в 1С: свойство ВладелецФормы, отбор в динамических списках, управляемые и обычные формы, типичные ошибки и примеры кода.

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

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

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

Что такое владелец формы и когда он назначается

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

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

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

Получение владельца в управляемой форме

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

&НаКлиенте

Процедура ПриОткрытии(Отказ)

Если ВладелецФормы = Неопределено Тогда

Возврат; // форма открыта без владельца

КонецЕсли;

Если ТипЗнч(ВладелецФормы) = Тип("УправляемаяФорма") Тогда

// владелец — форма, можно читать её данные

ИмяФормыВладельца = ВладелецФормы.ИмяФормы;

Иначе

// владелец — элемент формы (например, поле ввода)

КонецЕсли;

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

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

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

Владелец-поле ввода и обработка выбора

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

Механизм такой: форма выбора вызывает ОповеститьОВыборе(Значение), а поле ввода-владелец получает событие ОбработкаВыбора. Если обработку нужно выполнить в форме, содержащей поле, а не в самом поле, в модуле формы-владельца пишется обработчик:

&НаКлиенте

Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

// ВыбранноеЗначение — то, что передала форма выбора

// ИсточникВыбора — форма, из которой пришёл выбор

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

Если форма открыта программно и вы хотите получить результат выбора именно в точке вызова, надёжнее использовать ОткрытьФорму() с описанием оповещения о закрытии (ОписаниеОповещенияОЗакрытии), а не полагаться на владельца. Так код не зависит от того, кем оказался владелец, и работает даже при открытии без контекста формы.

Использование владельца для отбора в динамическом списке

Частая практическая задача: форма выбора должна показывать только элементы, связанные с объектом формы-владельца. Например, при выборе договора из документа показывать только договоры контрагента этого документа.

Современный и рекомендуемый способ — не лезть в владельца из открываемой формы, а передать параметры отбора при открытии:

&НаКлиенте

Процедура ДоговорНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

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

ПараметрыФормы.Вставить("Отбор", Новый Структура("Владелец", Объект.Контрагент));

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

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

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

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

Порядок действий
  1. 1
    Определите, откуда открывается форма: из другой формы, из поля ввода или программно без контекста
  2. 2
    В модуле открываемой формы проверьте ВладелецФормы на Неопределено
  3. 3
    Определите тип владельца: УправляемаяФорма или элемент формы
  4. 4
    Получите нужные данные: ИмяФормы, реквизит Объект или имя элемента
  5. 5
    Для передачи результата обратно используйте ОповеститьОВыборе() или описание оповещения о закрытии

Владелец формы в обычном приложении

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

Типичный код в обычной форме выбора:

Если ВладелецФормы <> Неопределено Тогда

Если ТипЗнч(ВладелецФормы) = Тип("Форма") Тогда

// владелец — форма

ИначеЕсли ТипЗнч(ВладелецФормы) = Тип("ПолеВвода") Тогда

// владелец — поле ввода, выбор попадёт в него автоматически

КонецЕсли;

КонецЕсли;

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

Альтернативы прямому обращению к владельцу

Жёсткая связь через ВладелецФормы делает форму зависимой от контекста вызова: её нельзя переиспользовать, открыв из другого места. Поэтому в ряде случаев лучше подходят другие механизмы.

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

ВладелецФормы

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

Параметры формы при открытии

Рекомендуемый способ передачи данных внутрь открываемой формы: ОткрытьФорму() со структурой параметров. Работает независимо от контекста вызова.

Описание оповещения о закрытии

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

Оповестить() / ОбработкаОповещения

Подходит для обновления открытых форм после изменения данных. Слабая связность: отправитель не знает получателей.

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

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

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

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

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

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

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

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

Форма открыта из поля ввода
Норма

ВладелецФормы содержит элемент формы, выбранное значение попадает в поле автоматически

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

ВладелецФормы = Неопределено, выбор никуда не возвращается

Форма открыта из другой формы командой
Норма

ВладелецФормы имеет тип УправляемаяФорма, доступны её реквизиты

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

Ошибка обращения к свойству — владелец не проверен на тип

Отбор в форме выбора
Норма

Список показывает только связанные элементы

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

Отбор не применился — параметр Отбор не передан при открытии

FAQ

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

Сравните имя формы-владельца: Если ВладелецФормы <> Неопределено И ТипЗнч(ВладелецФормы) = Тип("УправляемаяФорма") И ВладелецФормы.ИмяФормы = "Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента" Тогда .... Это надёжнее, чем проверка по заголовку, который может меняться.

Можно ли изменить владельца формы после открытия?

Нет, свойство ВладелецФормы доступно только для чтения и фиксируется в момент открытия. Если нужен другой владелец — закройте форму и откройте её заново с нужным параметром «Владелец» в ОткрытьФорму().

Почему ВладелецФормы равен Неопределено, хотя форму открыли из другой формы?

Скорее всего, при вызове ОткрытьФорму() не был передан параметр «Владелец», а открытие выполнено не из контекста элемента формы. Явно передайте владельца третьим параметром: ОткрытьФорму(ИмяФормы, ПараметрыФормы, ЭтаФорма).

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

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

Работает ли ВладелецФормы в расширениях конфигурации?

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

Чем отличается ВладелецФормы от КлючУникальности при открытии формы?

ВладелецФормы определяет, кто открыл форму и куда вернётся результат выбора. КлючУникальности — произвольное значение, предотвращающее открытие дубликатов формы: при повторном открытии с тем же ключом активируется уже открытая форма. Это независимые механизмы, их можно использовать вместе.

Итог

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

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