Нечёткий поиск "ПОДОБНО". Нюансы

23.02.20

Разработка - Запросы

Заметки о "ПОДОБНО" в языке запросов

Среди прочих инструментов, предоставляемых механизмом запросов 1С (который, как мы знаем, есть насадка-транслятор на механизмы СУБД), имеется единственный в своём роде - наложение условия шаблоном. Большинство операций реляционных СУБД работают с точными значениями или их диапазонами, и только ПОДОБНО имеет дело с маской, нечётким условием. "ПОДОБНО", он же "LIKE", есть в подавляющем большинстве современных СУБД (согласно стандарту ANSI SQL 2003), и 1С предоставляет нам возможности такого поиска единообразно, приводя средствами платформы различные тонкости СУБД к единому поведению. Возможность эта заложена в механизме запросов, отборов, отборов СКД (во всех её проявлениях), и, как показывает практика, "ПОДОБНО" действительно ведёт себя совершенно одинаково и ожидаемо и в динамических списках, и в разных запросах - везде в 1С.

Нам известны более кастомизированные механизмы - отборы и отборы СКД "Содержит"/"Не содержит". По сути они реализованы тем же образом, что и ПОДОБНО, но урезаны, и формируют строку шаблона самостоятельно (дописывают "%"). Тому есть несколько причин, от защиты ключевых мест системы от действий пользователя и разработчика, провоцирующих избыточную нагрузку, до простоты реализации в платформе.

Нам известны более гибкие механизмы - это полнотекстовый поиск. Он в СУБД реализуется отдельно от "основного движка", требует свои конструкции, индексы, и "может всё" ценой накладных расходов на разработку и поддержание. Известны также регулярные выражения и т.д.

Поиск "ПОДОБНО" опирается на штатную работу СУБД, на обращения к колонкам фактографической реляционной БД, пусть даже они строкового типа неограниченной длины. Обработка отбора "ПОДОБНО" обычно не требует специальных донастроек ни в 1С, ни в СУБД.

 
 Из справки 1С

Как видим, возможности даже шире, чет у некоторых СУБД (хотя, например, в SQL Server такое тоже есть).

Операторы "классического" поиска:

// имеем запрос вида:
ТекстЗапроса="ВЫБРАТЬ Истина ИЗ Справочник.Сайты КАК спр ГДЕ спр.Наименование ПОДОБНО &Условие";
// и элемент справочника с наименованием "Инфостарт".
//
// в зависимости от успешности поиска Запрос.Выполнить().Пустой() будет Истина (не нашли) или Ложь (нашли)
// служебный символ "%"
Запрос.УстановитьПараметр("Условие","%фоста%"); // найдёт
Запрос.УстановитьПараметр("Условие","%фоста"); // не найдёт
Запрос.УстановитьПараметр("Условие","%фостарт"); // найдёт
Запрос.УстановитьПараметр("Условие","Инфоста%"); // найдёт
Запрос.УстановитьПараметр("Условие","Инфоста"); // не найдёт
Запрос.УстановитьПараметр("Условие","Ин%арт"); // найдёт
// служебный символ "_"
Запрос.УстановитьПараметр("Условие","_Инфостарт"); // не найдёт
Запрос.УстановитьПараметр("Условие","_нфостарт"); // найдёт
Запрос.УстановитьПараметр("Условие","Инфостар_"); // найдёт
Запрос.УстановитьПараметр("Условие","Инфоста_"); // не найдёт
Запрос.УстановитьПараметр("Условие","Ин_оста_т"); // найдёт

Операторы с квадратными скобками позволяет понять, "есть ли такая буква в этом слове". Например:

Запрос.УстановитьПараметр("Условие","Ин[клм]остарт"); // не найдёт
Запрос.УстановитьПараметр("Условие","Ин[фыва]остарт"); // найдёт
// можно чередовать и применять всё вместе:
Запрос.УстановитьПараметр("Условие","И%[фыва]_ст[^йоу]р%"); // найдёт

Также, согласно стандарту, квадратные скобки "понимают" диапазоны букв:

Запрос.УстановитьПараметр("Ин[т-х]остарт"); // определяем буквы "т, у, ф, х", найдёт
Запрос.УстановитьПараметр("Ин[б-д]остарт"); // определяем буквы "б, в, г, д", не найдёт

// можно перечислять и указывать диапазоны вперемешку:
Запрос.УстановитьПараметр("Ин[рст-ц]остарт"); // определяем буквы "р, с, т, у, ф, х, ц", найдёт

