Зачастую при интеграции 1С со сторонними системами возникает задача поиска данных по неполному совпадению строк. В данной статье мы разберем, как эффективно найти физических лиц, если у нас есть список логинов, а в базе эти логины представлены как часть адреса электронной почты в формате логин@mail.ru.
Если задача разовая или объем данных невелик, мы можем воспользоваться механизмом временных таблиц. Суть метода заключается в подготовке данных перед выполнением основного запроса. Мы берем массив логинов, добавляем к ним шаблон поиска @% и используем оператор ПОДОБНО для фильтрации.
Рассмотрим пошаговую реализацию:
ТЗ = Объект.Пользователи.Выгрузить(, "Логин");
Для Каждого Стр Из ТЗ Цикл
Стр.Логин = Стр.Логин + "@%";
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТЗ.Логин КАК Логин
|ПОМЕСТИТЬ ВТ
|ИЗ
| &ТЗ КАК ТЗ
|;
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| КИ.Ссылка КАК Ссылка
|ИЗ
| Справочник.ФизическиеЛица.КонтактнаяИнформация КАК КИ
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ
| ПО (КИ.ЭлектроннаяПочта ПОДОБНО ВТ.Логин)";
Запрос.УстановитьПараметр("ТЗ", ТЗ);
Результат = Запрос.Выполнить().Выгрузить();
Важное примечание: При работе с ПОДОБНО помните, что поиск по шаблону, начинающемуся с символа подстановки (как в нашем случае), отключает использование индексов в SQL, что может привести к снижению производительности при большом количестве записей.
Если вы не хотите создавать временные таблицы, можно попытаться «вырезать» логин из адреса почты прямо внутри запроса. Для этого мы используем комбинацию функций ЛЕВ и СТРНАЙТИ.
Метод заключается в поиске позиции символа @ и извлечении подстроки до него:
ВЫБРАТЬ
КИ.Ссылка
ИЗ
Справочник.ФизическиеЛица.КонтактнаяИнформация КАК КИ
ГДЕ
ВЫРАЗИТЬ(ЛЕВ(КИ.ЭлектроннаяПочта, СТРНАЙТИ(КИ.ЭлектроннаяПочта, "@") - 1) КАК СТРОКА(40)) В (&МассивЛогинов)
Этот способ позволяет использовать оператор В (IN), который работает значительно быстрее, чем ПОДОБНО, так как позволяет базе данных эффективно искать по проиндексированным полям (хотя вычисление функции над полем в условии ГДЕ все равно является ресурсоемкой операцией).
В профессиональной разработке 1С рекомендуется избегать сложных динамических вычислений в запросах. Если вам часто приходится искать сотрудников по логину, самый надежный способ — зафиксировать логин как отдельный Вид контактной информации.
Рассмотрим преимущества этого метода:
Значение с использованием обычного оператора равенства или оператора В. Индексы работают в полную силу.ФизическиеЛица.Пример кода при использовании нового вида контактной информации «Логин»:
ВЫБРАТЬ
КИ.Ссылка
ИЗ
Справочник.ФизическиеЛица.КонтактнаяИнформация КАК КИ
ГДЕ
КИ.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.Логин)
И КИ.Значение В (&МассивЛогинов)
Мы проанализировали несколько способов решения задачи. Резюмируя:
ПОДОБНО, но будьте осторожны с производительностью.ПОДОБНО с маской в начале строки.Всегда помните о том, что при передаче параметров в Запрос.УстановитьПараметр() платформа 1С берет на себя заботу о типах данных, поэтому массив логинов будет корректно преобразован в конструкцию IN для SQL-сервера, обеспечивая безопасность выполнения запроса.