Запуск фонового задания во внешней обработке. Отключение предупреждений защиты от опасных действий в фоновом задании
1. Как запустить фоновое задание из модуля внешней обработки используя БСП
После тщетных попыток запустить в фоне процедуру модуля объекта внешней обработки, я все-таки решил глубже копнуть все механизмы длительных операций БСП. Все процедуры выполнения кода в фоне из подсистемы "Длительные операции" работают на сервере. То есть все происходит так: берется внешняя обработка, хранящаяся в справочнике "ДополнительныеОтчетыИОбработки", разворачивается на сервере (вот тут ключевой момент) и из этого экземпляра обработки выполняются указанные процедуры / функции модуля объекта (см. процедуру "ЗапуститьФоновоеЗаданиеСКонтекстомКлиента" модуля "ДлительныеОперации" БСП 3.х). Если вы вызываете ту же самую обработку из "файл-открыть", то БСП тупо пытается запустить указанные методы из обработки на сервере, в то время как обработка находится на клиенте.
Выходом было создать копию внешней обработки на сервере и запустить процедуру ее (копии) модуля объекта в фоне. Для этого, при открытии формы я помещал обработку во временное хранилище и тут же создавал копию на сервере в временном файле. Имя файла на сервере хранил в реквизите формы.
Ну вот, собственно и все. Осталось только правильно вызвать процедуру из модуля объекта копии обработки на сервере.
2. Как отключить безопасный режим и сообщения защиты от опасных действий независимо от профиля безопасности пользователя в фоновом задании во внешней обработке
Ниже приведенный способ, используемый мной, не является идеальным, но прекрасно работает и используется мной уже не один год.
Я думаю, что многим приходилось сталкиваться с тем, что на сервере надо было подтвердить разрешение на запуск com-соединения. И все выключали защиту от опасных действий в профиле пользователя, чего делать не рекомендуется. Я пошел другим путем. Создаю две экспортные процедуры в модуле объекта внешней обработки: одна — непосредственно функция, которая будет выполнять необходимые действия и другая, которая вызовет первую с отключенным контролем прав доступа профиля.
Выглядит это так:
То есть, я создал еще один экземпляр самой себя без контроля прав (не в безопасном режиме и с отключением предупреждений защиты от опасных действий).
Пример использования, созданный из обработки демонстрационной конфигурации БСП прилагается (создавалась на платформе 8.3.13.1513, совместима с любой платформой 8.3, которая поддерживает БСП 3.0 и старше)
Предупреждение. Нельзя использовать реквизиты и табличные части внешней обработке в процедурах/функциях, выполняемых в фоне. Данные реквизиты должны быть переданы непосредственно в вызываемую процедуру/функцию из модуля формы.
Фоновые задания в 1С 8.3
Иногда требуется выполнить какую-нибудь длительную операцию без блокирования интерфейса. То есть пользователь нажал кнопку, запустилась какая-нибудь длительная процедура, а в этом время пользователь может делать что-нибудь другое в программе. Для этого можно использовать механизм фоновых заданий.
Фоновые задания запускаются асинхронно (без ожидания завершения), в отдельном потоке. Фоновые задания можно запустить только на сервере. Для примера, представим что есть некий список электронных адресов, на который нужно выполнить рассылку по электронной почте. В списке может быть много адресов, да и отправка одного письма выполняется какое-то время. Поэтому хотелось бы запустить рассылку и продолжить дальше работать с программой.
Чтобы запустить фоновое задание используется метод Выполнить менеджера фоновых заданий. Первым параметром передается имя общего модуля и имя метода. Указанный метод должен находиться в общем модуле и быть экспортным.
В результате будет запущено фоновое задание, которое выполнит метод ВыполнитьРассылку из общего модуля МодульФоновыхЗаданий. Во время выполнения фонового задания интерфейс пользователя не будет заблокирован.
Если сейчас трижды запустить одно фоновое задание, то оно будет запущено три раза и три раза выполнит одно и то же действие. Чтобы избежать повторного запуска фонового задания, если оно уже было запущено можно использовать Ключ фонового задания. Ключ передается третьим параметром в метод Выполнить:
В результате при первом выполнении данного кода будет запущено фоновое задание с ключом «Рассылка». Если не дождавшись выполнения текущего фонового задания попробовать запустить его еще раз, то будет выброшено исключение «Задание с таким значением ключа уже выполняется». Если указать другое значение ключа, то оба фоновых задания будут выполняться одновременно.
Если у фоновых заданий с одним значением ключа не совпадают методы для выполнения, то такие задания могут быть запущены одновременно.
Стоит отметить, что в качестве метода для фонового задания можно использовать как процедуру, так и функцию. Возвращаемый результат функции будет проигнорирован. В качестве метода фонового задания нельзя использовать методы глобальных общих модулей.
Параметры фонового задания
При запуске фонового задания можно передать параметры в метод общего модуля. Например, добавим в процедуру ВыполнитьРассылку два параметра:
При запуске фонового задания вторым параметром нужно перадать массив параметров. Первый элемент массива будет передан в первый параметр, второй — во второй и т.д.
ИмяМетода = «МодульФоновыхЗаданий.ВыполнитьРассылку» ;
Ключ = «Рассылка»;
//параметры
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(«Первый параметр»);
МассивПараметров.Добавить(«Второй параметр»);
ФоновыеЗадания.Выполнить(ИмяМетода, МассивПараметров, Ключ);
Если количество параметров не будет совпадать, то фоновое задание не будет выполнено.
Фоновые задания в файловом и клиент-серверном варианте
Механизм выполнения фоновых заданий отличается в файловом и клиент-серверном варианте.
В файловом варианте фоновые задания выполняются на том клиентском приложении, которое его запустило. Одновременно может выполняться только одно фоновое задание, остальные фоновые задания встают в очередь.
В клиент-серверном варианте фоновые задания выполняются планировщиком заданий, который находится в менеджере кластера. Планировщик заданий подбирает наименее загруженный рабочий процесс сервера 1С и выполняет фоновое задание на нем.
И в файловом и клиент-серверном варианте фоновое задание это отдельный системный сеанс, который выполняется от имени того пользователя, кто создал задание.
Фоновое задание с ожиданием результата
Если требуется дождаться результата выполнения фонового задания, то можно воспользоваться тем, что метод Выполнить возвращает объект Фоновое задание. А у этого объекта есть метод ОжидатьЗавершенияВыполнения, который остановит поток выполнения, пока не изменится состояние фонового задания. Фоновое задание может быть в четырех состояниях:
— Активно — задание запущено на выполнение
— Завершено — задание успешно выполнено
— Завершено аварийно — возникла ошибка при выполнении задания
— Отменено — задание было отменено
После изменения состояния фонового задания метод ОжидатьЗавершенияВыполнения вернет обновленное фоновое задание, у которого можно анализировать свойство Состояние, чтобы узнать результат выполнения:
Метод Выполнить вернул фоновое задание, состояние которого было равно Активно. Состояние автоматически не обновляется. Для проверки изменения состояния фонового задания нужно заново получить фоновое задание. В данном примере оно было получено методом ОжидатьЗавершенияВыполнения.
Пауза через фоновое задание
В метод ОжидатьЗавершенияВыполнения параметром можно передать количество секунд. Выполнение кода продолжится или по истечении этого времени или сразу после изменения состояния фонового задания. Можно воспользоваться данным методом для возможности оставить выполнение кода на указанное количество секунд. В общий модуль добавим следующую процедуру:
Параметром принимаем количество секунд для паузы, затем определяем чей это сеанс. Если клиентский, то запускаем фоновое задание и ждем его завершения. Если это сеанс фонового задания, то просто ждем его завершения.
Вызов паузы на 5 секунд:
Преимущество такого метода в том, что на время паузы не загружается процессор.
Оповещение о выполнении фонового задания
Иногда требуется не просто запустить выполнение фонового задания, а оповестить пользователя о результатах выполнения. Для этого можно использовать следующий алгоритм действий:
1. Запускаем фоновое задание и сохраняем его уникальный идентификатор
2. С определенной периодичностью находим фоновое задание по идентификатору с помощью метода НайтиПоУникальномуИдентификатору и проверяем его состояние
Здесь был использован метод ПодключитьОбработчикОжидания, который вызывает процедуру, указанную в первом параметре через время, указанное во втором параметре. Затем вызов процедуры был отменен через метод ОтключитьОбработчикОжидания.
Отмена выполнения фонового задания
Для отмены фонового задания можно использовать метод Отменить самого фонового задания:
ИмяМетода = «МодульФоновыхЗаданий.ВыполнитьРассылку» ;
Ключ = «Рассылка»;
//параметры
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(«Первый параметр»);
МассивПараметров.Добавить(«Второй параметр»);
//запускаем
ФонЗад = ФоновыеЗадания.Выполнить(ИмяМетода, МассивПараметров, Ключ);
//отменяем
ФонЗад.Отменить();
Сообщения из фонового задания
Фоновое задание выполняется на сервере, поэтому если в нем использовать сообщения пользователю, то их никто не увидит. Однако у фонового задания есть метод ПолучитьСообщенияПользователю, который позволяет получить все сообщения из фонового задания. Для примера добавим в общий модуль следующую процедуру:
Выполним ее через фонового задание с получением всех сообщений и выведем полученные сообщения на экран:
Через сообщения можно организовать получение прогресса выполнения фонового задания. Добавим в общий модуль следующие процедуры:
И запустим фоновое задание на выполнение, с периодическим получением сообщений:
В результате в процессе выполнения фонового задания можно будет увидеть окно состояния с прогрессом выполнения:
Многопоточность через фоновые задания
С помощью фоновых заданий можно выполнить какую-то обработку в несколько потоков. Например, нужно во всем справочнике товаров увеличить цену на 10%. Можно разбить все товары на несколько частей и каждую часть обработать в отдельном потоке:
Здесь мы использовали метод ОжидатьЗавершения, но уже не у самого фонового задания, а у менеджера фоновых заданий. Параметром передали массив тех фоновых заданий, завершение которых нужно дождаться. У менеджера фоновых заданий тоже есть метод ОжидатьЗавершенияВыполнения, в который помимо массива заданий можно передать таймаут, аналогично одноименному методу у фонового задания. Даже если в методе ОжидатьЗавершенияВыполнения не указывать таймаут, то он в любом случае вернет массив всех обновленных фоновых заданий, после изменения статуса хотя бы у одного задания. Так как нам нужно дождаться завершения всех заданий, то был использован метод ОжидатьЗавершения.
Стоит отметить, что в одном фоновом задании можно запустить другое фоновое задание. То есть можно было запустить одно фоновое задание, в нем распараллелить выполнение на четыре фоновых задания, дождаться их выполнения и оповестить пользователя о завершении.
В силу ограничений выполнения фоновых заданий в файловом варианте многопоточную обработку данных можно реализовать только в клиент-серверном варианте.
Получить фоновые задания
Метод ПолучитьФоновыеЗадания позволяет получить список всех фоновых заданий, сохраненных в базе данных. Выполненные фоновые задания хранятся в течении суток, но не более 1000 заданий. Соответственно метод ПолучитьФоновыеЗадания вернет как текущие фоновые задания (выполняются в данный момент), так и завершившиеся в течении суток задания.
Нужно учитывать, что сюда также попадут системные фоновые задания, которые выполняет сама платформа.
Параметром можно передать структуру с отбором, чтобы получить только нужные фоновые задания:
//только активные фоновые задания
ОтборЗаданий = Новый Структура;
ОтборЗаданий.Вставить(«Состояние», СостояниеФоновогоЗадания.Активно);
ВсеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(От борЗаданий);
//задания запущенные после 1 мая 2021
ОтборЗаданий = Новый Структура;
ОтборЗаданий.Вставить(«Начало», Дата(2021,5,1));
ВсеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(От борЗаданий);
//с отбором по имени метода
ОтборЗаданий = Новый Структура;
ОтборЗаданий.Вставить(«ИмяМетода», «МодульФоновыхЗаданий.СообщенияИзФона»);
ВсеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(От борЗаданий);
Отбор можно устанавливать по следующим свойствам:
— УникальныйИдентификатор
— Ключ
— Состояние
— Начало
— Конец
— Наименование
— ИмяМетода
— РегламентноеЗадание
1С фоновое задание — Общее описание механизма
1С фоновое задание позволяет нам производить какие-либо вычисления в системе незаметно для пользователя, то есть в фоне. Более того данный механизм позволяет нам распараллелить процесс вычисления. Распараллелить мы можем даже процедуру, которая будет выполняться. Для этого наше фоновое задание должно запускать еще несколько фоновых заданий. В этом случае процессы распараллеливаются и, если у нас многопроцессорная, многоядерная система, наш алгоритм будет работать эффективно. После запуска нескольких процессов мы можем сказать системе, что необходимо дождаться окончания выполнения этих процессов для того, чтобы потом каким-то образом свести результат.

