Имя: Пароль:
1C
 
Не строгий поиск по нескольким словам в запросе 1с
,
0 tabarigen
 
05.02.19
09:59
Здравствуйте ребята.
подскажите пожалуйста по сабжу.

На питоне я это делал так.
if query:
        result = Pill.objects. \
                    filter(reduce(lambda x, y: x & y, [Q(title__icontains=word) for word in query]), is_active=True, last_update__gte=search_time). \
                    values('title', 'pharmacy__title', 'pharmacy__phone_number', 'balance', 'price'). \
                    order_by("title")[:300]

Есть ли вариант организовать что то подобное на 1с?

В настоящий момент работает простой поиск.
ГДЕ
    Номен.Наименование ПОДОБНО &СтрокаПоиска + ""%""
1 Гипервизор
 
05.02.19
10:01
Незнакомым с питоном людям ваш опус сильно поможет вникнуть в суть вопроса.
2 tabarigen
 
05.02.19
10:10
(1) суть вопроса в заголовке
3 Ёпрст
 
05.02.19
10:13
(0) используй like в тексте запроса
4 tabarigen
 
05.02.19
10:32
(3) разве ПОДОБНО не есть аналог LIKE?
5 catena
 
05.02.19
10:56
(4)Есть. Самый простой нестрогий поиск: "лайкнуть" на каждое слово и посчитать рейтинг совпадений. Это если слова целиком искать.
6 Вафель
 
05.02.19
10:57
нужно title содержит одно из слов в списке?
7 tabarigen
 
05.02.19
11:04
(6) нет чтоб слова в списке содержались в title

Например есть наименование Тетрациклиновая мазь туба 1% 10 гр. гл. мазь

нужно чтоб можно было найти по сочетанию тетрацик мазь 10
8 wowik
 
05.02.19
11:05
(7) подобно %тетрацик%
и подобно %мазь%
подобно %10%
9 tabarigen
 
05.02.19
11:06
(8) да ладно.. так работает че ле
10 wowik
 
05.02.19
11:06
(9) а то!
11 tabarigen
 
05.02.19
11:06
(10) ща попробую
12 Вафель
 
05.02.19
11:09
если порядок нужен, то можно
тетрацик%мазь
13 tabarigen
 
05.02.19
11:12
(12) порядок не важен
14 aleks_default
 
05.02.19
11:47
Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если значение выражения удовлетворяет шаблону – результатом оператора будет ИСТИНА, иначе – ЛОЖЬ.

Следующие символы в строке шаблона являются служебными и имеют смысл, отличный от символа строки:

% (процент): последовательность, содержащая любое количество произвольных символов
_ (подчеркивание): один произвольный символ
[…] (в квадратных скобках один или несколько символов): любой одиночный символ из перечисленных внутри квадратных скобок
В перечислении могут встречаться диапазоны, например a-z, означающие произвольный символ, входящий в диапазон, включая концы диапазона.
[^…] (в квадратных скобках значок отрицания, за которым следует один или несколько символов): любой одиночный символ, кроме тех, которые перечислены следом за значком отрицания
Любой другой символ означает сам себя и не несет никакой дополнительной нагрузки.

Если в качестве самого себя необходимо записать один из перечисленных символов, то ему должен предшествовать <Спецсимвол>. Сам <Спецсимвол> (любой подходящий символ) определяется в этом же операторе после ключевого слова СПЕЦСИМВОЛ.

Например, шаблон “%АБВ[0-9][абвг]\_абв%” СПЕЦСИМВОЛ “\” означает подстроку, состоящую из последовательности символов:
буквы А; буквы Б; буквы В; одной цифры; одной из букв а, б, в или г; символа подчеркивания; буквы а; буквы б; буквы в.

Причем перед этой последовательностью может располагаться произвольный набор символов.
15 tabarigen
 
05.02.19
11:59
Всем спасибо большое.
Очень помогли.
Пока сделал так. Правда мне лаконичность кода не очень нравится.

&НаСервере
Процедура ОбновитьТаблицуОстатков()
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ ПЕРВЫЕ 200
        |    Номен.Ссылка КАК Номенклатура,
        |    ТоварыНаСкладахОстатки.Характеристика КАК Серия,
        |    ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток,
        |    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
        |ИЗ
        |    Справочник.Номенклатура КАК Номен
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &РозничныйСклад) КАК ТоварыНаСкладахОстатки
        |            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &Розничная) КАК ЦеныНоменклатурыСрезПоследних
        |            ПО ТоварыНаСкладахОстатки.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика
        |        ПО Номен.Ссылка = ТоварыНаСкладахОстатки.Характеристика.Владелец
        |ГДЕ
        |";
        СтрокаПоиск = СфориироватьСтрокуПоиска();
        Запрос.Текст = Запрос.Текст + СтрокаПоиск +
        "
        |УПОРЯДОЧИТЬ ПО
        |    Остаток УБЫВ";
    
    Запрос.УстановитьПараметр("Розничная", Объект.ВидЦенПродажи);
    Запрос.УстановитьПараметр("РозничныйСклад", Объект.СкладПродажи);
    Запрос.УстановитьПараметр("СтрокаПоиска", ПолеПоиска);
    
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
    
    ОстаткиТоваров.Загрузить(РезультатЗапроса);    
КонецПроцедуры


Функция СфориироватьСтрокуПоиска()
    МассивСлов = СтрРазделить(ПолеПоиска, " ", Ложь);
    СтрокаПоиска = "";
    сч = 0;
    КоличествоСлов = МассивСлов.Количество();

    Для Каждого стр Из МассивСлов Цикл
        сч = сч + 1;
        СтрокаПоиска = СтрокаПоиска + "Номен.Наименование ПОДОБНО " + """%" + стр+ "%""";
        Если НЕ (КоличествоСлов - сч) = 0 Тогда
            СтрокаПоиска = СтрокаПоиска + " И ";    
        КонецЕсли;    
    КонецЦикла;    
    
    Возврат СтрокаПоиска;
КонецФункции
16 Сияющий в темноте
 
05.02.19
14:37
А полнотекстовый поиск?
17 tabarigen
 
05.02.19
15:31
(16) он медленный и я не могу его готовить.
Когда данных много скорость работы динамического списка не устраивает
18 PR
 
05.02.19
15:35
(9) LOL
19 tabarigen
 
05.02.19
15:37
(18) ПАРАЦЕТАMOL
20 АНДР
 
05.02.19
15:42
(15) Если применится к результату соединения. Сначала отбери номенклатуру во временную таблицу, потом её дополняй.
21 catena
 
06.02.19
05:17
"ГДЕ ИСТИНА "
.....
        СтрокаПоиска = СтрокаПоиска + " И Номен.Наименование ПОДОБНО " + """%" + стр+ "%""";


Минус счетчик, минус Если.
22 vasvl123
 
06.02.19
05:45