При работе с механизмами интеграции и XDTO-пакетами в платформе 1С:Предприятие разработчики часто сталкиваются с необходимостью жесткого ограничения входящих и исходящих данных. Для этого в свойствах типов XDTO используются фасеты (ограничения), среди которых наиболее гибким является Образец (pattern). Он позволяет задавать маски значений с помощью регулярных выражений.
Однако синтаксис регулярных выражений в XML-схемах (XSD), на которых базируется XDTO, имеет ряд важных отличий от привычных стандартов RegExp в JavaScript, PHP или Perl. В этой статье мы подробно разберем, как правильно задавать диапазоны длины, маскировать сложные форматы вроде UUID, избегать досадных синтаксических ошибок и корректно передавать строковые данные из запросов 1С.
Рассмотрим стандартную задачу: нам необходимо ограничить строковое поле так, чтобы оно содержало исключительно цифры, а длина этой строки варьировалась от 8 до 12 символов. Распространенной ошибкой является попытка указать диапазон через дефис внутри фигурных скобок:
[0-9]{8-12}
При попытке проверить или сохранить схему с таким регулярным выражением платформа 1С выдаст ошибку разбора регулярного выражения:
failed to compile: xmlFAParseRegExp: extra characters
Выясним причину этой ошибки. Согласно стандарту XML Schema (XSD), для указания диапазона повторений (квантификатора) в фигурных скобках должен использоваться разделитель-запятая, а не дефис. Правильный синтаксис выглядит следующим образом:
[0-9]{8,12}
Где:
[0-9] — определяет класс допустимых символов (только цифры от 0 до 9);{8,12} — указывает минимальное (8) и максимальное (12) количество вхождений символов этого класса.Еще одна частая ошибка при ручном написании шаблонов XDTO — использование круглых скобок вместо квадратных для определения набора допустимых символов. Проанализируем пример, когда строка "643" (код страны) не проходит валидацию по шаблону:
(0-9){3}
В синтаксисе регулярных выражений круглые скобки () используются для группировки выражений или захвата подстрок, но они не задают диапазон символов. Шаблон (0-9){3} буквально означает, что в проверяемой строке должна трижды повториться текстовая последовательность "0-9" (например, "0-90-90-9"). Разумеется, строка "643" этому правилу не соответствует.
Чтобы шаблон заработал как перечисление цифр, необходимо использовать квадратные скобки []:
[0-9]{3}
Только в квадратных скобках дефис трактуется как диапазон символов от "0" до "9".
В процессе интеграции систем часто требуется передавать уникальные идентификаторы (GUID/UUID). Простая маска вида ([A-Za-z0-9-]) является ошибочной: во-первых, круглые скобки здесь избыточны, во-вторых, она позволяет передавать строки произвольной длины и структуры.
Если вам необходима строгая валидация формата UUID (длина 36 символов, шестнадцатеричные цифры, разделенные дефисами по схеме 8-4-4-4-12), регулярное выражение должно выглядеть следующим образом:
[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
Обратите внимание на правила экранирования дефиса внутри квадратных скобок. Если вы хотите использовать дефис как обычный символ, его не нужно экранировать обратным слэшем \, если он расположен в самом конце списка символов внутри скобок. Платформа 1С при сохранении схемы автоматически оптимизирует выражение и удаляет избыточные экранирующие символы:
[A-Za-z0-9-]
Однако для UUID в 1С существует более правильный и элегантный путь. Нет необходимости вручную прописывать сложные регулярные выражения. Платформа имеет предопределенное пространство имен http://v8.1c.ru/8.1/data/core, в котором уже описан тип значения UUID.
Выполним интеграцию этого типа по шагам:
http://v8.1c.ru/8.1/data/core (обычно используется префикс xsr или d3p1).UUID из импортированного пространства имен.При выгрузке платформа 1С автоматически преобразует объект встроенного языка УникальныйИдентификатор в строковое XML-представление, а при чтении — выполнит обратную конвертацию и валидацию.
Регулярные выражения в XDTO имеют ключевые отличия от стандартных движков RegExp:
^ и конца строки $ использовать нельзя, платформа выдаст ошибку валидации при сохранении схемы. Шаблон [0-9]{3} в XDTO по умолчанию работает так же, как ^[0-9]{3}$ в других языках.*? не поддерживаются.Использование сложных регулярных выражений для одновременного контроля состава символов и длины (например, [0-9]{8,12}) усложняет чтение схемы сторонними системами. В XDTO-пакетах рекомендуется комбинировать различные фасеты ограничений:
8;12;[0-9]+ (что означает "только цифры").При таком подходе схема становится более наглядной, а в случае ошибки валидации платформа 1С выдаст более точную диагностику (например, "Значение не соответствует ограничению МинДлина" вместо общего "Значение не соответствует образцу").
Часто возникает ситуация, когда строковое значение (например, код "643"), полученное из результата запроса, упорно не проходит проверку по корректному образцу [0-9]{3}. Это связано с особенностями типизации в 1С.
Если поле в базе данных имеет числовой тип, то при записи значения в свойство XDTO-объекта платформа может неявно сохранить его тип как числовой. При последующей сериализации XML числовое значение будет проверяться регулярным выражением для строки, что вызовет ошибку валидации.
Чтобы избежать подобных проблем, всегда выполняйте явное приведение типов во встроенном языке 1С перед присвоением значения свойству XDTO-объекта:
// Пример правильного приведения типов при заполнении XDTO из выборки запроса
НовыйОбъект = ФабрикаXDTO.Создать(ТипОбъектаXDTO);
// Используем функцию Строка() для явной конвертации
НовыйОбъект.КодСтраны = СокрЛП(Строка(ВыборкаЗапроса.КодСтраны));
Важное предупреждение: При работе с числами больше 999 стандартная функция Строка(1000) возвращает строку с неразрывным пробелом в качестве разделителя групп разрядов ("1 000"). Это мгновенно нарушит валидацию регулярным выражением [0-9]{4}. Для выгрузки кодов без разделителей разрядов всегда применяйте функцию Формат():
// Форматирование числа без разделителей групп для безопасной валидации XDTO
НовыйОбъект.НомерДокумента = Формат(ВыборкаЗапроса.Номер, "ЧГ=0");
Применяя данные правила и понимая специфику валидации схем XML, вы сможете создавать надежные и отказоустойчивые интеграционные решения на платформе 1С:Предприятие.