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

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

Обработка выбора в 1С: что это и как её использовать

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

Обработка выбора в 1С — это механизм, который позволяет форме отреагировать на выбор значения пользователем в другой форме или в стандартном диалоге. Когда пользователь открывает справочник для подбора элемента, выбирает файл, период или значение из списка, система должна как-то передать результат обратно в вызвавшую форму. Именно эту задачу решает обработка выбора.

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

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

Что такое обработка выбора и где она встречается

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

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

Как работает событие ОбработкаВыбора в управляемой форме

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

Чтобы событие вообще сработало, должны выполняться условия: форма выбора открыта с указанием владельца (параметр Владелец или свойство ВладелецФормы), у формы выбора включён режим выбора (РежимВыбора = Истина), а в форме-владельце описан обработчик события. Если хотя бы одно условие нарушено, выбор визуально происходит, но в вызывающую форму ничего не возвращается.

Пример обработчика в модуле формы документа:

&НаКлиенте

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

Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.Номенклатура") Тогда

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

Модифицированность = Истина;

КонецЕсли;

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

Выбор через описание оповещения: современный подход

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

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

&НаКлиенте

Процедура ВыбратьКонтрагента(Команда)

Оповещение = Новый ОписаниеОповещения("ПослеВыбораКонтрагента", ЭтотОбъект);

ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", , ЭтотОбъект, , , , Оповещение);

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

&НаКлиенте

Процедура ПослеВыбораКонтрагента(Результат, ДополнительныеПараметры) Экспорт

Если Результат <> Неопределено Тогда

Объект.Контрагент = Результат;

КонецЕсли;

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

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

Событие ОбработкаВыбора

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

Описание оповещения

Универсальный вариант для управляемых форм: явная процедура-обработчик, можно передать дополнительные параметры, работает с любыми диалогами; требует аккуратности с экспортными процедурами и контекстом.

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

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

Настройка формы выбора: что проверить в конфигураторе

Если подбор реализуется через форму выбора справочника или документа, её нужно подготовить. В свойствах формы или в коде при открытии устанавливается РежимВыбора = Истина — тогда двойной щелчок по элементу будет означать выбор, а не открытие на редактирование. Для множественного подбора дополнительно включается МножественныйВыбор и, при необходимости, ЗакрыватьПриВыборе = Ложь, чтобы форма оставалась открытой при добавлении позиций.

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

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

Проверка результата и типичные ошибки

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

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

Типичные ошибки
01
Не указан владелец при открытии формы выбора — событие ОбработкаВыбора не приходит ни в одну форму.
02
Процедура оповещения объявлена без Экспорт — платформа не находит обработчик, результат теряется без ошибки.
03
В обработчике нет проверки ТипЗнч(ВыбранноеЗначение) — при выборе из разных источников подставляются неподходящие значения.
04
Используется ОткрытьФормуМодально в управляемом приложении — код не работает в веб-клиенте и при запрещённой модальности.
05
Значение присваивается реквизиту формы, но не реквизиту объекта — после записи документа выбор теряется.

Ограничения и когда нужен другой механизм

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

В тонком и веб-клиенте помните про разделение контекста: серверные процедуры без контекста (&НаСервереБезКонтекста) не имеют доступа к данным формы, поэтому запись выбранного значения в реквизит объекта выполняйте на клиенте или в контекстной серверной процедуре. Также учитывайте, что в мобильном клиенте часть сценариев с нестандартными формами выбора может работать иначе — тестируйте подбор на целевой платформе.

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

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

Подстановка значения
Норма

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

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

Поле остаётся пустым после закрытия формы выбора

Признак модифицированности
Норма

В заголовке формы появляется звёздочка, при закрытии задаётся вопрос о записи

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

Форма закрывается без вопроса — значение не записано в объект

Повторный выбор
Норма

При повторном открытии форма выбора позиционируется на текущем значении

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

Форма открывается без позиционирования, текущее значение не учитывается

Поведение после записи
Норма

Выбранное значение сохраняется после записи и переоткрытия объекта

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

После записи поле очищается — значение писалось в реквизит формы, а не объекта

FAQ: частые вопросы про обработку выбора в 1С

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

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

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

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

Можно ли передать из формы выбора не одно значение, а несколько полей?

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

Почему в веб-клиенте выбор работает иначе, чем в тонком?

В веб-клиенте модальные вызовы недоступны, поэтому код с ОткрытьФормуМодально или модальными вопросами не выполняется. Перепишите логику на описания оповещений и асинхронные методы — тогда поведение будет одинаковым во всех клиентах.

Нужно ли писать обработчик выбора для обычного поля с кнопкой выбора?

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

Итог

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

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