1с реквизит полнотекстовый поиск использовать

Полнотекстовый поиск —  позволит найти текстовую информацию, размещенную практически в любом месте используемой конфигурации. При этом искать нужные данные можно либо по всей конфигурации в целом, либо сузив область поиска до нескольких объектов (например, определенных видов документов или справочников). Сами критерии поиска могут варьироваться в довольно широком диапазоне. То есть найти нужные данные можно, даже не помня точно, где они хранятся в конфигурации и как именно записаны.

Полнотекстовый поиск предоставляет следующие возможности:

  • Есть поддержка транслитерации (написание русских слов символами латиницы в соответствии с ГОСТ 7.79-2000). Пример: «русская фраза» = «russkaya fraza».
  • Есть поддержка замещения (написание части символов в русских словах одноклавишными латинскими символами). Пример: «руссrfz фраpf» (окончания каждого слова набраны латиницей, допустим, в результате ошибки оператора).
  • Есть возможность нечеткого поиска (буквы в найденных словах могут отличаться) с указанием порога нечеткости. Пример: указав в строке поиска слово «привет» и нечеткость 17 %, найдем все аналогичные слова с ошибками и без: «привет», «превет», «привед».
  • Есть возможность указать область выполнения поиска по выбранным объектам метаданных.
  • Полнотекстовое индексирование названий стандартных полей («Код», «Наименование» и т. д.) производится на всех языках конфигурации.
  • Поиск выполняется с учетом синонимов русского, английского и украинского языков.
  • Морфологический словарь русского языка содержит ряд специфических слов, относящихся к областям деятельности, автоматизируемым с помощью системы программ «1С:Предприятие».
  • Стандартно в состав поставляемых словарей включены словарные базы и словари тезауруса и синонимов русского, украинского и английского языков, которые предоставлены компанией «Информатик».
  • Поиск можно осуществлять с использованием подстановочных символов («*»), а также с указанием поисковых операторов («И», «ИЛИ», «НЕ», «РЯДОМ») и спецсимволов.

Полнотекстовый поиск можно осуществлять в любой конфигурации на платформе 1С:Предприятие 8

Для того чтобы открыть окно управления полнотекстовым поиском необходимо выполнить следующее: 

Обычное приложение — пункт меню Операции — Управление полнотекстовым поиском.

Управляемое приложение — пункт меню Главное меню — Все функции — Стандартные — Управление полнотекстовым поиском.

  • Обновить индекс – Создание индекса/Обновление индекса; 
  • Очистить индекс – обнуление индекса(рекомендуется после обновления всех данных); 
  • пункт Разрешить слияние индексов – отвечает за слияние основного и дополнительного индекса.

Полнотекстовый поиск осуществляется при помощи полнотекстового индекса. При отсутствии индекса полнотекстовый поиск как таковой не возможен. Для того чтобы поиск имел результат, все необходимые данные должны быть включены в полнотекстовый индекс. Если пользователем введены в базу новые данные, их следует включить в рассматриваемый индекс, иначе они не будут участвовать в поиске. Чтобы этого избежать, необходимо обновлять полнотекстовый индекс. При обновлении система анализирует только определенные типы данных: Строка, Данные ссылочного типа (ссылки на документы, справочники),Число, Дата, ХранилищеЗначения. Если пользователь не имеет прав доступа к определенной информации, то он не сможет увидеть ее в результатах поиска. Следует также помнить и о том, что в свойствах объектов, по которым будет происходить поиск должно быть установлено значение Полнотекстовый Поиск – Использовать, которое задано по умолчанию.

Как вы можете заметить свойство Использовать установлено для всего справочника Контрагенты, но сделать это можно и для каждого его реквизита соответствующего типа.

Рассмотрим более подробно полнотекстовый индекс, который состоит из двух частей (индексов): основного индекса и дополнительного. Высокая скорость поиска данных обеспечивается за счет основного индекса, но обновление его происходит относительно медленно, в зависимости от объема данных. Дополнительный индекс ему противоположен. Данные добавляются в него намного быстрее, но поиск осуществляется медленнее. Система осуществляет поиск одновременно в обоих индексах. Большая часть данных находится в основном индексе, а данные добавляемые в систему попадают в дополнительный индекс. Пока объем данных в дополнительном индексе небольшой, поиск по нему происходит относительно быстро. В тот момент, когда нагрузка на систему невелика, происходит операция слияния индексов, в результате чего дополнительный индекс очищается, а все данные помещаются в основной индекс. Слияние индексов предпочтительнее выполнять в тот момент времени, когда нагрузка на систему минимальна. С этой целью можно создавать регламентированные задания и задания по расписанию.

Специальные операторы, допустимые при задании поискового выражения

Механизм полнотекстового поиска допускает написание части символов русского слова одноклавишными латинскими символами. Результат поиска при этом не измениться.

Два оператора РЯДОМ

  • упрощенный. На расстоянии 8 слов друг от друга
  • РЯДОМ/[+/-]n – поиск данных в одном реквизите на расстоянии n-1 слов между ними.

Знак указывает в каком направлении от первого слова будет поиск второго. (+ — после, — до)

Групповой символ «*» может использоваться только в качестве замены конца слова

Оператор нечеткости «#». Если неизвестно точное написание названия, имени.

Программными средствами и средствами 1с: программирование.

Оператор синонимов «!». Позволяет найти слово и его синонимы

Как программно обновить индекс полнотекстового поиска?

Код 1C v 8.х

 Процедура ОбновлениеИндексы() Экспорт
ПолнотекстовыйПоиск.ОбновитьИндекс();
КонецПроцедуры

Пример полнотекстового поиска данных

Определение переменной СписокПоиска

Код 1C v 8.х

 Перем СписокПоиска;   

Кроме этого в процедуре обработки события ПриОткрыии формы определим, что эта переменная будет содержать список полнотекстового поиска, с помощью которого мы и будем осуществлять поиск в данных

Код 1C v 8.х

 Процедура ПриОткрытии()
СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок();
КонецПроцедуры

Теперь для события нажатия на кнопку Найти напишем код, который позволит нам выполнять поиск в соответствии с тем выражением, которое задано в поле ПоисковоеВыражение

Код 1C v 8.х

 Процедура НайтиНажатие(Элемент)
СписокПоиска.СтрокаПоиска = ПоисковоеВыражение;
Попытка
СписокПоиска.ПерваяЧасть();
Исключение
Предупреждение(ОписаниеОшибки());
КонецПопытки;
Если СписокПоиска.ПолноеКоличество() = 0 Тогда
ЭлементыФормы.СообщениеОРезультате.Значение = "Не найдено";
ЭлементыФормы.РезультатПоиска.УстановитьТекст("");
Иначе
ВывестиРезультатПоиска();
КонецЕсли;
КонецПроцедуры

