Как в 1С проверить email-адрес регулярным выражением, исключив кириллицу?

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

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

Анализ исходной проблемы: почему метасимвол \w пропускает кириллицу?

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

Шаблон = "^([\\w\\.\\-]+)@([\\w\\.\\-]+)\\.([a-z]{2,6})$"

На первый взгляд, этот шаблон выглядит корректным. Метасимвол \w в большинстве языков программирования и сред означает "любой буквенно-цифровой символ или знак подчеркивания", что обычно эквивалентно [a-zA-Z0-9_]. Однако в 1С поведение этого символа зависит от региональных настроек системы.

Ключевая причина проблемы заключается в том, что в русскоязычной локали платформа 1С интерпретирует \w как "любой буквенный символ из текущего алфавита, цифра или знак подчеркивания". Это значит, что в набор допустимых символов попадают не только латинские, но и кириллические буквы. В результате, адрес вида "тест@тест.рф" успешно проходит такую проверку, что не соответствует исходной задаче, требующей только латиницы.

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

Решение: Явное указание разрешенных символов

Чтобы гарантированно исключить кириллицу и провести разбор текста на разрешенные символы, нужно заменить \w на явное перечисление. Разберем по шагам, как построить правильный шаблон.

  1. Определяем символы для имени пользователя (часть до @). Обычно это латинские буквы (в верхнем и нижнем регистре), цифры, точка, дефис и знак подчеркивания. В виде символьного класса это будет выглядеть так: [a-zA-Z0-9_.-]. Обратите внимание, что внутри квадратных скобок точку и дефис можно не экранировать (если дефис стоит в начале или конце), но для надежности и лучшей читаемости их часто экранируют обратным слэшем: [a-zA-Z0-9_\\.\\-].
  2. Определяем символы для доменного имени. Здесь правила похожи: латинские буквы, цифры, точка и дефис. Символьный класс будет таким: [a-zA-Z0-9.-].
  3. Определяем домен верхнего уровня. Это часть после последней точки. Обычно состоит только из латинских букв, длиной от 2 до 6 символов (хотя сейчас существуют и более длинные). Для этого используем конструкцию: [a-zA-Z]{2,6}.

Собрав все части вместе, получаем надежный шаблон для проверки email на латинице:

Шаблон = "^([a-zA-Z0-9_\\.\\-]+)@([a-zA-Z0-9\\.\\-]+)\\.([a-zA-Z]{2,6})$"

Рассмотрим, как применить это в коде 1С. Для написания и отладки алгоритмов удобно использовать объект XDTOПроверкаXML.

Пример кода для проверки:


// Функция для проверки корректности email-адреса
// Возвращает Истина, если адрес корректен, иначе - Ложь.
Функция ПроверитьEmail(СтрокаСПочтой)

    // Используем объект XDTOПроверкаXML для работы с регулярными выражениями
    Проверка = Новый XDTOПроверкаXML;
    
    // Шаблон, который разрешает только латинские буквы, цифры и символы _, ., -
    // ^ - начало строки
    // ([a-zA-Z0-9_\\.\\-]+) - первая группа: имя пользователя
    // @ - обязательный символ "собака"
    // ([a-zA-Z0-9\\.\\-]+) - вторая группа: доменное имя
    // \\. - обязательный символ точки перед доменом верхнего уровня
    // ([a-zA-Z]{2,6}) - третья группа: домен верхнего уровня (от 2 до 6 букв)
    // $ - конец строки
    Шаблон = "^([a-zA-Z0-9_\\.\\-]+)@([a-zA-Z0-9\\.\\-]+)\\.([a-zA-Z]{2,6})$";

    Возврат Проверка.Проверить(Шаблон, СтрокаСПочтой);

КонецФункции

// Пример использования
АдресДляПроверки1 = "test.user_123@example-site.com";
АдресДляПроверки2 = "тестовый.пользователь@пример.рф";
АдресДляПроверки3 = "invalid-email@";

Если ПроверитьEmail(АдресДляПроверки1) Тогда
    Сообщить("Адрес '" + АдресДляПроверки1 + "' корректен."); // Сработает
Иначе
    Сообщить("Адрес '" + АдресДляПроверки1 + "' не корректен.");
КонецЕсли;

Если ПроверитьEmail(АдресДляПроверки2) Тогда
    Сообщить("Адрес '" + АдресДляПроверки2 + "' корректен.");
Иначе
    Сообщить("Адрес '" + АдресДляПроверки2 + "' не корректен."); // Сработает, т.к. есть кириллица
КонецЕсли;

Если ПроверитьEmail(АдресДляПроверки3) Тогда
    Сообщить("Адрес '" + АдресДляПроверки3 + "' корректен.");
Иначе
    Сообщить("Адрес '" + АдресДляПроверки3 + "' не корректен."); // Сработает, т.к. неверный формат
КонецЕсли;

Ключевые выводы и рекомендации

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

  1. Не доверяйте метасимволу \w, если вам нужна проверка исключительно на латиницу. Его поведение зависит от локали и может привести к непредсказуемым результатам.
  2. Используйте явные символьные классы. Конструкция [a-zA-Z0-9_] всегда надежнее и однозначнее, чем \w, когда речь идет о строгом контроле набора символов.
  3. Применяйте объект XDTOПроверкаXML. Это стандартный и удобный механизм платформы 1С для работы с регулярными выражениями. Метод Проверить() возвращает булево значение, что идеально подходит для условий.
  4. Тестируйте свои шаблоны. Перед внедрением в продуктив всегда проверяйте регулярное выражение на различных примерах данных: корректных, некорректных и граничных случаях (например, с кириллицей, спецсимволами, без `@` и т.д.).

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

← На главную