Имя: Пароль:
1C
 
Запрещеные символы в запросе, экранирование символов.
0 Mr_Best
 
05.06.11
18:49
Есть маленькая но очень неприятная проблемка:
Итак, есть такой запрос:
   Представление = СокрЛП(Представление);
   Представление = СтрЗаменить(Представление, "[", "%");
   Представление = СтрЗаменить(Представление, "]", "%");
   
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
                  |    Номенклатура.Ссылка,
                  |    Номенклатура.Наименование
                  |ИЗ
                  |    Справочник.Номенклатура КАК Номенклатура
                  |ГДЕ
                  |    Номенклатура.ЭтоГруппа = ЛОЖЬ
                  |    И Номенклатура.Наименование ПОДОБНО &Представление";
                 
   Запрос.УстановитьПараметр("Представление", "%"+Представление+"%");
   
Результат = Запрос.Выполнить();

И есть такая ситуация, когда переменная "Представление" содержит такую строку: Кетанов 10мг Таб. п/о [ал.фольга/ПВХ/полиамид] Х100 (R)

В справочнике номенклатура есть куча одинаковых элементов с этим наименованием: Кетанов 10мг Таб. п/о [ал.фольга/ПВХ/полиамид] Х100 (R)

Но запрос НЕ находит ни одного элемента. Причем не находит только для элемента с этим наименованием: Кетанов 10мг Таб. п/о [ал.фольга/ПВХ/полиамид] Х100 (R)

Я предположил что нужно экранировать некоторые символы в запросе, но соответствующей функции экранирования в 1С 8.1 не нашёл!
Поэтому пришлось сделать так:
   Представление = СтрЗаменить(Представление, "[", "%");
   Представление = СтрЗаменить(Представление, "]", "%");

Вопрос: то что такие символы "[]" требуют экранирования это уже понятно. Подскажите какие еще символы требуют экранирования???
1 kosts
 
05.06.11
19:08
2 Kom-off
 
05.06.11
19:09
Следующие символы в строке шаблона являются служебными и имеют смысл, отличный от символа строки:

% (процент): последовательность, содержащая любое количество произвольных символов
_ (подчеркивание): один произвольный символ
[…] (в квадратных скобках один или несколько символов): любой одиночный символ из перечисленных внутри квадратных скобок
В перечислении могут встречаться диапазоны, например a-z, означающие произвольный символ, входящий в диапазон, включая концы диапазона.
[^…] (в квадратных скобках значок отрицания, за которым следует один или несколько символов): любой одиночный символ, кроме тех, которые перечислены следом за значком отрицания
Любой другой символ означает сам себя и не несет никакой дополнительной нагрузки.

Если в качестве самого себя необходимо записать один из перечисленных символов, то ему должен предшествовать <Спецсимвол>. Сам <Спецсимвол> (любой подходящий символ) определяется в этом же операторе после ключевого слова СПЕЦСИМВОЛ.

Например, шаблон “%АБВ[0-9][абвг]\_абв%” СПЕЦСИМВОЛ “\” означает подстроку, состоящую из последовательности символов:
буквы А; буквы Б; буквы В; одной цифры; одной из букв а, б, в или г; символа подчеркивания; буквы а; буквы б; буквы в.

Причем перед этой последовательностью может располагаться произвольный набор символов.
3 Mr_Best
 
05.06.11
19:15
Спасибо что разжували.
4 Mr_Best
 
05.06.11
19:28
Вот почему нет функции экранирования как в php?
Сейчас взял бы и заэкранировал одной функцией, и не парился бы!!!!
5 hhhh
 
05.06.11
21:14
(4) ты вообще что ли считаешь разработчиков придурками? Ну зачем в бухгалтерской программе еще и экранирование?
6 tridog
 
05.06.11
21:39
(5) Это походу ты их таковыми считаешь... Платформа "1С:Предприятие" согласно наполеоновским планам фирмы 1С это уже сооооовсем не бухгалтерская программа.
7 Mr_Best
 
05.06.11
22:00
(5) Я не считаю разработчиков придурками, а на счет того зачем в программе экранирование, так вот затем:
Если в запросе есть специальные символы, литеральные конструкции и подобие регулярных выражений(по терменологии php) то для простой выборки потребуется полное экранирование значений для условий в запросе. Поковыряйся в интернете и ты поймешь что 80% задач использующие "ПОДОБНО" в запросе требуют простого сравнения, а не сложных регулярных выражений(шаблонов). Так почемубы и не сделать функцию экранирования? Покрайней мере такие есть во всех базах данных из тех с которыми я работал: MySQL. MSSQL. Postgressql и языках программирования("расширяемые компоненты") VBasic, VC++, php, perl!
Это мое ИМХО ... Судите сами.