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