Опубликован: 06.12.2011 | Уровень: специалист | Доступ: свободно
Лекция 7:

Построение распределенных информационных систем, поиск, регламентные задания, функциональные опции

< Лекция 6 || Лекция 7: 12345678910

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

В Конфигураторе добавим в систему новый отчет. Назовем его ПоискВБазеДанных, создадим основную форму отчета, включим его в состав подсистемы Администрирование. Создадим следующие реквизиты и команды формы:

Реквизит ПоисковыйЗапрос, Тип: Строка, длина 100

В этом реквизите мы будем хранить поисковый запрос, который будет вводить пользователь. Разместим его на форме.

Команда ВыполнитьПоиск, наименование Искать!

Разместим команду на форме, она примет вид кнопки – нажатие на эту кнопку будет запускать новый поиск.

Реквизит СведенияОПоиске, Тип: Строка, длина 100, разместим реквизит на форме, зададим вид для элемента формы Поле надписи. Сюда мы будем выводить служебные сведения о поиске.

Реквизит РезультатыПоиска, оставим тип в значении по умолчанию, перетащим на форму и в свойстве элемента формы Вид укажем Поле HTML-документа В это поле будут выводиться результаты поиска, полученные в виде HTML.

Команда Назад, перетащим ее на форму

Команда Вперед, перетащим ее на форму

Эти команды будут использоваться для перехода к предыдущей, и, соответственно, следующей порции поиска.

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

Добавим реквизит СписокРезультатов, тип – СписокЗначений, не будем перетаскивать его на форму, мы будем пользоваться им в программном коде. Роль этого реквизита – хранение найденных данных для того, чтобы при щелчке мышью в поле HTML-документа по ссылке, ведущей к тому или иному объекту, открывалось бы окно этого объекта.

Добавим реквизит ПорогНечеткости, числового типа с параметрами по умолчанию. Перетащим его на форму, в окне настройки свойств элемента формы установим следующие параметры:

Заголовок: Порог нечеткости: 0
Вид: Поле полосы регулирования
Минимальное значение: 0
Максимальное значение: 100

Благодаря таким настройкам значение параметра ПорогНечеткости, который мы будем использовать для настройки поиска, можно будет менять, перетаскивая бегунок полосы прокрутки. Порог нечеткости изменяется от 0% до 100%, от него зависит то, насколько результат поиска будет совпадать с поисковым запросом.

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

Заголовок: Размер порции: 5
Вид: Поле полосы регулирования
Минимальное значение: 5
Максимальное значение: 50

Итоговый внешний вид формы представлен на рис. 7.16.

Внешний вид формы

увеличить изображение
Рис. 7.16. Внешний вид формы

Это окно будущей формы мы получили, нажав на кнопку Проверить в панели инструментов группы Элементы в редакторе форм.

Ниже приведен код модуля формы, который реализует поиск.

&НаКлиенте
Процедура ВыполнитьПоиск(Команда)
  //Начинаем новый поиск
  НачатьПоиск("Новый поиск");
КонецПроцедуры

&НаКлиенте
Процедура Назад(Команда)
  //Переходим к предыдущей порции поиска
  НачатьПоиск ("Назад");
КонецПроцедуры

&НаКлиенте
Процедура Вперед(Команда)
  //Переходим к следующей порции поиска
  НачатьПоиск("Вперед");
КонецПроцедуры