То же касается отрицаний [^..], можно задавать диапазоны символов. Напомню, порядок определяется возрастанием числовых кодов символов в таблице кодировки. При нарушенном порядке [я-а] ничего не найдётся. Сами квадратные скобки тоже можно искать: "[[]" определяет символ "[". Символы "%" и "_" в скобках означают сами себя, а не служебные wildcard.

Сложный шаблон уже даже начинает напоминать регулярное выражение. "ПОДОБНО" реализует упрощённую wildcard-семантику, где "%" заменяет классический "*", а "_" заменяет классический "?".

  • Многократный повтор "%" ровно ничего не меняет, "%%%фостарт", "Ин%%%%т" и "%фостарт" равнозначны. А вот "_" требователен к знакоместам, к позициям, и следует быть внимательным к повторам, т.к. "__нфостарт" сработает, а "___нфостарт" нет.
  • Все операторы не чувствительны к регистру букв, "Инф%" и "инф%" равнозначны. Интересно, что SQL по умолчанию тоже не учитывает регистр, а PostgreSQL и Оракл - учитывают.
  • Все операторы корректно обрабатывают всяческие символы, т.е. коллекцию "Символы", и символ параграфа-конца страницы, и прочий мусор (есть тонкости в национальных частях кодировок, см.ниже). В том числе в конструкциях "[..] и [^..]. Такие могут фигурировать в наполнении таблицы, в условии запроса, и будут правильно найдены (ввести их в строку поиска можно программно или скопипастить откуда-нибудь). "Символ.ПС", несмотря на некоторую синтетичность CR+LF, это один символ.
  • Сами себя "%" и "_" правильно находят, на общих основаниях, т.е. "Доход 20% годовых" по "%д 20% г%" будет найден.
  • Не следует делать экранирование операторов, как принято в СУБД, т.е. "/%" как раз-таки не сработает. Для экранирования и для уточнения используется оператор "СПЕЦСИМВОЛ" (он же Escape):
// имеем запрос вида:
ТекстЗапроса="ВЫБРАТЬ Истина ИЗ Справочник.Сайты КАК спр ГДЕ спр.Наименование ПОДОБНО &Условие";

// надо найти именно элемент с наименованием "Инфостарт_Сайт", а не "Инфостарт Сайт"
// поиск по шаблону "Инфостарт_Сайт" выдаст оба элемента. 

