На восьми собственных названиях сравниваем разные маски. Экранирование показывает, как отличить знак процента и подчёркивание в данных от служебных символов шаблона.
Где и как запускать
Полный серверный общий модуль учебной базы. Собственные значения в памяти, без чтения или записи рабочих данных.
Подготовка
В отдельной учебной базе 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С код не запускался.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.