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