Как реализован стандартный механизм строки поиска (Ctrl+F) ?

1. xtd 6 16.04.19 12:54 Сейчас в теме
Добрый день.

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

Не могу понять каким образом реализован стандартный механизм строки поиска (Ctrl+F). Как выбрать номенклатуру не учитывая конкретную последовательность введенных пользователем ключевых слов для поиска?

Т.е. если я использую такой запрос:

ЗапросПоиск = Новый Запрос(
    #Область Текст_запроса
    "ВЫБРАТЬ ПЕРВЫЕ 50
    |    Номенклатура.Ссылка,
    |    Номенклатура.Наименование,
    |    Номенклатура.АртикулДляПоиска
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |    (Номенклатура.Наименование ПОДОБНО ""%"" + &Наименование + ""%"" ИЛИ Номенклатура.АртикулДляПоиска ПОДОБНО ""%"" + &АртикулДляПоиска + ""%"")
	|    И Номенклатура.БУ = ЛОЖЬ
    #КонецОбласти
    );
    ЗапросПоиск.УстановитьПараметр("Наименование","%" + СтрЗаменить(СтрокПоиска, " ", "%") + "%");
    ЗапросПоиск.УстановитьПараметр("АртикулДляПоиска","%" + СтрЗаменить(СтрокПоиска, " ", "%") + "%");
Показать


То получаю результат поиска только в том случаи, если последовательность ключевых слов для поиска строго соблюдена по направлению в наименовании номенклатуры с Лева на Право.

Как "взломать ящик пандоры" и увидеть код стандартного механизма строки поиска (Ctrl+F)? Там нет разницы в какой последовательности введены ключевые слова для поиска. Как это сделано?
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. VmvLer 16.04.19 13:06 Сейчас в теме
вы на каком языке хотите увидеть код: ассемблер, с++?
4. tusv 211 16.04.19 13:30 Сейчас в теме
Может в событии АвтоВыбор прописать
ПараметрыПолученияДанных.СпособПоискаСтроки=СпособПоискаСтрокиПриВводеПоСтроке.ЛюбаяЧасть;
5. palsergeich 16.04.19 13:51 Сейчас в теме
Там используется механизм полнотекстового поиска
http://v8.1c.ru/overview/Term_000000275.htm
6. SlavaKron 23.04.19 16:29 Сейчас в теме
(25) Используйте
ПолнотекстовыйПоиск.СоздатьСписок(СтрокаПоиска, РазмерПорции)


Если полнотекстовый поиск отключён, разбейте строку поиска на слова и генерируйте текст условия.
Например:
	// поиск по наименованию
	// разделитель пробел и кавычки (по аналогии с поисковыми запросами)
	// наименование содержит слова, разделенные пробелом в любом порядке
	// наименование содержит точные фразы, если они выделены кавычками в любом порядке
	СтрокаПоиска = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрокаПоиска, "%", ""), "_", ""), "[", ""), "]", "") + " ";
	
	// вычленение закавыченных словосочетаний
	МассивСлов = Новый Массив;
	
	ПозицияКавычки = Найти(СтрокаПоиска, """");
	Пока ПозицияКавычки > 0 Цикл
		
		Текст = Сред(СтрокаПоиска, ПозицияКавычки + 1);
		
		ДлинаФразы = Найти(Текст, """") - 1;
		
		Если ДлинаФразы < 0 Тогда
			ДлинаФразы = СтрДлина(Текст)
		КонецЕсли;
		
		Текст = Лев(Текст, ДлинаФразы);
		
		Если Текст <> "" Тогда
			МассивСлов.Добавить(Текст)
		КонецЕсли;
		
		СтрокаПоиска = Лев(СтрокаПоиска, ПозицияКавычки - 1) + " " + Сред(СтрокаПоиска, ПозицияКавычки + ДлинаФразы + 2);
		
		ПозицияКавычки = Найти(СтрокаПоиска, """");
	КонецЦикла;
	
	// вычленение слов
	ПозицияПробела = Найти(СтрокаПоиска, " ");
	Пока ПозицияПробела > 0 Цикл
		Текст = СокрЛП(Лев(СтрокаПоиска, ПозицияПробела - 1));
		Если Текст <> "" Тогда
			МассивСлов.Добавить(Текст);
		КонецЕсли;
		СтрокаПоиска = Сред(СтрокаПоиска, ПозицияПробела + 1);
		ПозицияПробела = Найти(СтрокаПоиска, " ");
	КонецЦикла;
	
	УсловиеЗапроса1 = "";	
	УсловиеЗапроса2 = "";
	
	Для Каждого Слово Из МассивСлов Цикл
		УсловиеЗапроса1 = УсловиеЗапроса1 + " И Наименование ПОДОБНО ""%" + Слово + "%""";
		УсловиеЗапроса2 = УсловиеЗапроса2 + " И АртикулДляПоиска ПОДОБНО ""%" + Слово + "%""";
	КонецЦикла;	
	
	Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ " + Сред(УсловиеЗапроса1, 4) + 
	" ОБЪЕДИНИТЬ ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ " + Сред(УсловиеЗапроса2, 4);
Показать
7. xtd 6 09.05.19 10:03 Сейчас в теме
(6)
// поиск по наименованию
// разделитель пробел и кавычки (по аналогии с поисковыми запросами)
// наименование содержит слова, разделенные пробелом в любом порядке
// наименование содержит точные фразы, если они выделены кавычками в любом порядке
СтрокаПоиска = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрокаПоиска, "%", ""), "_", ""), "[", ""), "]", "") + " ";

