Программная настройка глобального поиска
страницаПрограммная настройка глобального поиска
Во встроенном языке существует объектная модель для работы с глобальным поиском. Она позволяет перехватывать многие события глобального поиска и изменять его стандартное поведение.
Например, можно исключить некоторые виды поиска.
Как уже говорилось, глобальный поиск ищет везде, и, особенно на больших объемах данных, количество элементов результата поиска может быть слишком большим, а сам поиск существенно замедляться.
Например, если ввести в поисковую строку выражение продажи, будет найдено помимо нужных вам данных много разделов справки – с пиктограммой «?» (рис. 20.6).

**Рис. 20.**6. Поиск по выражению «продажи»
Чтобы отсечь ненужные вам результаты, вы можете при начале работы системы настроить менеджер глобального поиска. Менеджер доступен через свойство глобального контекста ГлобальныйПоиск. У менеджера есть свойство ПланПоиска – это коллекция, которая содержит те виды поиска, которые будут выполняться.
Если вы не хотите, чтобы выполнялся поиск в справке или где-то еще, просто удалите этот вид поиска из коллекции.
Для этого откройте модуль приложения из контекстного меню вашей конфигурации, создайте в нем обработчик события ПриНачалеРаботыСистемы и заполните его следующим образом (листинг 20.1).
Листинг 2****0.1. Обработчик события «ПриНачалеРаботыСистемы()»
Процедура ПриНачалеРаботыСистемы()
// Получить существующий вид поиска.
ПланПоиска = ГлобальныйПоиск.ПолучитьПлан();
// Удалить из плана поиска поиск в меню "Функции для технического специалиста" и поиск по справке.
ПланПоиска.Удалить(СтандартныйВидГлобальногоПоиска.ФункцииДляТехническогоСпециалиста);
ПланПоиска.Удалить(СтандартныйВидГлобальногоПоиска.Справка);
// Вернуть план поиска "на место".
ГлобальныйПоиск.УстановитьПлан(ПланПоиска);
КонецПроцедуры
В этом обработчике вы сначала методом ПолучитьПлан() получаете полностью всю коллекцию плана поиска менеджера ГлобальныйПоиск. Затем удаляете из этой коллекции ненужные вам стандартные виды глобального поиска. И возвращаете новый усеченный план поиска на место старого с помощью метода УстановитьПлан().
После этого результат поиска по выражению продажи примет следующий вид (рис. 20.7).

**Рис. 20.**7. Поиск по выражению «продажи»
Теперь попробуйте решить более сложную задачу – выполнить собственный поиск по псевдокоманде.
Например, в вашем прикладном решении довольно частой задачей является поиск документов об оказании услуг по фрагменту номера документа.
Если вы просто введете в поисковую строку фрагмент номера, то получите очень много результатов (так как глобальный поиск ищет везде), и это может быть недостаточно быстро (так как используется полнотекстовый поиск в данных) – рис. 20.8.

