A1sCode библиотека 1С

A1sQ.EscapeLike

Назначение: экранировать строку под использование в операторе ПОДОБНО (SQL LIKE) с ESCAPE '~'.
Что делает: заменяет служебные символы шаблонов на безопасные последовательности с тильдой.

Сигнатура

Function EscapeLike(SearchString) Export

Как работает (по исходному коду)

Result = SearchString;
Result = StrReplace(Result, "~", "~~");
Result = StrReplace(Result, "%", "~%");
Result = StrReplace(Result, "_", "~_");
Result = StrReplace(Result, "[", "~[");
Result = StrReplace(Result, "]", "~]");
Result = StrReplace(Result, "^", "~^");
Возврат Result;
Порядок важен: сначала экранируется сама тильда ~, иначе последующие замены добавили бы «ложные» escape‑последовательности.

Параметры

  • SearchString — исходная строка пользователя (может содержать символы %, _, [, ], ^, ~).

Возвращает

Строку — экранированную под LIKE/ПОДОБНО с ESCAPE '~'.

Примеры

1) «Содержит» (совместно с LikePattern)

Mask = A1sQ.LikePattern("100% хлопок"); // "%100~% хлопок%"
QT = "
|ВЫБРАТЬ Наименование
|ИЗ Справочник.Номенклатура
|ГДЕ Наименование ПОДОБНО &Mask ESCAPE '~'";
Q  = A1sQ.CreateQ(QT);
Q.УстановитьПараметр("Mask", Mask);
ТЗ = Q.Выполнить().Выгрузить();

2) Начинается/заканчивается на...

StartMask = A1sQ.EscapeLike("ABC") + "%";   // ABC%
EndMask   = "%" + A1sQ.EscapeLike("XYZ");   // %XYZ
QT = "
|ВЫБРАТЬ Код
|ИЗ Справочник.Номенклатура
|ГДЕ Код ПОДОБНО &StartMask ESCAPE '~'
|   ИЛИ Код ПОДОБНО &EndMask ESCAPE '~'";
Q  = A1sQ.CreateQ(QT);
A1sQ.SetQParams(Q, Новый Структура("StartMask, EndMask", StartMask, EndMask));
ТЗ = Q.Выполнить().Выгрузить();

3) Сложная строка со скобками

Src  = "[A]_01^";
Mask = "%" + A1sQ.EscapeLike(Src) + "%"; // "%~[A~]~_01~^%"
QT   = "ВЫБРАТЬ ... ГДЕ Код ПОДОБНО &Mask ESCAPE '~'";

Нюансы и ограничения

✅ Минимизирует «ложные срабатывания» LIKE за счёт корректного экранирования
✅ Совместима с 1С-языком запросов (оператор ПОДОБНО)
❗ Не забывайте дописывать ESCAPE '~' в условие
❗ Регистр/коллация зависят от СУБД — функция их не меняет
❗ Это не защита от всех видов инъекций — используйте параметры запроса