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