// вычленение закавыченных словосочетаний
МассивСлов = Новый Массив;

ПозицияКавычки = Найти(СтрокаПоиска, """");
Пока ПозицияКавычки > 0 Цикл

Текст = Сред(СтрокаПоиска, ПозицияКавычки + 1);

ДлинаФразы = Найти(Текст, """") - 1;

Если ДлинаФразы "" Тогда
МассивСлов.Добавить(Текст)
КонецЕсли;

СтрокаПоиска = Лев(СтрокаПоиска, ПозицияКавычки - 1) + " " + Сред(СтрокаПоиска, ПозицияКавычки + ДлинаФразы + 2);

ПозицияКавычки = Найти(СтрокаПоиска, """");
КонецЦикла;

// вычленение слов
ПозицияПробела = Найти(СтрокаПоиска, " ");
Пока ПозицияПробела > 0 Цикл
Текст = СокрЛП(Лев(СтрокаПоиска, ПозицияПробела - 1));
Если Текст <> "" Тогда
МассивСлов.Добавить(Текст);
КонецЕсли;
СтрокаПоиска = Сред(СтрокаПоиска, ПозицияПробела + 1);
ПозицияПробела = Найти(СтрокаПоиска, " ");
КонецЦикла;

УсловиеЗапроса1 = "";
УсловиеЗапроса2 = "";

Для Каждого Слово Из МассивСлов Цикл
УсловиеЗапроса1 = УсловиеЗапроса1 + " И Наименование ПОДОБНО ""%" + Слово + "%""";
УсловиеЗапроса2 = УсловиеЗапроса2 + " И АртикулДляПоиска ПОДОБНО ""%" + Слово + "%""";
КонецЦикла;

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ " + Сред(УсловиеЗапроса1, 4) +
" ОБЪЕДИНИТЬ ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ " + Сред(УсловиеЗапроса2, 4);
Показать


"АртикулДляПоиска" не находит так...

Допустим, если есть карточка с наименованием "ПРОКЛАДКА КОЛЛЕКТОРА ВЫПУСК. MAN" и "АртикулДляПоиска" - "318109".

Вводим строку поиска: "MAN ПРОКЛАДКА 318109". В результате ничего не получаем... :(
8. Obertone 74 25.03.22 09:23 Сейчас в теме
Возможно, что кому-то понадобится по теме.
Столкнулся с задачей поиска элемента справочника по части текстового реквизита.

Решение найдено было через запрос, где текстовый реквизит нужен в качестве параметра, а имя элемента справочника идёт во вторую часть условия с применением функции языка запроса "ПОДОБНО":

ВЫБРАТЬ
    ФизическиеЛица.Ссылка КАК Ссылка
ИЗ
    Справочник.ФизическиеЛица КАК ФизическиеЛица
ГДЕ
    &ТекстовыйРеквизит ПОДОБНО "%" + ФизическиеЛица.Наименование + "%"

Подобный запрос можно реализовать для динамического списка, где параметром будет значение в поле текстового реквизита с формы.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот