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