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

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

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

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

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

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

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

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

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

В-третьих, именно владелец получает стандартное оповещение о выборе. Когда в форме выбора срабатывает ОповеститьОВыборе(ВыбранноеЗначение), событие ОбработкаВыбора вызывается у владельца формы. Если владелец не задан или задан неверно, выбор «уходит в никуда», и пользователь видит окно, которое ничего не делает.

Передача владельца через параметры ОткрытьФорму()

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

&НаКлиенте

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

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

ПараметрыФормы.Вставить("Владелец", ЭтаФорма);

ПараметрыФормы.Вставить("РежимВыбора", Истина);

ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаПодбора", ПараметрыФормы);

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

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

ПараметрыФормы.Вставить("Владелец", Элементы.Номенклатура);

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

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

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

&НаКлиенте

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

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

ОрганизацияРодителя = ВладелецФормы.Объект.Организация;

УстановитьОтборПоОрганизации(ОрганизацияРодителя);

КонецЕсли;

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

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

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

Возврат результата владельцу: оповещения о выборе и о закрытии

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

&НаКлиенте

Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

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

ОповеститьОВыборе(ВыбраннаяСтрока);

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

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

&НаКлиенте

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

Оповещение = Новый ОписаниеОповещения("ПодборЗавершение", ЭтотОбъект);

ПараметрыФормы = Новый Структура("Владелец", ЭтаФорма);

ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаПодбора",

ПараметрыФормы, ЭтаФорма, , , , Оповещение);

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

&НаКлиенте

Процедура ПодборЗавершение(Результат, ДополнительныеПараметры) Экспорт

Если Результат <> Неопределено Тогда

ДобавитьСтрокуТовара(Результат);

КонецЕсли;

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

Сравнение способов возврата результата

ОповеститьОВыборе + ОбработкаВыбора

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

ОписаниеОповещения + Закрыть(Результат)

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

Прямое обращение к ВладелецФормы

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

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

В обычном приложении (или при работе с обычными формами в режиме совместимости) владелец передаётся вторым параметром метода ПолучитьФорму():

ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора(, ЭтаФорма);

ФормаВыбора.Открыть();

Для управляемых форм метод ПолучитьФорму() также принимает владельца вторым параметром после структуры параметров. Это полезно, когда форму нужно сначала получить, заполнить программно и только потом показать:

ФормаПодбора = ПолучитьФорму("Справочник.Номенклатура.Форма.ФормаПодбора",

ПараметрыФормы, ЭтаФорма);

ФормаПодбора.Открыть();

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

Порядок передачи владельца при открытии формы
  1. 1
    Определите, кто будет владельцем: вся форма (ЭтаФорма) или конкретный элемент (Элементы.ИмяПоля)
  2. 2
    Сформируйте структуру параметров с ключом «Владелец» или передайте владельца третьим параметром ОткрытьФорму()
  3. 3
    В дочерней форме реализуйте возврат результата: ОповеститьОВыборе() или Закрыть(Результат)
  4. 4
    У владельца добавьте ОбработкаВыбора() или процедуру по описанию оповещения
  5. 5
    Проверьте сценарий открытия формы без владельца — добавьте проверку на Неопределено

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

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

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

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

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

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

Быстрая проверка — вывести тип владельца в дочерней форме при открытии. Если ВладелецФормы = Неопределено, параметр не дошёл: проверьте написание ключа «Владелец» и то, что значением является форма, а не что-то иное.

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

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

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

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

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

Содержит открывшую форму или элемент формы

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

Неопределено — параметр «Владелец» не передан или передан неверного типа

Срабатывание ОбработкаВыбора у владельца
Норма

Обработчик вызывается при выборе в дочерней форме

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

Выбор выполняется, но у владельца ничего не происходит

Закрытие формы-владельца
Норма

Подчинённая форма закрывается вместе с владельцем

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

Дочернее окно остаётся открытым после закрытия родителя

FAQ

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

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

Что передать владельцем, если форма открывается из общей команды?

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

Почему ОбработкаВыбора не вызывается, хотя владелец задан?

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

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

Владелец определяет, кто получает оповещения и кто управляет временем жизни формы. Ключ уникальности определяет, будет ли создана новая форма или активирована существующая. Оба параметра вместе участвуют в проверке уникальности открытия.

Можно ли владельцем сделать элемент табличной части?

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

Работает ли передача владельца в веб-клиенте?

Да, механизм владения формами работает во всех клиентах управляемого приложения. Ограничения касаются лишь метода ПолучитьФорму() на клиенте — предпочтительнее использовать ОткрытьФорму() с параметрами.

Итог

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

Владелец передаётся через параметр «Владелец» в ОткрытьФорму() или третьим параметром метода; значением может быть только форма или элемент формы. Результат возвращают через ОповеститьОВыборе() либо Закрыть(Результат) с описанием оповещения. Всегда проверяйте ВладелецФормы на Неопределено и наличие обработчика у получателя.