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