В современных интерфейсах пользователи привыкли к «живому» поиску: когда при вводе первых букв система сразу предлагает подходящие варианты. В среде 1С (особенно в Управляемом приложении, таком как УТ 11.4) этот функционал крайне востребован для быстрого подбора номенклатуры. Разберем подробно, какими способами можно реализовать механизмы подсказок, от простых настроек до глубокой программной доработки.
Прежде чем приступать к написанию кода, проанализируем типовой функционал платформы 8.3. В управляемых формах для большинства полей ввода, связанных со справочниками, уже предусмотрен механизм автоподбора. Однако часто он работает «по началу строки», что не устраивает пользователей, желающих найти «сникерс» по слову «орех».
Для настройки стандартного поиска в таких программах, как УТ 11, ERP или КА, выполним следующие шаги:
Если стандартного поведения недостаточно и нам нужно реализовать специфическую логику (например, искать сразу по нескольким полям или предлагать варианты из остатков), рассмотрим программный метод через событие Автоподбор. Это событие возникает на клиенте, когда пользователь вводит текст в поле ввода.
Разберем пример кода для реализации этой задачи:
&НаКлиенте
Процедура НоменклатураАвтоПодбор(Элемент, Текст, ДанныеВыбора, Параметры, Ожидание, СтандартнаяОбработка)
Если СтрДлина(Текст) < 3 Тогда
Возврат;
КонецЕсли;
СтандартнаяОбработка = Ложь;
ДанныеВыбора = ПолучитьСписокПодсказокНаСервере(Текст);
КонецПроцедуры
В этом примере мы отключаем СтандартнаяОбработка и передаем управление нашей серверной функции. Параметр Ожидание позволяет системе делать небольшую паузу после ввода символа, чтобы не перегружать сервер запросами на каждой букве.
Наиболее архитектурно правильный способ в 1С 8.3 — это использование механизма ОбработкаПолученияДанныхВыбора. Этот метод прописывается в Модуле менеджера соответствующего объекта (справочника Номенклатура).
Рассмотрим, как реализовать поиск по любой части строки с помощью запроса:
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТекстПоиска = Параметры.СтрокаПоиска;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 10
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНО &ТекстПоиска
| И НЕ Номенклатура.ЭтоГруппа";
Запрос.УстановитьПараметр("ТекстПоиска", "%" + ТекстПоиска + "%");
РезультатЗапроса = Запрос.Выполнить();
СписокВыбора = Новый СписокЗначений;
СписокВыбора.ЗагрузитьЗначения(РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Ссылка"));
ДанныеВыбора = СписокВыбора;
КонецПроцедуры
Важный нюанс: Использование оператора ПОДОБНО с процентом в начале (%Текст%) заставляет SQL-сервер игнорировать индексы, что может привести к замедлению работы на огромных справочниках. Проанализируем ситуацию: если в вашей базе более 100 000 позиций, лучше использовать полнотекстовый поиск 1С.
Чтобы поиск был действительно «умным», как в Google (учитывал опечатки и морфологию), воспользуемся методом ПолнотекстовыйПоиск.СоздатьСписок(). Это позволит находить «сникерс супер с лесным орехом», даже если пользователь ввел «лесным орехо».
Проанализируем шаги реализации:
Номенклатура установим свойство Использование полнотекстового поиска в значение Использовать.Пример программного поиска через ППД:
СписокППД = ПолнотекстовыйПоиск.СоздатьСписок(ТекстПоиска, 10);
СписокППД.ПерваяЧасть();
СписокВыбора = Новый СписокЗначений;
Для Каждого Результат Из СписокППД Цикл
Если ТипЗнч(Результат.Значение) = Тип("СправочникСсылка.Номенклатура") Тогда
СписокВыбора.Добавить(Результат.Значение, Результат.Представление);
КонецЕсли;
КонецЦикла;
Часто пользователь вводит слова не в том порядке, в котором они записаны в базе. Для решения этой задачи разберем алгоритм разделения строки. Мы разбиваем ввод пользователя на массив слов и ищем вхождения каждого слова по отдельности.
Выясним причину популярности этого метода: он обеспечивает максимальную гибкость. Если ввести «орех сникерс», запрос должен выглядеть примерно так:
ГДЕ Наименование ПОДОБНО "%орех%" И Наименование ПОДОБНО "%сникерс%"
Рассмотрим пример функции для подготовки условий запроса:
МассивСлов = СтрРазделить(ТекстПоиска, " ", Ложь);
ТекстУсловия = "";
Для Индекс = 0 По МассивСлов.ВходящаяГраница() Цикл
ПараметрИмя = "Слово" + Индекс;
ТекстУсловия = ТекстУсловия + " И Номенклатура.Наименование ПОДОБНО &" + ПараметрИмя;
Запрос.УстановитьПараметр(ПараметрИмя, "%" + МассивСлов[Индекс] + "%");
КонецЦикла;
Если вы работаете в старых конфигурациях (например, УПП или УТ 10.3), механизм управляемого автоподбора там отсутствует. В этом случае программисты используют событие ПриИзменении или ОкончаниеВводаТекста у элемента формы ПолеВвода.
Посмотрим на алгоритм действий:
ОкончаниеВводаТекста выполняется запрос к базе.ВыбратьИзСписка().Это создает визуальный эффект выпадающего меню, очень похожий на современные интерфейсы, хотя и требует большего объема ручного кодирования для обработки выбора значения.
Для достижения максимального сходства с Google можно использовать ФорматированнуюСтроку в списке выбора. Это позволит выделять найденные подстроки жирным шрифтом или цветом. Хотя это требует дополнительных ресурсов сервера на формирование каждой строки подсказки, удобство для конечного пользователя возрастает в разы.
Подведем итог: наиболее эффективным методом для современных версий 1С является сочетание ОбработкаПолученияДанныхВыбора и Полнотекстового поиска. Это обеспечивает и высокую скорость, и релевантность результатов, избавляя пользователей от необходимости нажимать Enter и ждать полного открытия списка номенклатуры.