Сначала в этой процедуре мы устанавливаем поисковое выражение, введенное пользователем, в качестве строки поиска для полнотекстового поиска. Затем выполняем метод ПерваяЧасть(), который собственно запускает полнотекстовый поиск и возвращает первую порцию результатов. По умолчанию порция содержит 20 элементов. После этого мы анализируем количество элементов в списке поиска. Если он не содержит ни одного элемента, то мы выводим в форму соответствующее сообщение. В противном случае вызывается процедура ВывестиРезультатПоиска(), которая отображает полученные результаты пользователю.

Создадим в модуле формы процедуру с таким именем и напишем в ней код,

Код 1C v 8.х

 Процедура ВывестиРезультатПоиска()
ЭлементыФормы.СообщениеОРезультате.Значение = "Показаны " + Строка(СписокПоиска.НачальнаяПозиция() + 1) + " - " + Строка(СписокПоиска.НачальнаяПозиция() +СписокПоиска.Количество()) + " из " + СписокПоиска.ПолноеКоличество();
Результат = СписокПоиска.ПолучитьОтображение(ВидОтображенияПолнотекстовогоПоиска.HTMLТекст);
ЭлементыФормы.РезультатПоиска.УстановитьТекст(Результат);
ДоступностьКнопок();
КонецПроцедуры

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

В заключение передаем управление в процедуру ДоступностьКнопок() для того, чтобы сделать доступными или, наоборот, запретить доступ к кнопкам Предыдущая порция и Следующая порция (в зависимости от того, какая порция полученных результатов отображена). Текст этой процедуры представлен в Коде

Код 1C v 8.х

 Процедура ДоступностьКнопок()
ЭлементыФормы.СледующаяПорция.Доступность = (СписокПоиска.ПолноеКоличество() - СписокПоиска.НачальнаяПозиция()) > СписокПоиска.Количество();
ЭлементыФормы.ПредыдущаяПорция.Доступность = (СписокПоиска.НачальнаяПозиция() > 0);
КонецПроцедуры

Теперь необходимо создать обработчики событий нажатия на кнопки ПредыдущаяПорция() и СледующаяПорция().

Код 1C v 8.х

 Процедура ПредыдущаяПорцияНажатие(Элемент)
СписокПоиска.ПредыдущаяЧасть();
ВывестиРезультатПоиска();
КонецПроцедуры
Процедура СледующаяПорцияНажатие(Элемент)
СписокПоиска.СледующаяЧасть();
ВывестиРезультатПоиска();
КонецПроцедуры

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

Код 1C v 8.х

 Процедура РезультатПоискаonclick(Элемент, pEvtObj)
htmlElement = pEvtObj.srcElement;
// Проверить идентификатор элемента
Если (htmlElement.id = "FullTextSearchListItem") Тогда
// Получить имя файла (номер строки списка поиска),
// содержащегося в гиперссылке
НомерВСписке = Число(htmlElement.nameProp);
// Получить строку списка поиска по номеру
ВыбраннаяСтрока = СписокПоиска[НомерВСписке];
// Открыть форму найденного объекта
ОткрытьЗначение(ВыбраннаяСтрока.Значение);
pEvtObj.returnValue = Ложь;
КонецЕсли;
КонецПроцедуры

Полнотекстовый поиск

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

Основные возможности полнотекстового поиска

  • Он функционирует в клиент-серверном варианте работы и в автономном сервере;
  • Вместо морфологических словарей он использует экспертные алгоритмы выделения корневой основы (stemming);
  • Все токены, включая составные слова, индексируются как целиком, так и по частям независимо от режима разделения составных слов;
  • Весь текст индексируется как есть, без приведения к нормальной форме. Это позволяет искать слова как в морфологическом режиме (префиксный поиск), так и в строгой падежной форме;
  • При индексации выкидываются (удаляются) шумовые-слова. Это некоторые предлоги, причастия, междометия, которые не несут самостоятельной смысловой нагрузки.

Полнотекстовый поиск в базе данных

Механизм полнотекстового поиска в данных системы 1С:Предприятие 8 позволяет осуществлять поиск в базе данных с указанием поисковых операторов (И, ИЛИ, НЕ, РЯДОМ и др.).

Механизм полнотекстового поиска основан на использовании двух составляющих:

  • полнотекстового индекса, который создается для текущей базы данных и затем периодически, по мере необходимости, обновляется,
  • средств выполнения полнотекстового поиска.

Создание и обновление полнотекстового индекса может быть выполнено интерактивно, в режиме 1С:Предприятие 8, или программно, средствами встроенного языка. Ниже приведен диалог управления полнотекстовым индексированием в режиме 1С:Предприятие:

Полнотекстовый поиск

Для выполнения поиска данных в базе данных может использоваться, например, поле глобального поиска.

Полнотекстовый поиск

Система 1С:Предприятие 8 позволяет осуществлять выборочное включение данных прикладных объектов и их реквизитов в полнотекстовый поиск. Также существует возможность ограничить область поиска данными только указанных объектов конфигурации.

Полнотекстовый поиск в справочной системе

В справочной системе 1С:Предприятия 8 также реализован полнотекстовый поиск, позволяющий использовать поисковые операторы И, ИЛИ, НЕ, РЯДОМ и др. При этом найденные слова выделяются.

Полнотекстовый поиск

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

Содержание

  1. Общие сведения
  2. Использование механизма
  3. Управление полнотекстовым поиском
  4. Выполнение поиска и обработка результатов
  5. Дополнительные словари
  6. Мобильная платформа

Общие сведения

Сам механизм полнотекстового поиска состоит из двух частей:

  • полнотекстовый индекс, который создается в базе данных и обновляется по мере необходимости;
  • средства выполнения полнотекстового поиска.

Искать же можно среди данных следующих объектов:

  • планы обмена;
  • справочники;
  • документы;
  • планы видов характеристик;
  • планы счетов;
  • планы видов расчета;
  • регистры сведений;
  • регистры накопления;
  • регистры бухгалтерии;
  • регистры расчета;
  • бизнес-процессы;
  • задачи.

Для перечисленных объектов, а также для подчиненных им объектов (для реквизитов, например) реализовано свойство «Полнотекстовый поиск», которое позволяет управлять полнотекстовым индексирование объектов (очень похоже на историю данных).

Свойство "Полнотекстовый поиск"

Свойство «Полнотекстовый поиск»

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

  • строка;
  • дата;
  • число;
  • ссылочные типы;
  • хранилище значения.

