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

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

При разработке управляемых форм часто возникает задача реализовать «живой» поиск или подсказки при наборе текста (например, интеграция с сервисами подсказок ФИО, адресов или динамический поиск по стороннему API). Типичная ошибка начинающих разработчиков — попытка динамически очищать и заполнять свойство Элемент.СписокВыбора во время набора текста. В результате значения в выпадающем списке либо не появляются вовсе, либо пропадают на этапе отображения.

Разберем причины такого поведения платформы 1С:Предприятие и рассмотрим правильный механизм реализации автоподбора через обработчик АвтоПодбор и коллекцию ДанныеВыбора.

Почему не работает прямое заполнение свойства СписокВыбора при вводе текста

Проанализируем механику работы управляемой формы. Свойство элемента формы СписокВыбора предназначено для статического или предварительно определенного набора значений. Когда пользователь начинает вводить текст в поле ввода, платформа запускает встроенный механизм быстрого поиска и автоподбора.

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

Правильный подход: использование события АвтоПодбор и параметра ДанныеВыбора

Для переопределения стандартного механизма поиска платформа предоставляет специальное событие элемента формы — АвтоПодбор. В заголовке обработчика этого события передаются ключевые параметры:

  1. Текст — текущая введенная пользователем строка, по которой требуется найти подсказки;
  2. ДанныеВыбора — выходной параметр типа СписокЗначений, в который помещаются найденные варианты;
  3. Ожидание — интервал задержки перед вызовом события (позволяет сократить число обращений к сервису при быстром наборе);
  4. СтандартнаяОбработка — булевый флаг, определяющий, будет ли платформа выполнять собственный типовой поиск.

Посмотрим на пример правильной структуры обработчика на клиенте:


&НаКлиенте
Процедура ПолеВводаФИОАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка)
    
    // Проверяем минимальную длину для начала поиска
    Если СтрДлина(СокрЛП(Текст)) < 3 Тогда
        Возврат;
    КонецЕсли;
    
    // Инициализируем список подсказок
    ДанныеВыбора = Новый СписокЗначений;
    
    // Получаем массив подходящих строк или структур
    МассивПодсказок = ПолучитьПодсказкиИзСервиса(Текст);
    
    Для Каждого Вариант Из МассивПодсказок Цикл
        // Добавляем значение и его представление
        ДанныеВыбора.Добавить(Вариант, Вариант);
    КонецЦикла;
    
    // Обязательно отключаем стандартную обработку автоподбора
    СтандартнаяОбработка = Ложь;
    
КонецПроцедуры

Почему значение не выбирается из списка: частые ошибки и их устранение

Рассмотрим распространенную проблему: список подсказок успешно появляется на экране, но при нажатии мыши или клавиши Enter выбранный пункт не подставляется в поле ввода. Выясним основные причины такого поведения:

  1. Несоответствие типов данных: Если реквизит формы имеет тип Строка, то первым параметром метода ДанныеВыбора.Добавить(Значение, Представление) должна передаваться именно строка. Если передать туда сложную структуру данных, объект или Неопределено, платформа не сможет сопоставить тип реквизита со значением элемента списка и сбросит ввод.
  2. Неинициализированный параметр: В момент входа в процедуру параметр ДанныеВыбора часто равен Неопределено. Всегда выполняйте явное создание объекта через ДанныеВыбора = Новый СписокЗначений;.
  3. Использование служебных структур: Если в СписокЗначений передается структура с дополнительными свойствами, платформа 1С распознает только зарезервированные ключи: Значение (подставляемое значение), ПометкаУдаления (булево) и Предупреждение (текст всплывающего предупреждения). Использование произвольных ключей в структуре приводит к ошибкам подстановки.

Перехват и дополнительная обработка выбранного значения

Если при выборе подсказки необходимо не просто заполнить текущее поле, но и распределить полученные данные по другим реквизитам формы (например, разбить строку ФИО на отдельные поля «Фамилия», «Имя», «Отчество»), используем событие поля ввода ОбработкаВыбора.

Разберем по шагам, как перехватить выбор:


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

Оптимизация производительности автоподбора

Событие АвтоПодбор срабатывает на стороне клиента при каждом изменении текста в поле. Чтобы форма не зависала при быстром наборе текста пользователем, важно соблюдать следующие правила:

  1. Использование параметра Ожидание: Установка значения параметра (например, Ожидание = 0.5;) дает платформе команду выполнять обращение только после паузы в наборе текста.
  2. Минимизация контекстных серверных вызовов: Если для получения данных требуется обращение к базе, используйте только директиву &НаСервереБезКонтекста, чтобы не передавать состояние всей управляемой формы по сети.

Применение параметров ДанныеВыбора и СтандартнаяОбработка = Ложь в обработчике АвтоПодбор полностью решает проблему потери подсказок и обеспечивает корректную работу интерактивного ввода в 1С.

← На главную