Как в управляемых формах 1С перехватить значение, выбранное пользователем из списка автоподбора?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интерактивном вводе данных в управляемых формах 1С разработчики нередко сталкиваются с необходимостью обработать момент, когда пользователь нажимает на определенный пункт выпадающего списка автоподбора. Например, требуется проверить выбранную позицию на соответствие условиям, подставить дополнительные реквизиты, перезаписать значение или вовсе запретить выбор. Разберем по шагам, какие события элемента формы участвуют в этом процессе, как правильно получить выбранное значение и какими возможностями обладает стандартный механизм платформы.

Событие «ОбработкаВыбора» элемента формы

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

Проанализируем сигнатуру обработчика и его параметры:


&НаКлиенте
Процедура ПолеВводаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    
    // ВыбранноеЗначение содержит данные выбранного пункта
    // СтандартнаяОбработка по умолчанию равна Истина
    
КонецПроцедуры

Рассмотрим подробнее каждый из параметров:

  1. Элемент — ссылка на элемент управляемой формы (поле ввода), в котором пользователь осуществлял подбор.
  2. ВыбранноеЗначение — непосредственно само значение (ссылка на элемент справочника, документ, число или строка), которое выбрал пользователь в выпадающем меню. Если список формировался программно через СписокЗначений, в параметр попадет именно свойство Значение элемента списка, а не сам объект строки.
  3. СтандартнаяОбработка — булев флаг, управляющий штатным поведением платформы. Если установить СтандартнаяОбработка = Ложь, платформа не будет автоматически помещать ВыбранноеЗначение в реквизит формы, связанный с полем ввода.

Различие между «ОбработкаВыбора» и «ПриИзменении»

Выясним причину, почему для перехвата позиции автоподбора следует использовать именно ОбработкаВыбора, а не привычное событие ПриИзменении:

  1. Момент вызова. Событие ОбработкаВыбора возникает в момент клика по пункту выпадающего списка, но до того, как значение запишется в связанный реквизит формы. Внутри обработчика реквизит формы все еще хранит старое значение, а новое находится в параметре ВыбранноеЗначение. Это позволяет сравнить предыдущее и новое состояние.
  2. Возможность отмены выбора. В событии ОбработкаВыбора можно отключить стандартное поведение через установку флага СтандартнаяОбработка = Ложь. В событии ПриИзменении значение в реквизит уже записано, и отменить действие без ручного возврата старых данных нельзя.
  3. Случаи несрабатывания. Если пользователь завершил ввод без явного выбора из списка (например, ввел строку целиком и нажал клавишу Enter при однозначном соответствии), событие ОбработкаВыбора может не вызваться, тогда как ПриИзменении сработает гарантированно.

Практический пример: валидация и подмена значения

Посмотрим на пример, в котором требуется проверить выбранное значение и при необходимости отменить выбор либо заменить его другим объектом:


&НаКлиенте
Процедура НоменклатураОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    
    Если Не ПроверитьДоступностьПозиции(ВыбранноеЗначение) Тогда
        // Отменяем стандартное помещение значения в реквизит формы
        СтандартнаяОбработка = Ложь;
        ПоказатьОповещениеПользователя("Внимание", , "Выбранная позиция недоступна для выбора!");
        Возврат;
    КонецЕсли;
    
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПроверитьДоступностьПозиции(Знач СсылкаНоменклатура)
    
    // Так как на клиенте нельзя обращаться к реквизитам через точку,
    // выполняем проверку на сервере
    Возврат Не СсылкаНоменклатура.ПометкаУдаления;
    
КонецФункции

Особенности контекста выполнения и типичные ошибки

Разберем важные нюансы, о которых необходимо помнить при реализации логики:

  1. Клиентский контекст. Процедура ОбработкаВыбора выполняется исключительно в директиве &НаКлиенте. Если в параметре ВыбранноеЗначение передана ссылка базы данных, попытка прочитать ее реквизиты через точку (например, ВыбранноеЗначение.Артикул) вызовет ошибку времени выполнения. Для получения свойств ссылки следует вызывать серверную функцию, предпочтительно с директивой &НаСервереБезКонтекста.
  2. Связь с событием «АвтоПодбор». Событие АвтоПодбор предназначено только для генерации и фильтрации выпадающего списка вариантов (через заполнение параметра ДанныеВыбора). Перехватывать результат выбора внутри события АвтоПодбор нельзя — оно вызывается только в момент набора текста или нажатия клавиши «Стрелка вниз».
  3. Событие поля ввода vs событие формы. Важно не путать событие ОбработкаВыбора конкретного элемента формы с одноименным событием самой формы. Событие формы вызывается при закрытии подчиненных форм подбора (когда отработал метод ОповеститьОВыборе), тогда как событие элемента срабатывает при выборе из выпадающего списка автоподбора поля.

Таким образом, связка событий АвтоПодбор (для формирования списка) и ОбработкаВыбора (для анализа выбранного значения) позволяет полностью управлять поведением выпадающих списков в управляемых формах 1С.

← На главную