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