Синтаксис и применение Оператор проверки строки на подобие шаблону в платформе 1С:Предприятие. Описание и примеры кода.
Полное описание, параметры и ограничения
Оператор проверки строки на подобие шаблону
Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если значение выражения удовлетворяет шаблону – результатом оператора будет ИСТИНА, иначе – ЛОЖЬ.
Следующие символы в строке шаблона являются служебными и имеют смысл, отличный от символа строки:
% (процент): последовательность, содержащая любое количество произвольных символов
_ (подчеркивание): один произвольный символ
[…] (в квадратных скобках один или несколько символов): любой одиночный символ из перечисленных внутри квадратных скобок
В перечислении могут встречаться диапазоны, например a-z, означающие произвольный символ, входящий в диапазон, включая концы диапазона.
[^…] (в квадратных скобках значок отрицания, за которым следует один или несколько символов): любой одиночный символ, кроме тех, которые перечислены следом за значком отрицания
Любой другой символ означает сам себя и не несет никакой дополнительной нагрузки.
Если в качестве самого себя необходимо записать один из перечисленных символов, то ему должен предшествовать <Спецсимвол>. Сам <Спецсимвол> (любой подходящий символ) определяется в этом же операторе после ключевого слова СПЕЦСИМВОЛ.
Например, шаблон “%АБВ[0-9][абвг]\_абв%” СПЕЦСИМВОЛ “\” означает подстроку, состоящую из последовательности символов:
буквы А; буквы Б; буквы В; одной цифры; одной из букв а, б, в или г; символа подчеркивания; буквы а; буквы б; буквы в.
Причем перед этой последовательностью может располагаться произвольный набор символов.
см. также: Логические выражения
Практические примеры
ПОДОБНО: маска, один символ и буквальные % и _
На восьми собственных названиях сравниваем разные маски. Экранирование показывает, как отличить знак процента и подчёркивание в данных от служебных символов шаблона.
Где и как запускать
Полный серверный общий модуль учебной базы. Собственные значения в памяти, без чтения или записи рабочих данных.
Подготовка
В отдельной учебной базе 8.5.1.1343 создайте общий модуль УчебныйЯзык: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь. Клиентские и внешнее соединение отключены; ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать.
Вставьте весь приведённый текст в этот общий модуль. ВыполнитьПример — экспортная точка входа; остальные процедуры и функции располагаются рядом, а не внутри неё.
В своей внешней учебной обработке создайте управляемую форму, команду Выполнить и кнопку. Клиентский обработчик Выполнить(Команда) вызывает свою процедуру ВыполнитьНаСервере(); она имеет директиву &НаСервереБезКонтекста и одну строку УчебныйЯзык.ВыполнитьПример();. Это серверный вызов общего модуля, а не разрешение клиенту прямо обращаться к серверной библиотеке.
Все товары, количества и строки придуманы в этом модуле. Запись документов, подключение к чужой базе, файлы, сеть и печать не используются. В рабочие общие модули текст не вставляйте.
HTML только показывает BSL. Код в 1С не запускался; перечисленные результаты и отрицательные опыты проверяйте самостоятельно в собственном стенде.
Названия этого урока отличаются от продаж других уроков. Каждое явно добавляется в коде; ожидаемые количества относятся только к этим восьми строкам.
Процедура ВыполнитьПример() Экспорт
Источник = Новый ТаблицаЗначений;
Источник.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(40)));
Названия = Новый Массив;
Названия.Добавить("Книга");
Названия.Добавить("КнигаА");
Названия.Добавить("КнигаАБ");
Названия.Добавить("Ручка");
Названия.Добавить("Скидка 10%");
Названия.Добавить("Скидка 100");
Названия.Добавить("Код_1");
Названия.Добавить("КодА1");
Для Каждого Название Из Названия Цикл
НоваяСтрока = Источник.Добавить();
НоваяСтрока.Наименование = Название;
КонецЦикла;
Менеджер = Новый МенеджерВременныхТаблиц;
Попытка
Создание = Новый Запрос;
Создание.МенеджерВременныхТаблиц = Менеджер;
Создание.Текст = "ВЫБРАТЬ Имена.Наименование КАК Наименование
|ПОМЕСТИТЬ ВТСобственныеИмена
|ИЗ &Источник КАК Имена";
Создание.УстановитьПараметр("Источник", Источник);
Создание.Выполнить();
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Менеджер;
Запрос.Текст = "ВЫБРАТЬ Имена.Наименование КАК Наименование
|ИЗ ВТСобственныеИмена КАК Имена
|ГДЕ Имена.Наименование ПОДОБНО ""Книга%""";
Результат = Запрос.Выполнить().Выгрузить();
Сообщить(Результат.Количество() = 3);
Запрос.Текст = "ВЫБРАТЬ Имена.Наименование КАК Наименование
|ИЗ ВТСобственныеИмена КАК Имена
|ГДЕ Имена.Наименование ПОДОБНО ""Книга_""";
Результат = Запрос.Выполнить().Выгрузить();
Сообщить(Результат.Количество() = 1);
Запрос.Текст = "ВЫБРАТЬ Имена.Наименование КАК Наименование
|ИЗ ВТСобственныеИмена КАК Имена
|ГДЕ Имена.Наименование ПОДОБНО ""Код_1""";
Результат = Запрос.Выполнить().Выгрузить();
Сообщить(Результат.Количество() = 2);
Запрос.Текст = "ВЫБРАТЬ Имена.Наименование КАК Наименование
|ИЗ ВТСобственныеИмена КАК Имена
|ГДЕ Имена.Наименование ПОДОБНО ""Код~_1"" СПЕЦСИМВОЛ ""~""";
Результат = Запрос.Выполнить().Выгрузить();
Сообщить(Результат.Количество() = 1);
Запрос.Текст = "ВЫБРАТЬ Имена.Наименование КАК Наименование
|ИЗ ВТСобственныеИмена КАК Имена
|ГДЕ Имена.Наименование ПОДОБНО ""Скидка 10~%"" СПЕЦСИМВОЛ ""~""";
Результат = Запрос.Выполнить().Выгрузить();
Сообщить(Результат.Количество() = 1);
Запрос.Текст = "ВЫБРАТЬ Имена.Наименование КАК Наименование
|ИЗ ВТСобственныеИмена КАК Имена
|ГДЕ Имена.Наименование ПОДОБНО ""Книга[АБ]""";
Результат = Запрос.Выполнить().Выгрузить();
Сообщить(Результат.Количество() = 1);
Запрос.Текст = "ВЫБРАТЬ Имена.Наименование КАК Наименование
|ИЗ ВТСобственныеИмена КАК Имена
|ГДЕ Имена.Наименование ПОДОБНО ""Книга[^Б]""";
Результат = Запрос.Выполнить().Выгрузить();
Сообщить(Результат.Количество() = 1);
Исключение
Менеджер.Закрыть();
ВызватьИсключение;
КонецПопытки;
Менеджер.Закрыть();
КонецПроцедурыРазбор по шагам
Создаём восемь строковых названий в колонке длины 40. Это собственная память, не поиск товаров рабочей номенклатуры.
Выполняем помещение параметризованного источника во временную таблицу. Каждый отбор читает ту же таблицу через тот же менеджер.
Книга% допускает любое число символов после Книга, включая ноль: подходят три названия. Книга_ допускает ровно один дополнительный символ: только КнигаА.
Код_1 без экранирования подходит и для Код_1, и для КодА1. Служебное подчёркивание сравнивает один произвольный символ, а не только само себя.
СПЕЦСИМВОЛ "~" превращает ~_ и ~% в буквальные знаки. Получаем точные Код_1 и Скидка 10%, не случайное число символов.
Книга[АБ] задаёт один из перечисленных символов, Книга[^Б] — один символ, кроме Б. Обе маски здесь выбирают только КнигаА; длинная КнигаАБ не подходит.
Все шаблоны — фиксированные литералы из этого модуля, без склейки неизвестного ввода в SQL. Два исключительных пути менеджера закрывают его после опыта.
Как проверить результат
Семь сравнений должны дать Истина: количества 3, 1, 2, 1, 1, 1, 1 в указанном порядке.
Поставьте остановку после каждого результата и сверяйте конкретные Наименование. Порядок без УПОРЯДОЧИТЬ не проверяется.
Не меняйте регистр и национальные настройки ради этого опыта: поведение сравнений строк зависит от настроек базы, а не только от регулярного выражения в другой программе.
Ожидаемый результат
Показана разница маски и буквального ввода на полностью подготовленном серверном источнике.
На что обратить внимание
ПОДОБНО — не регулярное выражение и не маска командной оболочки. % допускает ноль символов, _ требует один.
Оператор относится к строкам. Ограниченная колонка не заменяется ХранилищеЗначения или произвольным объектом.
Буквальный шаблон и строка BSL требуют разного уровня кавычек. Двойные кавычки внутри BSL здесь сохраняют литерал языка запросов.
Этот урок не утверждает, что самодельный парсер LIKE полностью повторяет серверные национальные сравнения. В 1С код не запускался.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.