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

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

1С: как вызвать обработку выбора и получить результат

Как в 1С вызвать обработку выбора: событие ОбработкаВыбора, ОповеститьОВыборе, ПоказатьВводЗначения, передача результата между формами, примеры кода и типичные ошибки.

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

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

Ниже разобраны оба механизма, способы программного вызова, передача дополнительных параметров, проверка результата и типичные ошибки, из-за которых обработчик «не срабатывает».

Как работает событие ОбработкаВыбора

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

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

&НаКлиенте

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

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

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

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

КонецЕсли;

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

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

Как программно вызвать обработку выбора через ОповеститьОВыборе

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

&НаКлиенте

Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

ТекущиеДанные = Элементы.Список.ТекущиеДанные;

Если ТекущиеДанные <> Неопределено Тогда

ОповеститьОВыборе(ТекущиеДанные.Ссылка);

КонецЕсли;

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

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

Проверить, что событие дошло, просто: поставьте точку останова или вывод сообщения в начале ОбработкаВыбора у формы-владельца. Если обработчик не вызывается — почти всегда дело в том, что у формы-источника нет владельца или владелец не та форма, которую вы ожидаете.

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

Как открыть форму выбора и получить результат через оповещение

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

&НаКлиенте

Процедура ПодобратьНоменклатуру(Команда)

ПараметрыФормы = Новый Структура("РежимВыбора", Истина);

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

ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы,

ЭтаФорма, , , , Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

&НаКлиенте

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

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

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

КонецЕсли;

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

Чтобы форма выбора вернула значение через оповещение, она должна закрываться с параметром: Закрыть(ВыбранноеЗначение). Стандартные формы выбора динамических списков делают это автоматически при установленном РежимВыбора = Истина.

Для простых случаев — выбор одного значения известного типа — удобен ПоказатьВводЗначения: он открывает стандартный диалог выбора без создания своей формы и возвращает результат в оповещение.

bsl
Оповещение = Новый ОписаниеОповещения("ПослеВыбораКонтрагента", ЭтотОбъект);
ПоказатьВводЗначения(Оповещение, Неопределено, "Выберите контрагента", Тип("СправочникСсылка.Контрагенты"));

Передача дополнительных данных и множественный выбор

Параметр ВыбранноеЗначение не обязан быть ссылкой — допустимо передать структуру с произвольным набором полей, массив при множественном выборе или значение примитивного типа. Это удобно, когда из формы подбора нужно вернуть не только ссылку, но и, например, количество, цену или характеристику.

&НаКлиенте

Процедура ПеренестиВДокумент(Команда)

Результат = Новый Структура;

Результат.Вставить("Номенклатура", ТекущаяНоменклатура);

Результат.Вставить("Количество", КоличествоПодобрано);

ОповеститьОВыборе(Результат);

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

В обработчике ОбработкаВыбора различать источники помогает параметр ИсточникВыбора и проверка типа значения. Если к одной форме подключается несколько форм подбора, сравнивайте имя формы источника или передавайте в структуре явный ключ-идентификатор операции.

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

ОбработкаВыбора против Оповестить: чем заменить и когда

Метод Оповестить(ИмяСобытия, Параметр, Источник) — более общий механизм: он рассылает событие всем формам, подписанным через обработчик ОбработкаОповещения. В отличие от ОповеститьОВыборе, он не привязан к владельцу и подходит для сценариев «обновить все открытые списки после записи».

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

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

ОбработкаВыбора + ОповеститьОВыборе

Классическая связка для возврата выбранного значения в форму-владельца. Требует, чтобы форма была открыта с владельцем.

ОткрытьФорму + ОписаниеОповещения

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

ПоказатьВводЗначения

Быстрый выбор одного значения стандартным диалогом без своей формы. Ограничен простыми типами и ссылками.

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

Широковещательное событие для всех открытых форм. Подходит для обновления списков, но не для возврата результата конкретной форме.

Типичные ошибки и их диагностика

Самая частая жалоба — «ОбработкаВыбора не срабатывает». Причины почти всегда одни и те же: форма выбора открыта без владельца, обработчик объявлен с директивой &НаСервере (событие клиентское), либо разработчик ищет результат в ОбработкаОповещения вместо ОбработкаВыбора.

Вторая группа ошибок — потеря контекста: в обработчике сравнивают ИсточникВыбора со строкой имени формы, хотя это объект формы, или не проверяют ВыбранноеЗначение на Неопределено, получая ошибку при отмене выбора пользователем.

Типичные ошибки
01
Открытие формы без владельца — событие ОбработкаВыбора уходит в никуда; укажите ЭтаФорма третьим параметром ОткрытьФорму
02
Директива &НаСервере у обработчика — событие вызывается на клиенте, серверный обработчик не будет найден
03
Ожидание результата в ОбработкаОповещения вместо ОбработкаВыбора — это разные события, ОповеститьОВыборе вызывает именно ОбработкаВыбора
04
Отсутствие проверки на Неопределено — при отмене выбора обращение к полям результата вызывает ошибку
05
Использование ОповеститьОВыборе в форме, открытой не из другой формы, — у неё нет владельца, результат теряется

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

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

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

Точка останова в ОбработкаВыбора формы-владельца
Норма

Отладчик останавливается сразу после выбора в подчинённой форме

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

Остановки нет — форма открыта без владельца или выбор идёт мимо

Значение параметра ВыбранноеЗначение
Норма

Ссылка, структура или массив ожидаемого состава

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

Неопределено или тип не совпадает с проверкой в обработчике

Реквизиты объекта после обработчика
Норма

Поля заполнены, форма помечена как модифицированная

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

Значения не изменились — ветка условия по типу не сработала

Ограничения и безопасные приёмы

Событие ОбработкаВыбора — клиентское, поэтому серверные вызовы из него делайте осознанно: каждый серверный вызов в цикле обработки массива выбранных значений замедляет работу. Для множественного подбора собирайте данные на клиенте и передавайте на сервер одним вызовом.

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

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

FAQ

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

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

Почему ОповеститьОВыборе не вызывает обработчик?

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

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

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

Можно ли вызвать обработку выбора без открытия формы?

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

Что использовать вместо ОткрытьФормуМодально для выбора?

Метод ОткрытьФорму с параметром ОписаниеОповещения и режимом БлокироватьОкноВладельца либо ПоказатьВводЗначения для простых типов. Результат придёт в процедуру, указанную в описании оповещения, после закрытия формы выбора.

Как понять, из какой формы пришёл выбор, если форм подбора несколько?

Используйте параметр ИсточникВыбора — это объект формы-источника, у которого можно проверить имя формы. Более надёжный вариант — передавать в структуре результата явный строковый ключ операции, например «ПодборНоменклатуры» или «ВыборКонтрагента», и ветвить логику по нему.

Итог

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

ОбработкаВыбора вызывается в форме-владельце при выборе в подчинённой форме; программно событие инициируется методом ОповеститьОВыборе. В управляемом приложении предпочтителен асинхронный вариант — ОткрытьФорму с ОписаниеОповещения. Главные причины «неработающего» выбора: отсутствие владельца у формы и серверная директива у клиентского обработчика.