Как реализовать поиск партнера по части номера телефона в 1С:Управление торговлей 11

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

При работе в современных конфигурациях на базе 1С:Предприятие 8.3, таких как Управление торговлей 11, пользователи часто сталкиваются с проблемой: поиск по фрагменту номера телефона (например, по последним 4 цифрам) не дает результатов, в то время как поиск по e-mail или полному номеру работает корректно. В этой статье мы разберем причины такого поведения системы и предложим несколько вариантов решения этой задачи, включая программную доработку.

Выясним причину: почему полнотекстовый поиск (ПП) игнорирует части номеров

Для начала проанализируем, как работает встроенный полнотекстовый поиск 1С. Основная особенность ПП заключается в том, что он работает со словами (токенами), а не с произвольными наборами символов. Рассмотрим ключевые нюансы:

  1. Токенизация: Телефонный номер в базе часто хранится как одна длинная строка цифр или строка с форматированием (например, +7 (900) 123-45-67). ПП индексирует это либо как одно целое «слово», либо разбивает по спецсимволам.
  2. Поиск по префиксу: Полнотекстовый поиск в 1С поддерживает поиск по началу слова при использовании символа * (астериск), например, 8911*. Однако поиск по части слова в середине или в конце (например, *4567) стандартными средствами ПП не поддерживается.
  3. Отличие от e-mail: Адреса электронной почты содержат разделители (точки, знаки @), которые ПП воспринимает как границы слов. Именно поэтому поиск по части e-mail (до собаки) часто отрабатывает успешно, а поиск по части телефона — нет.

Решение 1: Программный поиск через оператор ПОДОБНО

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

Для этого мы обратимся к табличной части КонтактнаяИнформация справочника Партнеры. Ниже представлен пример кода, который выполняет поиск по представлению телефона:


// Очищаем текущий список найденных партнеров
СписокПартнеров.Очистить();

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

// Добавляем проценты для поиска подстроки в любом месте
ЗапросПоиска.УстановитьПараметр("Представление", "%" + СтрокаПоиска + "%");

ВыборкаПоиска = ЗапросПоиска.Выполнить().Выбрать();

Пока ВыборкаПоиска.Следующий() Цикл
    // Логика добавления найденного партнера в форму поиска
    ОснованиеПоиска = "Найдено по номеру: " + ВыборкаПоиска.Представление;
    ДобавитьПартнераВСписок(СписокПартнеров, ВыборкаПоиска.Ссылка, ОснованиеПоиска);
КонецЦикла;

Важный момент: Использование оператора ПОДОБНО с процентом в начале (%Текст) заставляет SQL-сервер выполнять полное сканирование таблицы (Full Table Scan), что может замедлить работу системы при огромном количестве контрагентов. Рассмотрим способы оптимизации далее.

Решение 2: Оптимизация поиска по цифрам

Чтобы поиск работал быстрее и точнее, разберем рекомендации по работе с данными контактной информации:

  1. Нормализация номера: В современных версиях конфигураций БСП (Библиотека стандартных подсистем) в таблице контактной информации есть поле НомерТелефона. В нем хранятся только цифры, без скобок, пробелов и тире. Поиск по этому полю гораздо надежнее.
  2. Очистка строки поиска: Перед выполнением запроса крайне желательно программно удалить из введенной пользователем строки все нецифровые символы. Это позволит найти 79001112233, даже если пользователь ввел +7 (900) 111-22-33.
  3. Индекс и поиск по префиксу: Если вы ищете только по началу номера, используйте конструкцию СтрокаПоиска + "%" (без процента в начале). В этом случае SQL сможет использовать индекс, и поиск будет мгновенным.

Пример функции для очистки номера перед поиском:


Функция ОчиститьНомерОтСимволов(Знач ИсходныйНомер)
    Результат = "";
    ДопустимыеСимволы = "0123456789";
    Для Индекс = 1 По СтрДлина(ИсходныйНомер) Цикл
        Символ = Сред(ИсходныйНомер, Индекс, 1);
        Если Найти(ДопустимыеСимволы, Символ) > 0 Тогда
            Результат = Результат + Символ;
        КонецЕсли;
    КонецЦикла;
    Возврат Результат;
КонецФункции

Решение 3: Использование встроенных методов БСП

Разберем более профессиональный подход. В конфигурациях, использующих БСП (УТ 11, КА 2, ERP), рекомендуется использовать программный интерфейс общего модуля УправлениеКонтактнойИнформацией. Это позволяет не «изобретать велосипед» и учитывать все особенности хранения данных.

Рассмотрим использование метода для поиска объектов по контактной информации. Вместо прямого запроса к табличной части мы можем вызвать функции, которые автоматически учитывают нормализацию номеров и различные типы КИ. Это гарантирует, что ваша доработка не «сломается» после очередного обновления конфигурации.

Рекомендация по внедрению: Расширения конфигурации

Чтобы сохранить возможность беспрепятственного обновления 1С:Управление торговлей, проанализируем способ внедрения через расширения. Мы рекомендуем:

Резюме: Если вам требуется качественный поиск по части номера телефона, не полагайтесь только на полнотекстовый поиск. Комбинируйте его с прямыми запросами к таблице контактной информации, обязательно предварительно нормализуя поисковую строку. Это обеспечит пользователям комфортную работу и высокую скорость нахождения нужных данных.

← На главную