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