&НаКлиенте
Процедура НачатьПоиск(НаправлениеПоиска)
  //Проверяем строку поиска
  Если Не ПустаяСтрока(ПоисковыйЗапрос) Тогда
    ВыполнитьПоискСервер(НаправлениеПоиска);  
  Иначе
    Предупреждение("Строка поиска не задана");  
  КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ВыполнитьПоискСервер(НаправлениеПоиска) 
  //Создаем новый список поиска
  СпПоиска = ПолнотекстовыйПоиск.СоздатьСписок();
  //Задаем параметры поиска
  СпПоиска.СтрокаПоиска = ПоисковыйЗапрос;
  СпПоиска.РазмерПорции=РазмерПорции;
  СпПоиска.ПорогНечеткости=ПорогНечеткости;
  //проверяем направление поиска
  //в зависимости от них либо выполняем поиск 
  //с выдачей его первой части, либо показываем
  //предыдущую или следующую порции поиска
  Если НаправлениеПоиска = "Новый поиск" Тогда
    СпПоиска.ПерваяЧасть();      
  ИначеЕсли НаправлениеПоиска = "Назад" Тогда
    СпПоиска.ПредыдущаяЧасть(НачальнаяПозиция);
  ИначеЕсли НаправлениеПоиска = "Вперед" Тогда
    СпПоиска.СледующаяЧасть(НачальнаяПозиция);
  КонецЕсли;          
  //НачальнаяПозиция будет использоваться не только в дальнейших вычислениях
  //но и как ориентир при получении следующей или предыдущей порции поиска
  НачальнаяПозиция = СпПоиска.НачальнаяПозиция();
  
  //Выводим сообщение в поле сведений о поиске и настраиваем доступность
  //кнопок Вперед и Назад
  Если СпПоиска.Количество() <> 0 Тогда
    СведенияОПоиске = "Результаты поиска" + Строка(НачальнаяПозиция + 1)
      + "-" + Строка(НачальнаяПозиция + СпПоиска.Количество())
      + "из" + Строка(СпПоиска.ПолноеКоличество());
    Элементы.Вперед.Доступность 
      = (СпПоиска.ПолноеКоличество() - НачальнаяПозиция) > СпПоиска.Количество();
    Элементы.Назад.Доступность = (НачальнаяПозиция > 0);
  Иначе
    СведенияОПоиске = "Поиск не дал результатов";
    Элементы.Вперед.Доступность = Ложь;
    Элементы.Назад.Доступность = Ложь;
  КонецЕсли;
  //Выводим результат поиска в поле HTML-документа
  РезультатыПоиска = СпПоиска.ПолучитьОтображение
       (ВидОтображенияПолнотекстовогоПоиска.HTMLТекст);
  //Заполняем список СписокРезультатов
  СписокРезультатов.Очистить();
  Для Каждого Результат Из СпПоиска Цикл
    СписокРезультатов.Добавить(Результат.Значение);
  КонецЦикла; 
 КонецПроцедуры

&НаКлиенте
Процедура РезультатыПоискаПриНажатии
(Элемент, ДанныеСобытия, СтандартнаяОбработка)
  //Получаем элемент HTML
  ЭлементHTML = ДанныеСобытия.Event.srcElement;
  //Если это - элемент полнотекстового поиска
  Если (ЭлементHTML.id = "FullTextSearchListItem") Тогда
    //Отключаем стандартную обработку события
    СтандартнаяОбработка = Ложь;  
    // Получим номер строки (nameProp) найденной строки
    НомерЭлемента = Число(ЭлементHTML.sel_num);
    // Откроем форму найденного элемента 
    ОткрытьЗначение(СписокРезультатов[НомерЭлемента].Значение);
  КонецЕсли;
 КонецПроцедуры

&НаКлиенте
Процедура РазмерПорцииПриИзменении(Элемент)
  //Выводим информацию о текущем размере порции поиска
  Элементы.РазмерПорции.Заголовок="Размер порции: "+РазмерПорции;
КонецПроцедуры

&НаКлиенте
Процедура ПорогНечеткостиПриИзменении(Элемент)
  //Выводим информацию о текущем пороге нечеткости
  Элементы.ПорогНечеткости.Заголовок = "Порог нечеткости: " + ПорогНечеткости;
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
  //Задаем размер порции поиска и порог нечеткости
  РазмерПорции=5;
  ПорогНечеткости=0;
  //Блокируем кнопки Вперед и Назад
  Элементы.Вперед.Доступность=Ложь;
  Элементы.Назад.Доступность=Ложь;
КонецПроцедуры
< Лекция 6 || Лекция 7: 12345678910
Константин Павлов
Константин Павлов
Почему информация по Плану счетов не полная?
Надежда Федулкина
Надежда Федулкина
где находиться выгрузка базы?
Эварист Аминев
Эварист Аминев
Россия
Илья Калиничев
Илья Калиничев
Россия, Самара