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

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

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

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

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

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

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

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

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

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

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

Определение владельца в управляемых формах

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

Типичный код в модуле дочерней формы выглядит так:

&НаКлиенте

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

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

Сообщить("Форма открыта без владельца");

Иначе

Сообщить("Владелец: " + ВладелецФормы.ИмяФормы);

КонецЕсли;

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

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

Как гарантированно назначить владельца при открытии

Чтобы владелец был определён предсказуемо, передавайте его явно в параметрах открытия:

&НаКлиенте

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

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

ОткрытьФорму("Обработка.ПодборТоваров.Форма.ФормаПодбора",

ПараметрыФормы, ЭтотОбъект, УникальныйИдентификатор);

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

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

Порядок действий
  1. 1
    В родительской форме вызовите ОткрытьФорму, передав ЭтотОбъект третьим параметром
  2. 2
    В дочерней форме проверьте ВладелецФормы на Неопределено перед использованием
  3. 3
    Определите тип владельца через ВладелецФормы.ИмяФормы, если вызовов несколько
  4. 4
    Обратитесь к экспортным процедурам или реквизитам владельца для передачи данных
  5. 5
    Проверьте поведение при закрытии владельца раньше дочерней формы

Определение владельца в обычных формах

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

Определить тип владельца можно через ТипЗнч(ВладелецФормы). Если владелец — поле ввода, то до самой формы-родителя добираются цепочкой: ВладелецФормы.ВладелецФормы либо через свойство Родитель элемента управления. Это частая причина ошибок: разработчик ожидает форму, а получает поле ввода.

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

ФормаРодитель = ВладелецФормы.ВладелецФормы;

Иначе

ФормаРодитель = ВладелецФормы;

КонецЕсли;

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

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

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

Первый приём — анализ ВладелецФормы.ИмяФормы. Строка вида «Документ.ЗаказПокупателя.Форма.ФормаДокумента» однозначно идентифицирует источник. Второй приём — передача собственного признака в параметрах: в Параметры при открытии добавляют ключ, например ИсточникВызова = "ПодборИзЗаказа", и в дочерней форме анализируют его в обработчике ПриСозданииНаСервере. Этот способ надёжнее, потому что не зависит от того, назначила ли платформа владельца автоматически.

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

Частые ошибки при работе с владельцем формы

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

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

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

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

Альтернативы: оповещения и закрытие с результатом

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

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

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

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

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

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

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

Рекомендуемый способ получить результат закрытия формы; не требует знания владельца, работает и при модальном открытии

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

Подходит для рассылки события нескольким формам; сложнее отладить, нет гарантии наличия слушателя

Закрыть(Результат)

Передаёт значение выбора родителю при модальном открытии; не работает для немодальных сценариев без оповещения

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

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

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

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

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

Значение ВладелецФормы в дочерней форме
Норма

Содержит ссылку на форму-родителя, ИмяФормы соответствует ожидаемой

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

Неопределено — владелец не передан при открытии

Вызов экспортной процедуры владельца
Норма

Процедура выполняется, данные передаются

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

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

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

Активизируется существующее окно

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

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

FAQ

Чему равен ВладелецФормы, если форму открыли из командного интерфейса?

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

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

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

Как из дочерней формы вызвать серверную процедуру формы-владельца?

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

Почему в обычной форме ВладелецФормы оказался полем ввода, а не формой?

При интерактивном открытии формы выбора из поля ввода платформа назначает владельцем сам элемент управления. Проверяйте тип через ТипЗнч(ВладелецФормы) и при необходимости поднимайтесь к форме через ВладелецФормы.ВладелецФормы или цепочку родителей элемента.

Что использовать вместо ВладелецФормы в новых разработках?

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

Доступен ли ВладелецФормы на сервере в ПриСозданииНаСервере?

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

Итог

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

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