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

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С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    129742    700    390    

752

Как посмотреть итоговый запрос в отчете СКД

Запросы СКД Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    2951    implecs_team    4    

34

Пропорциональное распределение в запросе с использованием АвтоНомерЗаписи()

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

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    2619    andrey_sag    10    

32

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

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

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

13.02.2024    6300    KawaNoNeko    23    

26

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

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

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

1 стартмани

31.01.2024    2291    2    Yashazz    0    

32

Запрос 1С copilot

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

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

15.01.2024    7114    40    mkalimulin    32    

53

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

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

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

14.12.2023    2015    vandalsvq    7    

29

Консоль запросов УФ 8.3.2.24.12 (мод от Dr.Zombi)

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

Работа с запросом и СКД, Полная поддержка пакетных запросов, временных таблиц. Главное скорость отладки запроса и данных, а красота вторична.

1 стартмани

07.12.2023    3483    52    DrZombi    54    

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

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


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

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

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

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

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

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

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

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

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

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

проще посмотреть в типовой, что обычно используют в качестве служебного символа.
13. Дмитрий74Чел 235 26.02.20 09:55 Сейчас в теме
На счет
Сами себя "%" и "_" правильно находят, на общих основаниях, т.е. "Доход 20% годовых" по "%д 20% г%" будет найден.
не соглашусь. По-моему в данном примере строка попала под условие как раз потому что "%" сработал как условие "любой символ", а не "%" как "%".
14. Yashazz 4734 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 20 03.08.20 19:32 Сейчас в теме
(17) так попробуйте:
ТекстЗапроса="ВЫБРАТЬ Истина ИЗ Справочник.Сайты КАК спр ГДЕ спр.Наименование ПОДОБНО &Условие СПЕЦСИМВОЛ""$"""; 
Cyberhawk; +1 Ответить
21. Cyberhawk 135 03.08.20 19:52 Сейчас в теме
(20) Работает.
А экранировать долларом, получается, нужно только _ и % (если они присутствуют в шаблоне ПОДОБНО)?
22. mikhailv 20 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 158 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 4734 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 23 28.02.24 19:20 Сейчас в теме
Коллеги подскажите, можно ли как-то приспособить оператор ПОДОБНО для поиска по реквизиту без учета определенных символов. Например при поиске W671 чтобы в артикуле находило w67/1, w671, w67-1, -w-67-1-. Т.е. отбрасывались все знаки кроме букв и цифр. Но при этом не находились значения типа ww671 или w6711.
Оставьте свое сообщение