В идеале фоновое задание реализуется в варианте клиент-сервер, в этом случае вся нагрузка переходит на сервер. Что касается файлового варианта, то работа фонового задания возможна, но она имеет некоторые особенности.
Вот что выдаст система если не учесть эти особенности, и запустить фоновое задание в файловом варианте информационной базы.
1С фоновое задание имеет некоторые ограничения. Поскольку оно выполняется на стороне сервера, то нет возможности интерактивной работы с пользователем. К примеру нельзя вывести сообщение, ну и вообще какую-то информацию. Все эти данные нужно сохранять в рамках информационной базы и дальше каким-то образом обрабатывать.
Какие же средства мы имеем для управления фоновыми заданиями? Этим средством является объект метаданных«МенеджерФоновыхЗадания». У этого объекта есть метод «Выполнить», с помощью этого метода, как раз и запускается фоновое задание.
Имеет он следующие параметры: «ИмяМетода» — имя процедуры или функции, которую нужно выполнить, причем это должна быть процедура или функция серверного контекста; «Параметры» — массив параметров, количество элементов которого должно соответствовать количеству параметров нашей процедуры/функции, указанной в параметре «ИмяМетода»; «Ключ» — некий ключ уникальности, представляющий из себя строчку, по которой система понимает нужно ли запускать фоновое задание либо такое задание уже запущено; «Наименование» — здесь можно указать произвольное описание нашего метода.
Фоновое задание 1С 8.2, 8.3 — Пример использования
Приведем пример работы с фоновыми заданиями 1С. Сначала создадим простой алгоритм, который будет ненадолго загружать систему 1С таким образом, чтобы мы ничего не могли в это время делать.
Для этого:
1. Создадим общий модуль «ОбработчикиФоновыхЗаданий», который будет компилироваться на стороне сервера;