Для каждого объекта/реквизита в полнотекстовый индекс добавляется:

  • имя объекта метаданных или его реквизита;
  • синоним объекта метаданных иди его реквизита;
  • представление объекта метаданных.

Полнотекстовое индексирование создает основной индекс, а последующие изменения данных — дополнительный. Это важная особенность, так как поиск по основному индексу выполняется быстрее чем по дополнительному. Для устранения этого недостатка в процессе индексирования предусмотрена возможность слияния индексов. Этот процесс может потребовать значительного времени (зависит от размера основного индекса), поэтому для его выполнения рекомендуется выбирать такое время, когда нагрузка на систему минимальна (ночь или выходные).

В клиент-серверном варианте работы поиск выполняется на сервере. Результаты возвращаются частями, размер которых определяется при выполнении команды полнотекстового поиска. Ранжирование результатов осуществляется по:

  • «весу» объекта (чем больше ссылок на этот объект из реквизитов других объектов, тем больше вес);
  • дате объекта (новые объекты вверху).

Использование механизма

Работа с полнотекстовым поиском осуществляется при помощи свойства глобального контекста — ПолнотекстовыйПоиск.

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

Некоторые методы требуют наличия у пользователя административных прав, подробнее об этом написано в синтаксис-помощнике.

Управление полнотекстовым поиском

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

&НаСервере

Процедура РаботаСПолнотекстовымПоиском()

//проверим доступность полнотекстового поиска

Если ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска()

= РежимПолнотекстовогоПоиска.Запретить Тогда

//разрешим полнотекстовый поиск

//в этом случае имеющийся индекс будет очищен

ПолнотекстовыйПоиск.УстановитьРежимПолнотекстовогоПоиска(РежимПолнотекстовогоПоиска.Разрешить);

Иначе

//очистим весь индекси начнем все с начала

ПолнотекстовыйПоиск.ОчиститьИндекс();

КонецЕсли;

//дата актуальности индекса

ДатаАктуальности = ПолнотекстовыйПоиск.ДатаАктуальности();

//получим максимальный размер индексируемых данных в байтах

//по умолчанию 1048576 байт — 1 мегабайт

МаксимальныйРазмерИД = ПолнотекстовыйПоиск.ПолучитьМаксимальныйРазмерИндексируемыхДанных();

//будем индексировать все данные

ПолнотекстовыйПоиск.УстановитьМаксимальныйРазмерИндексируемыхДанных(0);

//получим максимальное количество фоновых заданий

//которое может быть запущено для обновления индекса

КоличествоЗаданий = ПолнотекстовыйПоиск.ПолучитьКоличествоЗаданийИндексирования();

//доверим системе самой выбирать количество заданий

ПолнотекстовыйПоиск.УстановитьКоличествоЗаданийИндексирования(0);

//проверяем актуальность индекса

Если НЕ ПолнотекстовыйПоиск.ИндексАктуален() Тогда

//проверяем необходимость слияния

Если НЕ ПолнотекстовыйПоиск.ОбновлениеИндексаЗавершено() Тогда

//обновляем индекс со слиянием

ПолнотекстовыйПоиск.ОбновитьИндекс(Истина, Ложь);

Иначе

//обновление без слияния

ПолнотекстовыйПоиск.ОбновитьИндекс();

КонецЕсли;

КонецЕсли;

КонецПроцедуры

Выполнение поиска и обработка результатов

Описание синтаксиса поисковых выражений можно посмотреть здесь.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

&НаСервере

Процедура РаботаСоСпискомРезультатов()

//поищем в базе по слову «Товары» и установим размер порции — 10

//размер порции по умолчанию — 20

РезультатыПоиска = ПолнотекстовыйПоиск.СоздатьСписок(«Товары», 10);

//для каждого результата буде тзаполнено описание

//что помогает понять контекст

РезультатыПоиска.ПолучатьОписание = Истина;

//в тоже время, это ускорит поиск

//РезультатыПоиска.ПолучатьОписание = Ложь;

//выполняет поиск и получает первую часть результатов

РезультатыПоиска.ПерваяЧасть();

//если результатов поиска слишком, то производится усечение результатов

СлишкомМногоРезультатов = РезультатыПоиска.СлишкомМногоРезультатов();

//общее количество найденых результатов

ОбщееКоличество = РезультатыПоиска.ПолноеКоличество();

//количество результатов в текущей порции

КоличествоВЭтойПорции = РезультатыПоиска.Количество();

Попытка

//навигация по результатам осуществляется так

//параметр указывает откуда взять следующую/предыдущую часть

РезультатыПоиска.СледующаяЧасть(50);

//и так

РезультатыПоиска.ПредыдущаяЧасть(35);

Исключение

//при достижении конца результатов будет вызвано исключение

//тоже самое будет если строка поиска содержит ошибки

КонецПопытки;

//узнаем текущую позицию поиска

ТекущееПоложения = РезультатыПоиска.НачальнаяПозиция();

Для Каждого Результат Из РезультатыПоиска Цикл

//список полнотекстового поиска можно обойти в цикле

//свойства элементов списка на картинке ниже

КонецЦикла;

//получает результаты поиска либо в виде объекта ЧтениеXML

//либо в виде строки с текстом в формате HTML

//в формате HTML найденные слова подсвечены, пример ниже

ОтображениеПоиска =

РезультатыПоиска.ПолучитьОтображение(ВидОтображенияПолнотекстовогоПоиска.HTMLТекст);

КонецПроцедуры

Элемент списка полнотекстового поиска

Элемент списка полнотекстового поиска
Отображение поиска в формате HTML
Отображение поиска в формате HTML

Дополнительные словари

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

рунетрунета рунете рунетом

ВанессаВанессе Ванессы Ванессу

ошибка баг сбой

стрим поток

Указать дополнительные словари можно в свойстве конфигурации «Дополнительные словари»:

Свойство "Дополнительные словари полнотекстового поиска"

Свойство «Дополнительные словари полнотекстового поиска»

Мобильная платформа

Полнотекстовый поиск на мобильной платформе работает с некоторыми ограничениями:

  • не поддерживается поиск с учетом морфологии;
  • нельзя подключить дополнительные словари;
  • нельзя использовать операцию извлечения текста.

Кроме этого существуют еще некоторые особенности работы полнотекстового поиска на мобильной платформе:

  • обновление индекса выполняется автоматически;
  • обновление индекса выполняется посредством фонового задания, которое создается в том случае, если не выполняется серверный вызов или другое фоновое задание;
  • если все объекта проиндексированы, то через 20 секунд бездействия платформа запускает слияние индексов.

Несмотря на автоматическое обновление индекса, иногда требуется принудительное обновление индекса, сделать это можно с помощью метода ОбновитьИндекс().

