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

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

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

Метод 1. Программная имитация задержки через паттерн Debounce

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

Для начала нам понадобится событие поля ввода ИзменениеТекстаРедактирования. В этом событии мы будем сбрасывать и заново запускать таймер. Рассмотрим пример кода:


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

Затем создадим саму процедуру ВыполнитьПрограммныйПоиск, в которой будем вызывать выпадающий список. Выясним причину, по которой это удобнее: мы полностью контролируем момент начала поиска. В этой процедуре можно использовать метод ВыбратьИзСписка или программно заполнять список выбора элемента.

Метод 2. Использование события Автоподбор

Разберем еще один глубокий механизм управления — событие Автоподбор. Оно срабатывает непосредственно перед тем, как платформа начнет искать данные в базе. Если мы установим параметр СтандартнаяОбработка = Ложь, системный поиск не запустится вовсе.

Это дает нам возможность реализовать следующую логику:

  1. Пользователь вводит символы.
  2. В событии Автоподбор мы проверяем, достаточно ли символов введено или прошло ли достаточно времени.
  3. Если условия не выполнены, мы отключаем стандартный поиск.
  4. Если пользователь замолчал — инициируем подбор принудительно.

Посмотрим на пример обработки в модуле формы:


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

Метод 3. Фильтрация в менеджере объекта

Иногда проблема не в самой задержке 0,2 секунды, а в том, что поиск по коротким строкам (1-2 символа) выдает слишком много результатов, что визуально тормозит систему. В этом случае мы можем применить обработку в модуле менеджера справочника или документа, к которому относится поле.

Рассмотрим использование предопределенной процедуры ОбработкаПолученияДанныхВыбора. Этот метод выполняется на сервере. Хотя он не меняет саму задержку появления списка, он позволяет эффективно отсекать ненужные запросы.


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

КонецПроцедуры

Проанализируем ситуацию: пользователь вводит "А". Платформа ждет 0,2 сек и идет на сервер. Сервер моментально отвечает "ничего не найдено" (потому что длина меньше 3). Пользователь продолжает ввод, и когда строка становится "АБВ", сервер выполняет реальный поиск. Это значительно снижает нагрузку на базу данных.

Метод 4. Оптимизация полнотекстового поиска и свойств поля

Часто субъективное ощущение "тормозов" при вводе связано не с задержкой, а с тем, как платформа ищет данные. Проанализируем настройки свойств поля ввода в конфигураторе:

Специфика работы в Web-клиенте

При работе через браузер стоит учитывать сетевые задержки (latency). Стандартные 0,2 секунды в Web-клиенте могут превращаться в визуальные рывки. В этом случае использование Метода 1 (Debounce) является практически обязательным, так как оно позволяет накопить ввод пользователя в один пакет и отправить один запрос на сервер вместо пяти-десяти при каждом нажатии клавиши.

Рекомендации по реализации

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

  1. Если ваша цель — снизить нагрузку на сервер, используйте ОбработкаПолученияДанныхВыбора в менеджере объекта с проверкой длины строки.
  2. Если ваша цель — дать пользователю допечатать слово без мелькания списка, используйте ПодключитьОбработчикОжидания в событии ИзменениеТекстаРедактирования.
  3. Для комплексного решения совмещайте оба метода: на клиенте делайте паузу, а на сервере проверяйте валидность введенных данных для поиска.

Рассмотренные механизмы позволяют сделать интерфейс программы более "отзывчивым" и профессиональным, адаптируя стандартные возможности 1С:Предприятие 8.3 под конкретные нужды бизнес-логики.

← На главную