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

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

Часто перед разработчиками 1С встает задача реализации так называемого «живого поиска» — когда список данных в форме фильтруется автоматически по мере того, как пользователь вводит символы в поле ввода. Стандартное событие ПриИзменении срабатывает только в момент завершения редактирования (потеря фокуса или нажатие Enter), что не подходит для интерактивного поиска. Разберем, как решить эту задачу правильно.

Использование события ТекстРедактирования

Для отслеживания ввода каждого символа в управляемых формах предназначено событие ТекстРедактирования (в английской версии EditTextChange). Это событие генерируется системой каждый раз, когда пользователь нажимает клавишу в поле ввода. Однако прямое использование этого обработчика для выполнения серверных вызовов — плохая практика, так как это приведет к «подвисанию» интерфейса при каждом нажатом символе.

Оптимизация: Подключение обработчика ожидания

Чтобы сервер не перегружался лишними запросами, нам необходимо внедрить механизм «паузы» перед выполнением поиска. Мы будем использовать ПодключитьОбработчикОжидания. Логика работы выглядит следующим образом:

  1. Пользователь начинает вводить текст.
  2. В обработчике ТекстРедактирования мы каждый раз сбрасываем предыдущий запланированный вызов поиска.
  3. Устанавливаем новый таймер (например, 0.5–1 секунду) до выполнения серверной функции поиска.
  4. Если пользователь продолжает вводить текст, таймер постоянно «сдвигается» вперед.
  5. Поиск на сервере выполнится только тогда, когда пользователь сделает паузу в наборе текста.

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


&НаКлиенте
Процедура ПолеВводаТекстРедактирования(Элемент, Текст, СтандартнаяОбработка)
    // Сбрасываем предыдущий ожидающий вызов, если он был
    ОтключитьОбработчикОжидания("ВыполнитьПоискНаСервере");
    
    // Устанавливаем задержку, чтобы дождаться окончания ввода
    ПодключитьОбработчикОжидания("ВыполнитьПоискНаСервере", 0.7, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьПоискНаСервере()
    // Получаем текущий текст из элемента
    ТекстПоиска = Элементы.ПолеВвода.ТекстРедактирования;
    
    // Проверка на минимальную длину для снижения нагрузки
    Если СтрДлина(ТекстПоиска) >= 3 Тогда
        // Вызываем серверный метод
        ОбновитьОтборНаСервере(ТекстПоиска);
    КонецЕсли;
КонецПроцедуры

Важные рекомендации по производительности

При реализации поиска в динамических списках или таблицах важно учитывать следующие аспекты:

Альтернативные подходы

Если задача заключается не в фильтрации списка, а в поиске элемента справочника, рассмотрите использование штатных механизмов:

Таким образом, сочетание события ТекстРедактирования и метода ПодключитьОбработчикОжидания является наиболее гибким способом реализации интерактивного поиска, который позволяет достичь «отзывчивости» интерфейса при выполнении серверных операций.

← На главную