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