ПОДОБНО в запросе 1С: как искать буквальный текст с процентом и скобками
Оператор ПОДОБНО сравнивает всю строку с шаблоном без учёта регистра. % означает любое число символов, _ — один символ. Для буквального поиска пользовательского текста экранируйте служебные символы, затем добавьте внешние проценты и передайте готовую маску параметром.
Маска и буквальный поиск — разные режимы
Маска А_ ищет двухсимвольное значение, начинающееся на А, а не текст с подчёркиванием. Маска %чай% ищет фрагмент в любой позиции. Без внешних процентов слово «чай» не означает «любое название, содержащее чай».
В интерфейсе явно разделяйте режимы «текст» и «маска». Не экранируйте готовую маску пользователя, если он осознанно задаёт шаблон, и не принимайте произвольный текст за шаблон.
Спецсимволы ПОДОБНО в запросе 1С 8.3
| Шаблон | Смысл |
|---|---|
| % | Ноль или больше символов |
| _ | Ровно один символ |
| [abc] | Один символ из списка |
| [^abc] | Один символ вне списка |
СПЕЦСИМВОЛ "~" позволяет обозначить буквальные служебные символы: ~%, ~_, ~~. Для переносимого буквального поиска экранируем также скобки и ^. Использование групп символов в собственных масках требует проверки на целевой СУБД.
Как экранировать пользовательский текст
Функция МаскаБуквальногоПоиска(ТекстПоиска)
// Сначала сам спецсимвол, иначе экранирование будет удвоено.
Маска = СтрЗаменить(ТекстПоиска, "~", "~~");
Для Каждого Символ Из СтрРазделить("%,_,[,],^", ",") Цикл
Маска = СтрЗаменить(Маска, Символ, "~" + Символ);
КонецЦикла;
Возврат "%" + Маска + "%";
КонецФункцииФункция не обращается к базе. Одна кавычка или двойная кавычка во вводе остаётся данными параметра: её не нужно превращать в часть текста запроса. Но специальные символы маски параметр сам не экранирует.
Как передать параметр ПОДОБНО в запрос
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ Товары.Ссылка
|ИЗ Справочник.Номенклатура КАК Товары
|ГДЕ Товары.Наименование ПОДОБНО &Шаблон СПЕЦСИМВОЛ ""~""";
Запрос.УстановитьПараметр("Шаблон", МаскаБуквальногоПоиска(ТекстПоиска));
Результат = Запрос.Выполнить();Имя справочника и реквизита замените по метаданным своей конфигурации. Проценты добавляются в BSL до выполнения запроса, а не конкатенацией вида ПОДОБНО "%" + &Текст + "%" в запросе.
Контрольные примеры: %, _, скобки и пустая строка
В файловой базе 8.3.27.1989 воспроизведён буквальный поиск 10%_[x]~^ в строке Цена 10%_[x]~^. Это проверка данного сценария, а не подтверждение всех СУБД.
- Искомый процент должен совпасть с процентом, не с произвольным хвостом.
- Искомое подчёркивание должно совпасть с подчёркиванием, не с буквой.
- Одинаковый текст в другом регистре совпадает по правилам ПОДОБНО.
- Пустая строка после обрамления даст
%%; решите на уровне интерфейса, нужен ли такой широкий поиск.
Добавьте отрицательный пример с похожим, но не буквальным текстом. На клиент-серверной базе повторите набор на используемой СУБД и проверьте максимальную длину маски.
Версии, производительность и официальные источники
Поиск с ведущим % не следует объявлять быстрым без плана запроса и замеров на объёме пользователя. При поиске по префиксу внешний начальный процент не нужен, но ускорение также зависит от СУБД и условий запроса.
Источники: руководство 8.3.27, §8.4.18.8 и стандарт ИТС №726. Стандарт содержит исторические ограничения отдельных СУБД; нельзя переносить старый лимит MS SQL 2005 на все современные системы. Текущие ограничения проверяйте для своей платформы и СУБД.
Частые ошибки
- Считать УстановитьПараметр экранированием маски — это разные задачи.
- Заменять ~ последним — уже добавленные escape-последовательности изменятся повторно.
- Объявлять поиск с ведущим % индексным и быстрым без измерений.
Частые вопросы
Как найти знак процента через ПОДОБНО?
Укажите СПЕЦСИМВОЛ и поставьте его перед процентом внутри готовой маски, например ~% при спецсимволе ~.
ПОДОБНО учитывает регистр?
Руководство платформы определяет сравнение без учёта регистра для используемых СУБД.
Нужно ли экранировать маску после УстановитьПараметр?
Для буквального поиска маску формируют с экранированием до передачи параметра. Сам параметр не отменяет значение % и _.