ПОДОБНО: маска, один символ и буквальные % и _

Учебные задачи

На восьми собственных названиях сравниваем разные маски. Экранирование показывает, как отличить знак процента и подчёркивание в данных от служебных символов шаблона.

Где и как запускать

Полный серверный общий модуль учебной базы. Собственные значения в памяти, без чтения или записи рабочих данных.

Подготовка

  1. В отдельной учебной базе 8.5.1.1343 создайте общий модуль УчебныйЯзык: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь. Клиентские и внешнее соединение отключены; ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать.

  2. Вставьте весь приведённый текст в этот общий модуль. ВыполнитьПример — экспортная точка входа; остальные процедуры и функции располагаются рядом, а не внутри неё.

  3. В своей внешней учебной обработке создайте управляемую форму, команду Выполнить и кнопку. Клиентский обработчик Выполнить(Команда) вызывает свою процедуру ВыполнитьНаСервере(); она имеет директиву &НаСервереБезКонтекста и одну строку УчебныйЯзык.ВыполнитьПример();. Это серверный вызов общего модуля, а не разрешение клиенту прямо обращаться к серверной библиотеке.

  4. Все товары, количества и строки придуманы в этом модуле. Запись документов, подключение к чужой базе, файлы, сеть и печать не используются. В рабочие общие модули текст не вставляйте.

  5. HTML только показывает BSL. Код в 1С не запускался; перечисленные результаты и отрицательные опыты проверяйте самостоятельно в собственном стенде.

  6. Названия этого урока отличаются от продаж других уроков. Каждое явно добавляется в коде; ожидаемые количества относятся только к этим восьми строкам.