Поэтому следует изменить запрос:
ТекстЗапроса="ВЫБРАТЬ Истина ИЗ Справочник.Сайты КАК спр ГДЕ спр.Наименование ПОДОБНО &Условие" СПЕЦСИМВОЛ""$""";
// поиск по шаблону "Инфостарт$_Сайт" выдаст только нужное.

 

Поиск возможен в строковых полях таблиц (в т.ч. неограниченной длины), в переменных неограниченной длины (в т.ч. полях таблиц-параметров и временных таблиц). Но при этом поиск невозможен в полях, полученных функцией "ПредставлениеСсылки", или имеющих, явно или потенциально, значение Null. Если таковое явственно, то даже компиляция, в т.ч. открытие конструктора запроса/СКД, сообщает об ошибке "Неверные параметры", если же нет, то будет ошибка исполнения запроса.

Отбор средствами СКД для "ПОДОБНО" имеет дело с значением колонки таблицы и может использовать индексы, т.е. быть ускорен (в SQL и Oracle так и есть), и создаваемая им нагрузка наблюдаема в профайлере обычным образом. Замечено, что запрос на несколько значений одного и того же поля "спр.Путь ПОДОБНО ""%фостар%"" ИЛИ спр.Путь ПОДОБНО ""%тар_"" и т.д., оптимизируется почти всегда, поэтому опасаться критичного торможения при наложении условия, моделирующего "подобие в списке" для одного поля, не стоит. А вот условия на разные поля, конечно, дадут рост нагрузки и, возможно, мер по оптимизации запроса.

 

 
 О кодировках

Определённую тонкость представляет кодировка. 1С использует Unicode, и вроде бы защищает нас от специфики СУБД, но, поскольку есть "Внешние источники", запросы и СКД к ним, упомяну о кодировке.

В MS SQL понимание кодировки зависит от SSMS, стыковки сервера скуля с провайдером, правильно выставленного свойства БД Collation (Cyrillic_General_CI_AS). Иногда where f1 like '%нфост%' не работает, а where f1 like N'%нфост%' работает, т.е. стоит перед литеральными юникодными строками писать "N" или делать так: "f1 LIKE Convert(VarChar,N'%нфост%')". Также советуют для юникода применять функции NCHAR(), UNICODE() и т.д, а не CHAR(), ANSI() и т.д. SQL иначе учитывает завершающие пробелы, и с кодировкой ASCII работает по своим старым стандартам, а не по ISO.

В Оракле: есть просто разные операторы:
"обычный" LIKE — применяется для запроса к строковым столбцам с традиционными кодировками;
LIKEC — применяется для столбцов с кодировкой Unicode (в терминологии Oracle — Unicode complete);
LIKE2 — для кодировки UCS2;
LIKE4 — для кодировки UCS4.

Насчёт внешних источников в методическом описании 1С сказано:
"Строковые функции и выражения запроса и СКД преобразуются в запрос к СУБД с использованием управляющих последовательностей ODBC (ODBC Escape Sequences, http://msdn.microsoft.com/en-us/library/windows/desktop/ms715364(v=vs.85).aspx", причём там речь о функции "Подстрока", а "ПОДОБНО" не упомянут вообще нет, но на практике эффект тот же. В других статьях 1С на эту тему никакие ограничения вообще не упомянуты.

И, повторюсь, благодаря 1С в "классических" случаях мы можем не заботиться о кодировке. 1С найдёт даже кракозябр в строке ему подобных.

 
 Примечания

 

Пожалуй, всё. Углубляться в дебри реализации "Like" средствами СУБД не будем.

ПОДОБНО запрос LIKE

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 руб.

02.09.2020    119908    656    389    

701

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    5618    KawaNoNeko    23    

23

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    1964    2    Yashazz    0    

29

Запрос 1С copilot

Инструментарий разработчика Запросы Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

5 стартмани

15.01.2024    6089    29    mkalimulin    23    

48

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Платформа 1С v8.3 Бесплатно (free)

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

14.12.2023    1714    vandalsvq    7    

28

Объектная модель запроса "Схема запроса" 2

Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Далеко уже не новый тип данных "Схема запроса". Статья о том, как использовать его "попроще". Примеры создания текста запроса с нуля и изменение имеющегося запроса.

06.12.2023    5282    user1923546    26    

43

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    15954    skovpin_sa    14    

97
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. echo77 1868 24.02.20 18:33 Сейчас в теме
Интересно, а при помощи Подобно можно найти все записи из справочника, равные СокрЛП("Инфостарт"), т.е. найти все записи, которые могут равняться "Инфостарт" или содержать какое-то количество пробелов слева и/или справа?
2. Yashazz 4706 24.02.20 18:39 Сейчас в теме
(1) Легко и быстро - не получится. Т.е. "%Инфостарт%" найдёт нам докучи ещё и "Инфостарт и приложения", "Сайт Инфостарт", а если длина наименования более 9 символов, т.е. пробелов спереди и сзади может быть сколько угодно, то и [ ] с пробелом внутри не спасает. Это уже регулярными придётся искать, или функцию общего модуля мутить.
3. json 3294 24.02.20 21:11 Сейчас в теме
(1) Да, возможно.

Примерно вот так
ГДЕ 
Наименование ПОДОБНО "%инфостарт%"
И НЕ Наименование ПОДОБНО "%[-!-я_]%инфостарт%"
И НЕ Наименование ПОДОБНО "%инфостарт%[-!-я_]%"


Если какие-то случаи не учел, то можно подогнать
kser87; mvxyz; anosin; +3 Ответить
4. Yashazz 4706 24.02.20 23:14 Сейчас в теме
(3) Т.е. просто забить-учесть все возможные диапазоны значений char для всего, кроме пробелов? Или я не понял мыслю?
5. json 3294 24.02.20 23:45 Сейчас в теме
(4) ты же в своей статье про оракл и все такое писал, а запрос в три строчки прочитать не можешь.

Могу разжевать, мне не трудно:
1. Взять все строки, в которых есть подстрока поиска
2. Отбросить те строки, в которых ПЕРЕД подстрокой поиска есть любой непробельный символ (на любом расстоянии от подстроки поиска)
3. Отбросить те строки, в которых ПОСЛЕ подстроки поиска есть любой непробельный символ

СокрЛП() - отбрасывает не только пробелы, это тоже нужно учитывать. Поэтому я употребляю выражение "любой непробельный символ"
6. Yashazz 4706 24.02.20 23:55 Сейчас в теме
(5) Я кстати про СокрЛП тоже подумывал написать)

Мне не очень понятно, как ты "любой непробельный на любом расстоянии" определяешь. Это всё-таки не regexp, не те возможности)

и да, бывает, что туплю, потому и спрашиваю
7. json 3294 25.02.20 00:10 Сейчас в теме
(6) теоретически диапазоны должны задаваться по ascii.
Но это теоретически.

Поэтому строка поиска [!-я] - должна покрывать все символы от 033 (восклицательный знак) по 255 (я)

По факту таким способом не все отрабатывает. Поэтому я еще явно добавил "_" (нижнее подчеркивание) и "-" (минус).

Поэтому получилось так [-_!-я]

На самом деле в этот диапазон еще не попадает ":"(двоеточие) и может что-то еще.

Если поэкспериментировать, то это условие можно написать более лаконично и пОлно.
Но я не готов тратить на это время, т.к. у меня в этом нет надобности.
Просто показал принцип. Возможно, кто-нибудь доведет до ума.
shu_vol; k268kk; triviumfan; +3 Ответить
9. Yashazz 4706 25.02.20 00:24 Сейчас в теме
(7) Пробовать надо. Я не сильно доверяю диапазонным указаниям. Потому и сказал, что "легко и просто" вряд ли.
10. Yashazz 4706 25.02.20 00:35 Сейчас в теме
(7) И, скажу честно, между пониманием всяких там реляционок и умением слёту читать шаблоны регулярок есть разница. Всегда преклонялся перед perl'овщиками, которые какую-нибудь адскую конструкцию понимают с первого прочтения...
8. Yashazz 4706 25.02.20 00:23 Сейчас в теме
Если кто что про кодировки знает, пишите. Мне не удалось найти материалы о том, как именно движок 1С транслирует этот момент в команды и запросы СУБД.
11. MikhailDr 25.02.20 08:10 Сейчас в теме
Очень полезно. Про конструкцию [^..] не знал ранее.
12. frkbvfnjh 785 26.02.20 07:03 Сейчас в теме
1С предоставляет нам возможности такого поиска единообразно, приводя средствами платформы различные тонкости СУБД к единому поведению.
Я тоже когда то был наивен и верил всему, что пишет 1С и доверял платформе. Из личного опыта могу сказать, что одно и тоже выражение может работать по разному в зависимости от используемой СУБД, особенно это касается использования служебного символа и приходилось играться, подбирая служебный символ, что бы платформе или СУБД он "понравился", по крайней мере несколько лет назад я сталкивался с этим. Как сейчас с этим обстоят дела я не знаю и стараюсь этими "костылями" не пользоваться, ну или максимум использовать выражения только с % и _, с этим я проблем не замечал.
15. Yashazz 4706 26.02.20 10:37 Сейчас в теме
(12) Это точно было многих 8.2, крайний раз на 8.3.7 сталкивался. Но в части Like не припоминаю, в других местах да.
16. PiotrLoginov 26.02.20 13:59 Сейчас в теме
(12)
подбирая служебный символ, что бы платформе или СУБД он "понравился"

проще посмотреть в типовой, что обычно используют в качестве служебного символа.
13. Дмитрий74Чел 234 26.02.20 09:55 Сейчас в теме
На счет
Сами себя "%" и "_" правильно находят, на общих основаниях, т.е. "Доход 20% годовых" по "%д 20% г%" будет найден.
не соглашусь. По-моему в данном примере строка попала под условие как раз потому что "%" сработал как условие "любой символ", а не "%" как "%".
14. Yashazz 4706 26.02.20 10:37 Сейчас в теме
(13) я это и имел в виду фразой "на общих основаниях", он именно и сработал как любой, а не как он сам. Имелось в виду, что себя в искомой строке он находит. А так, конечно, через esc-символ можно делать.
37. user779438 01.11.23 14:48 Сейчас в теме
(14)При поиске "Доход 20% годовых" по "%д 20% г%" знак процента нашел не себя, а любое количество любых символов между "20" и " г". Если необходимо найти именно 20% то условие должно приобрести вид
ПОДОБНО "20~%" СПЕЦСИМВОЛ "~"
Тильду можно заменить на любой небуквенный символ неиспользуемый в запросе.
17. Cyberhawk 135 29.02.20 16:33 Сейчас в теме
Поэтому следует изменить запрос:
ТекстЗапроса="ВЫБРАТЬ Истина ИЗ Справочник.Сайты КАК спр ГДЕ спр.Наименование ПОДОБНО &Условие" СПЕЦСИМВОЛ""$""";
// поиск по шаблону "Инфостарт$_Сайт" выдаст только нужное.
Такой код не компилируется. И не особо понял, откуда взялся доллар.
20. mikhailv 19 03.08.20 19:32 Сейчас в теме
(17) так попробуйте:
ТекстЗапроса="ВЫБРАТЬ Истина ИЗ Справочник.Сайты КАК спр ГДЕ спр.Наименование ПОДОБНО &Условие СПЕЦСИМВОЛ""$"""; 
Cyberhawk; +1 Ответить
21. Cyberhawk 135 03.08.20 19:52 Сейчас в теме
(20) Работает.
А экранировать долларом, получается, нужно только _ и % (если они присутствуют в шаблоне ПОДОБНО)?
22. mikhailv 19 03.08.20 20:11 Сейчас в теме
(21) экранировать долларом нужно было бы доллар, если бы он был спецсимволом, но вроде в синтаксисе ПОДОБНО такого спецсимвола нет, откуда он взялся в статье - не знаю. У меня скобки квадратные были в запросе решилось так:
"ВЫБРАТЬ ... ИЗ ... ГДЕ Наименование ПОДОБНО "Что-то%[]" СПЕЦСИМВОЛ ""["""

