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