В повседневной работе пользователи часто сталкиваются с необходимостью быстро найти контрагента или партнера не только по наименованию, но и по номеру телефона, адресу электронной почты или ИНН. Стандартный поиск в заголовке списка 1С не всегда «подхватывает» данные из подчиненных таблиц контактной информации. В этой статье мы разберем несколько профессиональных методов реализации универсального поиска, от простых настроек без программирования до создания оптимизированных механизмов индексации.
Прежде чем приступать к написанию кода, проанализируем возможности платформы, доступные рядовому пользователю. Если задача стоит разово или для ограниченного круга лиц, можно воспользоваться механизмом настройки динамического списка.
Разберем по шагам, как это сделать:
Партнеры откройте меню «Еще» (или «Все действия») и выберите пункт «Настроить список».Однако, как справедливо замечено в обсуждении, для массового пользователя этот путь слишком сложен. Им нужно одно поле ввода, которое «понимает всё».
Рассмотрим более продвинутый метод, который требует вмешательства программиста. Суть заключается в модификации текста запроса, на котором строится список партнеров. По умолчанию поиск в списке работает эффективно только по тем полям, которые присутствуют в выборке запроса.
Проанализируем ситуацию: контактная информация хранится в отдельной табличной части или регистре сведений. Чтобы поиск срабатывал, нам нужно присоединить эти данные к основной выборке. Выполним следующие действия:
В конструкторе запроса динамического списка добавим ЛЕВОЕ СОЕДИНЕНИЕ со справочником (или регистром) КонтактнаяИнформация. При этом важно учитывать, что у одного партнера может быть несколько телефонов. Чтобы избежать дублирования строк в списке, мы можем использовать группировку или выбрать только определенные виды контактов.
Пример кода для программного изменения запроса:
ТекстЗапроса =
"ВЫБРАТЬ
| СправочникПартнеры.Ссылка КАК Ссылка,
| СправочникПартнеры.Наименование КАК Наименование,
| СправочникПартнеры.ИНН КАК ИНН,
| ЕСТЬNULL(ПартнерыТелефоны.Представление, """") КАК Телефон
|ИЗ
| Справочник.Партнеры КАК СправочникПартнеры
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыТелефоны
| ПО СправочникПартнеры.Ссылка = ПартнерыТелефоны.Ссылка
| И ПартнерыТелефоны.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)";
После изменения запроса не забудьте зайти в свойства динамического списка и в параметре «Поля поиска» отметить новое поле Телефон. Теперь при вводе цифр в стандартную строку поиска система будет фильтровать список и по этому полю.
Если база данных большая, обычные соединения в запросах могут замедлить работу формы. В этом случае на помощь приходит механизм полнотекстового поиска 1С. Он работает по принципу поисковых систем: индексирует данные и выдает результат практически мгновенно.
Выясним причину, почему ППС может не работать «из коробки»:
Партнеры должно быть включено свойство «Использовать полнотекстовый поиск».ОбновлениеИндексаПолнотекстовогоПоиска запущено и выполняется каждые несколько минут.Программно вызвать окно полнотекстового поиска можно командой ПолнотекстовыйПоиск.СоздатьСписок(). Это позволит найти ссылки на объекты, которые затем можно наложить как отбор на текущий список.
В крупных высоконагруженных системах часто применяют метод создания денормализованного поля. Рассмотрим этот способ подробнее. Мы создаем у справочника Партнеры скрытый строковый реквизит неограниченной длины, назовем его СтрокаПоиска.
Суть метода заключается в том, что при записи объекта мы программно собираем в эту строку все значимые данные:
Процедура ПередЗаписью(Отказ)
// Собираем данные для быстрого поиска
ТекстДляИндекса = Строка(Наименование) + " " + Строка(ИНН) + " " + Строка(НаименованиеПолное);
Для Каждого СтрКИ Из КонтактнаяИнформация Цикл
ТекстДляИндекса = ТекстДляИндекса + " " + СтрКИ.Представление;
КонецЦикла;
// Очищаем от лишних символов и записываем в реквизит
СтрокаПоиска = ТекстДляИндекса;
КонецПроцедуры
Теперь в форме списка достаточно добавить поиск только по одному этому полю. Система будет искать совпадение в одной строке, не обращаясь к подчиненным таблицам, что колоссально экономит ресурсы сервера и ускоряет отклик интерфейса для пользователя.
Разберем ситуацию, когда поиск по телефону не находит партнера из-за разного формата записи: кто-то пишет +7 (999)..., а кто-то 8999.... Для решения этой проблемы рекомендуется использовать «нормализацию».
Проанализируем алгоритм: при вводе поискового запроса мы должны программно очистить его от скобок, пробелов и тире, оставив только цифры. В последних версиях БСП (Библиотека стандартных подсистем) существуют готовые функции для работы с номерами телефонов. Мы рекомендуем использовать функцию ОбщегоНазначения.ТолькоЦифры() для подготовки данных перед наложением фильтра.
В современных конфигурациях (УТ 11, ERP 2.5) реализован глобальный поиск (верхняя панель). Если клиент хочет видеть результаты именно в форме списка, можно перехватить событие изменения строки поиска и программно перенаправить запрос в механизм глобального поиска, получив массив ссылок и установив отбор Список.Отбор.Элементы с видом сравнения В Списке.
Важный момент: Если ваша конфигурация находится на поддержке, используйте Расширения. Вы можете добавить процедуру-обработчик &После("ПриСозданииНаСервере") для формы списка, где программно добавите необходимые колонки и настроите связи параметров компоновки данных. Это позволит сохранить возможность легкого обновления программы.
Подводя итог, выбор метода зависит от объема базы и требований к скорости. Для небольших баз достаточно изменения запроса динамического списка. Для крупных систем оптимальным решением станет создание отдельного индексированного реквизита или использование полнотекстового поиска.