При валидации данных часто возникает задача проверить, состоит ли строка исключительно из цифр заданной длины — например, 8 символов (номера документов, артикулы, идентификаторы). Разберем, как правильно сформировать регулярное выражение для этой цели и как применить его в платформе 1С:Предприятие.
Для указания количества повторений символов в регулярных выражениях применяются фигурные скобки — квантификаторы точного числа повторений {N}. Рассмотрим базовые конструкции:
[0-9]{8} — указывает, что любая цифра от 0 до 9 должна повторяться ровно 8 раз подряд.\d{8} — краткая запись, эквивалентная предыдущему выражению (спецсимвол \d обозначает любую цифру).Важный нюанс: выражения [0-9]{8} или \d{8} без дополнительных модификаторов найдут совпадение даже внутри более длинного числа (например, из 10 цифр). Чтобы проверить, что вся строка целиком состоит ровно из 8 цифр, необходимо ограничить шаблон якорями начала (^) и конца ($) строки:
^\d{8}$ или ^[0-9]{8}$
Если же требуется найти изолированное восьмизначное число внутри произвольного текста, используем границы слова: \b\d{8}\b.
В платформе 1С:Предприятие, начиная с релиза 8.3.23, реализована встроенная поддержка регулярных выражений по стандарту ICU. Рассмотрим применение новых функций на практике:
ПроверяемаяСтрока = "04354355";
// Проверка полного соответствия строки шаблону
Если СтрПодобнаПоРегулярномуВыражению(ПроверяемаяСтрока, "^\d{8}$") Тогда
Сообщить("Строка корректна и состоит ровно из 8 цифр");
Иначе
Сообщить("Строка не соответствует формату");
КонецЕсли;
Для поиска вхождений внутри текста воспользуемся функцией СтрНайтиПоРегулярномуВыражению:
Текст = "Заказ № 04354355 отгружен, а заказ 123 ожидает оплаты";
РезультатПоиска = СтрНайтиПоРегулярномуВыражению(Текст, "\b\d{8}\b");
Если РезультатПоиска <> Неопределено Тогда
Сообщить("Найдено совпадение в позиции: " + РезультатПоиска.НачальнаяПозиция);
КонецЕсли;
В более ранних версиях платформы 1С для работы с регулярными выражениями традиционно использовался объект операционной системы Windows VBScript.RegExp. Разберем пример реализации функции валидации:
Функция СтрокаСостоитИзВосьмиЦифр(ПроверяемаяСтрока) Экспорт
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина;
RegExp.Global = Ложь;
RegExp.Pattern = "^\d{8}$";
Возврат RegExp.Test(СокрЛП(ПроверяемаяСтрока));
КонецФункции
Обратите внимание: использование COMОбъект ограничено операционной системой Windows. Данный код вызовет исключительную ситуацию при исполнении на сервере или клиенте под управлением Linux или macOS.
Если платформа работает на релизах ниже 8.3.23 в кроссплатформенной среде (например, на сервере Linux), задачу можно решить стандартными строковыми функциями без использования регулярных выражений.
Вариант 1. С использованием функций БСП (Библиотеки стандартных подсистем):
Строка = СокрЛП(ПроверяемаяСтрока);
Корректно = (СтрДлина(Строка) = 8) И СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Строка);
Вариант 2. Посимвольная проверка через коды символов:
Строка = СокрЛП(ПроверяемаяСтрока);
Корректно = (СтрДлина(Строка) = 8);
Если Корректно Тогда
Для Индекс = 1 По 8 Цикл
Код = КодСимвола(Строка, Индекс);
// Коды ASCII: "0" = 48, "9" = 57
Если Код < 48 Или Код > 57 Тогда
Корректно = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Вариант 3. Проверка через поиск символов в эталонной строке:
Строка = СокрЛП(ПроверяемаяСтрока);
Корректно = (СтрДлина(Строка) = 8);
Если Корректно Тогда
Для Индекс = 1 По 8 Цикл
Символ = Сред(Строка, Индекс, 1);
Если СтрНайти("0123456789", Символ) = 0 Тогда
Корректно = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;