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

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

ОповеститьОВыборе в 1С: как работает механизм оповещения о выборе

Как работает метод ОповеститьОВыборе в 1С: механизм оповещения форм о выборе значения, ОбработкаВыбора, типичные ошибки и примеры кода для разработчика.

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

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

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

Как устроен механизм оповещения о выборе

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

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

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

Настройка формы-владельца: открытие выбора и приём значения

На стороне формы, которая инициирует выбор, нужно сделать две вещи: открыть форму выбора с правильными параметрами и описать обработчик ОбработкаВыбора. Открытие обычно выполняется через ОткрытьФорму с параметром РежимВыбора = Истина и указанием владельца:

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

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

ЭтотОбъект, , , , ,

РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

Третий параметр — ЭтотОбъект — и задаёт владельца, которому уйдёт оповещение. Далее в модуле формы-владельца описывается обработчик:

&НаКлиенте

Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

НоваяСтрока = Объект.Товары.Добавить();

НоваяСтрока.Номенклатура = ВыбранноеЗначение;

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

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

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

Настройка формы выбора: откуда вызывать ОповеститьОВыборе

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

В собственной форме вызов размещают в обработчике события Выбор таблицы списка или в команде формы:

&НаКлиенте

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

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

ОповеститьОВыборе(Элементы.Список.ТекущиеДанные.Ссылка);

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

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

Если требуется множественный подбор, передают массив строк из Элементы.Список.ВыделенныеСтроки, а форму не закрывают после каждого выбора. Для одиночного выбора после оповещения форму обычно закрывают вызовом Закрыть().

Чем ОповеститьОВыборе отличается от других методов оповещения

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

МетодПолучательТиповой сценарий
ОповеститьОВыбореФорма-владелец формы выбораПодбор значения из списка в документ или поле ввода
ОповеститьВсе формы, подписанные через ОбработкаОповещения с нужным именем событияШироковещательное сообщение: «объект записан», «настройки изменились»
ОповеститьОбИзмененииФормы, отображающие указанный объект или ссылкуОбновление открытых форм после изменения данных объекта
ОписаниеОповещения (ЗакрытиеФормы)Процедура, указанная при открытии формыПолучение результата после закрытия модальной или блокирующей формы

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

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

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

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

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

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

ОткрытьФорму с ОписаниеОповещения о закрытии

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

Типичные ошибки и почему выбор «не доходит»

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

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

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

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

Как проверить, что механизм работает правильно

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

Полезно временно добавить в обработчик вывод типа и содержимого значения:

Сообщить("Тип: " + ТипЗнч(ВыбранноеЗначение)

+ ", источник: " + ИсточникВыбора.ИмяФормы);

Так сразу видно, какая форма прислала оповещение и что именно передано. После отладки отладочный вывод удаляют.

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

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

Срабатывание ОбработкаВыбора
Норма

Точка останова в обработчике срабатывает при выборе строки

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

Обработчик не вызывается — проверять владельца и РежимВыбора

Содержимое ВыбранноеЗначение
Норма

Тип значения совпадает с ожидаемым обработчиком

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

Приходит другой тип или Неопределено

ИсточникВыбора
Норма

Содержит ожидаемую форму выбора

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

Другая форма или не та, что открывалась

Поведение формы выбора после выбора
Норма

Закрывается при одиночном выборе или остаётся для подбора — по замыслу

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

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

Когда ОповеститьОВыборе не подходит и что использовать вместо

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

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

Маршрут решения

Как выбрать действие

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

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

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

Частые вопросы

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

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

Можно ли передать через ОповеститьОВыборе несколько значений сразу?

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

Закрывается ли форма выбора после вызова ОповеститьОВыборе?

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

Чем отличается ОбработкаВыбора от ОбработкаОповещения?

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

Работает ли механизм, если форма выбора открыта не из кода, а стандартной кнопкой выбора поля ввода?

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

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

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