В платформе 1С:Предприятие 8.2 (особенно при использовании обычных форм) разработчики часто сталкиваются с тем, что штатный механизм автоподбора работает недостаточно гибко. В отличие от современных версий 8.3, где поиск по подстроке в середине слова включен по умолчанию, в 8.2 система «из коробки» ищет только по началу строки. Это создает неудобства для пользователей, которым нужно найти, например, «медный лом», просто введя слово «лом».
В рамках данной статьи мы разберем, как преодолеть ограничения платформы, обойти лимит в 50 элементов и реализовать удобный поиск «как в 8.3».
Прежде всего, проанализируем стандартное поведение платформы. Многие замечают, что при нажатии Enter или при автоматическом подборе список вариантов ограничен. Лимит в 50 строк для выпадающего списка в обычных формах является жестко «зашитым» в ядро 1С 8.2. К сожалению, изменить это число через свойства ПолеВвода или настройки системы невозможно.
Если ваша номенклатура содержит тысячи позиций, пользователь просто не увидит нужный товар, если под критерии поиска подпадает больше 50 элементов. Единственный путь решения — это полный отказ от стандартной обработки и переход к программному управлению списком выбора.
Основным инструментом для решения нашей задачи является обработчик события АвтоПодбор. Рассмотрим подробнее, как перехватить ввод пользователя и подменить стандартный поиск своим алгоритмом.
Для начала откроем свойства нужного ПолеВвода на форме и создадим обработчик события АвтоПодбор. Нам необходимо выполнить следующие шаги:
ПОДОБНО с масками «%».ДанныеВыбора полученными результатами.Посмотрим на пример программного кода:
Процедура ПолеВводаАвтоПодбор(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка)
// 1. Отключаем штатный поиск по началу строки
СтандартнаяОбработка = Ложь;
// 2. Устанавливаем минимальное количество символов для начала поиска (например, 3)
Если СтрДлина(Текст) < 3 Тогда
Возврат;
КонецЕсли;
// 3. Формируем запрос к справочнику Номенклатура
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 100
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНО &ТекстПоиска
| И НЕ Номенклатура.ЭтоГруппа";
// Используем спецсимвол % для поиска в любой части строки
Запрос.УстановитьПараметр("ТекстПоиска", "%" + Текст + "%");
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Список = Новый СписокЗначений;
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Список.Добавить(Выборка.Ссылка, Выборка.Наименование);
КонецЦикла;
// 4. Передаем список в систему для отображения пользователю
ДанныеВыбора = Список;
КонецЕсли;
КонецПроцедуры
Если мы будем выполнять запрос к базе данных на каждую введенную букву, интерфейс может начать «подтормаживать», особенно в высоконагруженных базах. В 1С 8.2 нет встроенного свойства «Режим изменения текста», который есть в 8.3. Поэтому профессиональные разработчики используют ПодключитьОбработчикОжидания.
Суть метода заключается в том, чтобы запускать поиск не мгновенно, а с задержкой в 0.5–1 секунду после последнего нажатия клавиши. Если пользователь продолжает печатать, предыдущий обработчик отключается и запускается новый таймер. Это позволяет избежать лишних запросов к СУБД.
Проанализируем ситуацию, когда справочник Номенклатура содержит сотни тысяч записей. Оператор ПОДОБНО "%...%" в SQL не может использовать индексы, что приведет к полному сканированию таблицы и резкому падению производительности. В этом случае на помощь приходит Полнотекстовый поиск.
Разберем алгоритм работы с ППС:
ПолнотекстовыйПоиск.СоздатьСписок().СписокПолнотекстовогоПоиска) преобразуйте в СписокЗначений и передайте в ДанныеВыбора.Важно помнить: если индекс ППС не обновлен, новые товары, добавленные в базу пять минут назад, пользователь найти не сможет.
Выясним, как аналогичные задачи решены в тиражных решениях от 1С на обычных формах. В конфигурациях вроде УправлениеТорговлей редакции 10.3 часто используется отдельное текстовое поле (строка поиска) над табличной частью или списком справочника.
При изменении текста в этом поле срабатывает фильтрация (отбор) в динамическом списке или табличном поле. Это более стабильный вариант для обычных форм, так как он не зависит от капризного поведения выпадающего списка и позволяет отображать неограниченное количество найденных позиций сразу в таблице, что гораздо удобнее для подбора большого количества товаров.
Если вам требуется именно «выпадающий список», при программном выводе списка в 8.2 следите за тем, чтобы ДанныеВыбора не перехватывали фокус ввода, иначе пользователю придется каждый раз кликать мышкой в поле, чтобы продолжить набор текста.
Для реализации качественного подбора в 1С 8.2 необходимо:
АвтоПодбор.СтандартнаяОбработка = Ложь.ПОДОБНО или механизмы полнотекстового поиска для больших баз.