Как составить регулярное выражение для проверки строки из 8 цифр в 1С?

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

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

Синтаксис шаблона регулярного выражения

Для указания количества повторений символов в регулярных выражениях применяются фигурные скобки — квантификаторы точного числа повторений {N}. Рассмотрим базовые конструкции:

  1. Диапазон символов: [0-9]{8} — указывает, что любая цифра от 0 до 9 должна повторяться ровно 8 раз подряд.
  2. Класс цифровых символов: \d{8} — краткая запись, эквивалентная предыдущему выражению (спецсимвол \d обозначает любую цифру).

Важный нюанс: выражения [0-9]{8} или \d{8} без дополнительных модификаторов найдут совпадение даже внутри более длинного числа (например, из 10 цифр). Чтобы проверить, что вся строка целиком состоит ровно из 8 цифр, необходимо ограничить шаблон якорями начала (^) и конца ($) строки:

^\d{8}$ или ^[0-9]{8}$

Если же требуется найти изолированное восьмизначное число внутри произвольного текста, используем границы слова: \b\d{8}\b.

Штатная работа с регулярными выражениями в 1С (начиная с версии 8.3.23)

В платформе 1С:Предприятие, начиная с релиза 8.3.23, реализована встроенная поддержка регулярных выражений по стандарту ICU. Рассмотрим применение новых функций на практике:


ПроверяемаяСтрока = "04354355";

// Проверка полного соответствия строки шаблону
Если СтрПодобнаПоРегулярномуВыражению(ПроверяемаяСтрока, "^\d{8}$") Тогда
    Сообщить("Строка корректна и состоит ровно из 8 цифр");
Иначе
    Сообщить("Строка не соответствует формату");
КонецЕсли;

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


Текст = "Заказ № 04354355 отгружен, а заказ 123 ожидает оплаты";
РезультатПоиска = СтрНайтиПоРегулярномуВыражению(Текст, "\b\d{8}\b");

Если РезультатПоиска <> Неопределено Тогда
    Сообщить("Найдено совпадение в позиции: " + РезультатПоиска.НачальнаяПозиция);
КонецЕсли;

Проверка через COM-объект в версиях платформы до 8.3.23

В более ранних версиях платформы 1С для работы с регулярными выражениями традиционно использовался объект операционной системы Windows VBScript.RegExp. Разберем пример реализации функции валидации:


Функция СтрокаСостоитИзВосьмиЦифр(ПроверяемаяСтрока) Экспорт
    
    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.IgnoreCase = Истина;
    RegExp.Global = Ложь;
    RegExp.Pattern = "^\d{8}$";
    
    Возврат RegExp.Test(СокрЛП(ПроверяемаяСтрока));
    
КонецФункции

Обратите внимание: использование COMОбъект ограничено операционной системой Windows. Данный код вызовет исключительную ситуацию при исполнении на сервере или клиенте под управлением Linux или macOS.

Альтернативные способы проверки средствами встроенного языка 1С

Если платформа работает на релизах ниже 8.3.23 в кроссплатформенной среде (например, на сервере Linux), задачу можно решить стандартными строковыми функциями без использования регулярных выражений.

Вариант 1. С использованием функций БСП (Библиотеки стандартных подсистем):


Строка = СокрЛП(ПроверяемаяСтрока);
Корректно = (СтрДлина(Строка) = 8) И СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Строка);

Вариант 2. Посимвольная проверка через коды символов:


Строка = СокрЛП(ПроверяемаяСтрока);
Корректно = (СтрДлина(Строка) = 8);

Если Корректно Тогда
    Для Индекс = 1 По 8 Цикл
        Код = КодСимвола(Строка, Индекс);
        // Коды ASCII: "0" = 48, "9" = 57
        Если Код < 48 Или Код > 57 Тогда
            Корректно = Ложь;
            Прервать;
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

Вариант 3. Проверка через поиск символов в эталонной строке:


Строка = СокрЛП(ПроверяемаяСтрока);
Корректно = (СтрДлина(Строка) = 8);

Если Корректно Тогда
    Для Индекс = 1 По 8 Цикл
        Символ = Сред(Строка, Индекс, 1);
        Если СтрНайти("0123456789", Символ) = 0 Тогда
            Корректно = Ложь;
            Прервать;
        КонецЕсли;
    КонецЦикла;
КонецЕсли;
← На главную