Как проверить корректность email-адреса в 1С с помощью регулярных выражений и БСП

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

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

Вариант 1: Использование регулярных выражений через COM-объект

Если ваша конфигурация не использует БСП или вам нужно быстро внедрить проверку в старую систему на обычных формах, можно воспользоваться механизмом VBScript.RegExp. Этот объект позволяет проверять текстовые строки на соответствие заданному шаблону.

Рассмотрим пример кода, который можно разместить в обработчике события ОкончаниеВводаТекста или ПриИзменении поля ввода. В данном случае мы будем использовать шаблон, который ограничивает ввод только латинскими символами, цифрами и допустимыми спецсимволами.


Процедура ЭлектроннаяПочтаПриИзменении(Элемент)
    ТекстДляПроверки = Элемент.Значение;
    
    // Создаем объект для работы с регулярными выражениями
    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.MultiLine = Ложь;
    RegExp.Global = Истина;
    RegExp.IgnoreCase = Истина;
    
    // Устанавливаем шаблон (Pattern)
    // Данный шаблон проверяет структуру: логин@домен.зона
    RegExp.Pattern = "^[a-zA-Z0-9_'+*/^&=?~{}\-](\.?[a-zA-Z0-9_'+*/^&=?~{}\-])*\@((\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(\:\d{1,3})?)||(((([a-zA-Z0-9][a-zA-Z0-9\-]+[a-zA-Z0-9])|([a-zA-Z0-9]{1,2}))[\.]{1})+([a-zA-Z]{2,6})))$";
    
    Если НЕ RegExp.Test(ТекстДляПроверки) Тогда
        Сообщить("Введенный email " + ТекстДляПроверки + " некорректен! Проверьте формат записи.");
        // Можно очистить значение или заблокировать дальнейшие действия
        // Элемент.Значение = "";
    КонецЕсли;
КонецПроцедуры

Проанализируем используемый шаблон. Символы ^ и $ обозначают начало и конец строки соответственно, что гарантирует проверку всей строки целиком, а не ее части. Конструкция [a-zA-Z0-9...] описывает разрешенный набор символов для локальной части адреса. Однако стоит помнить, что регулярные выражения часто являются компромиссом между строгостью и гибкостью.

Вариант 2: Использование встроенных функций платформы (8.3.16+)

В современных версиях платформы 1С (начиная с 8.3.16) появилась возможность работать с регулярными выражениями напрямую, без использования COM-объектов. Это делает код кроссплатформенным и более производительным, что критично для работы на серверах под управлением Linux.

Разберем, как реализовать ту же проверку с помощью функции СтрПодобна или СтрНайтиПоРегулярномуВыражению. Посмотрим на пример функции, которую можно вызвать из любого модуля:


Функция АдресПочтыКорректен(Знач ТекстАдреса) Экспорт
    // Шаблон для упрощенной проверки формата
    Шаблон = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";
    
    // Используем встроенную функцию платформы
    Результат = СтрНайтиПоРегулярномуВыражению(ТекстАдреса, Шаблон);
    
    Возврат ЗначениеЗаполнено(Результат);
КонецФункции

Использование СтрНайтиПоРегулярномуВыражению позволяет избежать зависимости от системных библиотек Windows, что является стандартом для современной разработки.

Вариант 3: Использование функций Библиотеки стандартных подсистем (БСП)

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

Выясним, какую функцию использовать. В составе БСП есть общий модуль РаботаСАдресами (в некоторых версиях может называться иначе, например, связанный с проверкой контактной информации). Основной метод, который нам нужен — АдресЭлектроннойПочтыСоответствуетТребованиям.

Рассмотрим пример использования:


// Пример вызова в типовой конфигурации
Если НЕ РаботаСАдресами.АдресЭлектроннойПочтыСоответствуетТребованиям(Объект.Email) Тогда
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Пожалуйста, введите корректный адрес электронной почты.");
КонецЕсли;

Преимущества метода БСП:

  1. Поддержка стандартов: Регулярные выражения внутри БСП гораздо сложнее и полнее тех, что обычно пишутся вручную.
  2. Обновляемость: При выходе новых версий БСП логика проверки актуализируется под новые требования почтовых сервисов.
  3. Обработка спецсимволов: Функция корректно обрабатывает пробелы, точки в начале/конце и другие нюансы, которые часто пропускают самописные скрипты.

Проблема кириллических доменов и .рф

Важно помнить, что если ваша задача подразумевает поддержку адресов типа инфо@почта.рф, обычные "латинские" регулярные выражения не справятся. Для работы с ними необходимо либо расширять диапазон допустимых символов до [а-яА-Я], либо использовать предварительную конвертацию домена в Punycode (формат xn--...).

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

Рекомендации по реализации

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

  1. Для типовых конфигураций (УТ 11, ERP, БП 3.0): Всегда используйте РаботаСАдресами.АдресЭлектроннойПочтыСоответствуетТребованиям(). Это "золотой стандарт" разработки.
  2. Для самописных систем на новых версиях платформы: Используйте встроенный механизм СтрНайтиПоРегулярномуВыражению.
  3. Для поддержки старых систем (1С 7.7 или 8.2/8.3 без БСП): Используйте VBScript.RegExp, но тщательно тестируйте шаблон на граничных случаях (например, на адресах с дефисами или короткими доменными зонами).

Помните, что никакая регулярная проверка не гарантирует существования почтового ящика. Максимальная надежность достигается только путем отправки тестового письма с подтверждением, но для первичной фильтрации опечаток описанные выше методы подходят идеально.

← На главную