Как найти физических лиц по логину, который является частью адреса электронной почты в 1С?

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

Зачастую при интеграции 1С со сторонними системами возникает задача поиска данных по неполному совпадению строк. В данной статье мы разберем, как эффективно найти физических лиц, если у нас есть список логинов, а в базе эти логины представлены как часть адреса электронной почты в формате логин@mail.ru.

Вариант 1: Использование временных таблиц и оператора ПОДОБНО

Если задача разовая или объем данных невелик, мы можем воспользоваться механизмом временных таблиц. Суть метода заключается в подготовке данных перед выполнением основного запроса. Мы берем массив логинов, добавляем к ним шаблон поиска @% и используем оператор ПОДОБНО для фильтрации.

Рассмотрим пошаговую реализацию:

  1. Выгружаем логины из табличной части в таблицу значений.
  2. Дополняем каждый логин маской для поиска.
  3. Передаем таблицу в запрос как временную.
  4. Выполняем соединение с таблицей контактной информации.

ТЗ = Объект.Пользователи.Выгрузить(, "Логин");
Для Каждого Стр Из ТЗ Цикл
    Стр.Логин = Стр.Логин + "@%";
КонецЦикла;

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    ТЗ.Логин КАК Логин
    |ПОМЕСТИТЬ ВТ
    |ИЗ
    |    &ТЗ КАК ТЗ
    |;
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    КИ.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник.ФизическиеЛица.КонтактнаяИнформация КАК КИ
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ
    |        ПО (КИ.ЭлектроннаяПочта ПОДОБНО ВТ.Логин)";
Запрос.УстановитьПараметр("ТЗ", ТЗ);
Результат = Запрос.Выполнить().Выгрузить();

Важное примечание: При работе с ПОДОБНО помните, что поиск по шаблону, начинающемуся с символа подстановки (как в нашем случае), отключает использование индексов в SQL, что может привести к снижению производительности при большом количестве записей.

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

Если вы не хотите создавать временные таблицы, можно попытаться «вырезать» логин из адреса почты прямо внутри запроса. Для этого мы используем комбинацию функций ЛЕВ и СТРНАЙТИ.

Метод заключается в поиске позиции символа @ и извлечении подстроки до него:


ВЫБРАТЬ
    КИ.Ссылка
ИЗ
    Справочник.ФизическиеЛица.КонтактнаяИнформация КАК КИ
ГДЕ
    ВЫРАЗИТЬ(ЛЕВ(КИ.ЭлектроннаяПочта, СТРНАЙТИ(КИ.ЭлектроннаяПочта, "@") - 1) КАК СТРОКА(40)) В (&МассивЛогинов)

Этот способ позволяет использовать оператор В (IN), который работает значительно быстрее, чем ПОДОБНО, так как позволяет базе данных эффективно искать по проиндексированным полям (хотя вычисление функции над полем в условии ГДЕ все равно является ресурсоемкой операцией).

Вариант 3: Архитектурно правильный подход — отдельный вид контактной информации

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

Рассмотрим преимущества этого метода:

Пример кода при использовании нового вида контактной информации «Логин»:


ВЫБРАТЬ
    КИ.Ссылка
ИЗ
    Справочник.ФизическиеЛица.КонтактнаяИнформация КАК КИ
ГДЕ
    КИ.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.Логин)
    И КИ.Значение В (&МассивЛогинов)

Заключение и рекомендации

Мы проанализировали несколько способов решения задачи. Резюмируя:

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

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

← На главную