2. Опишем в нем экспортную процедуру «ПроизветиФоновоеВычисление(Параметр)», которая принимает один параметр строкового типа;
3. Далее создадим внешнюю обработку и в событии нажатия на кнопку поместим код, запускающий наш алгоритм;

Теперь обеспечим произведение этих вычислений в фоне, то есть чтобы фоновое задание 1С 8.2, 8.3 выполнялось, но нам не мешало.
Для этого:
1. В обработке, в событии нажатия кнопки пропишем следующий код.
Здесь первым параметром мы передаем имя процедуры общего модуля, а вторым — массив параметров. Третьим параметром нужно передать уникальный ключ и четвертым некоторое описание нашей процедуры.
Готово. Теперь можем проверять. Перезапускаем нашу обработку нажимаем кнопку, система не подвисает и мы работаем беспрепятственно.
Приведенный выше пример показывает, как работает фоновое задание 1С 8.2, 8.3. То, каким полезным оно может быть в разработке ваших алгоритмов.
Механизм заданий
Механизм заданий предназначен для выполнения какой-либо прикладной функциональности по расписанию или асинхронно.
Механизм заданий решает следующие задачи:
- возможность определения регламентных процедур на этапе конфигурирования системы;
- выполнение заданных действий по расписанию;
- выполнение вызова заданной процедуры или функции асинхронно, т. е. без ожидания ее завершения;
- отслеживание хода выполнения определенного задания и получение его статуса завершения (значения, указывающего успешность или неуспешность его выполнения);
- получение списка текущих заданий;
- возможность ожидания завершения одного или нескольких заданий;
- управление заданиями (возможность отмены, блокировка выполнения и др.).
Механизм заданий состоит из следующих компонентов:
- метаданных регламентных заданий,
- регламентных заданий,
- фоновых заданий,
- планировщика заданий.
Регламентные задания предназначены для выполнения прикладных задач по расписанию. Регламентные задания хранятся в информационной базе и создаются на основе метаданных, определяемых в конфигурации. Метаданные регламентного задания содержат такую информацию, как наименование, метод, использование и т. д.
Регламентное задание имеет расписание, которое определяет, в какие моменты времени нужно выполнять связанный с регламентным заданием метод. Расписание, как правило, задается в информационной базе, но может быть задано и на этапе конфигурирования (например, для предопределенных регламентных заданий).
Фоновые задания предназначены для выполнения прикладных задач асинхронно, реализуются средствами встроенного языка.
Планировщик заданий используется для планирования выполнения регламентных заданий. Для каждого регламентного задания планировщик периодически проверяет, соответствует ли текущая дата и время расписанию регламентного задания. Если соответствует, планировщик назначает такое задание на выполнение. Для этого по данному регламентному заданию планировщик создает фоновое задание, которое и выполняет реальную обработку.
18.2. Фоновые задания
18.2.1. Общая информация
Фоновые задания удобно использовать для выполнения сложных вычислений, когда результат вычисления может быть получен через продолжительное время. Механизм заданий имеет средства для выполнения таких вычислений асинхронно.
С фоновым заданием связан метод, который вызывается при выполнении фонового задания. В качестве метода фонового задания может выступать любая процедура или функция не глобального общего модуля, которую можно вызвать на сервере. Параметрами фонового задания могут быть любые значения, которые разрешено передавать на сервер. Параметры фонового задания должны в точности соответствовать параметрам той процедуры или функции, которую оно вызывает. Параметры фонового задания, в сериализованном виде, не могут превышать размер в 1 Гбайт. Если размер сериализованных параметров фонового задания превышает значение 1 Гбайт ‑ формируется исключение. Если методом фонового задания является функция, то ее возвращаемое значение игнорируется.
Фоновое задание может иметь ключ ‑ любое прикладное значение. Ключ вводит ограничение на запуск фоновых заданий ‑ в единицу времени может выполняться только одно фоновое задание с определенным значением ключа и заданным именем метода фонового задания (имя метода состоит из имени модуля и имени процедуры или функции). Ключ позволяет группировать фоновые задания, имеющие одинаковые методы, по определенному прикладному признаку с тем, чтобы в рамках одной группы выполнялось не более одного фонового задания.
Создание и управление фоновыми заданиями выполняются программно из любого соединения. Создавать фоновое задание разрешено любому пользователю. При этом оно выполняется от имени того пользователя, который его создал. Получать задания, а также ожидать их завершения разрешено из любого соединения пользователю с административными правами либо пользователю, который создал эти фоновые задания.
Фоновое задание является чисто сеансовым объектом, но не принадлежит какому-либо пользовательскому сеансу. Для каждого задания создается специальный системный сеанс, выполняющийся от имени того пользователя, который выполнил вызов. Фоновые задания не имеют сохраняемого состояния.
Фоновое задание может порождать другие фоновые задания. В клиент-серверном варианте это позволяет распараллеливать сложные вычисления по рабочим процессам кластера, что может значительно ускорить процесс вычисления в целом. Распараллеливание реализуется порождением нескольких дочерних фоновых заданий с ожиданием завершения каждого из них в основном фоновом задании.
Фоновое задание имеет возможность помещать данные во временное хранилище вызывающего сеанса (см. здесь). Это может быть использовано, например, для передачи в вызывающий сеанс сформированного отчета или подготовленных для обработки данных. Передача данных из вызывающего сеанса в сеанс фонового задания невозможна.
Запуск фонового задания выполняется следующим образом:
- Выполняются служебные действия:
- Фиксируется факт запуска фонового задания в журнале регистрации;
- Устанавливаются параметры соединения с внешними источниками данных ;
- Устанавливается режим интерфейса и т. д.
- В модуле сеанса выполняется обработчик события УстановкаПараметровСеанса ;
- Выполняется собственно фоновое задание.
Завершившиеся успешно или аварийно фоновые задания хранятся в течение суток, а потом удаляются. История выполнения фоновых и регламентных заданий имеет следующие особенности:
● История хранится для каждой информационной базы;
● Хранится история выполнения:
● Фоновых заданий ‑ не более 1 000 заданий.
● Регламентных заданий ‑ не более 1 000 заданий. При этом система пытается хранить не менее 3 последних запусков для каждого различного регламентного задания. При превышении общего ограничения в 1 000 запусков, система будет пытаться обеспечить хранение 2 последних запусков для каждого регламентного задания, а потом 1.
● Системных фоновых заданий ‑ не более 1 000 запусков. В данном разделе речь идет о фоновых заданиях, которые инициируются системой для выполнения каких-либо действий (выполнение отчетов, поиск и т. д.).
18.2.2. Работа с фоновыми заданиями из встроенного языка
ПРИМЕЧАНИЕ. Примеры, приведенные в данном разделе, не являются законченными. Они предназначены только для демонстрации способов работы с фоновыми заданиями.
Управление фоновыми заданиями выполняется с помощью менеджера фоновых заданий (ФоновыеЗадания). С помощью менеджера фоновых заданий предоставляется возможность:
● Выполнить фоновое задание с передачей параметров (метод ФоновыеЗадания.Выполнить()). После запуска фонового задания возвращается объект, описывающий запущенное фоновое задание (ФоновоеЗадание).
● Получить список фоновых заданий, соответствующих некоторому отбору (метод ФоновыеЗадания.ПолучитьФоновыеЗадания()) или найти фоновое задание по уникальному идентификатору фонового задания (ФоновыеЗадания.НайтиПоУникальномуИдентификатору()).
● Ожидать завершение одного (ФоновоеЗадание.ОжидатьЗавершенияВыполнения()) или нескольких (метод ФоновыеЗадания.ОжидатьЗавершенияВыполнения()) ранее запущенных фоновых заданий с указанием времени ожидания.
Более подробно рассмотрим все этапы.
Для запуска фонового задания необходима экспортируемая процедура или функция, описанная в не глобальном общем модуле, который доступен на сервере. Параметры вызываемого метода необходимо перечислить в специальном массиве параметров. При этом порядок следования параметров в методе должен в точности соответствовать порядку элементов массива: самый левый параметр соответствует элементу массива с индексом 0. Все значения параметров фонового задания должны поддерживать сериализацию. Затем передается ключ и описание запускаемого фонового задания. Ключ используется для обеспечения уникальности запускаемого фонового задания.
В качестве фонового задания будет использоваться экспортный метод общего модуля с именем ВыгрузитьДанные(), расположенный в серверном общем модуле ОбщийМодульФоновые:
Для запуска фонового задания необходимо выполнить следующее:
В качестве параметра ОписаниеДанных будет передано значение переменной ВыгружаемыеДанные, в качестве значения параметра ПутьКФайлу будет передана строка c:\temp\data.dat. Для запускаемого фонового задания будет установлен ключ уникальности ВыгрузкаДанных и некоторое описание.
При запуске не выполняется ожидания завершения работы фонового задания. Вместо этого, после создания специального сеанса работы фонового задания и запуска метода фонового задания на выполнение, управление вернется в вызываемый код. При этом в качестве возвращаемого значения метода ФоновыеЗадания.Выполнить() будет получен объект, описывающий запущенное фоновое задание (типа ФоновоеЗадание). Этот объект будет помещен в переменную ЗаданиеВыгрузки.
С помощью описания фонового задания можно получить идентификатор фонового задания, который используется для поиска фонового задания (свойство УникальныйИдентификаторобъекта ФоновоеЗадание). При проверке состояния фонового задания (с помощью свойства фонового задания Состояние) следует помнить, что это состояние фиксируется на момент создания объекта ФоновоеЗадание и в дальнейшем не обновляется. Для проверки состояния необходимо перед каждой проверкой получать описание для проверяемого фонового задания:
При необходимости, работу конкретного экземпляра фонового задания можно прервать с помощью метода ФоновоеЗадание.Отменить(). При этом следует помнить, что после прерывания фонового задания необходимо реализовать «сборку мусора». Например, удалить временные файлы, которые могло порождать прерываемое фоновое задание.
После запуска фонового задания может потребоваться периодически проверять статус выполнения задания. Для этого предназначен метод ФоновоеЗадание.ОжидатьЗавершенияВыполнения(). В качестве параметра метода передается время, в течение которого ожидается изменение состояния фонового задания. В любом случае, не позднее, чем указанный таймаут, метод завершает свою работу и формирует объект ФоновоеЗадание, который описывает текущее состояние фонового задания (включая свойство Состояние).
Таким образом, ожидание завершения работы фонового задания можно выполнить следующим образом:
В примере таймаут установлен в 10 секунд (параметр метода ОжидатьЗавершенияВыполнения()). Если за 10 секунд фоновое задание не завершило свою работу ‑ цикл ожидания завершения будет продолжен. Если фоновое задание перестало выполняться (перестало быть активным), то конкретная причина завершения будет понятна по анализу свойства ФоновоеЗадание.Состояние.
Следует отметить, что ожидать завершения работы можно не только для одного фонового задания. У менеджера фоновых заданий существует аналогичный метод (ФоновыеЗадания.ОжидатьЗавершенияВыполнения()). Разница заключается в том, что в качестве параметра метода передается массив объектов ФоновоеЗадание, завершение которых необходимо отслеживать.
Фоновое задание в процессе своей работы может формировать сообщения пользователю (с помощью объекта СообщениеПользователю). Эти сообщения могут быть получены с помощью метода ФоновоеЗадание.ПолучитьСообщенияПользователю(). Сообщения можно получать как во время работы фонового задания, так и после завершения работы задания.
18.2.3. Фоновое задание и расширения
При старте фонового задания в сеансе фонового задания будут подключены те расширения, которые были подключены в родительском сеансе. В тоже время имеется возможность запустить фоновое задание таким образом, чтобы в сеансе фонового задания были подключены все расширения, зарегистрированные для текущей информационной базы и текущего набора разделителей. Для этого следует использовать метод РасширенияКонфигурации.ВыполнитьФоновоеЗаданиеСРасширениямиБазыДанных(). Однако, в некоторых сценариях может потребоваться запускать фоновое задание совсем без расширений конфигурации. Для этого следует использовать метод РасширенияКонфигурации.ВыполнитьФоновоеЗаданиеБезРасширений().
18.3. Регламентные задания
Регламентные задания используются, когда необходимо выполнить определенные периодические или однократные действия в соответствии с расписанием.
Регламентные задания хранятся в информационной базе и создаются на основе метаданных регламентного задания, определенных в конфигурации. Метаданные задают такие параметры регламентного задания, как вызываемый метод, наименование, ключ, возможность использования, признак предопределенности и др. При создании регламентного задания дополнительно можно указать расписание (может быть указано в метаданных), значения параметров метода, имя пользователя, от имени которого должно выполняться регламентное задание, и др.
Создание и управление регламентными заданиями выполняется с помощью встроенного языка из любого соединения и разрешены только пользователям, имеющим административные права.
ПРИМЕЧАНИЕ. При работе в файловом варианте создавать и редактировать регламентные задания возможно без запуска планировщика заданий.
С регламентным заданием связан метод, который вызывается при выполнении регламентного задания. В качестве метода регламентного задания может выступать любая процедура или функция неглобального общего модуля, которую можно вызвать на сервере. Параметрами регламентного задания могут быть любые значения, которые разрешено передавать на сервер. Параметры регламентного задания должны в точности соответствовать параметрам той процедуры или функции, которую оно вызывает. Если методом регламентного задания является функция, то ее возвращаемое значение игнорируется.
Регламентное задание может иметь ключ ‑ любое прикладное значение. Ключ вводит ограничение на запуск регламентных заданий, т. к. в единицу времени среди регламентных заданий, связанных с одним и тем же объектом метаданных, может выполняться только одно регламентное задание с определенным значением ключа. Ключ позволяет группировать регламентные задания, связанные с одним и тем же объектом метаданных, по определенному прикладному признаку с тем, чтобы в рамках одной группы выполнялось не более одного регламентного задания.
При конфигурировании можно определить предопределенные регламентные задания. Предопределенные регламентные задания ничем не отличаются от обычных регламентных заданий, за исключением того, что их нельзя явно создавать и удалять. Если в метаданных регламентного задания установлен признак предопределенного регламентного задания, то при обновлении конфигурации в информационной базе автоматически будет создано предопределенное регламентное задание. Если признак предопределенности снят, то при обновлении конфигурации в информационной базе автоматически будет удалено предопределенное регламентное задание. Начальные значения свойств предопределенного регламентного задания (например, расписание) устанавливаются в метаданных. В дальнейшем при работе приложения их можно менять через соответствующие методы встроенного языка. Изменение свойств уже созданного предопределенного регламентного задания в метаданных не окажет влияния на реальные параметры этого задания в информационной базе. Предопределенные регламентные задания не имеют параметров.
Расписание регламентного задания определяет, в какие моменты времени регламентное задание должно быть запущено. Расписание позволяет:
● задавать дату и время начала и окончания выполнения задания;
● дни недели и месяцы, по которым нужно выполнять регламентное задание и др. (см. описание встроенного языка).
Примеры расписаний регламентных заданий:
| Расписание | Значения параметров |
| Каждый час, только один день | ПериодПовтораДней = 0ПериодПовтораВТечениеДня = 3600 |
| Каждый день один раз в день | ПериодПовтораДней = 1ПериодПовтораВТечениеДня = 0 |
| Один день, один раз | ПериодПовтораДней = 0 |
| Через день один раз в день | ПериодПовтораДней = 2 |
| Каждый час с 01.00 до 07.00 каждый день | ПериодПовтораДней = 1ПериодПовтораВТечениеДня = 3600ВремяНачала = 01.00ВремяКонца = 07.00 |
| Каждую субботу и воскресенье в 09.00 | ПериодПовтораДней = 1ДниНедели = 6, 7ВремяНачала = 09.00 |
| Каждый день одну неделю, неделя пропуска | ПериодПовтораДней = 1ПериодНедель = 2 |
| В 01.00 один раз | ВремяНачала = 01.00 |
| Последнее число каждого месяца в 9.00 | ПериодПовтораДней = 1ДеньВМесяце = -1ВремяНачала = 09.00 |
| Пятое число каждого месяца в 9.00 | ПериодПовтораДней = 1ДеньВМесяце = 5ВремяНачала = 09.00 |
| Вторая среда каждого месяца в 9.00 | ПериодПовтораДней = 1ДеньНеделиВМесяце = 2ДниНедели = 3ВремяНачала = 09.00 |
Можно проверять, выполняется ли задание для заданной даты (метод ТребуетсяВыполнение() объекта РасписаниеРегламентныхЗаданий). Регламентные задания всегда выполняются от имени определенного пользователя. Если пользователь регламентного задания не указан, то выполнение происходит с правами, которые определяются набором ролей, указанных в свойстве конфигурации ОсновныеРоли. В том случае, если в этом свойстве не указано ни одной роли, выполнение происходит без ограничения прав доступа.
Выполнение регламентных заданий происходит с использованием фоновых заданий. Когда планировщик определяет, что регламентное задание должно быть запущено, то автоматически на основе данного регламентного задания создается фоновое задание, которое и выполняет всю дальнейшую обработку. Если данное регламентное задание уже выполняется, то оно не будет запущено повторно, вне зависимости от его расписания.
Регламентные задания имеют возможность перезапуска. Это особенно актуально, когда метод регламентного задания должен быть гарантированно выполнен. Перезапуск регламентного задания осуществляется в том случае, когда оно завершено аварийно, либо когда рабочий процесс (в клиент-серверном варианте) или клиентский процесс (в файловом варианте), на котором выполнялось регламентное задание, завершен аварийно. В регламентном задании можно указать, сколько раз нужно его перезапускать (свойство Количество повторов при аварийном завершении), а также интервал между перезапусками (свойство Интервал повтора при аварийном завершении). После выполнения заданного количества перезапусков, попытки запуска прекращаются до момента, когда наступит очередное время старта регламентного задания (в соответствии с расписанием). При этом счетчик количества повторов сбрасывается и при аварийном завершении регламентного задания, процесс перезапуска начинается сначала.
При реализации метода перезапускаемого регламентного задания нужно учитывать, что при перезапуске его выполнение будет начато с начала, а не продолжено с момента аварийного завершения.
18.4. Особенности выполнения фоновых заданий в файловом и клиент-серверном вариантах
Механизмы выполнения фоновых заданий в файловом и клиент-серверном вариантах различаются.
18.4.1.1. Файловый вариант
Фоновые и регламентные задания выполняются клиентскими приложениями или расширением веб-сервера. Фоновые задания выполняются на том клиентском приложении, которое инициировало запуск фонового задания. Фоновые задания исполняются последовательно, т. е. на одном клиентском приложении не может одновременно выполняться два фоновых задания. В случае работы через веб-сервер, для каждой информационной базы, доступ к которой осуществляется через этот веб-сервер, организовано последовательное выполнение фоновых и регламентных заданий.
Поведение фоновых и регламентных заданий в файловом варианте имеет следующие особенности:
● Информация о фоновых заданиях, вызванных с помощью методов языка или выполняющих отчеты, доступна только в том клиентском приложении, которое их выполняло. Информация не сохраняется после завершения работы клиентского приложения.
● Информация о фоновых заданиях, инициированных регламентными заданиями, доступна на всех клиентских приложениях и сохраняется между запусками.
● Регламентные задания выполняются только одним клиентским приложением. Имеется возможность запретить запуск регламентных заданий определенным клиентским приложением или указать, что какое-либо клиентское приложение принудительно назначается исполнителем регламентных заданий. Такое управление осуществляется с помощью:
● Параметра командной строки /AllowExecuteScheduledJobs для толстого и тонкого клиентских приложений.
● Атрибута allowexecutescheduledjobs элемента point файла публикации default.vrd (см. здесь) в случае публикации информационной базы на веб-сервере.
● Регламентные задания выполняются первым, по порядку запуска, клиентским приложением, у которого не указан запрет выполнения регламентных заданий. После завершения сеанса этого клиентского приложения, выполнение переходит к какому-либо из оставшихся запущенными клиентских приложений. Если запускается клиентское приложение с явным указанием на необходимость исполнения регламентных заданий, то регламентные задания начинают выполняться этим клиентским приложением, независимо от наличия других клиентских приложений (включая расширения веб-сервера).
● Регламентные задания выполняются расширением веб-сервера до тех пор, пока расширение веб-сервера обслуживает хотя бы один клиентский сеанс.
● Регламентные задания обрабатываются один раз в 60 секунд.
● Инициализация планировщика фоновых заданий выполняется через 60 секунд после старта клиентского приложения или после попытки запустить первое фоновое задание. До момента запуска планировщика фоновых заданий в синхронном режиме выполняются следующие операции: поиск в динамическом списке, построение отчетов и поиск для ввода по строке.
● Инициализация механизма планировщика регламентных заданий выполняется через 60 секунд после запуска механизма планировщика фоновых заданий. Следовательно, регламентные задания прикладного решения начинают выполняться максимум через 120 секунд после запуска клиентского приложения.
● Выполняется принудительное завершение фоновых заданий, которые не завершились в течение 30 секунд после завершения работы клиентского приложения. В журнале регистрации в этом случае фиксируется событие Фоновое задание. Принудительное завершение (_$Job$_.Terminate).
● Не поддерживается работа регламентных заданий в файловом варианте информационной базы в сеансе, который получен с использованием automation-сервера «1С:Предприятия» или COM-соединения. Если в таком сеансе создаются фоновые задания, они размещаются в очереь, но запуск таких заданий выполнен не будет.
18.4.1.2. Клиент-серверный вариант
В клиент-серверном варианте для выполнения фоновых заданий используется планировщик заданий, который физически находится в менеджере кластера. Планировщик получает наименее загруженный рабочий процесс для всех поставленных в очередь на выполнение фоновых заданий и использует его для выполнения соответствующего фонового задания. Рабочий процесс выполняет задание и уведомляет планировщик о результатах выполнения.
В клиент-серверном варианте имеется возможность блокирования выполнения регламентных заданий. Блокирование выполнения регламентных заданий происходит в следующих случаях:
● На информационную базу установлена явная блокировка регламентных заданий. Блокировка может быть установлена через консоль кластера.
● На информационную базу установлена блокировка начала сеансов. Блокировка может быть установлена через консоль кластера.
● Из встроенного языка вызван метод УстановитьМонопольныйРежим() с параметром Истина.
● В некоторых других случаях (например, при обновлении конфигурации базы данных).
18.5. Создание метаданных регламентного задания
Перед тем как создать регламентное задание в информационной базе с помощью встроенного языка, необходимо создать для него объект конфигурации.
Для создания объекта конфигурации регламентного задания в ветке Общие дерева конфигурации для ветки Регламентные задания нужно выполнить команду Добавить.
Регламентное задание обладает рядом свойств, которые описаны ниже.
Имя метода ‑ указывается имя метода регламентного задания.
Ключ ‑ указывается произвольное строковое значение, которое будет использовано в качестве ключа регламентного задания.
Расписание ‑ указывается расписание регламентного задания. Для формирования расписания следует перейти по ссылке Открыть и в открывшейся форме расписания установить нужные значения.
На закладке Общее указывается дата начала и завершения задания и режим повтора.
Рис. 462. Общее расписание
На закладке Дневное указывается дневное расписание задания.
Рис. 463. Дневное расписание
В расписании можно указать:
● время начала и окончания задания;
● время завершения задания, после которого оно будет принудительно завершено;
● период повтора задания;
● продолжительность паузы между повторами;
Допускается указание произвольного сочетания условий.
На закладке Недельное указывается недельное расписание задания.
Рис. 464. Недельное расписание
Нужно установить флажки по тем дням недели, по которым задание будет выполняться. Если требуется повторять задание, указать интервал повтора в неделях. Например, задание выполняется через 2 недели, значение повтора ‑ 2.
В том случае, задано недельное расписание и значение свойства Повторять каждые больше 1, то при определении границ недели будет учитываться свойство Первый день недели, заданный в региональных настройках информационной базы (подробнее см. здесь).
На закладке Месячное указывается месячное расписание задания.
Рис. 465. Месячное расписание
Нужно установить флажки по тем месяцам, в которых задание будет выполняться. При необходимости можно указать конкретный день (месяца или недели) выполнения с начала месяца/недели или конца.
Использование ‑ если установлено, то задание будет выполняться согласно расписанию.
Предопределенное ‑ если установлено, то задание является предопределенным.
Количество повторов при аварийном завершении ‑ указывает количество повторов при аварийном завершении.
Интервал повтора при аварийном завершении ‑ указывает интервал повтора при аварийном завершении.
Пример создания фонового задания «Обновление индекса полнотекстового поиска»:
Пример создания регламентного задания «Восстановление последовательностей»: