Как проверить правильность адреса электронной почты в СКД?

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

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

Причина ошибки при стандартном сравнении

Проанализируем частую ошибку начинающих разработчиков: попытку использования оператора равенства = вместе со спецсимволами шаблона (такими как % или *):


// Ошибочный вариант:
КонтрагентыКонтактнаяИнформация.Представление = "%@%"

В языке запросов 1С оператор = выполняет точное строковое сравнение, поэтому такое условие вернет только строки, где буквально записан текст %@%. Для сопоставления со спецсимволами шаблона необходимо использовать оператор ПОДОБНО.

Решение 1. Проверка адреса в запросе с помощью оператора ПОДОБНО

Рассмотрим, как отфильтровать адреса непосредственно в тексте запроса на уровне СУБД. Простейшая проверка на наличие символа «@» выглядит следующим образом:


ВЫБРАТЬ
    КонтрагентыКонтактнаяИнформация.Ссылка КАК Контрагент,
    КонтрагентыКонтактнаяИнформация.Представление КАК АдресЭП
ИЗ
    Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
ГДЕ
    КонтрагентыКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)
    И КонтрагентыКонтактнаяИнформация.Представление ПОДОБНО "%@%"

Однако простая проверка ПОДОБНО "%@%" пропускает заведомо некорректные строки, содержащие пробелы, дублирующиеся знаки «@» или адреса без доменной зоны. Разберем по шагам, как составить более строгое условие фильтрации:

  1. Проверка базовой структуры адреса: шаблон "_%@_%.__%" требует наличия минимум одного символа перед «@», минимум одного символа в имени домена и минимум двух символов в доменной зоне после точки.
  2. Исключение пробелов: условие И НЕ Представление ПОДОБНО "% %" отсекает строки со случайными пробелами внутри адреса.
  3. Исключение повторного символа @: условие И НЕ Представление ПОДОБНО "%@%@%" исключает строки с несколькими адресами или опечатками.

Посмотрим на пример комплексного условия в секции ГДЕ запроса:


ГДЕ
    КонтрагентыКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)
    И КонтрагентыКонтактнаяИнформация.Представление ПОДОБНО "_%@_%.__%"
    И НЕ КонтрагентыКонтактнаяИнформация.Представление ПОДОБНО "% %"
    И НЕ КонтрагентыКонтактнаяИнформация.Представление ПОДОБНО "%@%@%"

Решение 2. Проверка через вычисляемые поля СКД и функцию общего модуля

Язык запросов 1С не поддерживает регулярные выражения. Если требуется выполнить строгую валидацию по стандарту RFC или проверить корректность адреса сложными алгоритмами, подключим функцию общего модуля через вкладку «Вычисляемые поля» схемы компоновки данных.

Разберем по шагам порядок настройки:

  1. В общем модуле с установленным флажком «Сервер» (или «Клиент, сервер») создаем экспортную функцию проверки:
    
    Функция ПроверитьАдресЭП(Адрес) Экспорт
        Если ПустаяСтрока(Адрес) Тогда
            Возврат Ложь;
        КонецЕсли;
        
        // Простейший пример проверки без регулярных выражений:
        ПозицияСобаки = СтрНайти(Адрес, "@");
        Если ПозицияСобаки < 2 Или СтрНайти(Адрес, " ") > 0 Тогда
            Возврат Ложь;
        КонецЕсли;
        
        Возврат Истина;
    КонецФункции
    
  2. Открываем схему компоновки данных и переходим на вкладку «Вычисляемые поля».
  3. Добавляем новое поле ПочтаКорректна и в колонке «Выражение» прописываем вызов функции: ИмяОбщегоМодуля.ПроверитьАдресЭП(Представление)
  4. На вкладке «Настройки» в панели отборов добавляем условие: ПочтаКорректна Равно Истина (или Ложь, если требуется построить отчет по ошибкам заполнения базы).

Рекомендации по работе с контактной информацией

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

  1. Использование поля «АдресЭП»: в современных конфигурациях адрес электронной почты хранится не только в поле Представление, но и в отдельном реквизите АдресЭП, где данные очищены от лишнего форматирования. Рекомендуется строить отборы именно по этому полю.
  2. Проверка при вводе: чтобы избежать попадания некорректных адресов в отчеты, включите штатную проверку в справочнике Виды контактной информации, активировав признак «Запрещать ввод некорректных адресов» для соответствующего вида контактной информации.
  3. Производительность: фильтрация оператором ПОДОБНО в запросе выполняется СУБД, что обеспечивает высокую скорость. Вызовы функций через вычисляемые поля СКД происходят построчно в процессе постобработки, поэтому для больших объемов данных предпочтительнее использовать условия в запросе.
← На главную