При разработке в 1С часто возникает задача проверки корректности вводимых пользователем данных, в частности, адресов электронной почты. Стандартный подход — использование регулярных выражений. Однако здесь есть важный нюанс, связанный с особенностями работы платформы 1С с кириллическими символами, который может привести к неверной валидации. Рассмотрим, как создать надежное регулярное выражение для проверки email, которое будет принимать только латинские символы.
Проанализируем ситуацию, с которой столкнулся автор. Изначально для проверки был использован следующий шаблон:
Шаблон = "^([\\w\\.\\-]+)@([\\w\\.\\-]+)\\.([a-z]{2,6})$"
На первый взгляд, этот шаблон выглядит корректным. Метасимвол \w в большинстве языков программирования и сред означает "любой буквенно-цифровой символ или знак подчеркивания", что обычно эквивалентно [a-zA-Z0-9_]. Однако в 1С поведение этого символа зависит от региональных настроек системы.
Ключевая причина проблемы заключается в том, что в русскоязычной локали платформа 1С интерпретирует \w как "любой буквенный символ из текущего алфавита, цифра или знак подчеркивания". Это значит, что в набор допустимых символов попадают не только латинские, но и кириллические буквы. В результате, адрес вида "тест@тест.рф" успешно проходит такую проверку, что не соответствует исходной задаче, требующей только латиницы.
Это распространенная ошибка, которую может выявить анализатор кода. Чтобы избежать ее, необходимо явно указывать допустимый набор символов, не полагаясь на обобщенные метасимволы.
Чтобы гарантированно исключить кириллицу и провести разбор текста на разрешенные символы, нужно заменить \w на явное перечисление. Разберем по шагам, как построить правильный шаблон.
[a-zA-Z0-9_.-]. Обратите внимание, что внутри квадратных скобок точку и дефис можно не экранировать (если дефис стоит в начале или конце), но для надежности и лучшей читаемости их часто экранируют обратным слэшем: [a-zA-Z0-9_\\.\\-].
[a-zA-Z0-9.-].
[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С:
\w, если вам нужна проверка исключительно на латиницу. Его поведение зависит от локали и может привести к непредсказуемым результатам.[a-zA-Z0-9_] всегда надежнее и однозначнее, чем \w, когда речь идет о строгом контроле набора символов.XDTOПроверкаXML. Это стандартный и удобный механизм платформы 1С для работы с регулярными выражениями. Метод Проверить() возвращает булево значение, что идеально подходит для условий.Следуя этим простым рекомендациям, вы сможете создавать надежные и предсказуемые механизмы валидации данных в ваших конфигурациях 1С.