**Рис. 20.**8. Стандартный поиск по фрагменту номера документа
Чтобы устранить эту проблему, вы можете выделить задачу поиска по номеру документа в отдельный «вид поиска» и реализовать для него собственный алгоритм поиска «по псевдокоманде».
Например, если пользователь хочет найти документ об оказании услуг по фрагменту номера, то первым символом в поисковую строку он должен ввести «№», а затем фрагмент того номера, который он ищет. Например: «№ 1».
Для этого вы можете воспользоваться событием ПриГлобальномПоиске. Это событие возникает тогда, когда в процессе набора текста в поле поиска сделана пауза. Это событие вы можете обработать в модуле приложения.
Если в строке поиска первый символ «№», вы удаляете все элементы из плана поиска и добавляете свой собственный элемент. Алгоритм его работы написан в процедуре ПоискДокументовПоНомеру(), которая находится в общем модуле ГлобальныйПоискВДанных.
Создайте в модуле приложения обработчик события ПриГлобальномПоиске() и заполните его следующим образом (листинг 20.2).
**Листинг 2****0.**2. Обработчик события «ПриГлобальномПоиске()»
Процедура ПриГлобальномПоиске(СтрокаПоиска, ПланПоиска)
Если СтрНайти(СтрокаПоиска, "№") = 1 Тогда
//Установить собственный вид поиска, в котором есть только поиск по номеру документа.
ПланПоиска.Очистить();
ПланПоиска.Вставить(0, "ПоискДокументовПоНомеру", "ГлобальныйПоискВДанных", Истина, Ложь);
КонецЕсли;
КонецПроцедуры
Затем создайте в вашей конфигурации общий неглобальный серверный модуль ГлобальныйПоискВДанных(флажок Глобальный снят, а флажок Сервер установлен по умолчанию). Поместите в нем процедуру ПоискДокументовПоНомеру() и заполните ее следующим образом (листинг 20.3).
**Листинг 2****0.**3. Процедура «ПоискДокументовПоНомеру()»
Процедура ПоискДокументовПоНомеру(СтрокаПоиска, РезультатПоиска, ДопПараметры) Экспорт
ФрагментНомера = Прав(СтрокаПоиска, СтрДлина(СтрокаПоиска) - 1);
//Если в строке поиска только "№", то ничего не делать;
Если ФрагментНомера = "" Тогда
Возврат;
КонецЕсли;
// Выбрать документы об оказании услуг с номером, содержащим введенную строку.
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка, Номер, Представление
|ИЗ Документ.ОказаниеУслуги
|ГДЕ Номер ПОДОБНО &ФрагментНомера");
Запрос.УстановитьПараметр("ФрагментНомера", "%" + ФрагментНомера + "%");
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
// Создать элемент результата поиска и добавить его в коллекцию.
ЭлементРезультата = Новый ЭлементРезультатаГлобальногоПоиска(
Выборка.Ссылка,
СтрНайтиИВыделитьОформлением(Выборка.Представление, ФрагментНомера));
РезультатПоиска.Добавить(ЭлементРезультата);
КонецЦикла;
КонецПроцедуры
В этой процедуре запросом вы получаете только те документы об оказании услуг, в номере которых содержится искомый фрагмент строки. Затем в результат глобального поиска вы добавляете собственные элементы. Каждый из них содержит ссылку на найденный документ и представление, в котором выделен найденный фрагмент.
Для выделения элементов используется функция СтрНайтиИВыделитьОформлением(), в которую первым параметром передается строка, которая будет отображаться в результате поиска, а во втором параметре – тот фрагмент, который надо выделить в этой строке.
После этого результат поиска по выражению № 1 примет следующий вид (рис. 20.9).

**Рис. 20.**9. Поиск по псевдокоманде
Как видите, результат поиска будет содержать гораздо меньше элементов, и сам поиск будет выполнен значительно быстрее. Если же не вводить «№» первым символом в поисковую строку, глобальный поиск будет работать как обычно, «из коробки».
Теперь в качестве заключительного штриха осталось только дополнить описание поиска новыми возможностями, которые вы только что реализовали.
Глобальный поиск имеет описание, которое открывается по ссылке Что искать или в пустой строке поиска (рис. 20.10).

**Рис. 20.**10. «Что искать»
Вы можете изменить это описание.
Для этого добавьте в обработчик события ПриНачалеРаботыСистемы() в модуле приложения выделенный ниже фрагмент кода (листинг 20.4).
**Листинг 2****0.**4. Обработчик события «ПриНачалеРаботыСистемы()»
Процедура ПриНачалеРаботыСистемы()
// Получить существующий вид поиска.
ПланПоиска = ГлобальныйПоиск.ПолучитьПлан();
// Удалить из плана поиска поиск в меню "Функции для технического специалиста" и поиск по справке.
ПланПоиска.Удалить(СтандартныйВидГлобальногоПоиска.ФункцииДляТехническогоСпециалиста);
ПланПоиска.Удалить(СтандартныйВидГлобальногоПоиска.Справка);
// Вернуть план поиска "на место".
ГлобальныйПоиск.УстановитьПлан(ПланПоиска);
// Установить собственное описание поисковой строки.
ГлобальныйПоиск.УстановитьОписание("Введите строку поиска, ссылку или арифметическое выражение." + Символы.ПС + "Для поиска документов об оказании услуг по номеру введите ""№"" и сразу за ним без пробела часть номера.");
КонецПроцедуры
В результате при нажатии на ссылку Что искать пользователь увидит заданное вами описание (рис. 20.11).

**Рис. 20.**11. Подсказка «Что искать»
ПРИМЕЧАНИЕ
Вы можете сравнить свое прикладное решение с эталонным приложением Занятие 20. Как это сделать, описано в разделе «Эталонные проекты».