Как реализовать «умные» подсказки при поиске в 1С (как в Google)?

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

В современных интерфейсах пользователи привыкли к «живому» поиску: когда при вводе первых букв система сразу предлагает подходящие варианты. В среде 1С (особенно в Управляемом приложении, таком как УТ 11.4) этот функционал крайне востребован для быстрого подбора номенклатуры. Разберем подробно, какими способами можно реализовать механизмы подсказок, от простых настроек до глубокой программной доработки.

1. Встроенные возможности управляемых форм

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

Для настройки стандартного поиска в таких программах, как УТ 11, ERP или КА, выполним следующие шаги:

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

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

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

Разберем пример кода для реализации этой задачи:


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

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

3. Обработка получения данных выбора в модуле менеджера

Наиболее архитектурно правильный способ в 1С 8.3 — это использование механизма ОбработкаПолученияДанныхВыбора. Этот метод прописывается в Модуле менеджера соответствующего объекта (справочника Номенклатура).

Рассмотрим, как реализовать поиск по любой части строки с помощью запроса:


Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    ТекстПоиска = Параметры.СтрокаПоиска;
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 10
    |   Номенклатура.Ссылка КАК Ссылка,
    |   Номенклатура.Наименование КАК Наименование
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |   Номенклатура.Наименование ПОДОБНО &ТекстПоиска
    |   И НЕ Номенклатура.ЭтоГруппа";
    
    Запрос.УстановитьПараметр("ТекстПоиска", "%" + ТекстПоиска + "%");
    
    РезультатЗапроса = Запрос.Выполнить();
    СписокВыбора = Новый СписокЗначений;
    СписокВыбора.ЗагрузитьЗначения(РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Ссылка"));
    
    ДанныеВыбора = СписокВыбора;
    
КонецПроцедуры

Важный нюанс: Использование оператора ПОДОБНО с процентом в начале (%Текст%) заставляет SQL-сервер игнорировать индексы, что может привести к замедлению работы на огромных справочниках. Проанализируем ситуацию: если в вашей базе более 100 000 позиций, лучше использовать полнотекстовый поиск 1С.

4. Применение полнотекстового поиска (ППД) для подсказок

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

Проанализируем шаги реализации:

  1. В конфигураторе для справочника Номенклатура установим свойство Использование полнотекстового поиска в значение Использовать.
  2. В коде будем формировать поисковое выражение.

Пример программного поиска через ППД:


СписокППД = ПолнотекстовыйПоиск.СоздатьСписок(ТекстПоиска, 10);
СписокППД.ПерваяЧасть();

СписокВыбора = Новый СписокЗначений;
Для Каждого Результат Из СписокППД Цикл
    Если ТипЗнч(Результат.Значение) = Тип("СправочникСсылка.Номенклатура") Тогда
        СписокВыбора.Добавить(Результат.Значение, Результат.Представление);
    КонецЕсли;
КонецЦикла;

5. Реализация поиска по нескольким словам

Часто пользователь вводит слова не в том порядке, в котором они записаны в базе. Для решения этой задачи разберем алгоритм разделения строки. Мы разбиваем ввод пользователя на массив слов и ищем вхождения каждого слова по отдельности.

Выясним причину популярности этого метода: он обеспечивает максимальную гибкость. Если ввести «орех сникерс», запрос должен выглядеть примерно так:

ГДЕ Наименование ПОДОБНО "%орех%" И Наименование ПОДОБНО "%сникерс%"

Рассмотрим пример функции для подготовки условий запроса:


МассивСлов = СтрРазделить(ТекстПоиска, " ", Ложь);
ТекстУсловия = "";
Для Индекс = 0 По МассивСлов.ВходящаяГраница() Цикл
    ПараметрИмя = "Слово" + Индекс;
    ТекстУсловия = ТекстУсловия + " И Номенклатура.Наименование ПОДОБНО &" + ПараметрИмя;
    Запрос.УстановитьПараметр(ПараметрИмя, "%" + МассивСлов[Индекс] + "%");
КонецЦикла;

6. Особенности для Обычных форм

Если вы работаете в старых конфигурациях (например, УПП или УТ 10.3), механизм управляемого автоподбора там отсутствует. В этом случае программисты используют событие ПриИзменении или ОкончаниеВводаТекста у элемента формы ПолеВвода.

Посмотрим на алгоритм действий:

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

7. Юзабилити и «красивое» отображение

Для достижения максимального сходства с Google можно использовать ФорматированнуюСтроку в списке выбора. Это позволит выделять найденные подстроки жирным шрифтом или цветом. Хотя это требует дополнительных ресурсов сервера на формирование каждой строки подсказки, удобство для конечного пользователя возрастает в разы.

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

← На главную