Опубликован: 06.12.2011 | Доступ: свободный | Студентов: 3557 / 746 | Оценка: 4.50 / 4.39 | Длительность: 03:42:00
Лекция 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
Константин Павлов
Константин Павлов

Почему в лекции 1 "Основы организации бухгалтерской подсистемы" курса "Разработка прикладных решений для платформы 1С:Предприятие 8.2 в режиме "Управляемое приложение"" совершенно нет информации о том что нужно на вкладке данные в табличной части создать табличную часть "ВидыСубконто" и также нет информации о том какие нужно добавить реквизиты и какие у этих реквизитов должен быть тип? Считаю лекцию 1 в данном вопросе недоработанной.

Надежда Федулкина
Надежда Федулкина