чтобы выбралось запросом "Что-то красивое []". Без приписки СПЕЦСИМВОЛ ""["" не выбиралось ничего.
Cyberhawk; +1 Ответить
38. user779438 02.11.23 01:27 Сейчас в теме
(22)СПЕЦСИМВОЛ нужен для того, чтобы экранировать служебные символы (их список ограничен %,_,[...] и [^...]). Если в искомой строке необходимо найти символы совпадающие со служебными, то их надо экранировать и тогда код примет вид
"ВЫБРАТЬ ... ИЗ ... ГДЕ Наименование ПОДОБНО "Что-то%[[[]" СПЕЦСИМВОЛ ""["""
но лучше конечно использовать символ который не задействован в тексте запроса, например
"ВЫБРАТЬ ... ИЗ ... ГДЕ Наименование ПОДОБНО "Что-то%\[\]" СПЕЦСИМВОЛ ""\"""

p.s. Хоть и три года прошло, но лучше поздно, чем никогда )
18. ojiojiowka 08.03.20 16:41 Сейчас в теме
Хоть бы про "е" и "ё" на различных СУБД написали
19. Fox-trot 156 08.03.20 22:31 Сейчас в теме
а вот и боты подтянулись
23. tasshh 23.12.20 23:59 Сейчас в теме
скажите, а если мне допустим нужно отобрать строки, которые содержат кавычки. Это как написать? ПОДОБНО "%"%" СПЕЦСИМВОЛ """...
33. beezone 23.01.23 19:28 Сейчас в теме
(23) кавычки по общим правилам внутри строки надо удваивать, т.е. подобно "%""%". Они сами по себе не являются спецсимволом, если это не указано служебным словом
24. Hagaro 16.02.21 14:03 Сейчас в теме
Добрый день. Имею вопрос. Вот допустим есть наименование справочника содержащее буквы, скобки, точки, пробелы и прочую дичь. Но встречается допустим переданное число в название "1 200", как уже понятно между 1 и 200 не пробел. А некий разделитель разрядности. Есть идеи как это бороть через Подобно?
П.С.
Небольшой Пример: "УП ВК1 /Н5 /0,08х(1530х2) х1 200 а.Вк 557"
25. Yashazz 4706 16.02.21 14:11 Сейчас в теме
(24) я бы написал в запросе "Наименование ПОДОБНО &УслСтрока" и Запрос.УстановитьПараметр("УслСтрока","1"+Символы.НПП+"200") и как-то так. Юникод, должно прокатить.
26. Hagaro 16.02.21 14:14 Сейчас в теме
(25)
Символы.НПП

Спасибо за наводку.
34. beezone 23.01.23 19:34 Сейчас в теме
(24) вы же в юникоде везде, включая редактор 1С. Попробуйте добыть этот символ например из Excel, куда числа выгружались с НПП, вставить в строку в 1С (визуально будет пробел, но перенесенный через буфер - уже не пробел), и сделать запрос. То же что в самом Excel их искать или заменять, чтобы вернуть обратно числа. Замечание: брать нужно из места где юникод, хотя бы из таблицы значений. При выводе обычным "сообщить", НПП при копировании обратно через буфер, может превратиться в обычный пробел. Проверяйте получением кода символа - если 32 это пробел, у НПП другой код.
27. Sanario 26 13.04.21 18:13 Сейчас в теме
Ребят подскажите, а как можно и можно ли к оператору ПОДОБНО привязать список значений?
28. Sanario 26 13.04.21 18:14 Сейчас в теме
Ну например в списке значений: Обувь; 46; Абидас и он находит элементы справочника в наименовании которых будут встречаться слова из списка значений
29. JOJ73 02.06.21 16:07 Сейчас в теме
(28)
Список значений не заюзать,но можно использовать строку , примерно как:

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

Условие = "Обувь; 46; Абидас"
35. beezone 23.01.23 19:42 Сейчас в теме
(28) можно элементарно, но иногда может давать ошибку - если там где "обувь" или "абидас", есть свои разделители ";":
выбрать * из реестр где кодированныйсписок подобно &товарнаягруппа + "; " + &размер +"; " +&фирма
могут быть и другие ошибки, типа размера нет, а при этом нет еще и пробела
или встретится знак, который в запросе является спецсимволом, тот же %, и вся конструкция может повести себя странно, особенно если ты найденное потом делишь по разделителям. Разделители иногда это выход, но лучше все же отселить их в разные поля, а если надо откуда-то грузить - написать загрузчик, с особой обработкой странных вариантов
30. Sanario 26 02.06.21 16:47 Сейчас в теме
Хм... Попробую, спасибо за совет
31. Даня 9 16.07.21 11:04 Сейчас в теме
Добрый день!

Т.е. предложенине 29 неплохое, но 1С прямо рекомендует так не делать...

См. тут: https://its.1c.ru/db/v8std/content/726/hdoc
Цитирую:
Запросы, в которых управляющие символы шаблона оператора ПОДОБНО находятся в полях запроса или в вычисляемых выражениях, по-разному интерпретируются на различных СУБД. Запрос, успешно выполняющийся, например, при работе с файловой базой, может возвращать неверные результаты при работе в режиме клиент-сервера. Подобные выражения необходимо переформулировать.

Например, вместо:

Запрос = Новый Запрос("
    |ВЫБРАТЬ
    |    Товары.Ссылка
    |ИЗ
    |    Справочник.Товары КАК Товары
    |ГДЕ
    |    Товары.СтранаПроисхождения.Наименование ПОДОБНО &ШаблонНазванияСтраны + "_"
    |");

Запрос.УстановитьПараметр("ШаблонНазванияСтраны", "ЧА");
Показать

Необходимо использовать:

Запрос = Новый Запрос("
    |ВЫБРАТЬ
    |    Товары.Ссылка
    |ИЗ
    |    Справочник.Товары КАК Товары
    |ГДЕ
    |    Товары.СтранаПроисхождения.Наименование ПОДОБНО &ШаблонНазванияСтраны
    |");

Запрос.УстановитьПараметр("ШаблонНазванияСтраны", "ЧА_");
Показать

Данное требование продиктовано необходимостью переносимости прикладных решений на различные СУБД.
32. пользователь 12.10.22 20:27
Сообщение было скрыто модератором.
...
36. kembrik 10 20.07.23 09:58 Сейчас в теме
Хотелось бы дополнить комментарием по нестандартному использованию ПОДОБНО, про который часто забывают. Допустим нам пришел список уникальных кодов "косячных" документов, которые быстро надо подставить как результат запроса в обработку, которая позволит с ними что то сделать. А так как во многих стандартных консолях Список значений для отбора через В из строки не загрузишь - пользуюсь таким шаблоном запроса

ВЫБРАТЬ
НужныйДокумент.Ссылка
ИЗ
Документ.НужныйДокумент КАК НужныйДокумент
ГДЕ
&СтрокаПодобия ПОДОБНО "%" + НужныйДокумент.Номер + "%"

в СтрокаПодобия при этом строка кодов с любым разделителем, которого не будет в поле Номер, например "02120011179;09110001780;09120018055"
voneska7; +1 Ответить
39. Miket78 20 28.02.24 19:20 Сейчас в теме
Коллеги подскажите, можно ли как-то приспособить оператор ПОДОБНО для поиска по реквизиту без учета определенных символов. Например при поиске W671 чтобы в артикуле находило w67/1, w671, w67-1, -w-67-1-. Т.е. отбрасывались все знаки кроме букв и цифр. Но при этом не находились значения типа ww671 или w6711.
Оставьте свое сообщение