Цель лекции: научиться использовать возможности
Базы данных 1С:Предприятие обычно содержат огромное количество информации. Логично было бы предположить, что для того, чтобы ориентироваться в этой информации, неплохо было бы иметь механизм поиска. Такой механизм уже присутствует в базе по умолчанию. Он позволяет задавать поисковые запросы на естественно языке, использовать поисковые операторы ( И, ИЛИ, НЕ, РЯДОМ и другие), искать информацию даже в том случае, если нам известна лишь часть искомого текста.
В частности, при создании новых объектов и их реквизитов, свойство .
(рис 8.1) Реквизит включен в полнотекстовый поискЕсли в режиме 1С:Предприятие выполнить команду .
(рис 8.2) Управление полнотекстовым поискомКнопка Обновить индекс служит для обновления поискового
Кнопка Очистить индекс позволяет очищать
Кнопка , которое содержит лишь один параметр - разрешающий или запрещающий использование
(рис 8.3) Разрешение или запрещение полнотекстового поискаНужно отметить, что
Ранее мы не пользовались
(рис 8.4) Поисковый индекс обновленМеханизм
В Конфигураторе добавим в систему новый отчет. Назовем его ПоискВБазеДанных, создадим основную форму отчета, разместим на ней поле ввода с подписью Поисковый запрос, кнопку с именем ВыполнитьПоиск и подписью Искать! и надпись с именем СведенияОПоиске и заголовком-подсказкой Введите текст в поле и нажмите кнопку Искать!. В поле ввода мы будем вносить поисковый запрос, по нажатию на кнопку этот запрос будет выполняться, в надпись СведенияОПоиске будем выводить служебную информацию о выполненном поиске.
Для того, чтобы отображать результаты поиска, которые можно получить в формате HTML, добавим в форму отчета поле HTML-документа с именем РезультатыПоиска, а под ним - пару кнопок - с именами Вперед и Назад и соответствующими заголовками. Результаты поискового запроса выдаются порциями, по умолчанию это 20 элементов. Если будет получено больше элементов, с помощью этих кнопок мы сможем перемещаться по результатам поиска.
Удалим из нижней командной панели формы отчета кнопку .
(рис 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.7) Поиск по базе с необновленным индексомКак видите, в соответствии с
Решить эту проблему можно вручную - обновлять поисковый
Наша база невелика, работает с ней не очень много сотрудников, поэтому мы вполне можем обновлять поисковый
Добавим в модуль формы отчета ПоискВБазеДанных новую процедуру - ОбновлениеПоисковогоИндекса():
Процедура ОбновлениеПоисковогоИндекса() //Если полнотекстовый поиск разрешен Если ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска()= РежимПолнотекстовогоПоиска.Разрешить Тогда //И если индекс не актуален Если Не ПолнотекстовыйПоиск.ИндексАктуален() Тогда //Обновить индекс со слиянием и без разбиения на порции ПолнотекстовыйПоиск.ОбновитьИндекс(Истина, Ложь); КонецЕсли; КонецЕсли; КонецПроцедуры
Здесь мы проверяем, разрешен ли
Добавим вызов в начало процедуры ВыполнитьПоискНажатие. Вот как будет теперь выглядеть начало этой процедуры:
Процедура ВыполнитьПоискНажатие(Элемент) //Проверка поискового индекса и его обновление //если он не актуален ОбновлениеПоисковогоИндекса(); …команды, описанные ранее…. КонецПроцедуры
Теперь при каждом нажатии кнопки запуска поиска сначала будет обновляться поисковый
В реальных базах индексирование может выполняться достаточно медленно, поэтому в них поисковый
В информационных базах 1С:Предприятие 8 существует немало регулярно повторяемых последовательностей действий, которые вполне можно было бы доверить автоматике. Например, это обмен данными с другими информационными системами, резервное копирование информации, обновление поисковых
(рис 8.8) Новое регламентное заданиеВ качестве метода, который будет выполняться
(рис 8.9) Новый модуль для процедуры, реализующей регламентное заданиеОткроем код модуля и введем туда следующий код:
Процедура ПроверкаЗадания() Экспорт
Сообщить("Задание работает, сейчас "+ТекущаяДата());
КонецПроцедуры
Теперь укажем данную процедуру в настройках задания, в поле .
(рис 8.10) Окно настройки расписания, вкладка ОбщееНа вкладке .
(рис 8.11) Окно настройки расписания, вкладка ДневноеНа вкладке Недельное можно задать расписание запуска по неделям, на вкладке Месячное - расписание по месяцам.
Ограничимся в настройках расписания вышеприведенными изменениями, закроем окно нажатием на кнопку ОК.
Мы работаем с информационной базой в файловом режиме. Если бы мы работали с серверным вариантом, то, для того, чтобы задание было запущено и выполнялось в соответствии с расписанием, нам нужно было бы лишь установить флажок Предопределенное в форме свойств задания. Для файлового варианта нам понадобятся некоторые дополнительные усилия (флажок Предопределенное мы так же установим).
А именно, создадим обработку с именем ОбработкаЗаданий. Создадим форму обработки без командных панелей, удалим кнопку Выполнить, добавим на нее надпись "Обработка заданий. Закрыть для завершения", а в модуль обработки добавим следующий код:
Процедура ОбработкаЗаданий()
ВыполнитьОбработкуЗаданий();
КонецПроцедуры
ПодключитьОбработчикОжидания("ОбработкаЗаданий", 5);
В этом коде мы подключаем обработчик ожидания формы. Он использует указанную при его вызове процедуру в качестве обработчика ожидания. Эта процедура будет вызываться каждый раз по истечению указанного при подключении интервала времени (в секундах).
В процедуре вы можете видеть окно программы с открытой формой обработки, ответственной за выполнение заданий. Как можно судить из окна служебных сообщений, наше
(рис 8.12) Форма обработки, ответственной за вызов метода ОбработкаЗаданий()Для того, чтобы обеспечить обработку
В этой лекции мы познакомились с организацией
Для данной лекции подготовлен видеоурок.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.