На этом все, надеюсь, что эта статья была Вам полезна.

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Загрузка…

Содержание:

1.       Что такое полнотекстовый поиск данных?

2.       Как включить доступность полнотекстового поиска в 1С?

3.       Как осуществляется полнотекстовый поиск данных?  

1.    Что такое полнотекстовый поиск данных?

Полнотекстовый поиск данных- это функция/инструмент программы 1С, с помощью которого в информационной базе выполняется поиск объектов (справочников, документов, присоединенных текстовых файлов и т.д.), в которых присутствует введенный в строку поиска текст.

Так, например, если вам нужно быстро найти все объекты системы, где упоминается определенное название номенклатуры, воспользуйтесь строкой поиска и введите название этой номенклатуры и система предложит документы и справочники, где выбрана эта номенклатура.

Текст, вводимый в строку, может быть простым, т.е. надо вписать одно слово, часть слова, несколько слов. А также может быть сложный запрос для функции поиска данных, например, можно найти объекты, в которых используется одно из слов, либо оба слова или найти слова с учетом допущения ошибок ввода.  

2.    Как включить доступность полнотекстового поиска в 1С?

Механизм полнотекстового поиска будет доступен при включенном флаге «Полнотекстовый поиск данных». Данный флаг доступен в настройках базы и расположен в разделе «Администрирование» → «Общие настройки» → «Полнотекстовый поиск данных» (в зависимости от конфигурации, расположение настройки может отличаться, тогда включить/отключить флаг поиска можно в меню «Все функции»)

Полнотекстовый поиск данных в 1С

Для открытия окна поиска надо нажать «лупу» в панели инструментов или вызвать сочетанием клавиш Ctrl+Shift+F.

Открытие окна поиска   

3.    Как осуществляется полнотекстовый поиск данных?

Для полнотекстового поиска в 1С наберите часть слова, слово или словосочетание.

Процесс полнотекстового поиска в 1С

Помимо точного текста допускается использование более сложных поисковых запросов (правила использования поисковых операторов для осуществления запросов полнотекстового поиска в данных смотри на рисунке ниже)

Язык запросов полнотекстового поиска данных

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

Сокращение области полнотекстового поиска в 1С

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

Использование полнотекстового поиска данных

В результате в окне результата поиска будут выведены все объекты, содержащие указанный текст.

Окно результатов поиска

Любой из отображенных объектов можно открыть, нажав на его название.

Открытие объектов в окне результатов поиска

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

Перемещение в окне результатов поиска

Специалист компании «Кодерлайн»

Зоя Косьяненко

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

Механизм полнотекстового поиска в 1С состоит из двух составных частей:

  • Полнотекстовый индекс;
  • Средства выполнения поиска.
Полнотекстовый индекс

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

Будет ли информация о том или ином объекте входить в полнотекстовый индекс, определяется его свойством «Полнотекстовый поиск» (значение по умолчанию «Использовать») в конфигураторе.

Если установлено значение «Использовать», объект информационной базы будет участвовать в полнотекстовом поиске.

Полнотекстовый индекс создаётся только один раз. После этого он только периодически обновляется.

Частота обновления определяется исходя из интенсивности работы с информационной базой. Чем чаще в ней происходят изменения (добавление данных в справочники, создание и проведение документов и т.д.), тем чаще нужно обновлять полнотекстовый индекс. Иначе поиск будет предоставлять пользователю неактуальные данные.

Управлять полнотекстовым индексом можно из режима» 1С Предприятие» или программно.

В режиме «1С Предприятие»

В режиме «1С Предприятие» доступ к требуемому функционалу осуществляется с помощью меню «Все функции» — «Стандартные» — «Управление полнотекстовым поиском».

При помощи открывшегося диалогового окна можно обновить индекс (о необходимости обновления будет информировать соответствующая надпись) или полностью очистить индекс. В последнем случае для того чтобы полнотекстовый поиск вновь заработал индекс необходимо обновить.

Кнопка «Настройка» открывает диалоговое окно включения и отключения полнотекстового поиска как такового.

В программном коде

Для работы с полнотекстовым поиском в программном коде существует специальный объект «Полнотекстовый поиск».

Обновление полнотекстового индекса возможно в двух режимах:

  • Полное;
  • Частичное.

Первый режим используется для обновления полнотекстового индекса целиком.

Если

Если Не ПолнотекстовыйПоиск.ИндексАктуален() Тогда

    ПолнотекстовыйПоиск.ОбновитьИндекс(Истина);

КонецЕсли;

Для этого в методе ОбновитьИндекс в первом параметре передаётся значение «Истина» (второй имеет значение по умолчанию «Ложь»).

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

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

Второй режим применяется для быстрого обновления, так как данные обновляются отдельными порциями, максимальный размер которых составляет 10 000 записей. При этом за один раз обрабатывается только одна порция. То есть, если нужно обновить 25 000 записей, быстрое обновление придётся выполнить три раза.

Реализация частичного обновления полностью аналогична полному за исключение параметров передаваемых методу ОбновитьИндекс.

Если Не ПолнотекстовыйПоиск.ИндексАктуален() Тогда

    ПолнотекстовыйПоиск.ОбновитьИндекс(,Истина);

КонецЕсли;

При быстром обновлении значение первого параметра остаётся по умолчанию («Ложь»), а во втором параметре передаётся наоборот «Истина». Тогда слияния не произойдет, и данные будут обновляться каждый раз частично.

Очистка индекса производится при помощи метода ОчиститьИндекс. Он не принимает никаких параметров.

ПолнотекстовыйПоиск.ОчиститьИндекс();

Важно:

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

Если ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска()=РежимПолнотекстовогоПоиска.Разрешить Тогда

     //Делаем что-то

КонецЕсли;

Включение и отключение полнотекстового поиска производится при помощи метода УстановитьРежимПолнотекстовогоПоиска. Он принимает единственный параметр типа РежимПолнотекстовогоПоиска.

Для включения полнотекстового поиска передаём РежимПолнотекстовогоПоиска.Разрешить

ПолнотекстовыйПоиск.УстановитьРежимПолнотекстовогоПоиска(РежимПолнотекстовогоПоиска.Разрешить);

Для отключения РежимПолнотекстовогоПоиска.Запретить

ПолнотекстовыйПоиск.УстановитьРежимПолнотекстовогоПоиска(РежимПолнотекстовогоПоиска.Запретить);

Реализация полнотекстового поиска

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

Реализовать его можно при помощи такого объекта конфигурации как «Отчёт».

Для этого в режиме конфигуратор создаём новый «Отчёт» и сразу же создаём для него основную форму.

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

Внешний вид отчёта по поиску

