Как правильно настроить проверку корректности e-mail в 1С с помощью регулярных выражений и стандартных функций?

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

При вводе контактной информации контрагентов пользователи часто совершают случайные ошибки: забывают ввести символ «@», ставят точку в самом конце адреса, допускают опечатки в доменной части или случайно добавляют лишние пробелы. Для борьбы с этой проблемой разработчики часто прибегают к валидации данных. Давайте подробно разберем, как решить задачу ограничения «косорукости» ввода e-mail в 1С, проанализируем популярные регулярные выражения из обсуждения на форуме, выявим их скрытые угрозы и рассмотрим наиболее современные и надежные инструменты платформы.

Анализ решений на основе регулярных выражений (RegExp)

На форумах часто предлагают использовать собственные регулярные выражения. Рассмотрим шаблон, к которому пришел автор темы в процессе обсуждения:

^[^а-я]+@[^а-я]+\.[^а-я\._'+;*^&=?~{}\-\.\/,\\]+$

Проанализируем этот шаблон по шагам, чтобы понять его логику и выявить слабые стороны:

  1. Исключение кириллицы: Конструкция [^а-я] пытается запретить ввод русских букв в адресе почты.
  2. Наличие разделителя: Символ @ жестко зафиксирован в середине выражения.
  3. Наличие точки в доменной части: Символ \. проверяет, что после «собаки» есть точка, разделяющая домен.
  4. Ограничение на спецсимволы в конце строки: Последняя группа [^а-я\._'+;*^&=?~{}\-\.\/,\\]+ запрещает завершать почтовый адрес точкой, слэшем, подчеркиванием или другими служебными знаками.

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

Критический недостаток: проблема кириллических адресов (IDN и EAI)

Использование конструкции [^а-я] для полной блокировки кириллицы в современных реалиях бизнеса — это грубая ошибка. Согласно международным стандартам IDN (Internationalized Domain Names) и EAI (Email Address Internationalization, стандарты RFC 6530 и более новые), почтовые ящики и домены на национальных алфавитах официально существуют и активно используются.

Адреса вида иван@почта.рф или отдел-продаж@компания.бел абсолютно валидны. Если применить шаблон автора темы на «боевой» базе, менеджеры физически не смогут ввести контакты клиентов, использующих русскоязычные домены. Система выдаст ошибку, и компания потеряет потенциальные лиды.

Скрытая угроза безопасности: уязвимость ReDoS

Составление сложных «самописных» регулярных выражений с избыточным использованием вложенных квантификаторов (например, знаков * или + внутри других групп, как показано в сообщении №13 форума) несет в себе скрытую угрозу безопасности системы.

При попытке проверить специально подготовленную некорректную строку длинный шаблон может вызвать так называемый катастрофический возврат (catastrophic backtracking). В этот момент движок регулярных выражений начнет перебирать миллионы комбинаций символов, зависнет и загрузит процессор сервера 1С на 100%. Это приведет к отказу в обслуживании (ReDoS-атаке) и парализует работу всех остальных пользователей базы.

Универсальный стандарт валидации (HTML5)

Написать регулярное выражение, на 100% соответствующее официальному стандарту RFC 5322, практически невозможно (оно получается длиной в несколько тысяч символов и разрешает крайне редкие и странные конструкции, например, комментарии в круглых скобках внутри адреса).

Консорциум W3C в стандарте HTML5 для валидации полей ввода пошел по пути практичности и компромисса. Они предлагают лаконичный шаблон, который покрывает 99.9% реальных адресов, запрещает пробелы, двойные точки и точки на концах:


^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$

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

Нативная поддержка регулярных выражений в 1С (Платформа 8.3.23+)

В старых версиях платформы 1С проверка e-mail через регулярные выражения обычно выполнялась через COM-объект VBScript.RegExp. У этого подхода есть огромный минус — он работает исключительно под операционной системой Windows. Если сервер 1С работает под управлением Linux (что сегодня является стандартом для крупных корпоративных баз), такой код вызовет аварийное завершение работы системы.

В современных версиях платформы 1С:Предприятие (начиная с версии 8.3.23) появилась встроенная кроссплатформенная поддержка регулярных выражений на базе стандарта ICU. Теперь мы можем использовать функции СтрНайтиПоРегулярномуВыражению и СтрЗаменитьПоРегулярномуВыражению как на Windows, так и на Linux.

Давайте посмотрим на пример реализации проверки адреса e-mail с помощью нативных механизмов платформы:


&НаКлиенте
Функция АдресПочтыКорректен(Знач ПроверяемыйАдрес) Экспорт
    
    // Используем проверенный шаблон HTML5
    Шаблон = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$";
    
    ПозицияСовпадения = СтрНайтиПоРегулярномуВыражению(ПроверяемыйАдрес, Шаблон);
    
    // Если функция вернула значение больше 0, значит адрес соответствует шаблону
    Возврат ПозицияСовпадения > 0;
    
КонецФункции

Лучшее решение: Готовые механизмы БСП

Если ваша конфигурация построена на базе БСП (Библиотека стандартных подсистем), вам вообще нет необходимости самостоятельно писать регулярные выражения и «изобретать велосипед». Разработчики фирмы 1С уже реализовали надежные, протестированные и регулярно обновляемые методы валидации.

Для проверки корректности одного e-mail адреса используйте готовую функцию из общего модуля БСП:


&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    
    АдресДляПроверки = ТекущийОбъект.Email;
    
    Если ЗначениеЗаполнено(АдресДляПроверки) Тогда
        // Функция проверяет соответствие RFC стандартам, включая поддержку кириллических адресов
        Если Не ОбщегоНазначенияКлиентСервер.АдресЭлектроннойПочтыСоответствуетТребованиям(АдресДляПроверки, Ложь) Тогда
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
                "Введен некорректный адрес электронной почты!",
                ЭтотОбъект,
                "Объект.Email",
                ,
                Отказ
            );
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Давайте разберем параметры функции АдресЭлектроннойПочтыСоответствуетТребованиям:

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


&НаСервере
Процедура ПроверитьСписокАдресов(СтрокаСАдресами)
    
    // Функция разбивает строку на массив структур с детальной информацией по каждому адресу
    МассивАдресов = ОбщегоНазначенияКлиентСервер.АдресаЭлектроннойПочтыИзСтроки(СтрокаСАдресами);
    
    Для Каждого СведенияОбАдресе Из МассивАдресов Цикл
        Если Не СведенияОбАдресе.ДоменСодержитТочку Или Не ЗначениеЗаполнено(СведенияОбАдресе.Адрес) Тогда
            ВызватьИсключение "Один из введенных адресов некорректен: " + СведенияОбАдресе.Адрес;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Подведем итоги: пошаговый план разработки

При решении задачи валидации e-mail в 1С придерживайтесь следующих правил:

  1. Используйте БСП в первую очередь. Если в вашей конфигурации есть Библиотека стандартных подсистем, всегда вызывайте функцию ОбщегоНазначенияКлиентСервер.АдресЭлектроннойПочтыСоответствуетТребованиям. Она поддерживается разработчиками 1С, корректно обрабатывает международные кириллические домены и регулярно обновляется при изменении стандартов.
  2. Избегайте самописных сложных регулярных выражений. Не пытайтесь составить «идеальный» шаблон вручную — высок риск заблокировать корректные адреса (например, с дефисами, редкими доменами верхнего уровня или кириллицей) или создать уязвимость для зависания сервера (ReDoS).
  3. Применяйте нативный RegExp для нестандартных условий. Если вы работаете на платформе версии 8.3.23 и выше и вам требуется специфическая логика проверки, используйте встроенную функцию СтрНайтиПоРегулярномуВыражению с шаблоном HTML5. Это гарантирует стабильную кроссплатформенную работу вашего кода как под Windows, так и под Linux.
  4. Не забывайте про бизнес-логику. Помните, что ни одно регулярное выражение не гарантирует, что указанный почтовый ящик реально существует. Если критически важно подтвердить подлинность контакта, используйте отправку проверочного письма с кодом подтверждения.
← На главную