Область применения: управляемое приложение, обычное приложение.
Методическая рекомендация (полезный совет)
1. Рекомендуется предоставлять пользователям альтернативную возможность по выполнению регламентных заданий вручную. Например, предлагать «по кнопке» выполнить обработку данных, обычно выполняемую регламентным заданием в фоне. Это вызвано тем соображением, что работа системы не должна зависеть от автоматического выполнения регламентных заданий. В частности:
- выполнение регламентных заданий может быть осознанно выключено на кластере серверов 1С:Предприятия;
- в отличие от клиент-серверного режима работы 1С:Предприятия версии 8.2 и ранее, в котором регламентные и фоновые задания выполняются на сервере, в файловом режиме отсутствовала возможность по их автоматическому выполнению.
В зависимости от специфики регламентных заданий, различается способ их запуска.
1.1. В случае если регламентное задание изменяет в системе некоторые данные , которые необходимы определенному бизнес-процессу или выводятся в конкретном «рабочем месте» (форме), то в таких «рабочих местах» дополнительно рекомендуется размещать команду для выполнения этого действия. Например:
- в форме для поиска в данных рекомендуется вывести дату актуальности индекса, если он не актуален, и команду «Обновить»;
- в списке входящих писем указано, когда они последний раз принимались, и имеется команда «Получить почту»;
- в рабочем месте ответственного за партионный учет указано, на какой момент времени проводилось последний раз распределение по партиям, и команда «Выполнить» для распределения по партиям.
Такие рабочие места должны информировать пользователя о дате актуальности представленных данных и команду для их обновления или обработки (которая выполняет то же действие, что и регламентное задание). Команда должна быть доступна только пользователям с необходимыми для ее выполнения правами.
Пример ручного запуска задания по очистке устаревших версий объектов:
// Проверка, выполняется ли фоновое задание по очистке устаревших версий.
Отбор = Новый Структура;
Отбор.Вставить("ИмяМетода", ИмяМетода);
Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно);
ФоновыеЗаданияОчистки = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
Если ФоновыеЗаданияОчистки.Количество() = 0 Тогда
НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = ‘Запуск вручную: %1’"), РегламентноеЗаданиеМетаданные.Синоним);
ФоновыеЗадания.Выполнить(ИмяМетода. НаименованиеФоновогоЗадания);
КонецЕсли;
КонецПроцедуры
1.2. Если работа регламентного задания оказывает влияние на данные, отображаемые в заранее неизвестном количестве рабочих мест, или влияет на информационную базу в целом , то не представляется возможным выделить какое-то одно рабочее место для размещения команды запуска всех таких заданий. Примеры регламентных заданий, не «привязанных» к конкретным рабочим местам:
- обновление и перестроение агрегатов;
- установка периода рассчитанных итогов.
Результат работы таких регламентных заданий оказывает влияние сразу на множество внутренних и внешних отчетов системы, которые опираются на итоги и агрегаты.
В этом случае рекомендуется заводить отдельное рабочее место для выполнения таких регламентных заданий. При использовании в конфигурации Библиотеки стандартных подсистем такое рабочее место уже входит в состав подсистемы «Регламентные задания» (форма «Регламентные и фоновые задания»).
1.3. В тех же случаях когда регламентное задание не изменяет данные в системе , а формирует различные отчеты или рассылки из нее, также рекомендуется предусматривать отдельное рабочее место для выполнения таких регламентных заданий.
Примеры регламентных заданий, которые не меняют данные в базе:
- рассылка по почтовым адресатам информации об ошибках в журнале регистрации;
- рассылка информации о новых/просроченных задачах;
- периодический запуск внешних обработок для рассылки отчетов.
При использовании в конфигурации Библиотеки стандартных подсистем такое рабочее место уже входит в состав подсистемы «Регламентные задания» (форма «Регламентные и фоновые задания»).
2. Для администраторов информационных баз действует рекомендация: на период выполнения обновления ИБ блокировать работу регламентных заданий. Однако если обновление выполняет неподготовленный пользователь, в особенности, в файловом режиме работы, то рекомендуется дополнительно предусмотреть следующие меры:
- в файловом режиме работы, при неудачной попытке установки монопольного режима для обновления данных ИБ предлагать автоматически блокировать работу регламентных заданий (перезапуск программы с ключом командной строки /AllowExecuteScheduledJobs -Off );
- в начале кода обработчиков регламентных заданий проверять режим работы и прерывать работу регламентного задания с помощью вызова исключения, если обновление ИБ еще не завершено.
При использовании в конфигурации Библиотеки стандартных подсистем первая рекомендация реализована в подсистеме «Обновление версии ИБ», а для выполнения второй предусмотрена процедура ПриНачалеВыполненияРегламентногоЗадания общего модуля ОбщегоНазначения , вызов которой необходимо размещать в начале кода обработчиков регламентных заданий.
В рабочей базе постоянно требуется автоматический запуск различных обработок по расписанию. В 1С есть замечательный механизм регламентных заданий, который можно использовать в этих целях. Но создавать в конфигураторе каждый раз регламентное задание неудобно. Проще создать одно универсальное и создавать новые задания по мере надобности.
Содержание
Создаем регламентное задание
Создадим регламентное задание «Выполнение обработки».
Отключим использование регламентного задания, чтобы при обновлении конфигурации оно автоматом не запускалось.
Назначим процедуру, которая будет срабатывать при запуске регламентного задания: МодульРегламентныхЗаданий.РегламентноеЗаданиеВыполнениеОбработки .
Сама процедура имеет вид:
Процедура РегламентноеЗаданиеВыполнениеОбработки(Ключ) Экспорт
Создаем справочник для регламентных заданий
Наше регламентное задание может порождать множество фоновых процессов – по одному на каждую обработку. У каждого задания в платформе 1С8 есть ключ. Но метод регламентного задания не знает ключ фонового задания, поэтому нужно использовать параметры фонового задания. В результате мы можем видеть фоновое задание в консоли заданий, но не можем вручную из этой консоли создать фоновое задание, т.к. задания с параметрами вручную не создаются.
Справочник «Параметры регламентных заданий» :
· КодПередЗапуском – неограниченная строка – код на языке 1С, который нужно выполнить перед запуском.
· Обработка из конфигурации – строка (100) — идентификатор обработки из конфигурации
· Обработка из справочника – строка (100) — ссылка на элемент справочника «Внешние обработки», если такой имеется в конфигурации
· Выполнять через приложение 1С – булево — будет создано отдельное приложение 1С и в нем будет запущено регламентное задание. Создано для 8.1, где не все методы приложения доступны на сервере, где работает регламентное задание.
· КодЗапуска — – неограниченная строка – код на языке 1С, который будет выполняться при запуске регламентного задания.
Создадим форму элемента :
По нажатию на кнопку «Создать регл. задание» программно создается регламентное задание с ключом-кодом:
Параметры = Новый Массив();
Запуск регламентного задания
Каждое созданное нами регламентное задание имеет ключ:
Этот ключ соответствует коду справочника «Параметры регламентных заданий», по нему осуществляется поиск при старте задания. Если элемент справочника не найдено, задание не выполняется.
Далее, если задан код КодПередЗапуском то будет выполнен этот код. Далее, если переменная Выполнять примет значение ложь, то задание не будет выполнено. При анализе доступна переменная Параметры , где хранится ссылка на найденный элемент справочника «Параметры регламентных заданий».
В зависимости от выбранных значений реквизитов или запустится код на языке 1С, или запустится обработка из конфигурации, или обработка из типового справочника «Внешние обработки».
Для 1С81 предусмотрено выполнение в новом приложении – чтобы можно было использовать код, доступный только на клиенте, в том числе и использование внешних обработок. Для этого нужно установить галочку «Выполнять через приложение 1С». Иначе регламентное задание будет выполняться на сервере.
Рекомендую устанавливать пользователя в поле «Пользователь» у вновь созданного регламентного задания, чтобы задание выполнялось под определенными правами. Рекомендую такому пользователю давать полные права. У меня используется пользователь « robot ».
Расписание регламентного задания создается по гиперссылке «Расписание» из формы регламентного задания. Можно использовать обработку «Консоль регламентных заданий».
Регламентные задания в 1С предназначены для выполнения определенных процедур по расписанию, с некоторой периодичностью.
Регламентные задания хранятся в информационной базе, имеют расписание запуска. Сам запуск производится полностью автоматически, если режим работы информационной базы клиент-серверный. Если же база файловая, то необходимо выполнить следующие действия:
- выделить специального пользователя для выполнения регламентных заданий;
- должна быть открыта база под этим пользователем, в которой периодически должна выполняться функция ВыполнитьОбработкуЗаданий().
Создание регламентного задания
Регламентные задания — объект метаданных конфигурации 1С. Находится в группе Общие. Рассмотрим параметры и свойства регламентных заданий.
Имя метода— путь к экспортной процедуре в общем модуле, которая будет выполняться по заданному расписанию. Процедура должна выполняться на сервере. В этом регламентные задания чем-то похожи на объект Подписка на событие.
Ключ — позволяет создать несколько регламентных заданий одного типа. Например, выполнение синхронизации данных между несколькими информационными базами может быть реализовано с помощью одного объекта метаданных РегламентноеЗадание, при этом самих регламентных заданий будет создано несколько (по количеству баз для обмена). Различаться эти регламентные задания будут с помощью свойства Ключ. Одновременно может выполняться только одно задание с одинаковым ключом.
Использование — флаг, показывающий, включено ли регламентное задание.
Предопределенное — здесь можно провести аналогию с предопределенными элементами справочника. Предопределенные элементы создаются в конфигураторе и применяются пользователями в работе. Обычные элементы пользователь создает сам. С регламентными заданиями точно так же: если оно предопределенное, то оно существует и может выполняться по расписанию сразу после создания в конфигураторе. Если же флаг Предопределенное не установлен, то пользователю нужно самому создать одно или несколько регламентных заданий данного типа (например, через Консоль заданий).
Количество повторов при аварийном завершении задания — определяет, сколько раз будет выполнен перезапуск фонового задания, если оно было завершено с ошибкой.
Интервал повтора при аварийном завершении задания — определяет, с какой периодичностью будет выполнен перезапуск фонового задания, если оно было завершено с ошибкой.
Программная работа с регламентными заданиями
В данных примерах будем рассматривать работу с обычными, не предопределенными, регламентными заданиями.
Программное создание регламентного задания
//Создаем задание
Задание = РегламентныеЗадания . СоздатьРегламентноеЗадание ( "ИмяРегдаментногоЗадания" ) ;
//Устанавливаем ключ регламентного задания (не обязательно)
Задание . Ключ = "КлючЗадания" ;
//Включаем регламентное задание
Задание . Использование = Истина ;
//Записываем регламентное задание
Задание . Записать ( ) ;
Программное получение регламентного задания для изменения параметров
В этом примере предположим, что существует только одно регламентное задание данного типа. Если заданий несколько, то, зная методы работы с массивами, нетрудно внести в код соответствующие изменения.
//Получаем массив с регламентными заданиями нужного типа
Задания = РегламентныеЗадания . ПолучитьРегламентныеЗадания ( новый Структура ( "Метаданные" , Метаданные . РегламентныеЗадания [ "ИмяРегламентногоЗадания" ] ) ) ;
//Если задание существует, то по условию оно одно
Если Задания . Количество ( ) > 0 Тогда
Задание = Задания [ 0 ] ;
//Если задания нет, создадим его
Иначе
Задание = РегламентныеЗадания . СоздатьРегламентноеЗадание ( "ИмяРегламентногоЗадания" ) ;
//Регламентное задание находится в переменной Задание. Можно изменять его параметры.
Вызов диалога изменения расписания регламентного задания
Для работы с расписанием регламентного задания существует особый тип диалога. Все еще предполагаем, что у нас есть только одно регламентное задание данного типа.
//Получаем массив с регламентными заданиями нужного типа
Задания = РегламентныеЗадания . ПолучитьРегламентныеЗадания ( новый Структура ( "Метаданные" , Метаданные . РегламентныеЗадания [ "ИмяРегламентногоЗадания" ] ) ) ;
//Если задание существует, то по условию оно одно
Если Задания . Количество ( ) > 0 Тогда
Задание = Задания [ 0 ] ;
//Если задания нет, создадим его
Иначе
Задание = РегламентныеЗадания . СоздатьРегламентноеЗадание ( "ИмяРегламентногоЗадания" ) ;
Расписание = Задание . Расписание ;
//Создаем диалог изменения расписания регламентного задания
ДиалогРедактирования = Новый ДиалогРасписанияРегламентногоЗадания ( Расписание ) ;
//Показываем диалог пользователю и обрабатываем изменения расписания
Если ДиалогРедактирования . ОткрытьМодально ( ) Тогда
Задание . Расписание = ДиалогРедактирования . Расписание ;
Задание . Записать ( ) ;
КонецЕсли ;