Как реализовать поиск по всем реквизитам и контактной информации в справочнике Партнеры?

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

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

Метод 1. Использование стандартной настройки списка пользователем

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

Разберем по шагам, как это сделать:

  1. В форме списка справочника Партнеры откройте меню «Еще» (или «Все действия») и выберите пункт «Настроить список».
  2. Перейдите на вкладку «Отбор».
  3. В левой колонке доступных полей найдите и раскройте узел «Контактная информация».
  4. Выберите нужное поле (например, «Представление» или «Значение») и перетащите его в правую часть окна.
  5. Установите вид сравнения «Содержит». Теперь пользователь может вводить часть телефона или email прямо в окне настроек.

Однако, как справедливо замечено в обсуждении, для массового пользователя этот путь слишком сложен. Им нужно одно поле ввода, которое «понимает всё».

Метод 2. Изменение основного запроса динамического списка

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

Проанализируем ситуацию: контактная информация хранится в отдельной табличной части или регистре сведений. Чтобы поиск срабатывал, нам нужно присоединить эти данные к основной выборке. Выполним следующие действия:

В конструкторе запроса динамического списка добавим ЛЕВОЕ СОЕДИНЕНИЕ со справочником (или регистром) КонтактнаяИнформация. При этом важно учитывать, что у одного партнера может быть несколько телефонов. Чтобы избежать дублирования строк в списке, мы можем использовать группировку или выбрать только определенные виды контактов.

Пример кода для программного изменения запроса:


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

После изменения запроса не забудьте зайти в свойства динамического списка и в параметре «Поля поиска» отметить новое поле Телефон. Теперь при вводе цифр в стандартную строку поиска система будет фильтровать список и по этому полю.

Метод 3. Полнотекстовый поиск (ППС) — мощный и быстрый инструмент

Если база данных большая, обычные соединения в запросах могут замедлить работу формы. В этом случае на помощь приходит механизм полнотекстового поиска 1С. Он работает по принципу поисковых систем: индексирует данные и выдает результат практически мгновенно.

Выясним причину, почему ППС может не работать «из коробки»:

Программно вызвать окно полнотекстового поиска можно командой ПолнотекстовыйПоиск.СоздатьСписок(). Это позволит найти ссылки на объекты, которые затем можно наложить как отбор на текущий список.

Метод 4. Создание служебного реквизита для «супер-поиска»

В крупных высоконагруженных системах часто применяют метод создания денормализованного поля. Рассмотрим этот способ подробнее. Мы создаем у справочника Партнеры скрытый строковый реквизит неограниченной длины, назовем его СтрокаПоиска.

Суть метода заключается в том, что при записи объекта мы программно собираем в эту строку все значимые данные:


Процедура ПередЗаписью(Отказ)
    // Собираем данные для быстрого поиска
    ТекстДляИндекса = Строка(Наименование) + " " + Строка(ИНН) + " " + Строка(НаименованиеПолное);
    
    Для Каждого СтрКИ Из КонтактнаяИнформация Цикл
        ТекстДляИндекса = ТекстДляИндекса + " " + СтрКИ.Представление;
    КонецЦикла;
    
    // Очищаем от лишних символов и записываем в реквизит
    СтрокаПоиска = ТекстДляИндекса;
КонецПроцедуры

Теперь в форме списка достаточно добавить поиск только по одному этому полю. Система будет искать совпадение в одной строке, не обращаясь к подчиненным таблицам, что колоссально экономит ресурсы сервера и ускоряет отклик интерфейса для пользователя.

Метод 5. Особенности поиска по номеру телефона

Разберем ситуацию, когда поиск по телефону не находит партнера из-за разного формата записи: кто-то пишет +7 (999)..., а кто-то 8999.... Для решения этой проблемы рекомендуется использовать «нормализацию».

Проанализируем алгоритм: при вводе поискового запроса мы должны программно очистить его от скобок, пробелов и тире, оставив только цифры. В последних версиях БСП (Библиотека стандартных подсистем) существуют готовые функции для работы с номерами телефонов. Мы рекомендуем использовать функцию ОбщегоНазначения.ТолькоЦифры() для подготовки данных перед наложением фильтра.

Метод 6. Глобальный поиск и расширения

В современных конфигурациях (УТ 11, ERP 2.5) реализован глобальный поиск (верхняя панель). Если клиент хочет видеть результаты именно в форме списка, можно перехватить событие изменения строки поиска и программно перенаправить запрос в механизм глобального поиска, получив массив ссылок и установив отбор Список.Отбор.Элементы с видом сравнения В Списке.

Важный момент: Если ваша конфигурация находится на поддержке, используйте Расширения. Вы можете добавить процедуру-обработчик &После("ПриСозданииНаСервере") для формы списка, где программно добавите необходимые колонки и настроите связи параметров компоновки данных. Это позволит сохранить возможность легкого обновления программы.

Подводя итог, выбор метода зависит от объема базы и требований к скорости. Для небольших баз достаточно изменения запроса динамического списка. Для крупных систем оптимальным решением станет создание отдельного индексированного реквизита или использование полнотекстового поиска.

← На главную