Поиск номенклатуры по частям слов



Поиск любых справочников по частям слов наименования

Поиск любых справочников по частям слов наименования, при этом не важно, в каком порядке вводить части слов наименования.
Например при строке поиска «ламп 40 вт» результат будет тем же, что и при поиске по строке «вт ламп 40».
Поиск происходит очень быстро, при номенклатуре в 40 000 позиций, время работы около 1,5 — 2 сек.

Подключение к конфигурации производится путем объединения конфигураций.
В прилагаемом файле находится база данных с небольшим количеством номенклатуры для примера.
Конфигурация базы данных содержит только необходимые объекты метаданных:

1. Общий модуль с небходимыми процедурами
2. Подписка на событие «ПриЗаписи» объекта «СправочникОбъект.Номенклатура». Если необходимо выполнять поиск
    в другом справочнике, то его тип нужно добавить в список типов источника подписки.
3. Регистр сведений «_БазаСлов» хранит «огрызки» слов, составляющих наименования элементов справочника
4. Обработка «_ПереиндексацияБазыСлов» служит для первоначального заполнения регистра сведений «_БазаСлов», а 
    так же для его очистки в случае необходимости.
5. Обработка «_БыстрыйПоискЭлементовСправочника» служит для ввода поисковой строки и вызывается из формы списка
    справочника. Я в своем примере на форму списка номенклатуры добавил две кнопки «Поиск» и «ПоискОчистка», назначил
    им сочетания клавиш «F7» и «Ctrl+F7»

Не используются внешние компоненты.