Для работы с полнотекстовым поиском нам потребуются:

  • Три команды:
    • Поиск – Осуществляет непосредственно поиск данных;
    • Предыдущая – переход на предыдущую страницу поисковой выдачи;
    • Следующая – переход на предыдущую страницу поисковой выдачи.
  • Реквизиты:
    • Поисковое выражение – строка поиска;
    • РезультатПоиска – (строка) отображает результаты поиска. Для отображения сразу устанавливаем в свойстве «Вид» значение «Поле HTML документа»;
    • РезультатыПоиска – (список значений) Вспомогательный реквизит для хранения информации о найденных объектах информационной базы;
    • СообщенииеОРезультате – (строка) выводит сообщение о результатах поиска.;
    • ТекущаяПозиция – (число) вспомогательный реквизит, хранит условный номер страницы результатов поиска.

Поиск может выдать результат достаточно большого объёма. Поэтому сразу предусматриваем условное разделение их на страницы для удобства работы. Собственно для этого и созданы команды «Предыдущая», «Следующая» и реквизит «Текущая позиция».

Для работы формы поиска на форме необходимо разместить только все три команды, а также реквизиты «Поисковое выражение», «РезультатПоиска» и «СообщенииеОРезультате».

Всё вышеперечисленные элементы можно располагать по своему усмотрению. Возможный вариант их расположения:

Этот же вариант в работе уже был показан в самом начале статьи. Однако для того чтобы придать созданной форме отчёта работоспособность разработать её внешний вид недостаточно.

Нужно реализовать программную логику работы с полнотекстовым поиском.

Основной механизм полнотекстового поиска и обработки его результатов

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

Получаем результаты поиска по введённой поисковой фразе и выбираем из них соответствующую часть.

СписокПоиска=ПолнотекстовыйПоиск.СоздатьСписок();

СписокПоиска.СтрокаПоиска=ПоисковоеВыражение;

Если Направление=0 Тогда

    СписокПоиска.ПерваяЧасть();

ИначеЕсли Направление=1 Тогда

    СписокПоиска.ПредыдущаяЧасть(ТекущаяПозиция);

ИначеЕсли Направление=1 Тогда

    СписокПоиска.СледующаяЧасть(ТекущаяПозиция);

КонецЕсли;

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

  • Значение «0» – выбираем самую первую часть результатов поиска;
  • Значение «1» – выбираем следующую часть (страницу) результатов поиска относительно текущей позиции;
  • Значение «-1» – выбираем предыдующую часть (страницу) результатов поиска относительно текущей позиции.

Далее получаем информацию о каждом найденном объекте информационной базы и добавляем её в список РезультатыПоиска.

При этом краткую информацию о них отображаем в виде HTML в тестовом поле РезультатПоиска. Это именно то, что будет видеть пользователь, если был найден хотя бы один объект (иначе это текстовое поле останется пустым).

РезультатыПоиска.Очистить();

Для каждого Результат Из СписокПоиска Цикл

    РезультатыПоиска.Добавить(Результат.Значение);

КонецЦикла;

РезультатПоиска=СписокПоиска.ПолучитьОтображение(ВидОтображенияПолнотекстовогоПоиска.HTMLТекст);

Сохраняем текущую позицию (условный номер текущей части (страницы) и общее количество частей (страниц) в поисковой выдаче.

ТекущаяПозиция=СписокПоиска.НачальнаяПозиция();

ПолноеКоличество=СписокПоиска.ПолноеКоличество();

В завершение обработки результатов поиска отображаем информацию о результатах поиска и устанавливаем доступность команд «Предыдущая» и «Следующая».

Если СписокПоиска.Количество()0 Тогда

    СообщениеОРезультате=«Показаны «+Строка(ТекущаяПозиция+1)+«-«+Строка(ТекущаяПозиция+СписокПоиска.Количество())+» из «+

    Строка(ПолноеКоличество);

    Элементы.Следующая.Доступность=(ПолноеКоличествоТекущаяПозиция)>СписокПоиска.Количество();

    Элементы.Предыдущая.Доступность=ТекущаяПозиция>0;

Иначе

    СообщениеОРезультате=«По данному запросу ничего не найдено!»;

    Элементы.Следующая.Доступность=Ложь;

    Элементы.Предыдущая.Доступность=Ложь;

КонецЕсли;

Полностью процедура поиска на стороне сервера выглядит следующим образом:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

&НаСервере

Процедура ИскатьСервер(Направление) Экспорт

    СписокПоиска=ПолнотекстовыйПоиск.СоздатьСписок();

    СписокПоиска.СтрокаПоиска=ПоисковоеВыражение;

    Если Направление=0 Тогда

        СписокПоиска.ПерваяЧасть();

    ИначеЕсли Направление=1 Тогда

        СписокПоиска.ПредыдущаяЧасть(ТекущаяПозиция);

    ИначеЕсли Направление=1 Тогда

        СписокПоиска.СледующаяЧасть(ТекущаяПозиция);

    КонецЕсли;

    РезультатыПоиска.Очистить();

    Для каждого Результат Из СписокПоиска Цикл

        РезультатыПоиска.Добавить(Результат.Значение);

    КонецЦикла;

    РезультатПоиска=СписокПоиска.ПолучитьОтображение(ВидОтображенияПолнотекстовогоПоиска.HTMLТекст);

    ТекущаяПозиция=СписокПоиска.НачальнаяПозиция();

    ПолноеКоличество=СписокПоиска.ПолноеКоличество();

    Если СписокПоиска.Количество()0 Тогда

        СообщениеОРезультате=«Показаны «+Строка(ТекущаяПозиция+1)+«-«+Строка(ТекущаяПозиция+СписокПоиска.Количество())+» из «+

        Строка(ПолноеКоличество);

        Элементы.Следующая.Доступность=(ПолноеКоличествоТекущаяПозиция)>СписокПоиска.Количество();

        Элементы.Предыдущая.Доступность=ТекущаяПозиция>0;

   Иначе

        СообщениеОРезультате=«По данному запросу ничего не найдено!»;

        Элементы.Следующая.Доступность=Ложь;

        Элементы.Предыдущая.Доступность=Ложь;

    КонецЕсли;

КонецПроцедуры

Приведённая процедура является основой выполнения полнотекстового поиска и представляет наиболее сложный его компонент.

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

&НаКлиенте

Процедура Искать (Направление)

    Если ПустаяСтрока(ПоисковоеВыражение) Тогда

        Предупреждение(«Не задан поисковый запрос!»);

        Возврат;

    КонецЕсли;

    ИскатьСервер(Направление);

КонецПроцедуры

Реализация клиентских команд и доступа к найденным объектам

Теперь, когда механизм поиска готов, можно без труда реализовать работу всех трёх ранее созданных команд на форме отчёта.

&НаКлиенте

Процедура Поиск(Команда)

    Искать(0);

КонецПроцедуры

&НаКлиенте

Процедура Предыдущая(Команда)

    Искать(1);

КонецПроцедуры

&НаКлиенте

Процедура Следующая(Команда)

    Искать(1);

КонецПроцедуры

Смысл параметров передаваемых процедуре Искать подробно описан в предыдущем подразделе.

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

&НаКлиенте

Процедура РезультатПоискаПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)

    ЭлементHTML=ДанныеСобытия.Event.srcElement;

    Если ЭлементHTML.id=«FullTextSearchListItem» Тогда

        НомерВСписке=Число(ЭлементHTML.nameProp);

        ВыбраннаяСтрока=РезультатыПоиска[НомерВСписке].Значение;

        ОткрытьЗначение(ВыбраннаяСтрока);

        СтандартнаяОбработка=Ложь;

    КонецЕсли;

