Как составить простейшие поисковые выражения 1с

Для чего нужен полнотекстовый поиск в данных?

Ну а для чего нужен гугл, яндекс и иже с ними? Для поиска
же! Вот и тут такая же фигня. Имеем строчку поисковика, вводим туда матерное
слово, пробегается по базе и ищет, где есть упоминание этого. Все понятно.

Что такое основной полнотекстовый индекс и что такое
дополнительный полнотекстовый индекс?

Полнотекстовый индекс состоит из двух частей: основного и
дополнительного индекса.

Основной индекс – спроектирован таким образом, чтобы
обеспечить максимальную скорость поиска при большом объеме данных.

Дополнительный – наоборот.

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

Какова стратегия полнотекстового индексирования
информационной базы?

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

Как создать отчет, выполняющий поиск в данных?

Ну тащемта перепечатать код, который дан в этом задании.
Единственное, что стоит не забывать, что после слов КонецПроцедуры точка с
запятой не ставятся, иначе увидите ошибку

{Отчет.ПоискДанных.Форма.ФормаОтчета.Форма(47,1)}:
Неопознанный оператор

<<?>>&НаКлиенте (Проверка: Сервер)

{Отчет.ПоискДанных.Форма.ФормаОтчета.Форма(1,1)}: Обнаружено
логическое завершение исходного текста модуля (Проверка: Сервер)

{Отчет.ПоискДанных.Форма.ФормаОтчета.Форма(47,1)}:
Неопознанный оператор

<<?>>&НаКлиенте (Проверка: Тонкий клиент)

{Отчет.ПоискДанных.Форма.ФормаОтчета.Форма(1,1)}: Обнаружено
логическое завершение исходного текста модуля (Проверка: Тонкий клиент)

Как составить простейшие поисковые выражения?

Принцип такой же, как и при использовании поисковиков типа
гугл.

Занятие 19 621

В результате будет открыто окно управления полнотекстовым поиском (рис. 19.4).

Рис. 19.4. Окно управления полнотекстовым поиском

Это окно позволяет создавать и обновлять полнотекстовый индекс интерактивно. Кроме этого, оно позволяет разрешать или запрещать вообще все операции, связанные с полнотекстовым поиском: обновление, очистка полнотекстового индекса, полнотекстовый поиск.

Как вы видите, по умолчанию полнотекстовый поиск стандартно разрешен.

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

нажмем кнопку Обновить индекс.

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

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

622 1С:Предприятие 8.3. Практическое пособие разработчика

полнотекстового индекса – дата, когда последний раз выполнялось обновление индекса (см. рис. 19.6).

Рис. 19.5. Полнотекстовое индексирование завершено

Рис. 19.6. Окно управления полнотекстовым поиском

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

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

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

Поиск в данных на основе полнотекстового индекса является стандартной функцией платформы «1С:Предприятие». Для начала поиска достаточно нажать кнопку Поиск (со значком лупы) в панели инструментов приложения (рис. 19.7).

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

Для начала попробуем найти данные, связанные с Ивановым. Введем в строку поиска значение иванов и нажмем Найти или клавишу Enter

(рис. 19.8).

Занятие 19 623

Рис. 19.7. Вызов функции поиска в базе данных

Рис. 19.8. Поиск по выражению «иванов»

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

Обратите внимание, что кроме элемента справочника Иванов и  документа оказания услуги клиенту Иванов система нашла также и другие объекты, которые содержат различные словоформы введенного выражения (в данном случае – Иван).

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

624 1С:Предприятие 8.3. Практическое пособие разработчика

Рис. 19.9. Поиск по выражению «иванов»

Часто пользователь не помнит точно, например, название номенклатуры. В этом случае можно выполнить поиск по нескольким начальным символам слова, заменив последние символы звездочкой (*). Например, при поиске по выражению тран* будут найдены элементы номенклатуры: транзистор и трансформатор (рис. 19.10).

Рис. 19.10. Поиск по первым символам поискового слова

Занятие 19 625

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

Например, если требуется узнать, какого числа клиенту Симонову заменили трансформатор в телевизоре, можно ввести поисковое выражение трансформатор симонов (рис. 19.11).

Рис. 19.11. Поиск по выражению «трансформатор Симонов»

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

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

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

Рис. 19.12. Поиск по выражению «сотрудник Деловой»

626 1С:Предприятие 8.3. Практическое пособие разработчика

Как видите, система нашла также и документы начисления сотрудникам, которые содержат формы слова «сотрудники», но, несмотря на это, искомый нами справочник Сотрудники находится первым в  списке найденных.

Система позволяет выполнять также нечеткий поиск. Например, пользователь не уверен в правильности написания поискового слова. В этом случае в поисковом выражении можно задать признак нечеткого поиска – решетку (#) и количество символов после нее, на которое поисковое выражение может отличаться от оригинала в  базе данных. В результате, даже если пользователь ввел в поисковую строку римонт#2, в базе данных будут найдены все объекты, содержащие слово ремонт (рис. 19.13).

Рис. 19.13. Нечеткий поиск по выражению «римонт»

Также можно выполнять поиск по синонимам слов. Для этого перед поисковым выражением нужно поставить символ ! (восклицательный знак). Например, поиск по выражению !починка даст такой же результат (см. рис. 19.13), так как ремонт и починка являются синонимами.

Для составления поисковых выражений можно использовать разнообразные операторы, которые подробно описаны в документации «1С:Предприятие 8.3. Руководство разработчика», приложение 5 «Поисковые выражения полнотекстового поиска». Их использование не должно вызвать у вас затруднений.

Занятие 19

7

62

Форма поиска, которая появляется

при

нажатии кнопки Поиск

в  панели инструментов приложения

(рис.

19.7–19.13), стандартно

генерируется платформой. Так происходит потому, что свойство конфигурации ОсновнаяФормаПоиска по умолчанию не определено.

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

Поиск при вводе по строке

Врежиме «Конфигуратор»

Вплатформе «1С:Предприятие» реализован мощный механизм

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

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

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

Непосредственно).

Установим параметры поиска поля ввода для справочника Номенклатура так, как показано на рис. 19.14.

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

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

не  только по началу строки (Способ поиска строки Любая часть).

628 1С:Предприятие 8.3. Практическое пособие разработчика

Рис. 19.14. Свойства поиска по строке в поле ввода

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

поля ввода АвтоПодбор и ОкончаниеВводаТекста. А также это можно сделать в модуле менеджера того объекта, в данных которого выполняется поиск, в обработчике события ОбработкаПолуче-

нияДанныхВыбора (за исключением свойства РежимПолученияДанныхВыбора).

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

Запустим «1С:Предприятие» и начнем вводить новую цену на номен-

клатуру в регистр Цены на номенклатуру.

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

Занятие 19 629

Рис. 19.15. Поиск по строке в поле ввода

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

630 1С:Предприятие 8.3. Практическое пособие разработчика

Контрольные вопросы

;; Для чего предназначен полнотекстовый поиск в данных? ;; Как интерактивно управлять полнотекстовым поиском? ;; Как составлять простейшие поисковые выражения?

;; Как настроить свойства поиска при вводе по строке в поле ввода?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

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

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

  • Есть поддержка транслитерации (написание русских слов символами латиницы в соответствии с ГОСТ 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 = Ложь;
КонецЕсли;
КонецПроцедуры

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С и возможности выделить отдельный компьютер для выполнения исключительно технологических задач, возможность обновить полнотекстовый индекс вручную становится спасительным выходом из ситуации.

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

Система «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.

Загрузка…

Добавить комментарий