Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1C-DevGuide83

.pdf
Скачиваний:
362
Добавлен:
14.05.2015
Размер:
46.69 Mб
Скачать

Занятие 20

Выполнение заданий по расписанию

Продолжительность

 

Ориентировочная продолжительность занятия – 35 минут.

 

Постановка задачи..........................................................................................................

632

Что такое регламентное задание...................................................................................

634

Создание регламентных заданий .................................................................................

634

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

634

Запуск регламентных заданий.......................................................................................

640

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

641

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

642

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

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

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

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

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

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

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

Постановка задачи

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

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

Занятие 20 633

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

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

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

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

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

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

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

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

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

Приступим к созданию этих заданий.

Что такое регламентное задание

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

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

Свойство Расписание позволяет задать периодичность выполнения этой процедуры.

Кроме перечисленных свойств регламентное задание содержит и  другие свойства, например Интервал повтора при аварийном завер-

шении и Количество повторов при аварийном завершении. Таким образом, если по какой-либо причине выполнение регламентного задания закончится неудачно, система «1С:Предприятие» может автоматически запустить это задание указанное количество раз по прошествии указанного периода времени.

Создание регламентных заданий

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

Сначала создадим первое регламентное задание по обновлению индекса.

Раскроем ветвь Общие дерева объектов конфигурации. Выделим строку Регламентные задания и добавим новый объект конфигу-

рации Регламентное задание. Зададим его имя – ОбновлениеИндекса

(рис. 20.1).

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

Занятие 20 635

Рис. 20.1. Создание регламентного задания

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

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

(рис. 20.2).

Рис. 20.2. Свойства общего модуля

Вернемся к свойствам регламентного задания ОбновлениеИндекса. Нажмем кнопку открытия у поля ввода Имя

метода.

Система откроет окно выбора общего модуля (рис. 20.3).

Рис. 20.3. Выбор обработчика события

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

Выберем модуль РегламентныеПроцедуры. В этом модуле будет создан шаблон процедуры ОбновлениеИндекса(). Заполним его следующим образом (листинг 20.1).

Листинг 20.1. Процедура обновления индекса

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

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

КонецЕсли; КонецЕсли;

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

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

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

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

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

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

Перейдем к составлению расписания запуска регламентного задания.

Нажмем на ссылку Открыть в свойствах регламентного задания (в  строке Расписание), и  система откроет диалог редактирования расписания (рис. 20.4).

Занятие 20 637

Рис. 20.4. Диалог редактирования расписания

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

Наша задача – запускать регламентное задание ежедневно, каждую минуту.

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

(Повторять каждые: 1 дн.),

рис. 20.5.

Рис. 20.5. Запуск задания каждый день

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

Укажем, что запуск задания должен повторяться каждые 60 секунд

(Повторять через: 60 сек.),

рис. 20.6.

Рис. 20.6. Запуск задания каждую минуту

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

В нижней части диалога отображено созданное нами расписание запуска: Выполнять: каждый день; каждые 60 сек.

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

Однако наше ООО «На все руки мастер» не работает круглосуточно, и запуск этого задания в ночное время будет явно бесполезным – данные в базе данных не изменяются. В то же время вполне возможна ситуация, когда некоторые сотрудники задерживаются после окончания рабочего

дня.

Поэтому доработаем расписание следующим образом: укажем Время начала: 08:00 (рис. 20.7).

Рис. 20.7. Указание времени начала запуска

В результате запуск задания будет выполняться не круглые сутки, а только с 8 часов утра. Так как время окончания запуска не указано, запуск задания будет прекращен по окончании текущих суток. Таким образом, с 00:00 до 08:00 часов запуск задания выполняться не будет.

На этом создание расписания регламентного задания закончено, нажмем ОK.

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

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

На этом создание регламентного задания Обновление индекса завершено.

Занятие 20 639

Рис. 20.8. Предопределенное регламентное задание

Теперь по аналогии создадим второе регламентное задание – СлияниеИндексов. В палитре его свойств нажмем кнопку открытия у поля ввода Имя метода. В открывшемся диалоге выберем модуль Регла-

ментныеПроцедуры.

В этом модуле будет создан шаблон процедуры СлияниеИндексов(). Заполним его следующим образом (листинг 20.2).

Листинг 20.2. Процедура «СлияниеИндексов»

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

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

КонецЕсли; КонецЕсли;

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

В свойствах задания установим также флажок Предопределенное

иприступим к редактированию расписания. Для этого нажмем на ссылку Открыть в свойствах регламентного задания (в строке Распи-

сание).

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

На закладке Общее укажем, что задание будет запускаться каждый день (Повторять каждые: 1 дн.), а на закладке Дневное укажем время начала выполнения задания (Время начала: 01:00), рис. 20.9.

Рис. 20.9. Расписание задания «СлияниеИндексов»

В результате мы получим следующее расписание запуска регламент-

ного задания: Выполнять: каждый день; с 1:00 один раз в день.

На этом создание регламентного задания СлияниеИндексов завершено, нажмем ОK.

Запуск регламентных заданий

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

Как мы уже говорили на теоретическом занятии (стр. 200) в начале книги, система «1С:Предприятие» поддерживает два варианта работы: файловый и клиент-серверный.

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

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