Как написать обработку для проверки корректности email-адресов контрагентов в 1С?

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

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

Выясняем причину: почему скопированный код «не работает»?

Проанализируем ситуацию, описанную в сообщениях форума. Автор скопировал сложную функцию РазобратьСтрокуСПочтовымиАдресами во внешнюю обработку и назначил её выполнение прямо на кнопку формы. В результате ничего не произошло. Почему так получилось?

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

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

Наконец, копировать код стандартных функций БСП во внешние обработки — это плохая практика. Если функция уже есть в общем модуле вашей конфигурации (например, в ОбщегоНазначенияКлиентСервер), её следует вызывать напрямую. Это гарантирует стабильность работы при обновлениях конфигурации.

Где и как хранятся email-адреса в 1С?

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

Каждая запись контактной информации имеет тип, определяемый перечислением ТипыКонтактнойИнформации.АдресЭлектроннойПочты. Чтобы получить список адресов для проверки, мы напишем запрос именно к этой табличной части.

Шаг 1. Создание интерфейса внешней обработки

Создадим новую внешнюю обработку в конфигураторе и добавим форму. Нам потребуется:

  1. Команда формы (кнопка) с именем ВыполнитьПроверку.
  2. Кнопку необходимо вынести на рабочую панель формы.
  3. Для отображения результатов можно использовать стандартное окно сообщений или создать на форме таблицу значений с колонками "Контрагент", "Некорректный Email" и "Описание ошибки". В нашем примере для простоты мы будем выводить ошибки в стандартный лог сообщений.

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


&НаКлиенте
Процедура ВыполнитьПроверку(Команда)
    
    ОчиститьСообщения();
    ПоказатьПредупреждение(, "Начинается проверка email-адресов. Пожалуйста, подождите...");
    
    ПроверитьАдресаНаСервере();
    
КонецПроцедуры

Шаг 2. Написание серверной логики проверки через БСП

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

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


&НаСервере
Процедура ПроверитьАдресаНаСервере()
    
    // 1. Выбираем контрагентов и их email-адреса из табличной части контактной информации
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	КонтрагентыКонтактнаяИнформация.Ссылка КАК Контрагент,
        |	КонтрагентыКонтактнаяИнформация.Представление КАК Email
        |ИЗ
        |	Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
        |ГДЕ
        |	КонтрагентыКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)
        |	И КонтрагентыКонтактнаяИнформация.Представление <> """"";
    
    РезультатЗапроса = Запрос.Выполнить();
    
    Если РезультатЗапроса.Пустой() Тогда
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("В базе данных не найдено заполненных email-адресов контрагентов.");
        Возврат;
    КонецЕсли;
    
    Выборка = РезультатЗапроса.Выбрать();
    ОшибокНайдено = 0;
    ПровереноАдресов = 0;
    
    // 2. Обходим результаты в цикле и выполняем валидацию
    Пока Выборка.Следующий() Цикл
        
        ТекущийАдрес = СокрЛП(Выборка.Email);
        ПровереноАдресов = ПровереноАдресов + 1;
        
        // Вызываем готовую функцию БСП напрямую из общего модуля
        РезультатАнализа = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(ТекущийАдрес, Ложь);
        
        // Проверяем статус разбора адреса
        Если НЕ РезультатАнализа.Статус Тогда
            ОшибокНайдено = ОшибокНайдено + 1;
            
            // Формируем текст ошибки и выводим пользователю
            ТекстОшибки = СтрШаблон("Контрагент: %1. Неверный формат email: '%2'. Причина: %3", 
                Выборка.Контрагент, 
                ТекущийАдрес, 
                РезультатАнализа.СообщениеОбОшибке);
                
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, Выборка.Контрагент);
        КонецЕсли;
        
    КонецЦикла;
    
    // Выводим финальный итог работы
    ИтогПроверки = СтрШаблон("Проверка завершена. Проверено адресов: %1. Найдено ошибок: %2.", ПровереноАдресов, ОшибокНайдено);
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ИтогПроверки);
    
КонецПроцедуры

Шаг 3. Альтернативный метод с использованием регулярных выражений (RegExp)

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

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

Вариант А. Для современных платформ 1С (начиная с версии 8.3.23)

В современных релизах платформы разработчикам доступна нативная работа с регулярными выражениями прямо "из коробки" с помощью функции СтрПодобнаПоРегулярномуВыражению. Этот метод работает на любых операционных системах (как Windows, так и Linux).

Рассмотрим пример функции валидации:


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

Вариант Б. Для старых платформ 1С (до версии 8.3.23)

Если ваша база работает на старой платформе, нативной поддержки регулярных выражений в ней нет. Но мы можем решить эту задачу на серверах под управлением ОС Windows с помощью COM-объекта VBScript.RegExp. Разберем этот код:


&НаСервере
Функция EmailСоответствуетШаблонуРегЭксп(Знач ПроверяемыйEmail) Экспорт
    
    Попытка
        RegExp = Новый COMОбъект("VBScript.RegExp");
    Исключение
        // Обработка ситуации, если сервер работает под Linux и COM-объект недоступен
        ЗаписьЖурналаРегистрации("ПроверкаEmail", УровеньЖурналаРегистрации.Ошибка,,, 
            "Не удалось создать COM-объект VBScript.RegExp. Проверка невозможна.");
        Возврат Истина; // Пропускаем проверку, чтобы не блокировать процесс
    КонецПопытки;
    
    RegExp.IgnoreCase = Истина; // Игнорировать регистр букв
    RegExp.Global = Ложь;
    RegExp.Pattern = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";
    
    Возврат RegExp.Test(ПроверяемыйEmail);
    
КонецФункции

Этот вспомогательный метод вы можете легко интегрировать в цикл обхода контрагентов вместо вызова стандартного метода БСП.

Важное предупреждение: синтаксис против реального существования

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

Это означает, что программа проверяет только соответствие строки формальным правилам написания почтовых ящиков (наличие одной «собачки» @, допустимых букв, точек в доменном имени, отсутствие пробелов и запрещенных символов вроде !#$%).

Однако синтаксическая проверка не может определить:

Если вашей компании требуется стопроцентная очистка базы от "мертвых" и несуществующих адресов, синтаксической проверки будет недостаточно. В таких сценариях мы рекомендуем использовать интеграцию вашей 1С со специализированными внешними веб-сервисами валидации по API (через HTTP-запросы) или отправлять проверочное письмо с уникальной ссылкой для подтверждения контактных данных.

← На главную