4 Comments

  1. cool.vlad4
    3. Регистр сведений «_БазаСлов» хранит «огрызки» слов, составляющих наименования элементов справочника

    4. Обработка «_ПереиндексацияБазыСлов» служит для первоначального заполнения регистра сведений «_БазаСлов», а

    так же для его очистки в случае необходимости.

    А зачем? когда данная задача решается просто разбиением строки и формированием запроса через ПОДОБНО? и по скорости уж точно не медленнее, чем

    Поиск происходит очень быстро, при номенклатуре в 40 000 позиций, время работы около 1,5 — 2 сек.
    Reply
  2. Re:аниматор

    Подскажу вам хитрость как это легко доработать в процедуре поиске стандартных конфигураций.

    На примере обработки «Подбор номенклатуры» УТ 10.3

    Процедура ВыполнитьПоиск()
    …
    
    // заменим спецсимволы
    ШаблонПоиска = СтрЗаменить(ШаблонПоиска, «~», «~~»);
    ШаблонПоиска = СтрЗаменить(ШаблонПоиска, «%», «~%»);
    ШаблонПоиска = СтрЗаменить(ШаблонПоиска, «_», «~_»);
    ШаблонПоиска = СтрЗаменить(ШаблонПоиска, «[«, «~[«);
    ШаблонПоиска = СтрЗаменить(ШаблонПоиска, «-«, «~-«);
    ШаблонПоиска = «%» + ШаблонПоиска + «%»;
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр(«ШаблонПоиска», ШаблонПоиска);
    
    …
    
    

    Показать

    Заменяем на

    // заменим спецсимволы
    ШаблонПоиска = СтрЗаменить(ШаблонПоиска, «~», «~~»);
    ШаблонПоиска = СтрЗаменить(ШаблонПоиска, «%», «~%»);
    ШаблонПоиска = СтрЗаменить(ШаблонПоиска, «_», «~_»);
    ШаблонПоиска = СтрЗаменить(ШаблонПоиска, «[«, «~[«);
    ШаблонПоиска = СтрЗаменить(ШаблонПоиска, «-«, «~-«);
    
    ШаблонПоиска = СокрЛП(ШаблонПоиска);
    
    ТекстИ = »
    | И «;
    ТекстУсловияОтбораПоШаблону = «»;
    СписокПодШаблонов = Новый СписокЗначений;
    ЕстьПробелы = Найти(ШаблонПоиска, » «) > 0;
    н = 0;
    Пока ЕстьПробелы Цикл
    ПозицияПробела = Найти(ШаблонПоиска, » «);
    ПодШаблон = Лев(ШаблонПоиска, ПозицияПробела — 1);
    ПодШаблон = «%» + ПодШаблон + «%»;
    СписокПодШаблонов.Добавить(ПодШаблон);
    ШаблонПоиска = СокрЛП(Прав(ШаблонПоиска, СтрДлина(ШаблонПоиска) — ПозицияПробела));
    ЕстьПробелы = Найти(ШаблонПоиска, » «) > 0;
    ТекстУсловияОтбораПоШаблону = ТекстУсловияОтбораПоШаблону +
    ?(ТекстУсловияОтбораПоШаблону = «», «», ТекстИ) + » Номенклатура.» + ЭлементыФормы.СписокВидовПоиска.Значение + » ПОДОБНО &ШаблонПоиска» + н + » СПЕЦСИМВОЛ «»~»»»;
    н = н + 1;
    КонецЦикла;
    
    ШаблонПоиска = «%» + ШаблонПоиска + «%»;
    
    СписокПодШаблонов.Добавить(ШаблонПоиска);
    ТекстУсловияОтбораПоШаблону = ТекстУсловияОтбораПоШаблону +
    ?(ТекстУсловияОтбораПоШаблону = «», «», ТекстИ) + » Номенклатура.» + ЭлементыФормы.СписокВидовПоиска.Значение + » ПОДОБНО &ШаблонПоиска» + н + » СПЕЦСИМВОЛ «»~»»»;
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр(«ШаблонПоиска», ШаблонПоиска);
    
    

    Показать

    P.S. не нужно хранить «огрызки» слов. Время работы около 0,5 — 1 сек.

    Reply
  3. orfos

    Спасибо. Очень помогло.

    Reply
  4. kida1

    (2) идея хорошая, вероятно вы выложили не весь текст который нужно заменить, и не совсем универсальный механизм.

    Предлагаю в обработке Подбор номенклатуры в процедуре ВыполнитьПоиск() следующее:

    
    // заменим спецсимволы
    ШаблонПоиска = СтрЗаменить(ШаблонПоиска, «~», «~~»);
    ШаблонПоиска = СтрЗаменить(ШаблонПоиска, «%», «~%»);
    ШаблонПоиска = СтрЗаменить(ШаблонПоиска, «_», «~_»);
    ШаблонПоиска = СтрЗаменить(ШаблонПоиска, «[«, «~[«);
    ШаблонПоиска = СтрЗаменить(ШаблонПоиска, «-«, «~-«);
    
    Запрос = Новый Запрос;
    
    ШаблонПоиска = СокрЛП(ШаблонПоиска);
    
    ТекстИ = »
    |    И «;
    ТекстУсловияОтбораПоШаблону = «»;
    СписокПодШаблонов = Новый СписокЗначений;
    
    н=0;
    Для каждого ПодШаблон из ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(ШаблонПоиска,» «) цикл
    ПараметрПоиска =  «%» + ПодШаблон + «%»;
    Запрос.УстановитьПараметр(«ШаблонПоиска»+н, ПараметрПоиска);
    
    ТекстУсловияОтбораПоШаблону = ТекстУсловияОтбораПоШаблону +
    ?(ТекстУсловияОтбораПоШаблону = «», «», ТекстИ) + »    Номенклатура.» + ЭлементыФормы.СписокВидовПоиска.Значение + » ПОДОБНО &ШаблонПоиска» + н + » СПЕЦСИМВОЛ «»~»»»;
    н=н+1;
    КонецЦикла;
    //см-
    
    Если ЕстьНоменклатурнаяГруппа Тогда
    Запрос.УстановитьПараметр(«НоменклатурнаяГруппа», НоменклатурнаяГруппа);
    КонецЕсли;
    
    // Инициализируем структуру выбранной строки (реквизиты обработки).
    Если ПодборПоСправочнику Тогда
    
    Запрос.Текст = »
    |ВЫБРАТЬ ПЕРВЫЕ 51
    | Номенклатура.Код КАК Код,
    | Номенклатура.Артикул КАК Артикул,
    | Номенклатура.Ссылка КАК Номенклатура,
    | Номенклатура.НаименованиеПолное КАК НаименованиеПолное,
    | Номенклатура.Родитель КАК Родитель
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |
    |ГДЕ
    |   «+ТекстУсловияОтбораПоШаблону+»
    //| Номенклатура.» + ЭлементыФормы.СписокВидовПоиска.Значение + » ПОДОБНО &ШаблонПоиска СПЕЦСИМВОЛ «»~»»
    | И Номенклатура.ЭтоГруппа = Ложь
    | » + ?(ЕстьНоменклатурнаяГруппа, «И Номенклатура.НоменклатурнаяГруппа В (&НоменклатурнаяГруппа)», «») + »
    |»;
    
    Иначе
    

    Показать

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *