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