При работе в современных конфигурациях на базе 1С:Предприятие 8.3, таких как Управление торговлей 11, пользователи часто сталкиваются с проблемой: поиск по фрагменту номера телефона (например, по последним 4 цифрам) не дает результатов, в то время как поиск по e-mail или полному номеру работает корректно. В этой статье мы разберем причины такого поведения системы и предложим несколько вариантов решения этой задачи, включая программную доработку.
Для начала проанализируем, как работает встроенный полнотекстовый поиск 1С. Основная особенность ПП заключается в том, что он работает со словами (токенами), а не с произвольными наборами символов. Рассмотрим ключевые нюансы:
+7 (900) 123-45-67). ПП индексирует это либо как одно целое «слово», либо разбивает по спецсимволам.* (астериск), например, 8911*. Однако поиск по части слова в середине или в конце (например, *4567) стандартными средствами ПП не поддерживается.Если стандартный полнотекстовый поиск не справляется, мы можем дополнить типовой механизм поиска собственным запросом к таблице контактной информации. Рассмотрим пример реализации, который можно внедрить в процедуру поиска партнеров. Проанализируем ситуацию, когда нам нужно найти ссылку на партнера, зная лишь часть его телефона.
Для этого мы обратимся к табличной части КонтактнаяИнформация справочника Партнеры. Ниже представлен пример кода, который выполняет поиск по представлению телефона:
// Очищаем текущий список найденных партнеров
СписокПартнеров.Очистить();
ЗапросПоиска = Новый Запрос;
ЗапросПоиска.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПартнерыКонтактнаяИнформация.Ссылка КАК Ссылка,
| ПартнерыКонтактнаяИнформация.Представление КАК Представление
|ИЗ
| Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация
|ГДЕ
| ПартнерыКонтактнаяИнформация.Представление ПОДОБНО &Представление
| И ПартнерыКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)";
// Добавляем проценты для поиска подстроки в любом месте
ЗапросПоиска.УстановитьПараметр("Представление", "%" + СтрокаПоиска + "%");
ВыборкаПоиска = ЗапросПоиска.Выполнить().Выбрать();
Пока ВыборкаПоиска.Следующий() Цикл
// Логика добавления найденного партнера в форму поиска
ОснованиеПоиска = "Найдено по номеру: " + ВыборкаПоиска.Представление;
ДобавитьПартнераВСписок(СписокПартнеров, ВыборкаПоиска.Ссылка, ОснованиеПоиска);
КонецЦикла;
Важный момент: Использование оператора ПОДОБНО с процентом в начале (%Текст) заставляет SQL-сервер выполнять полное сканирование таблицы (Full Table Scan), что может замедлить работу системы при огромном количестве контрагентов. Рассмотрим способы оптимизации далее.
Чтобы поиск работал быстрее и точнее, разберем рекомендации по работе с данными контактной информации:
НомерТелефона. В нем хранятся только цифры, без скобок, пробелов и тире. Поиск по этому полю гораздо надежнее.79001112233, даже если пользователь ввел +7 (900) 111-22-33.СтрокаПоиска + "%" (без процента в начале). В этом случае SQL сможет использовать индекс, и поиск будет мгновенным.Пример функции для очистки номера перед поиском:
Функция ОчиститьНомерОтСимволов(Знач ИсходныйНомер)
Результат = "";
ДопустимыеСимволы = "0123456789";
Для Индекс = 1 По СтрДлина(ИсходныйНомер) Цикл
Символ = Сред(ИсходныйНомер, Индекс, 1);
Если Найти(ДопустимыеСимволы, Символ) > 0 Тогда
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Разберем более профессиональный подход. В конфигурациях, использующих БСП (УТ 11, КА 2, ERP), рекомендуется использовать программный интерфейс общего модуля УправлениеКонтактнойИнформацией. Это позволяет не «изобретать велосипед» и учитывать все особенности хранения данных.
Рассмотрим использование метода для поиска объектов по контактной информации. Вместо прямого запроса к табличной части мы можем вызвать функции, которые автоматически учитывают нормализацию номеров и различные типы КИ. Это гарантирует, что ваша доработка не «сломается» после очередного обновления конфигурации.
Чтобы сохранить возможность беспрепятственного обновления 1С:Управление торговлей, проанализируем способ внедрения через расширения. Мы рекомендуем:
ПриИзменении поля поиска).&После или &Вместо, чтобы добавить свою логику поиска по фрагменту телефона к стандартному механизму.Резюме: Если вам требуется качественный поиск по части номера телефона, не полагайтесь только на полнотекстовый поиск. Комбинируйте его с прямыми запросами к таблице контактной информации, обязательно предварительно нормализуя поисковую строку. Это обеспечит пользователям комфортную работу и высокую скорость нахождения нужных данных.