КонецПроцедуры

Теперь при клике мышью на любом из найденных объектов, отображаемых в списке, этот объект будет открыт для просмотра и редактирования.

Варианты обновления полнотекстового индекса

В заключение хотелось бы сказать несколько слов о таком важном вопросе, как применимость различных вариантов обновления полнотекстового индекса.

Как уже было сказано выше, возможны два варианта обновления полнотекстового индекса:

  • Вручную (через меню «Все функции»);
  • При помощи программного кода.

Они не является взаимоисключающими. Однако в зависимости от конкретных обстоятельств и IT инфраструктуры один из них, так или иначе, является более предпочтительным.

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

Но, такой подход требует наличие постоянно работающего сервера или, в крайнем случае, обычного компьютера на котором 1С Предприятие будет работать в режиме толстого клиента.

Также необходимо сформировать расписание выполнения заданий таким образом, чтобы процесс обновления не создавал помех в работе пользователей. Например, назначить полное обновление в ночное время.

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

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

Однако требует определённой дисциплины, чтобы обновления выполнялись своевременно.

Аннотация: В этой лекции рассматривается работа с с полнотекстовым поиском по базе данных и с регламентными заданиями

Цель лекции: научиться использовать возможности полнотекстового поиска по базе данных и регламентных заданий

8.1. Полнотекстовый поиск в базе данных

Базы данных 1С:Предприятие обычно содержат огромное количество информации. Логично было бы предположить, что для того, чтобы ориентироваться в этой информации, неплохо было бы иметь механизм поиска. Такой механизм уже присутствует в базе по умолчанию. Он позволяет задавать поисковые запросы на естественно языке, использовать поисковые операторы ( И, ИЛИ, НЕ, РЯДОМ и другие), искать информацию даже в том случае, если нам известна лишь часть искомого текста.

В частности, при создании новых объектов и их реквизитов, свойство Полнотекстовый поиск устанавливается в значение Использовать,
рис.
8.1.

Реквизит включен в полнотекстовый поиск

Рис.
8.1.
Реквизит включен в полнотекстовый поиск

Если в режиме 1С:Предприятие выполнить команду Операции > Управление полнотекстовым поиском, мы увидим соответствующее окно,
рис.
8.2.

Управление полнотекстовым поиском

Рис.
8.2.
Управление полнотекстовым поиском

Кнопка Обновить индекс служит для обновления поискового индекса.

Кнопка Очистить индекс позволяет очищать индекс.

Кнопка Настройка вызывает окно,
рис.
8.3, которое содержит лишь один параметр — разрешающий или запрещающий использование полнотекстового поиска. По умолчанию поиск разрешен.

Разрешение или запрещение полнотекстового поиска

Рис.
8.3.
Разрешение или запрещение полнотекстового поиска

Полнотекстовый поиск в базе данных возможен лишь тогда, когда построен поисковый индекс. В системе существует два индекса — основной и дополнительный. Основной индекс устроен так, чтобы обеспечить как можно более высокую скорость поиска информации, однако свежая информация в него добавляется относительно медленно. Дополнительный индекс постоянно пополняется свежими данными при внесении в базу новый данных или изменении существующих, но поиск в нем ведется медленнее. Установка Разрешить слияние индексов позволяет системе объединять индексы.
Это создает дополнительную нагрузку на систему, но, в итоге, данные из дополнительного индекса переносятся в основной индекс, что ускоряет поиск, а дополнительный индекс очищается.

Нужно отметить, что полнотекстовый поиск в базе данных осуществляется в соответствии с правами пользователя, который осуществляет поиск. То есть, если пользователю запрещен доступ к какому-либо объекту, данные этого объекта в поисковую выдачу не попадут.

Ранее мы не пользовались полнотекстовым поиском, соответственно, поискового индекса у нас пока нет (параметр Дата актуальности индекса пуст). Создадим индекс, нажав на кнопку Обновить индекс, установив предварительно флаг Разрешить слияние индексов. В итоге нам будет выдано сообщение о том, что полнотекстовое индексирование завершено (в нашей маленькой базе это происходит почти мгновенно, а вот в реально используемых базах, размеры которых могут быть очень большими, обновление индекса может занять продолжительное время, поэтому лучше не обновлять индекс во время интенсивного использования системы). Окно управления полнотекстовым поиском приняло вид, показанный на
рис.
8.4.

Поисковый индекс обновлен

Рис.
8.4.
Поисковый индекс обновлен

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

В Конфигураторе добавим в систему новый отчет. Назовем его ПоискВБазеДанных, создадим основную форму отчета, разместим на ней поле ввода с подписью Поисковый запрос, кнопку с именем ВыполнитьПоиск и подписью Искать! и надпись с именем СведенияОПоиске и заголовком-подсказкой Введите текст в поле и нажмите кнопку Искать!. В поле ввода мы будем вносить поисковый запрос, по нажатию на кнопку этот запрос будет выполняться, в надпись СведенияОПоиске будем выводить служебную информацию о выполненном поиске.

Для того, чтобы отображать результаты поиска, которые можно получить в формате HTML, добавим в форму отчета поле HTML-документа с именем РезультатыПоиска, а под ним — пару кнопок — с именами Вперед и Назад и соответствующими заголовками. Результаты поискового запроса выдаются порциями, по умолчанию это 20 элементов. Если будет получено больше элементов, с помощью этих кнопок мы сможем перемещаться по результатам поиска.

Удалим из нижней командной панели формы отчета кнопку Сформировать. Визуальная часть разработки формы выполнена,
рис.
8.5.

Форма поиска

Рис.
8.5.
Форма поиска

Теперь приступим к программной части нашего поискового интерфейса.

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