Процедура ВыполнитьПример() Экспорт
    Источник = Новый ТаблицаЗначений;
    Источник.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(40)));
    Названия = Новый Массив;
    Названия.Добавить("Книга");
    Названия.Добавить("КнигаА");
    Названия.Добавить("КнигаАБ");
    Названия.Добавить("Ручка");
    Названия.Добавить("Скидка 10%");
    Названия.Добавить("Скидка 100");
    Названия.Добавить("Код_1");
    Названия.Добавить("КодА1");
    Для Каждого Название Из Названия Цикл
        НоваяСтрока = Источник.Добавить();
        НоваяСтрока.Наименование = Название;
    КонецЦикла;
    Менеджер = Новый МенеджерВременныхТаблиц;
    Попытка
        Создание = Новый Запрос;
        Создание.МенеджерВременныхТаблиц = Менеджер;
        Создание.Текст = "ВЫБРАТЬ Имена.Наименование КАК Наименование
        |ПОМЕСТИТЬ ВТСобственныеИмена
        |ИЗ &Источник КАК Имена";
        Создание.УстановитьПараметр("Источник", Источник);
        Создание.Выполнить();
        Запрос = Новый Запрос;
        Запрос.МенеджерВременныхТаблиц = Менеджер;
        Запрос.Текст = "ВЫБРАТЬ Имена.Наименование КАК Наименование
        |ИЗ ВТСобственныеИмена КАК Имена
        |ГДЕ Имена.Наименование ПОДОБНО ""Книга%""";
        Результат = Запрос.Выполнить().Выгрузить();
        Сообщить(Результат.Количество() = 3);
        Запрос.Текст = "ВЫБРАТЬ Имена.Наименование КАК Наименование
        |ИЗ ВТСобственныеИмена КАК Имена
        |ГДЕ Имена.Наименование ПОДОБНО ""Книга_""";
        Результат = Запрос.Выполнить().Выгрузить();
        Сообщить(Результат.Количество() = 1);
        Запрос.Текст = "ВЫБРАТЬ Имена.Наименование КАК Наименование
        |ИЗ ВТСобственныеИмена КАК Имена
        |ГДЕ Имена.Наименование ПОДОБНО ""Код_1""";
        Результат = Запрос.Выполнить().Выгрузить();
        Сообщить(Результат.Количество() = 2);
        Запрос.Текст = "ВЫБРАТЬ Имена.Наименование КАК Наименование
        |ИЗ ВТСобственныеИмена КАК Имена
        |ГДЕ Имена.Наименование ПОДОБНО ""Код~_1"" СПЕЦСИМВОЛ ""~""";
        Результат = Запрос.Выполнить().Выгрузить();
        Сообщить(Результат.Количество() = 1);
        Запрос.Текст = "ВЫБРАТЬ Имена.Наименование КАК Наименование
        |ИЗ ВТСобственныеИмена КАК Имена
        |ГДЕ Имена.Наименование ПОДОБНО ""Скидка 10~%"" СПЕЦСИМВОЛ ""~""";
        Результат = Запрос.Выполнить().Выгрузить();
        Сообщить(Результат.Количество() = 1);
        Запрос.Текст = "ВЫБРАТЬ Имена.Наименование КАК Наименование
        |ИЗ ВТСобственныеИмена КАК Имена
        |ГДЕ Имена.Наименование ПОДОБНО ""Книга[АБ]""";
        Результат = Запрос.Выполнить().Выгрузить();
        Сообщить(Результат.Количество() = 1);
        Запрос.Текст = "ВЫБРАТЬ Имена.Наименование КАК Наименование
        |ИЗ ВТСобственныеИмена КАК Имена
        |ГДЕ Имена.Наименование ПОДОБНО ""Книга[^Б]""";
        Результат = Запрос.Выполнить().Выгрузить();
        Сообщить(Результат.Количество() = 1);
    Исключение
        Менеджер.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Менеджер.Закрыть();
КонецПроцедуры

Разбор по шагам

  1. Создаём восемь строковых названий в колонке длины 40. Это собственная память, не поиск товаров рабочей номенклатуры.

  2. Выполняем помещение параметризованного источника во временную таблицу. Каждый отбор читает ту же таблицу через тот же менеджер.

  3. Книга% допускает любое число символов после Книга, включая ноль: подходят три названия. Книга_ допускает ровно один дополнительный символ: только КнигаА.

  4. Код_1 без экранирования подходит и для Код_1, и для КодА1. Служебное подчёркивание сравнивает один произвольный символ, а не только само себя.

  5. СПЕЦСИМВОЛ "~" превращает ~_ и ~% в буквальные знаки. Получаем точные Код_1 и Скидка 10%, не случайное число символов.

  6. Книга[АБ] задаёт один из перечисленных символов, Книга[^Б] — один символ, кроме Б. Обе маски здесь выбирают только КнигаА; длинная КнигаАБ не подходит.

  7. Все шаблоны — фиксированные литералы из этого модуля, без склейки неизвестного ввода в SQL. Два исключительных пути менеджера закрывают его после опыта.

Как проверить результат

  1. Семь сравнений должны дать Истина: количества 3, 1, 2, 1, 1, 1, 1 в указанном порядке.

  2. Поставьте остановку после каждого результата и сверяйте конкретные Наименование. Порядок без УПОРЯДОЧИТЬ не проверяется.

  3. Не меняйте регистр и национальные настройки ради этого опыта: поведение сравнений строк зависит от настроек базы, а не только от регулярного выражения в другой программе.

Ожидаемый результат

Показана разница маски и буквального ввода на полностью подготовленном серверном источнике.

На что обратить внимание

  1. ПОДОБНО — не регулярное выражение и не маска командной оболочки. % допускает ноль символов, _ требует один.

  2. Оператор относится к строкам. Ограниченная колонка не заменяется ХранилищеЗначения или произвольным объектом.

  3. Буквальный шаблон и строка BSL требуют разного уровня кавычек. Двойные кавычки внутри BSL здесь сохраняют литерал языка запросов.

  4. Этот урок не утверждает, что самодельный парсер LIKE полностью повторяет серверные национальные сравнения. В 1С код не запускался.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.