Почему в 1С:Управление торговлей 11 не работает поиск номенклатуры по любой части строки и как это исправить?

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

При работе с документами в типовых конфигурациях (таких как 1С:Управление торговлей 11, 1С:Комплексная автоматизация или 1С:ERP) пользователи часто сталкиваются с неудобством при быстром вводе позиций в табличную часть. При вводе текста в поле номенклатуры система ищет совпадение только с начала строки, игнорируя слова из середины наименования. Изменение свойства поля ввода в метаданных на Любая часть при этом не дает никакого эффекта.

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

Причина поведения типовой конфигурации

Выясним причину, по которой стандартная настройка поля ввода не работает в типовых решениях. В платформе 1С:Предприятие 8.3 для справочников действительно предусмотрено свойство СпособПоискаСтрокиПриВводеПоСтроке.ЛюбаяЧасть. Однако оно работает только при стандартной обработке ввода данных выбора.

В конфигурации 1С:УТ 11 алгоритм подбора номенклатуры полностью переопределен разработчиками:

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

Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    Параметры.ПолнотекстовыйПоиск = ПолнотекстовыйПоискПриВводеПоСтроке.Использовать; 
    Параметры.СпособПоискаСтроки = СпособПоискаСтрокиПриВводеПоСтроке.ЛюбаяЧасть;
    НоменклатураВызовСервера.НоменклатураОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка);
    
КонецПроцедуры
  1. Внутри процедуры НоменклатураВызовСервера.НоменклатураОбработкаПолученияДанныхВыбора платформенная обработка отключается через установку СтандартнаяОбработка = Ложь.
  2. Формируется собственный текст запроса к базе данных, где для условий отбора по полям Наименование и Артикул жестко прописана конструкция ПОДОБНО &Текст + "%", то есть поиск строго по началу строки.

Из-за отключения стандартной обработки любые попытки изменить свойства в палитре свойств метаданных или в структуре Параметры модуля менеджера не приводят к результату.

Способ 1. Корректировка алгоритма через расширение конфигурации

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

Разберем по шагам порядок действий:

  1. Создадим новое расширение конфигурации и добавим в него общий модуль НоменклатураВызовСервера.
  2. Перехватим процедуру НоменклатураОбработкаПолученияДанныхВыбора с помощью аннотации &Вместо или &ИзменениеИКонтроль.
  3. В месте формирования текста запроса заменим условие поиска по наименованию с начала строки на поиск по вхождению подстроки:

// Было в типовом коде:
// УсловиеПоНаименованию = "Номенклатура.Наименование ПОДОБНО &СтрокаПоиска + ""%""";

// Заменяем на поиск по любой части:
УсловиеПоНаименованию = "Номенклатура.Наименование ПОДОБНО ""%"" + &СтрокаПоиска + ""%""";

Если требуется находить позиции при вводе нескольких слов в произвольном порядке, разобьем строку поиска на массив слов и наложим условие ПОДОБНО на каждое отдельное слово через логический оператор И.

Способ 2. Использование штатного полнотекстового поиска

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

Проверим следующие настройки:

  1. Перейдем в раздел администрирования и откроем Полнотекстовый поиск.
  2. Проверим состояние индекса полнотекстового поиска. Убедимся, что регламентные задания ОбновлениеИндексаППД и СлияниеИндексаППД регулярно выполняются по расписанию.
  3. Убедимся, что для пользователей включена опция полнотекстового поиска при вводе по строке.

При актуальном индексе ввод слова «тестовая» найдет позицию «Номенклатура тестовая», так как полнотекстовый поиск платформы анализирует слова целиком.

Влияние на производительность и ограничения

Обратим внимание на критические технические нюансы при реализации поиска по подстроке:

  1. Нагрузка на СУБД: Использование конструкции ПОДОБНО "%" + ... приводит к операции Full Table Scan (полное сканирование таблицы), так как СУБД не может использовать индекс по наименованию при наличии маски в начале строки. В базах данных с номенклатурой более 50 000 позиций это может вызывать ощутимые задержки интерфейса.
  2. Ограничение минимальной длины ввода: Чтобы не перегружать сервер запросами при вводе 1-2 символов, обязательно установим программное ограничение: выполнять запрос по шаблону %текст% только в том случае, если пользователь ввел не менее 3 символов.
  3. Особенность полнотекстового поиска: Штатный полнотекстовый поиск ищет по словам и префиксам слов, но не находит произвольные сочетания букв внутри одного неделимого слова (например, сочетание «оменкл» внутри слова «Номенклатура»).
← На главную