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

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

Владелец формы в 1С: что это и как с ним работать

Что такое владелец формы в 1С, зачем он нужен при открытии форм, как передавать параметры владельца и избегать типичных ошибок в коде.

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

Механизм владельца решает практическую задачу: открытая форма должна знать, куда вернуть результат работы. Когда пользователь выбирает значение в форме выбора, платформа отправляет оповещение именно владельцу, а тот обрабатывает выбор в своём обработчике. Без корректного владельца выбор «зависает»: форма закрывается, но данные в исходную форму не попадают.

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

Что именно хранится в свойстве ВладелецФормы

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

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

Проверить тип владельца в коде можно простым условием:

bsl
&НаКлиенте
Процедура ПриОткрытии(Отказ)
	Если ВладелецФормы = Неопределено Тогда
		// Форма открыта самостоятельно, владельца нет
	ИначеЕсли ТипЗнч(ВладелецФормы) = Тип("ФормаКлиентскогоПриложения") Тогда
		// Владелец — форма целиком
	Иначе
		// Владелец — элемент формы (например, поле ввода)
	КонецЕсли;
КонецПроцедуры

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

Как платформа назначает владельца автоматически

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

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

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

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

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

Порядок действий
  1. 1
    Определите, кто должен получить результат: форма целиком или конкретный элемент (поле ввода)
  2. 2
    Вызовите ОткрытьФорму() с третьим параметром: ЭтаФорма для формы или Элементы.ИмяПоля для поля
  3. 3
    В форме-владельце реализуйте ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) для приёма результата
  4. 4
    Откройте форму, выполните выбор и убедитесь, что обработчик сработал и данные попали в нужный реквизит

Пример открытия формы выбора с владельцем-формой:

bsl
&НаКлиенте
Процедура ПодобратьКонтрагента(Команда)
	ПараметрыФормы = Новый Структура("РежимВыбора", Истина);
	ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", ПараметрыФормы, ЭтаФорма);
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.Контрагенты") Тогда
		Объект.Контрагент = ВыбранноеЗначение;
	КонецЕсли;
КонецПроцедуры

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

Владелец и возврат результата выбора

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

Для нестандартных сценариев есть метод ОповеститьОВыборе(Значение), который форма выбора вызывает сама, чтобы передать владельцу произвольное значение — не обязательно ссылку. Например, форма подбора может вернуть структуру с количеством и ценой.

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

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

Владелец + ОбработкаВыбора

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

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

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

Владелец — элемент формы

Подходит для простого подставления значения в поле. Платформа делает всё сама, но дополнительная обработка результата затруднена

Владелец формы и ключ уникальности открытия

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

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

Управлять поведением можно параметром КлючУникальности в ОткрытьФорму(). Сочетание «владелец + ключ» однозначно определяет экземпляр формы в рамках сеанса.

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

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

Повторное открытие формы выбора из того же поля
Норма

Активируется уже открытое окно, дубликат не создаётся

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

Каждый раз открывается новое окно — проверьте владельца и ключ уникальности

Выбор значения в открытой форме
Норма

Значение появляется в поле или срабатывает ОбработкаВыбора владельца

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

Форма закрывается, но данные не передаются — владелец не задан или обработчик отсутствует

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

Содержит ожидаемую форму или элемент

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

Неопределено — форма открыта без владельца, возврат результата работать не будет

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

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

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

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

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

Практические рекомендации и границы применения

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

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

Для сложных сценариев — подбор с возвратом таблицы значений, многошаговые мастера — используйте оповещения о закрытии вместо связки «владелец + ОбработкаВыбора». Владелец остаётся полезен для группировки окон и уникальности, но передачу данных лучше вести через явные механизмы оповещений.

При отладке проблем с выбором полезно поставить точку останова в ОбработкаВыбора формы-владельца и посмотреть параметр ИсточникВыбора — он показывает, какая именно форма вернула значение. Это быстрее, чем искать вызов ОткрытьФорму по всему модулю.
ПЗ
Практическое замечание

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

Чем владелец формы отличается от родительской формы?

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

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

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

Почему ВладелецФормы равен Неопределено?

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

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

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

Влияет ли владелец на закрытие формы?

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

Нужен ли владелец при открытии формы нового объекта?

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

Итог

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

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