Как реализован стандартный механизм строки поиска (Ctrl+F) ?
Добрый день.
Стоит задача дополнить выпадающий список при поиске номенклатуры в табличной части документа. (модуль менеджера: ОбработкаПолученияДанныхВыбора).
Не могу понять каким образом реализован стандартный механизм строки поиска (Ctrl+F). Как выбрать номенклатуру не учитывая конкретную последовательность введенных пользователем ключевых слов для поиска?
Т.е. если я использую такой запрос:
То получаю результат поиска только в том случаи, если последовательность ключевых слов для поиска строго соблюдена по направлению в наименовании номенклатуры с Лева на Право.
Как "взломать ящик пандоры" и увидеть код стандартного механизма строки поиска (Ctrl+F)? Там нет разницы в какой последовательности введены ключевые слова для поиска. Как это сделано?
Стоит задача дополнить выпадающий список при поиске номенклатуры в табличной части документа. (модуль менеджера: ОбработкаПолученияДанныхВыбора).
Не могу понять каким образом реализован стандартный механизм строки поиска (Ctrl+F). Как выбрать номенклатуру не учитывая конкретную последовательность введенных пользователем ключевых слов для поиска?
Т.е. если я использую такой запрос:
ЗапросПоиск = Новый Запрос(
#Область Текст_запроса
"ВЫБРАТЬ ПЕРВЫЕ 50
| Номенклатура.Ссылка,
| Номенклатура.Наименование,
| Номенклатура.АртикулДляПоиска
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| (Номенклатура.Наименование ПОДОБНО ""%"" + &Наименование + ""%"" ИЛИ Номенклатура.АртикулДляПоиска ПОДОБНО ""%"" + &АртикулДляПоиска + ""%"")
| И Номенклатура.БУ = ЛОЖЬ
#КонецОбласти
);
ЗапросПоиск.УстановитьПараметр("Наименование","%" + СтрЗаменить(СтрокПоиска, " ", "%") + "%");
ЗапросПоиск.УстановитьПараметр("АртикулДляПоиска","%" + СтрЗаменить(СтрокПоиска, " ", "%") + "%");
ПоказатьТо получаю результат поиска только в том случаи, если последовательность ключевых слов для поиска строго соблюдена по направлению в наименовании номенклатуры с Лева на Право.
Как "взломать ящик пандоры" и увидеть код стандартного механизма строки поиска (Ctrl+F)? Там нет разницы в какой последовательности введены ключевые слова для поиска. Как это сделано?
Прикрепленные файлы:
По теме из базы знаний
- Опыт разработки скриптов для автоматизации работы в конфигураторе
- Как контролировать качество внешних обработок, отчетов, правил обмена, расширений 1С и поставить это на поток
- Поддержка пользователей [Alt+S] (подключаемое расширение)
- Как автоматизировать учет по проектам в 1С:Бухгалтерии
- Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(25) Используйте
Если полнотекстовый поиск отключён, разбейте строку поиска на слова и генерируйте текст условия.
Например:
ПолнотекстовыйПоиск.СоздатьСписок(СтрокаПоиска, РазмерПорции)
Если полнотекстовый поиск отключён, разбейте строку поиска на слова и генерируйте текст условия.
Например:
// поиск по наименованию
// разделитель пробел и кавычки (по аналогии с поисковыми запросами)
// наименование содержит слова, разделенные пробелом в любом порядке
// наименование содержит точные фразы, если они выделены кавычками в любом порядке
СтрокаПоиска = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрокаПоиска, "%", ""), "_", ""), "[", ""), "]", "") + " ";
// вычленение закавыченных словосочетаний
МассивСлов = Новый Массив;
ПозицияКавычки = Найти(СтрокаПоиска, """");
Пока ПозицияКавычки > 0 Цикл
Текст = Сред(СтрокаПоиска, ПозицияКавычки + 1);
ДлинаФразы = Найти(Текст, """") - 1;
Если ДлинаФразы < 0 Тогда
ДлинаФразы = СтрДлина(Текст)
КонецЕсли;
Текст = Лев(Текст, ДлинаФразы);
Если Текст <> "" Тогда
МассивСлов.Добавить(Текст)
КонецЕсли;
СтрокаПоиска = Лев(СтрокаПоиска, ПозицияКавычки - 1) + " " + Сред(СтрокаПоиска, ПозицияКавычки + ДлинаФразы + 2);
ПозицияКавычки = Найти(СтрокаПоиска, """");
КонецЦикла;
// вычленение слов
ПозицияПробела = Найти(СтрокаПоиска, " ");
Пока ПозицияПробела > 0 Цикл
Текст = СокрЛП(Лев(СтрокаПоиска, ПозицияПробела - 1));
Если Текст <> "" Тогда
МассивСлов.Добавить(Текст);
КонецЕсли;
СтрокаПоиска = Сред(СтрокаПоиска, ПозицияПробела + 1);
ПозицияПробела = Найти(СтрокаПоиска, " ");
КонецЦикла;
УсловиеЗапроса1 = "";
УсловиеЗапроса2 = "";
Для Каждого Слово Из МассивСлов Цикл
УсловиеЗапроса1 = УсловиеЗапроса1 + " И Наименование ПОДОБНО ""%" + Слово + "%""";
УсловиеЗапроса2 = УсловиеЗапроса2 + " И АртикулДляПоиска ПОДОБНО ""%" + Слово + "%""";
КонецЦикла;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ " + Сред(УсловиеЗапроса1, 4) +
" ОБЪЕДИНИТЬ ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ " + Сред(УсловиеЗапроса2, 4);
Показать
(6)
"АртикулДляПоиска" не находит так...
Допустим, если есть карточка с наименованием "ПРОКЛАДКА КОЛЛЕКТОРА ВЫПУСК. MAN" и "АртикулДляПоиска" - "318109".
Вводим строку поиска: "MAN ПРОКЛАДКА 318109". В результате ничего не получаем... :(
// поиск по наименованию
// разделитель пробел и кавычки (по аналогии с поисковыми запросами)
// наименование содержит слова, разделенные пробелом в любом порядке
// наименование содержит точные фразы, если они выделены кавычками в любом порядке
СтрокаПоиска = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрокаПоиска, "%", ""), "_", ""), "[", ""), "]", "") + " ";
// вычленение закавыченных словосочетаний
МассивСлов = Новый Массив;
ПозицияКавычки = Найти(СтрокаПоиска, """");
Пока ПозицияКавычки > 0 Цикл
Текст = Сред(СтрокаПоиска, ПозицияКавычки + 1);
ДлинаФразы = Найти(Текст, """") - 1;
Если ДлинаФразы "" Тогда
МассивСлов.Добавить(Текст)
КонецЕсли;
СтрокаПоиска = Лев(СтрокаПоиска, ПозицияКавычки - 1) + " " + Сред(СтрокаПоиска, ПозицияКавычки + ДлинаФразы + 2);
ПозицияКавычки = Найти(СтрокаПоиска, """");
КонецЦикла;
// вычленение слов
ПозицияПробела = Найти(СтрокаПоиска, " ");
Пока ПозицияПробела > 0 Цикл
Текст = СокрЛП(Лев(СтрокаПоиска, ПозицияПробела - 1));
Если Текст <> "" Тогда
МассивСлов.Добавить(Текст);
КонецЕсли;
СтрокаПоиска = Сред(СтрокаПоиска, ПозицияПробела + 1);
ПозицияПробела = Найти(СтрокаПоиска, " ");
КонецЦикла;
УсловиеЗапроса1 = "";
УсловиеЗапроса2 = "";
Для Каждого Слово Из МассивСлов Цикл
УсловиеЗапроса1 = УсловиеЗапроса1 + " И Наименование ПОДОБНО ""%" + Слово + "%""";
УсловиеЗапроса2 = УсловиеЗапроса2 + " И АртикулДляПоиска ПОДОБНО ""%" + Слово + "%""";
КонецЦикла;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ " + Сред(УсловиеЗапроса1, 4) +
" ОБЪЕДИНИТЬ ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ " + Сред(УсловиеЗапроса2, 4);
Показать// разделитель пробел и кавычки (по аналогии с поисковыми запросами)
// наименование содержит слова, разделенные пробелом в любом порядке
// наименование содержит точные фразы, если они выделены кавычками в любом порядке
СтрокаПоиска = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрокаПоиска, "%", ""), "_", ""), "[", ""), "]", "") + " ";
// вычленение закавыченных словосочетаний
МассивСлов = Новый Массив;
ПозицияКавычки = Найти(СтрокаПоиска, """");
Пока ПозицияКавычки > 0 Цикл
Текст = Сред(СтрокаПоиска, ПозицияКавычки + 1);
ДлинаФразы = Найти(Текст, """") - 1;
Если ДлинаФразы "" Тогда
МассивСлов.Добавить(Текст)
КонецЕсли;
СтрокаПоиска = Лев(СтрокаПоиска, ПозицияКавычки - 1) + " " + Сред(СтрокаПоиска, ПозицияКавычки + ДлинаФразы + 2);
ПозицияКавычки = Найти(СтрокаПоиска, """");
КонецЦикла;
// вычленение слов
ПозицияПробела = Найти(СтрокаПоиска, " ");
Пока ПозицияПробела > 0 Цикл
Текст = СокрЛП(Лев(СтрокаПоиска, ПозицияПробела - 1));
Если Текст <> "" Тогда
МассивСлов.Добавить(Текст);
КонецЕсли;
СтрокаПоиска = Сред(СтрокаПоиска, ПозицияПробела + 1);
ПозицияПробела = Найти(СтрокаПоиска, " ");
КонецЦикла;
УсловиеЗапроса1 = "";
УсловиеЗапроса2 = "";
Для Каждого Слово Из МассивСлов Цикл
УсловиеЗапроса1 = УсловиеЗапроса1 + " И Наименование ПОДОБНО ""%" + Слово + "%""";
УсловиеЗапроса2 = УсловиеЗапроса2 + " И АртикулДляПоиска ПОДОБНО ""%" + Слово + "%""";
КонецЦикла;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ " + Сред(УсловиеЗапроса1, 4) +
" ОБЪЕДИНИТЬ ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ " + Сред(УсловиеЗапроса2, 4);
"АртикулДляПоиска" не находит так...
Допустим, если есть карточка с наименованием "ПРОКЛАДКА КОЛЛЕКТОРА ВЫПУСК. MAN" и "АртикулДляПоиска" - "318109".
Вводим строку поиска: "MAN ПРОКЛАДКА 318109". В результате ничего не получаем... :(
Возможно, что кому-то понадобится по теме.
Столкнулся с задачей поиска элемента справочника по части текстового реквизита.
Решение найдено было через запрос, где текстовый реквизит нужен в качестве параметра, а имя элемента справочника идёт во вторую часть условия с применением функции языка запроса "ПОДОБНО":
Подобный запрос можно реализовать для динамического списка, где параметром будет значение в поле текстового реквизита с формы.
Столкнулся с задачей поиска элемента справочника по части текстового реквизита.
Решение найдено было через запрос, где текстовый реквизит нужен в качестве параметра, а имя элемента справочника идёт во вторую часть условия с применением функции языка запроса "ПОДОБНО":
ВЫБРАТЬ
ФизическиеЛица.Ссылка КАК Ссылка
ИЗ
Справочник.ФизическиеЛица КАК ФизическиеЛица
ГДЕ
&ТекстовыйРеквизит ПОДОБНО "%" + ФизическиеЛица.Наименование + "%"
Подобный запрос можно реализовать для динамического списка, где параметром будет значение в поле текстового реквизита с формы.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот