Механизм регламентных и фоновых заданий позволяет выполнять определенные задачи по расписанию. В данной статье я на примере записи лога в регистр сведений покажу, как можно настроить регламентные и фоновые задания. Ну и без теории, конечно же, не обойдется! 🙂
Содержание
Чем отличаются регламентные задания от фоновых?
Регламентные задания – это отдельный механизм платформы, позволяющий автоматически выполнять какие-то действия по заданному расписанию. Регламентные задания можно создать и настроить в конфигураторе, в ветке метаданных “Общие”. На основе добавленных в конфигураторе регламентных заданий можно средствами языка 1С создавать отдельные экземпляры регламентных заданий с разными настройками, которые будут храниться в информационной базе.
Фоновые задания – это объекты языка 1С, которые служат для асинхронного выполнения прикладных задач. Они запускаются в отдельных системных сеансах, могут порождать подчиненные фоновые задания, и тем самым позволяют реализовать параллельную обработку данных.
Регулярно встречаю тиражируемую с сайта на сайт информацию, что фоновые задания – это объект, порождаемый регламентными заданиями. Это не так. Фоновые задания действительно могут создаваться на основе регламентных. Но могут быть созданы и полностью независимо при помощи встроенного языка.
Создание и настройка регламентного задания
Разобраться с регламентными заданиями проще всего на примере, поэтому давайте перейдем к практике! Вне зависимости от того, клиент-серверный вариант базы, или файловый, последовательность действий будет одна и та же. Об особенностях файлового режима смотрите в конце данной статьи.
В конфигураторе откроем ветку метаданных Общее, перейдем к пункту Регламентные задания, и добавим новое задание. Пусть наше задание просто добавляет запись в регистр сведений “ЛогРеглЗадания”. Код, который выполняет запись, не принципиален, и рассматривать его в данной статье мы не будем.
В случае, если регламентное задание завершится с ошибкой, платформа предусматривает возможность повторной попытки выполнить это задание. Например, мы можем пытаться связаться с внешним интернет-сайтом, и в случае, если он не отвечает с первого раза, выполнить еще несколько попыток – на случай перебоев в сетевом соединении.
Количество повторов при аварийном завершении – этот параметр указывает платформе, сколько раз вызвать регламентное задание в случае неудачи, в рамках одного запуска по расписанию. Если за указанное количество повторов регламентное задание так и не завершилось успехом, его выполнение прекращается, но следующий запуск по расписанию снова будет снова предусматривать возможность повторов.
Интервал повтора при аварийном завершении – время в секундах, через которое платформа будет пытаться повторно выполнить регламентное задание.
Как это работает? Рассмотрим на примере. Мы настроили расписание задания – каждый день, каждый час. Количество попыток 2, интервал – 30 секунд. Предположим, задание прервалось по ошибке. Платформа через 30 секунд попробует снова, и если будет ошибка, подождет еще 30 секунд, и попытается выполнить задание последний раз. После этого, вне зависимости от того, отработало ли регл. задание или снова была ошибка, через 1 час согласно расписанию будет новый цикл попыток выполнить регламентное задание.
В поле Имя метода нужно указать имя экспортной процедуры серверного общего модуля. Изначально если имя метода не указано, при нажатии на кнопку увеличительного стекла будет открыт диалог выбора общего модуля, в котором далее будет автоматически создан экспортный метод.
Если же нажать на кнопку с многоточием, то будет открыт другой диалог – выбор обработчика события. В этом окне мы можем выбрать подходящую процедуру из уже существующих.
Отметим флажки Использование и Предопределенное, и нажмем гиперссылку “Открыть” в строке Расписание. В открывшемся диалоговом окне можно достаточно гибко настроить расписание, по которому должно работать регламентное задание. В зависимости от настроек на разных закладках, в отдельном поле формируется понятное текстовое пояснение, например:
Выполнять: c 1 января 2022 г. каждый день; с 20:00:00 каждые 10 секунд
Чтобы понять, как вам лучше настроить расписание, лучше самостоятельно изучить закладки и поиграть с параметрами, например, выключить выполнение задания в выходные дни, или настроить выполнение раз в квартал.
Итак, мы создали объект метаданных Регламентное задание. Но это по сути только образец, эталон, на основе которого в информационной базе будут создаваться отдельные экземпляры. Эти экземпляры регламентных заданий хранятся непосредственно в информационной базе.
Что такое предопределенные регламентные задания?
В случае, если для регламентного задания указать признак “Предопределенное”, в информационной базе будет создан предопределенный экземпляр этого задания, который нельзя удалить или создать программно. В остальном он не отличается от других регламентных заданий, которые созданы в информационной базе. Если в объекте метаданных снять флажок “Предопределенное”, то существующее в информационной базе предопределенное регламентное задание будет автоматически удалено.
Если вы хотите, чтобы регламентное задание сразу вступило в строй и начало работать автоматически, следует включить флажок “Предопределенное”. Если этого не сделать, то для создания и настройки такого регламентного задания можно воспользоваться обработкой “Консоль заданий”, либо создавать экземпляр этого регламентного задания средствами языка 1С.
Важный нюанс. Регламентные задания после создания в конфигураторе, можно настраивать в режиме 1С Предприятие – указать другое расписание, отметить или отключить использование, задать параметры выполнения. Изменения регламентного задания в пользовательском режиме никак не повлияют на настройки этого регламентного задания в метаданных.
Как создать регламентное задание программно?
За программную работу с регламентными заданиями отвечает свойство глобального контекста РегламентныеЗадания – это специальный объект с типом МенеджерРегламентныхЗаданий.
Объекты регламентных заданий можно создавать только на основе существующих в метаданных регламентных заданий. Рассмотрим пример:
Расписание = Новый РасписаниеРегламентногоЗадания; Расписание.ПериодПовтораДней = 1; Расписание.ПериодПовтораВТечениеДня = 3600; Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание("ЗаписатьВЛог"); Задание.Расписание = Расписание; Задание.Записать();
В примере мы создаем объект задания на основе метаданных регламентного задания “ЗаписатьВЛог” и объекта расписание. Расписание в свою очередь – это объект языка, который аналогичен рассмотренному выше окну расписания – и все настройки, которые делаются в этом окне интерактивно, можно задать программно средствами языка 1С.
Второй вариант использования метода СоздатьРегламентноеЗадание – передать в качестве параметра непосредственно объект метаданных:
Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание(Метаданные.РегламентныеЗадания.ЗаписатьВЛог);
Важно! Создать регламентное задание можно только на основе существующего в метаданных объекта Регламентное задание. Указание других метаданных приведет к ошибке.
Создание и работа с фоновыми заданиями
При наличии в информационной базе регламентных заданий – предопределенных, или созданных программно – платформа будет на их основе создавать фоновые задания согласно расписанию. В большинстве случаев, достаточно корректной настройки регламентных заданий, чтобы фоновые задания своевременно и правильно отрабатывали.
Важно понимать, что фоновое задание – это объект встроенного языка, который предназначен для асинхронного выполнения прикладных задач. Фоновые задания нельзя запланировать при помощи языка 1С – только создать программно – и они тут же начнут выполняться.
Таким образом, можно сказать следующее: фоновые задания, созданные регламентным заданием выполняются по расписанию этого регламентного задания; а фоновые задания, созданные программно, выполняются немедленно в момент создания.
Выполнение фонового задания
Чтобы из языка 1С запустить фоновое задание, используется объект языка ФоновыеЗадания. Тип этого объекта – МенеджерФоновыхЗаданий. Для выполнения фонового задания служит метод Выполнить.
ФоновыеЗадания.Выполнить("РеглЗадания.ЗаписатьВЛог", , Строка(Новый УникальныйИдентификатор));
Выполнить в фоновом задании можно экспортную процедуру или функцию, которая должна быть размещена в общем неглобальном модуле.
Получение списка фоновых заданий
Фоновые задания могут выполняться очень длительное время, поэтому разработчику может понадобиться периодически опрашивать запущенные задания, чтобы узнать – какие уже выполнились, а какие все еще работают.
Для получения списка фоновых заданий используется метод ФоновыеЗадания.ПолучитьФоновыеЗадания(<Отбор>). Данный метод может получить как список всех фоновых заданий, если не указывать отбор, так и отфильтрованный список – например, только все активные фоновые задания, или фоновые задания с определенным методом, или же фоновые задания, созданные определенным регламентным заданием, и т.д.
В случае, если нам необходимо дождаться выполнения нескольких фоновых заданий, следует использовать метод ФоновыеЗадания.ОжидатьЗавершенияВыполнения(<Массив фоновых заданий>). Кроме того, у каждого фонового задания также есть аналогичный метод – который можно использовать, если мы хотим дождаться завершения одного конкретного фонового задания.
Регламентные задания в файловом варианте базы
При работе с файловой базой регламентные задания имеют ряд отличий от выполнения в клиент-серверном варианте.
Для выполнения регламентных заданий должен быть запущен клиентский сеанс.
- Регламентные задания в файловом варианте, вне зависимости от расписания обрабатываются раз в 60 секунд. Т.е. можно указать расписание 1 раз в 5 секунд, но все равно следующий запуск произойдет через 60 секунд. Второй пример: расписание настроено на 90 секунд. Но по факту фоновые задания будут выполнены с интервалом 120 секунд.
- Фоновые задания выполняются последовательно – т.е. в файловой базе одновременно не может работать два фоновых задания. Пока выполняется одно, остальные становятся в очередь на выполнение.
- Регламентные задания выполняются только одним клиентским приложением. При этом, если не указано специальных настроек, за выполнение регламентных заданий будет отвечать первый запущенный клиентский сеанс.
От сайта к сайту часто встречается информация, что для выполнения регламентных заданий в файловом варианте следует использовать метод ВыполнитьОбработкуЗаданий(). Данная информация устарела, и в последних версиях платформы 8.3. регламентные задания в файловом режиме настраиваются и работают практически так же как в клиент-серверной среде.