Как правильно использовать регулярные выражения (RegExp) в 1С для проверки значений реквизитов

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

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

Разбор проблемы с символом звездочки в регулярных выражениях

Рассмотрим распространенное заблуждение: при переходе из подсистем поиска файлов или масок командной строки многие считают символ * универсальным "джокером", означающим "любые символы". Однако в регулярных выражениях синтаксис работает иначе.

Посмотрим на пример кода проверки через COM-объект VBScript.RegExp:


RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "114*";
Результат = RegExp.Test(ЗначениеРеквизита);

При попытке применить шаблон 114* метод Test будет возвращать значение Истина практически для любой строки. Выясним причину такого поведения:

  1. Назначение звездочки: Квантификатор * применяется к предыдущему символу и означает "ноль или более повторений данного символа". Шаблон 114* расшифровывается как: одна единица, за ней еще одна единица, а затем ноль или более четверок.
  2. Поиск подстроки: В VBScript.RegExp метод Test ищет вхождение подстроки в любом месте текста. Так как выражение 114* успешно совпадает с подстрокой "11" (ноль четверок), метод возвращает положительный результат почти на любой строке, содержащей хотя бы две единицы подряд.

Формирование правильного шаблона маски

Разберем, из каких элементов должен состоять корректный шаблон регулярного выражения для проверки формата строки.

  1. Обозначение начала строки (символ ^): Если не привязать шаблон к началу строки, поиск совпадения может произойти в середине текста (например, в строке "01144"). Чтобы проверка работала строго с первого символа, используется символ якоря ^.
  2. Обозначение любого символа (точка .): В регулярных выражениях именно точка означает "любой одиночный символ".
  3. Комбинация .*: Сочетание точки и звездочки означает "любое количество (от 0 до бесконечности) любых символов".

Проанализируем правильный вариант шаблона для проверки строки, которая должна строго начинаться с "114":


RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "^114.*";
Если RegExp.Test(ЗначениеРеквизита) Тогда
    // Значение реквизита корректно
КонецЕсли;

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


RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "^...4";
// С трех любых символов в начале строки, за которыми идет цифра 4
РезультатПроверки = RegExp.Test(ЗначениеРеквизита);

Проверка строк через встроенные функции платформы 1С

Начиная с версии платформы 8.3.23, в 1С:Предприятие появилась встроенная кроссплатформенная поддержка регулярных выражений. Это позволяет отказаться от использования Windows-зависимого COM-объекта VBScript.RegExp и выполнять проверки как на сервере под управлением Linux, так и в тонком или веб-клиенте.

Посмотрим, как выглядит аналог проверки с использованием функции СтрПодобнаПоРегулярномуВыражению:


Шаблон = "^114.*";
Если СтрПодобнаПоРегулярномуВыражению(ЗначениеРеквизита, Шаблон) Тогда
    // Значение соответствует маске
КонецЕсли;

В платформу также входят дополнительные функции для работы с регулярными выражениями:

  1. СтрНайтиПоРегулярномуВыражению — поиск вхождения подстроки по заданному шаблону с возвратом информации о позиции и длине;
  2. СтрНайтиВсеПоРегулярномуВыражению — получение массива всех совпадений в строке;
  3. СтрЗаменитьПоРегулярномуВыражению — замена подстрок, соответствующих регулярному выражению.

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

← На главную