Язык запросов 1С

ПОДОБНО в запросе 1С: как искать буквальный текст с процентом и скобками

Коротко

Оператор ПОДОБНО сравнивает всю строку с шаблоном без учёта регистра. % означает любое число символов, _ — один символ. Для буквального поиска пользовательского текста экранируйте служебные символы, затем добавьте внешние проценты и передайте готовую маску параметром.

Маска и буквальный поиск — разные режимы

Маска А_ ищет двухсимвольное значение, начинающееся на А, а не текст с подчёркиванием. Маска %чай% ищет фрагмент в любой позиции. Без внешних процентов слово «чай» не означает «любое название, содержащее чай».

В интерфейсе явно разделяйте режимы «текст» и «маска». Не экранируйте готовую маску пользователя, если он осознанно задаёт шаблон, и не принимайте произвольный текст за шаблон.

Спецсимволы ПОДОБНО в запросе 1С 8.3

ШаблонСмысл
%Ноль или больше символов
_Ровно один символ
[abc]Один символ из списка
[^abc]Один символ вне списка

СПЕЦСИМВОЛ "~" позволяет обозначить буквальные служебные символы: ~%, ~_, ~~. Для переносимого буквального поиска экранируем также скобки и ^. Использование групп символов в собственных масках требует проверки на целевой СУБД.

Как экранировать пользовательский текст

Функция МаскаБуквальногоПоиска(ТекстПоиска)
    // Сначала сам спецсимвол, иначе экранирование будет удвоено.
    Маска = СтрЗаменить(ТекстПоиска, "~", "~~");
    Для Каждого Символ Из СтрРазделить("%,_,[,],^", ",") Цикл
        Маска = СтрЗаменить(Маска, Символ, "~" + Символ);
    КонецЦикла;
    Возврат "%" + Маска + "%";
КонецФункции
СтрЗаменить / ПОДОБНО
ТекстПоискаСтрока буквального пользовательского ввода
СПЕЦСИМВОЛВ запросе должен совпадать с выбранным здесь ~
→ Строка шаблона

Функция не обращается к базе. Одна кавычка или двойная кавычка во вводе остаётся данными параметра: её не нужно превращать в часть текста запроса. Но специальные символы маски параметр сам не экранирует.

Как передать параметр ПОДОБНО в запрос

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ Товары.Ссылка
    |ИЗ Справочник.Номенклатура КАК Товары
    |ГДЕ Товары.Наименование ПОДОБНО &Шаблон СПЕЦСИМВОЛ ""~""";
Запрос.УстановитьПараметр("Шаблон", МаскаБуквальногоПоиска(ТекстПоиска));
Результат = Запрос.Выполнить();

Имя справочника и реквизита замените по метаданным своей конфигурации. Проценты добавляются в BSL до выполнения запроса, а не конкатенацией вида ПОДОБНО "%" + &Текст + "%" в запросе.

В ИИ Консоли запросов 1С можно попросить проверить маску на примерах с процентами и скобками и подобрать реальные поля по метаданным базы.

Контрольные примеры: %, _, скобки и пустая строка

В файловой базе 8.3.27.1989 воспроизведён буквальный поиск 10%_[x]~^ в строке Цена 10%_[x]~^. Это проверка данного сценария, а не подтверждение всех СУБД.

  • Искомый процент должен совпасть с процентом, не с произвольным хвостом.
  • Искомое подчёркивание должно совпасть с подчёркиванием, не с буквой.
  • Одинаковый текст в другом регистре совпадает по правилам ПОДОБНО.
  • Пустая строка после обрамления даст %%; решите на уровне интерфейса, нужен ли такой широкий поиск.

Добавьте отрицательный пример с похожим, но не буквальным текстом. На клиент-серверной базе повторите набор на используемой СУБД и проверьте максимальную длину маски.

Версии, производительность и официальные источники

Поиск с ведущим % не следует объявлять быстрым без плана запроса и замеров на объёме пользователя. При поиске по префиксу внешний начальный процент не нужен, но ускорение также зависит от СУБД и условий запроса.

Источники: руководство 8.3.27, §8.4.18.8 и стандарт ИТС №726. Стандарт содержит исторические ограничения отдельных СУБД; нельзя переносить старый лимит MS SQL 2005 на все современные системы. Текущие ограничения проверяйте для своей платформы и СУБД.

Частые ошибки

  • Считать УстановитьПараметр экранированием маски — это разные задачи.
  • Заменять ~ последним — уже добавленные escape-последовательности изменятся повторно.
  • Объявлять поиск с ведущим % индексным и быстрым без измерений.

Частые вопросы

Как найти знак процента через ПОДОБНО?

Укажите СПЕЦСИМВОЛ и поставьте его перед процентом внутри готовой маски, например ~% при спецсимволе ~.

ПОДОБНО учитывает регистр?

Руководство платформы определяет сравнение без учёта регистра для используемых СУБД.

Нужно ли экранировать маску после УстановитьПараметр?

Для буквального поиска маску формируют с экранированием до передачи параметра. Сам параметр не отменяет значение % и _.