Особенности использования в запросах оператора ПОДОБНО

#std726

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

1. Оператор ПОДОБНО в тексте запроса необходимо использовать только 

Не следует формировать строку шаблона вычислениями или конкатенацией.

Правильно:

Реквизит ПОДОБНО "123%"
Реквизит ПОДОБНО &Шаблон

Неправильно:

Реквизит ПОДОБНО "123" + "%"
Реквизит ПОДОБНО &Шаблон + "%"
Реквизит ПОДОБНО Таблица.Шаблон

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

Недопустимы, т.к. не работает на IBM DB 2:

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

3. Необходимо экранировать все спецсимволы (_%[]^), чтобы они трактовались как часть искомого текста (а не как спецсимвол). Иначе если пользователь в строке поиска, например, введет текст со скобками [ ], то при выполнении запроса возникнет ошибка вида: ERROR:  invalid regular expression: invalid character range (PostgreSQL).

Для экранирования необходимо:

Например, для поиска по строке "100%":

"100~%" СПЕЦСИМВОЛ "~"

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

Правильно:

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

Запрос.УстановитьПараметр("Шаблон", "%" + ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(ИскомыйТекст) + "%");

Реализация для конфигураций без Библиотеки стандартных подсистем (БСП):

Функция СформироватьСтрокуДляПоискаВЗапросе(Знач СтрокаПоиска) Экспорт

Результат = СтрокаПоиска;
Результат = СтрЗаменить(Результат, "~", "~~");
Результат = СтрЗаменить(Результат, "%", "~%");
Результат = СтрЗаменить(Результат, "_", "~_");
Результат = СтрЗаменить(Результат, "[", "~[");
Результат = СтрЗаменить(Результат, "]", "~]");
Результат = СтрЗаменить(Результат, "^", "~^");

Возврат Результат;

КонецФункции

4. Сравнение выполняется без учета регистра символов.

См. также