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