Как реализовать выбор из выпадающего списка при наборе части наименования в 1С 8.2

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

В платформе 1С:Предприятие 8.2 (особенно при использовании обычных форм) разработчики часто сталкиваются с тем, что штатный механизм автоподбора работает недостаточно гибко. В отличие от современных версий 8.3, где поиск по подстроке в середине слова включен по умолчанию, в 8.2 система «из коробки» ищет только по началу строки. Это создает неудобства для пользователей, которым нужно найти, например, «медный лом», просто введя слово «лом».

В рамках данной статьи мы разберем, как преодолеть ограничения платформы, обойти лимит в 50 элементов и реализовать удобный поиск «как в 8.3».

Проблема жесткого ограничения в 50 элементов

Прежде всего, проанализируем стандартное поведение платформы. Многие замечают, что при нажатии Enter или при автоматическом подборе список вариантов ограничен. Лимит в 50 строк для выпадающего списка в обычных формах является жестко «зашитым» в ядро 1С 8.2. К сожалению, изменить это число через свойства ПолеВвода или настройки системы невозможно.

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

Реализация поиска по подстроке через событие АвтоПодбор

Основным инструментом для решения нашей задачи является обработчик события АвтоПодбор. Рассмотрим подробнее, как перехватить ввод пользователя и подменить стандартный поиск своим алгоритмом.

Для начала откроем свойства нужного ПолеВвода на форме и создадим обработчик события АвтоПодбор. Нам необходимо выполнить следующие шаги:

  1. Отключить стандартную обработку события системой.
  2. Сформировать запрос к базе данных, используя оператор ПОДОБНО с масками «%».
  3. Заполнить параметр ДанныеВыбора полученными результатами.

Посмотрим на пример программного кода:


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

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

Оптимизация производительности: использование ожидания

Если мы будем выполнять запрос к базе данных на каждую введенную букву, интерфейс может начать «подтормаживать», особенно в высоконагруженных базах. В 1С 8.2 нет встроенного свойства «Режим изменения текста», который есть в 8.3. Поэтому профессиональные разработчики используют ПодключитьОбработчикОжидания.

Суть метода заключается в том, чтобы запускать поиск не мгновенно, а с задержкой в 0.5–1 секунду после последнего нажатия клавиши. Если пользователь продолжает печатать, предыдущий обработчик отключается и запускается новый таймер. Это позволяет избежать лишних запросов к СУБД.

Использование полнотекстового поиска (ППС)

Проанализируем ситуацию, когда справочник Номенклатура содержит сотни тысяч записей. Оператор ПОДОБНО "%...%" в SQL не может использовать индексы, что приведет к полному сканированию таблицы и резкому падению производительности. В этом случае на помощь приходит Полнотекстовый поиск.

Разберем алгоритм работы с ППС:

  1. Убедитесь, что в базе включено регламентное задание по обновлению индекса полнотекстового поиска.
  2. В обработчике вместо обычного запроса используйте метод ПолнотекстовыйПоиск.СоздатьСписок().
  3. Полученные результаты (объекты СписокПолнотекстовогоПоиска) преобразуйте в СписокЗначений и передайте в ДанныеВыбора.

Важно помнить: если индекс ППС не обновлен, новые товары, добавленные в базу пять минут назад, пользователь найти не сможет.

Опыт типовых конфигураций (УТ 10.3, УПП 1.3)

Выясним, как аналогичные задачи решены в тиражных решениях от 1С на обычных формах. В конфигурациях вроде УправлениеТорговлей редакции 10.3 часто используется отдельное текстовое поле (строка поиска) над табличной частью или списком справочника.

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

Если вам требуется именно «выпадающий список», при программном выводе списка в 8.2 следите за тем, чтобы ДанныеВыбора не перехватывали фокус ввода, иначе пользователю придется каждый раз кликать мышкой в поле, чтобы продолжить набор текста.

Резюме

Для реализации качественного подбора в 1С 8.2 необходимо:

← На главную