//Эту переменную будем использовать в процедурах
//для обращения к объекту 
Перем СпПолнПоиска;

Процедура ПриОткрытии()
	//Инициализируем переменную СпПолнПоиска
	СпПолнПоиска=ПолнотекстовыйПоиск.СоздатьСписок();
	//Задаем размер порции выдачи поисковых записей
	//по умолчанию это 20
	СпПолнПоиска.РазмерПорции=5;
	//Задаем порог нечеткости - этот параметр
	//позволяет находить в базе не только точные слова
	//но и слова, отличающиеся от запроса, задается в процентах
	СпПолнПоиска.ПорогНечеткости=20;
КонецПроцедуры

Процедура ВыполнитьПоискНажатие(Элемент)
	//Записываем поисковый запрос из поля в
	//свойство СтрокаПоиска объекта СпПолнПоиска
	СпПолнПоиска.СтрокаПоиска=ПоисковыйЗапрос;
	//Получаем первую часть поисковой выдачи
	СпПолнПоиска.ПерваяЧасть();
	//Если поиск не дал результата
	Если СпПолнПоиска.ПолноеКоличество()=0 Тогда
		//Сообщаем об этом
		ЭлементыФормы.СведенияОПоиске.Значение="Поиск не дал результатов";
		//Очищаем поле HTML-документа
		ЭлементыФормы.РезультатыПоиска.УстановитьТекст("");

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

 Процедура НазадНажатие(Элемент)
	//При нажатии на кнопку Назад получаем предыдущую
	//порцию поиска
	СпПолнПоиска.ПредыдущаяЧасть();
	//Выводим результат
	ВывестиРезультат();
КонецПроцедуры

Процедура ВпередНажатие(Элемент)
	//При нажатии кнопки Вперед получаем
	//следующую порцию поиска
	СпПолнПоиска.СледующаяЧасть();
	//Выводим результат
	ВывестиРезультат();
КонецПроцедуры

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


Листинг
.

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

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

После того, как мы ввели поисковый запрос и нажали кнопку ВыполнитьПоиск, запускается обработчик события нажатия этой кнопки ВыполнитьПоискНажатие(). Здесь свойству СтрокаПоиска объекта СпПолнПоиска присваивается строка, содержащаяся в текстовом поле и, с помощью метода этого объекта ПерваяЧасть() выполняется поиск. Если поиск не дал результатов — мы сообщаем об этом пользователю, если дал — вызываем процедуру ВывестиРезультат(). Эта процедура формирует надпись, сообщающую пользователю о количестве найденных результатов и о просматриваемой в данный момент их порции. Далее, здесь же мы получаем найденные данные в виде HTML-кода и записываем в поле HTML-документа. Завершает эту процедуру вызов процедуры НастроитьДоступностьКнопок().

Процедура НастроитьДоступностьКнопок() позволяет или запрещает использование кнопок Вперед и Назад в зависимости от количества найденных результатов и от порции, просматриваемой в данный момент.

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

И, наконец, процедура РезультатыПоискаonClick() обрабатывает щелчок по гиперссылке на объект в поле HTML-документа. Такой щелчок приводит к открытию формы объекта, заданного в ссылке.

Вот как выглядит работа с нашей формой поиска,
рис.
8.6.

Работа с формой поиска

Рис.
8.6.
Работа с формой поиска

Если мы внесем изменения в информационную базу, например, введем новый документ, создадим новый элемент справочника или изменим реквизит уже существующего объекта, поисковый индекс потребует обновления. Проведем небольшой эксперимент, который покажет нам, чем грозит несвоевременное обновление индекса. На
рис.
8.6 можно видеть, что по ключевому слову «Петр» было найдено физическое лицо Васильев Петр Петрович. Предположим, при вводе данных по этому физическому лицу была допущена ошибка — его, на самом деле, зовут Павел, а ввели Петр. Откроем форму элемента справочника Физические лица (это можно сделать прямо из поискового окна) и изменим имя «Петр» на «Павел». Сохраним элемент и повторим поиск по тому же ключевому слову. Вот, что у нас получится,
рис.
8.7.

Поиск по базе с необновленным индексом

Рис.
8.7.
Поиск по базе с необновленным индексом

Как видите, в соответствии с индексом сотрудника Васильева П.П. все еще зовут «Петр» — имя (взятое из свойств элемента, то есть — Павел) выведено в качестве подходящего реквизита, хотя на самом деле этот реквизит под условия поиска не подходит.

Решить эту проблему можно вручную — обновлять поисковый индекс в интерактивном режиме уже знакомым вам способом. Это означает, что всякий раз, когда мы решим воспользоваться поиском с использованием нашей поисковой формы, нам, для того, чтобы у нас была уверенность в том, что ищем мы по актуальным данным, нужно обновить поисковый индекс. Это можно забыть сделать, в итоге искать мы будем по устаревшим данным. К счастью, есть программные методы обновления поискового индекса.

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

Добавим в модуль формы отчета ПоискВБазеДанных новую процедуру — ОбновлениеПоисковогоИндекса():

Процедура ОбновлениеПоисковогоИндекса()
		//Если полнотекстовый поиск разрешен
	Если ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска()=
		РежимПолнотекстовогоПоиска.Разрешить Тогда
		//И если индекс не актуален
		Если Не ПолнотекстовыйПоиск.ИндексАктуален() Тогда
			//Обновить индекс со слиянием и без разбиения на порции
			ПолнотекстовыйПоиск.ОбновитьИндекс(Истина, Ложь);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

Здесь мы проверяем, разрешен ли полнотекстовый поиск, актуален ли индекс. Если поиск разрешен, а индекс не актуален, вызываем метод ОбновитьИндекс() объекта ПолнотекстовыйПоиск. Метод принимает два параметра. Первый указывает на то, следует ли провести слияние индексов (в нашем случае мы так и делаем). Второй, установленный в Ложь, отключает порционное индексирование объектов. По умолчанию одна порция индексирования равна 10000 объектов индексирования. Значение Ложь говорит системе о том, что следует проиндексировать все объекты. В небольшой базе, подобной нашей, мы можем так поступать без опасений за производительность решения.

Добавим вызов в начало процедуры ВыполнитьПоискНажатие. Вот как будет теперь выглядеть начало этой процедуры:

Процедура ВыполнитьПоискНажатие(Элемент)
	//Проверка поискового индекса и его обновление
	//если он не актуален
	ОбновлениеПоисковогоИндекса();
…команды, описанные ранее….
КонецПроцедуры

Теперь при каждом нажатии кнопки запуска поиска сначала будет обновляться поисковый индекс (если он неактуален), после чего поиск будет вестись по самым свежим данным. В итоге, ситуация, рассмотренная выше, когда реальный реквизит элемента справочника изменен, а в индексе содержатся устаревшие данные, не повторится.

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

