Почему отсутствуют описания регулярных выражений в Синтаксис-помощнике и как с ними работать?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

С выходом новых версий платформы 1С:Предприятие (начиная с 8.3.23) разработчики получили долгожданный инструмент — нативные функции для работы с регулярными выражениями. Однако многие специалисты сталкиваются с ситуацией, когда функции (например, СтрЗаменитьПоРегулярномуВыражению) доступны в коде и работают, но при попытке открыть справку (F1) Синтаксис-помощник не выдает никакой информации. Давайте разберем, почему это происходит, как исправить отображение справки и, самое главное, подробно рассмотрим, как пользоваться этими инструментами.

Причины отсутствия информации в Синтаксис-помощнике

Ситуация, когда платформа обновлена, а справка "молчит", встречается нередко. Рассмотрим основные причины и способы их устранения.

  1. Настройки отображения справки. Иногда фильтры справки настроены таким образом, что скрывают определенные разделы.

    Попробуйте проверить настройки платформы. Перейдите в меню Сервис — Параметры — Справка. Убедитесь, что не установлены ограничивающие фильтры. В некоторых случаях (хоть это и кажется нелогичным для новых функций) помогает галочка "Отображать нерекомендуемые объекты" или сброс настроек фильтрации.

  2. Актуальность файлов справки. Локальная справка устанавливается вместе с платформой. Если при обновлении платформы произошел сбой обновления индексных файлов справки, новые разделы могут быть недоступны через поиск. В этом случае надежнее всего обращаться к онлайн-документации на ИТС (раздел "Общая информация" главы "Работа со строками").

Переход на нативные регулярные выражения: Библиотека ICU

Ранее для работы с регулярными выражениями (RegExp) программисты 1С вынуждены были использовать COM-объект VBScript.RegExp. У этого подхода были недостатки: работа только под Windows и зависимость от внешних компонентов.

Начиная с версии 8.3.23, платформа использует библиотеку ICU (International Components for Unicode). Давайте проанализируем, что это значит для нас как для разработчиков:

Основные функции для работы с регулярными выражениями

Разберем детально синтаксис и применение новых функций. Их всего две основные, но они покрывают большинство задач.

1. Поиск совпадений: СтрНайтиПоРегулярномуВыражению

Функция ищет первое вхождение шаблона в строке. Если вам нужно найти все вхождения, придется организовывать цикл, смещая позицию поиска.

Синтаксис:


Результат = СтрНайтиПоРегулярномуВыражению(ИсходнаяСтрока, Шаблон, [НаправлениеПоиска], [НачальнаяПозиция], [НомерВхождения]);

Функция возвращает объект типа РезультатПоискаПоРегулярномуВыражению или Неопределено, если ничего не найдено. Рассмотрим свойства возвращаемого объекта:

Пример использования: Допустим, нам нужно извлечь артикул вида "ABC-1234" из текста.


Текст = "Поступил товар с артикулом ABC-1234 на склад.";
Шаблон = "[A-Z]{3}-\d{4}";

Попытка
    РезультатПоиска = СтрНайтиПоРегулярномуВыражению(Текст, Шаблон);
    Если РезультатПоиска <> Неопределено Тогда
        Сообщить("Найден артикул: " + РезультатПоиска.Значение); // Выведет: ABC-1234
        Сообщить("Позиция: " + РезультатПоиска.НачальнаяПозиция);
    Иначе
        Сообщить("Артикул не найден.");
    КонецЕсли;
Исключение
    Сообщить("Ошибка в шаблоне: " + ОписаниеОшибки());
КонецПопытки;

Обратите внимание на использование блока Попытка ... Исключение. Если в шаблоне будет синтаксическая ошибка (например, незакрытая скобка), платформа сгенерирует исключение. Это критически важно учитывать при формировании шаблонов динамически.

2. Замена по шаблону: СтрЗаменитьПоРегулярномуВыражению

Эта функция позволяет заменить все вхождения, соответствующие шаблону, на строку замены. Поддерживается использование ссылок на захваченные группы ($1, $2 и т.д.).

Синтаксис:


НоваяСтрока = СтрЗаменитьПоРегулярномуВыражению(ИсходнаяСтрока, Шаблон, СтрокаЗамены);

Пример с перестановкой слов: Поменяем местами Фамилию и Имя.


ФИО = "Иванов Иван";
// Шаблон ищет два слова, разделенных пробелом.
// (\w+) - захватывает слово в группу 1
// \s+ - один или более пробелов
// (\w+) - захватывает второе слово в группу 2
Шаблон = "(\w+)\s+(\w+)"; 

// $2 ссылается на вторую группу (Имя), $1 на первую (Фамилия)
Результат = СтрЗаменитьПоРегулярномуВыражению(ФИО, Шаблон, "$2 $1");

Сообщить(Результат); // Выведет: Иван Иванов

Особенности работы с флагами (ICU)

Как мы упоминали ранее, отдельных параметров для флагов нет. Используйте инлайн-модификаторы в начале шаблона.

Пример поиска без учета регистра:


Текст = "Важный документ";
// Без флага (?i) слово "важный" с маленькой буквы не нашлось бы
Шаблон = "(?i)важный"; 

Если СтрНайтиПоРегулярномуВыражению(Текст, Шаблон) <> Неопределено Тогда
    Сообщить("Найдено!");
КонецЕсли;

Работа с группами захвата

Коллекция Группы в объекте результата поиска позволяет детально разобрать строку. Рассмотрим пример парсинга строки адреса электронной почты, чтобы отделить логин от домена.


Email = "user@example.com";
// Шаблон с двумя группами: (логин)@(домен)
Шаблон = "([a-zA-Z0-9_.]+)@([a-zA-Z0-9_.]+)";

Результат = СтрНайтиПоРегулярномуВыражению(Email, Шаблон);

Если Результат <> Неопределено Тогда
    // Группы индексируются с 0. 
    // Группа[0] - это все совпадение целиком ("user@example.com")
    // Группа[1] - первая скобка (логин)
    // Группа[2] - вторая скобка (домен)
    
    Логин = Результат.Группы.Получить(1).Значение;
    Домен = Результат.Группы.Получить(2).Значение;
    
    Сообщить("Логин: " + Логин);
    Сообщить("Домен: " + Домен);
КонецЕсли;

Производительность и рекомендации

Давайте проанализируем вопросы производительности при использовании новых функций:

  1. Нативные функции против COM. Нативные функции работают быстрее VBScript.RegExp, так как нет затрат на маршалинг данных (передачу между процессом 1С и COM-объектом). Это особенно заметно при большом количестве вызовов в цикле.
  2. Регулярные выражения против простых функций. Несмотря на мощность, регулярные выражения — ресурсоемкий инструмент. Если задачу можно решить обычной функцией СтрЗаменить или СтрНайти (например, простая замена "Маша" на "Даша"), то стандартные строковые функции будут работать быстрее. Используйте регулярные выражения там, где есть сложные шаблоны поиска.
  3. Безопасность. Всегда оборачивайте вызов функций поиска и замены в Попытка, если шаблон вводит пользователь или он формируется программно, чтобы избежать падения приложения.

Используя эти знания, вы сможете эффективно применять мощь библиотеки ICU в своих решениях на платформе 1С, даже если Синтаксис-помощник временно не отображает подсказки по этим методам.

← На главную