При вводе текста в поле подбора номенклатуры пользователи часто сталкиваются с ситуацией, когда система предлагает только те позиции, наименование которых начинается со введенного слова. Если же искомое слово находится в середине или конце названия товара, автоподбор его не находит. Изменение свойства справочника Способ поиска строки = Любая часть в метаданных или включение полнотекстового поиска в свойствах поля ввода не всегда приносит желаемый результат. Проанализируем причину такого поведения и разберем варианты решения данной задачи.
Выясним, почему стандартная настройка метаданных не срабатывает в типовых конфигурациях (таких как «1С:Управление торговлей 11», «1С:ERP» и «1С:Комплексная автоматизация»). В этих решениях штатный механизм платформы по подбору по строке переопределен программно в событии ОбработкаПолученияДанныхВыбора модуля менеджера объекта или в специализированных общих модулях.
В коде процедуры значение параметра СтандартнаяОбработка сбрасывается в Ложь, а выборка формируется прямым запросом к базе данных. При этом к поисковой строке программно добавляется символ % только в конец подставляемого значения:
Запрос.УстановитьПараметр("СтрокаПоиска", СтрокаПоиска + "%");
В результате СУБД выполняет условие ПОДОБНО "Текст%", что обеспечивает поиск строго по началу строки и игнорирует вхождения текста в середине наименования.
Рассмотрим быструю альтернативу, не требующую вмешательства в конфигурацию. Пользователи могут самостоятельно указывать символ % перед вводимым словом прямо в поле ввода. Например, если ввести %проста, итоговый параметр запроса принимает вид %проста%, и система выведет все позиции, содержащие данное слово в любой части наименования.
Разберем наиболее корректное техническое решение, которое позволяет сохранить конфигурацию на поддержке. Доработаем программный код с помощью расширения конфигурации.
НоменклатураВызовСервера или модуле менеджера справочника Номенклатура в событии ОбработкаПолученияДанныхВыбора).&ИзменениеИОбработка или &Вместо, изменив условие так, чтобы символ процента добавлялся и в начало строки:
// Изменение формирования параметра для поиска по любой части строки
Запрос.УстановитьПараметр("СтрокаПоиска", "%" + СтрокаПоиска + "%");
Важно о производительности: Использование оператора ПОДОБНО "%Текст%" отключает использование индексов СУБД по наименованию. В крупных базах данных (от 100 000 элементов номенклатуры) это может приводить к повышенной нагрузке на сервер при одновременной работе нескольких пользователей.
Посмотрим, как решить задачу подбора без потери производительности на больших справочниках. Для этого необходимо задействовать полнотекстовый поиск платформы.
ОбработкаПолученияДанныхВыбора установим использование полнотекстового поиска для параметра выборки:
Параметры.ПолнотекстовыйПоиск = ПолнотекстовыйПоискПриВводеПоСтроке.Использовать;
Проанализируем альтернативный вариант работы в пользовательском режиме. Вместо прямого набора наименования в строке табличной части документа можно использовать специальную форму подбора (кнопка «Подбор»). В штатной форме подбора конфигураций «1С:Управление торговлей» встроен полноценный полнотекстовый поиск, который позволяет находить позиции по любой части названия, артикулу и дополнительным реквизитам без необходимости доработки программного кода.