Механизм полнотекстового поиска в 1С позволяет быстро находить необходимую для пользователя информацию. Данный вид поиска особенно эффективен, если информационная база располагает большим объемом информации, а также точно не известно, где находятся интересующие пользователя данные или как часто бывает, их точное название не известно. Для того чтобы открыть окно управления полнотекстовым поиском необходимо выполнить следующее: пункт меню Операции Управление полнотекстовым поиском.

Полнотекстовый поиск в 1С

В данном окошке можно наблюдать три кнопки: НастройкаВключение/Отключение полнотекстового поиска;

Полнотекстовый поиск в 1С

Обновить индексСоздание индекса/Обновление индекса; Очистить индекс – обнуление индекса(рекомендуется после обновления всех данных); пункт Разрешить слияние индексовотвечает за слияние основного и дополнительного индекса.

Полнотекстовый поиск осуществляется при помощи полнотекстового индекса. При отсутствии индекса полнотекстовый поиск как таковой не возможен. Для того чтобы поиск имел результат, все необходимые данные должны быть включены в полнотекстовый индекс. Если пользователем введены в базу новые данные, их следует включить в рассматриваемый индекс, иначе они не будут участвовать в поиске. Чтобы этого избежать, необходимо обновлять полнотекстовый индекс. При обновлении система анализирует только определенные типы данных: Строка, Данные ссылочного типа (ссылки на документы, справочники),Число, Дата, ХранилищеЗначения. Если пользователь не имеет прав доступа к определенной информации, то он не сможет увидеть ее в результатах поиска. Следует также помнить и о том, что в свойствах объектов, по которым будет происходить поиск должно быть установлено значение Полнотекстовый Поиск – Использовать, которое задано по умолчанию.

Полнотекстовый поиск в 1С

Как вы можете заметить свойство Использовать установлено для всего справочника РегНомера, но сделать это можно и для каждого его реквизита соответствующего типа.

Рассмотрим более подробно полнотекстовый индекс, который состоит из двух частей (индексов): основного индекса и дополнительного. Высокая скорость поиска данных обеспечивается за счет основного индекса, но обновление его происходит относительно медленно, в зависимости от объема данных. Дополнительный индекс ему противоположен. Данные добавляются в него намного быстрее, но поиск осуществляется медленнее. Система осуществляет поиск одновременно в обоих индексах. Большая часть данных находится в основном индексе, а данные добавляемые в систему попадают в дополнительный индекс. Пока объем данных в дополнительном индексе небольшой, поиск по нему происходит относительно быстро. В тот момент, когда нагрузка на систему невелика, происходит операция слияния индексов, в результате чего дополнительный индекс очищается, а все данные помещаются в основной индекс. Слияние индексов предпочтительнее выполнять в тот момент времени, когда нагрузка на систему минимальна. С этой целью можно создавать регламентированные задания и задания по расписанию.

Рассмотрим случай автоматического обновления индекса при запуске приложения. Данный случай подходит для однопользовательских баз данных (в качестве однопользовательских баз данных могут выступать такие продукты как 1С Бухгалтерия Базовая, 1С Упрощенка), так как при большом количестве пользователей обновление будет происходить после запуска приложения каждого из пользователей, что в результате очень сильно скажется на производительности системы.

Для начала создадим общий модуль и назовем его, к примеру ПП. В нем пропишем следующую процедуру:

Процедура ОбновлениеИндексы() Экспорт

ПолнотекстовыйПоиск.ОбновитьИндекс();

КонецПроцедуры

Так же установим свойства как на рисунке.

Полнотекстовый поиск в 1С

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

ОбновлениеПолнотекстовогоПоиска.ОбновлениеИндексы ();

Полнотекстовый поиск в 1С

Сохраняем внесенные изменения. Таким образом, после каждого запуска приложения индекс будет обновляться автоматически.

Теперь рассмотрим случай, когда пользователей несколько. Здесь воспользуемся Регламентными Заданиями (в режиме Конфигуратор: в дереве конфигурации – Общие – Регламентные Задания). В данном случае нас интересуют только два задания: ОбновлениеИндексаПолнотекстовогоПоиска и СлияниеИндексаПолнотекстовогоПоиска. В свойствах этих заданий выберем Расписание и нажмем на сслыку Открыть. После чего появится следующее окно:

Полнотекстовый поиск в 1С

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

Полнотекстовый поиск в 1С

Перейдем в режим Предприятия и выполним следующее: Запустим нашу обработку, которая в данном случае будет вызываться каждые 5 секунд и, в свою очередь вызывает метод “ВыполнитьОбработкуЗаданий()”. Данный метод проверяет настало ли время выполнять задания согласно их расписанию. Далее перейдем в пункт меню Операции – Константы – Настройка программы – вкладка Обмен Данными.

Полнотекстовый поиск в 1С

Определим пользовательский сеанс, который будет отвечать за выполнение и установим интервал опроса регламентных заданий. Работать в данном сеансе не рекомендуется, так как это может сказаться на производительности системы. Также на дисках ИТС имеется обработка “ЗапускРегламентныхЗаданий”, которая принудительно запускает регламентные задания по выбору пользователя. Форма данной обработки выглядит следующим образом:

Полнотекстовый поиск в 1С

Таким образом все подготовительные работы выполнены и можно приступать непосредственно к самому поиску данных.

Чтобы начать работать с полнотекстовым поиском необходимо выполнить следующую команду: меню Сервис à Поиск данных.

После чего появится следующее окно:

Полнотекстовый поиск в 1С

Нажав на кнопку Настройки, появится поле с дополнительными настройками, такими как: Ограничение области поиска, Нечеткость, Размер Порции (в данном случае значение = 5, что означает вывод по пять результатов поиска на страницу). Параметр Нечеткость обозначает несовпадение части символов в поисковом запросе и полученной в ходе поиска информации. Нечеткость задается в процентном соотношении.

Полнотекстовый поиск может использовать следующие операторы:

Полнотекстовый поиск в 1С 

Помимо этого механизм полнотекстового поиска допускает написание части символов русского слова одноклавишными латинскими символами. Результат поиска при этом не измениться.

В клиент-серверном варианте планированием выполнения заданий занимается планировщик заданий.

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

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

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

Спасибо! 

Нужна помощь по 1C:УПП?

Понравилась статья? Поделить с друзьями:
  • 1с реквизит список значений управляемая форма
  • 4 лапы зоомагазин на чертановской часы работы
  • 1с реквизит формы в значение таблица значений
  • 4 сезона петропавловск камчатский часы работы
  • 1с розница дополнительные реквизиты документа