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