В процессе разработки или администрирования систем на платформе 1С:Предприятие 8.3 часто возникает необходимость в гибкой настройке выполнения фоновых операций. Регламентные задания — это мощный инструмент для автоматизации рутинных задач, таких как обновление данных, формирование отчетов или очистка информации. Чтобы построить действительно эффективную систему, можно использовать готовый конвейер обработки задач, который позволяет создавать мощные цепочки фоновых процессов. Однако иногда стандартные средства конфигурации не позволяют в полной мере удовлетворить все требования к их периодичности. В таких случаях мы обращаемся к программному управлению расписанием регламентных заданий.
В этой статье мы подробно рассмотрим, как программно устанавливать и изменять интервал повтора и другие параметры расписания для существующих регламентных заданий, а также разберем нюансы работы с объектом РасписаниеРегламентногоЗадания. Если вы работаете в конфигурации, где минимизировано использование стандартных библиотек, вам будет полезен пример того, как реализовать фоновые задания, отслеживание результата и индикацию прогресса без БСП.
Для программного управления регламентными заданиями в 1С мы будем использовать два ключевых объекта: РегламентноеЗадание и РасписаниеРегламентногоЗадания. Объект РегламентноеЗадание представляет само задание (его имя, метод, использование), а свойство Расписание этого объекта является экземпляром РасписаниеРегламентногоЗадания, которое и содержит всю информацию о периодичности выполнения.
Прежде всего, нам необходимо получить ссылку на нужное регламентное задание. Сделать это можно с помощью метода РегламентныеЗадания.НайтиПоИмени(), передав ему точное имя вашего задания.
// Определяем имя регламентного задания, которое хотим настроить
ИмяЗадания = "МоеРегламентноеЗадание";
// Получаем объект регламентного задания по его имени
РегЗадание = РегламентныеЗадания.НайтиПоИмени(ИмяЗадания);
Если РегЗадание = Неопределено Тогда
Сообщить("Регламентное задание с именем '" + ИмяЗадания + "' не найдено. Проверьте правильность имени.", СтатусСообщения.Внимание);
Возврат;
КонецЕсли;
// Дальнейшие действия будем выполнять с найденным РегЗадание
Важно отметить, что все изменения расписания не вступят в силу до тех пор, пока мы явно не сохраним их с помощью метода Записать() у объекта РегламентноеЗадание.
Одной из наиболее частых задач является установка интервала повтора, то есть запуск задания каждые N минут или часов. Для этого мы создадим новый объект РасписаниеРегламентногоЗадания и настроим его свойства.
Рассмотрим по шагам, как установить интервал повтора в 15 минут:
РасписаниеРегламентногоЗадания, который мы будем конфигурировать.Начало и Конец объекта РасписаниеРегламентногоЗадания определяют временной диапазон, в течение которого расписание активно. Если мы хотим, чтобы задание запускалось в течение всего дня, можно указать начало и конец дня. Дата в этих значениях обычно не играет роли при установке интервала, поэтому часто используют дату начала эпохи '00010101000000'.ИнтервалПовтора принимает значение в секундах. Поэтому, если нам нужен интервал в минутах, необходимо умножить количество минут на 60.ИспользованиеДнейНедели, ИспользованиеМесяцев, ИспользованиеГодовыхДаты должны быть установлены в Ложь, если мы не хотим их использовать.Расписание нашего РегламентногоЗадание и вызываем метод Записать().Вот пример кода, реализующий эти шаги:
// ... (получаем РегЗадание, как показано выше)
// Определяем желаемый интервал повтора в минутах
ИнтервалПовтораВМинутах = 15;
// Создаем новый объект расписания регламентного задания
НовоеРасписание = Новый РасписаниеРегламентногоЗадания;
// Устанавливаем параметры расписания для ежедневного выполнения с интервалом
// Начало и Конец определяют временной диапазон в рамках дня, в котором расписание активно.
НовоеРасписание.Начало = '00010101000000';
НовоеРасписание.Конец = '00010101235959';
// Устанавливаем интервал повтора в секундах
НовоеРасписание.ИнтервалПовтора = ИнтервалПовтораВМинутах * 60;
// Отключаем использование специфических интервалов
НовоеРасписание.ИспользованиеДнейНедели = Ложь;
НовоеРасписание.ИспользованиеМесяцев = Ложь;
НовоеРасписание.ИспользованиеГодовыхДаты = Ложь;
// Присваиваем новое расписание регламентному заданию
РегЗадание.Расписание = НовоеРасписание;
Попытка
// Записываем изменения, чтобы они вступили в силу
РегЗадание.Записать();
Сообщить("Расписание для задания '" + ИмяЗадания + "' успешно обновлено. Интервал: " + ИнтервалПовтораВМинутах + " мин.");
Исключение
Сообщить("Ошибка при записи расписания для задания '" + ИмяЗадания + "': " + ОписаниеОшибки(), СтатусСообщения.Ошибка);
КонецПопытки;
Помните, что сервер 1С периодически проверяет расписания регламентных заданий. Изменения, внесенные программно, вступят в силу при следующей проверке, обычно в течение нескольких минут.
Иногда требуется, чтобы регламентное задание запускалось не просто с интервалом, а в строго определенные моменты времени в течение дня (например, в 9:00, 12:00, 15:00). Для настройки конкретных точек запуска объект РасписаниеРегламентногоЗадания предоставляет коллекцию ВремяНачала.
Рассмотрим, как настроить запуск в 9:00, 12:00 и 15:00:
ИспользованиеДневногоРасписания = Истина.Начало и Конец теперь будут определять общий диапазон в рамках дня, в котором эти конкретные точки времени могут быть применены.Добавить() коллекции ВремяНачала, передавая ему строковое представление времени (например, '00010101090000' для 9 утра).
// ... (получаем РегЗадание, как показано выше)
// Создаем новый объект расписания регламентного задания
НовоеРасписание = Новый РасписаниеРегламентногоЗадания;
// Устанавливаем, что используем дневное расписание
НовоеРасписание.ИспользованиеДневногоРасписания = Истина;
// Определяем общий диапазон в рамках дня
НовоеРасписание.Начало = '00010101080000';
НовоеРасписание.Конец = '00010101180000';
// Добавляем конкретные моменты времени для запуска
НовоеРасписание.ВремяНачала.Добавить('00010101090000'); // Запуск в 9:00:00
НовоеРасписание.ВремяНачала.Добавить('00010101120000'); // Запуск в 12:00:00
НовоеРасписание.ВремяНачала.Добавить('00010101150000'); // Запуск в 15:00:00
// Присваиваем новое расписание регламентному заданию
РегЗадание.Расписание = НовоеРасписание;
Попытка
// Записываем изменения
РегЗадание.Записать();
Сообщить("Расписание для задания '" + ИмяЗадания + "' успешно обновлено. Запуск в 9:00, 12:00, 15:00.");
Исключение
Сообщить("Ошибка при записи расписания для задания '" + ИмяЗадания + "': " + ОписаниеОшибки(), СтатусСообщения.Ошибка);
КонецПопытки;
Объект РасписаниеРегламентногоЗадания предоставляет гораздо больше возможностей для тонкой настройки периодичности. Если вам требуется максимально гибкая настройка в стиле Unix-систем, обратите внимание на конструктор Cron расписания, который поможет сформировать сложную строку расписания для различных нужд платформы.
Мы можем настроить расписание по:
ДатаНачала и ДатаОкончания позволяют задать общий временной период действия расписания.Пример настройки расписания для запуска по будням с интервалом в 30 минут:
// ... (получаем РегЗадание, как показано выше)
НовоеРасписание = Новый РасписаниеРегламентногоЗадания;
НовоеРасписание.Начало = '00010101080000';
НовоеРасписание.Конец = '00010101170000';
НовоеРасписание.ИнтервалПовтора = 30 * 60;
НовоеРасписание.ИспользованиеДнейНедели = Истина;
НовоеРасписание.ДниНедели.Добавить(ДеньНедели.Понедельник);
НовоеРасписание.ДниНедели.Добавить(ДеньНедели.Вторник);
НовоеРасписание.ДниНедели.Добавить(ДеньНедели.Среда);
НовоеРасписание.ДниНедели.Добавить(ДеньНедели.Четверг);
НовоеРасписание.ДниНедели.Добавить(ДеньНедели.Пятница);
// ... (запись задания)
Помимо расписания, мы можем программно управлять и активностью задания. Свойство Использование объекта РегламентноеЗадание позволяет включать или выключать его. При выполнении длительных процессов для удобства пользователей часто реализуется индикация прогресса выполнения фонового задания на управляемой форме, что делает работу системы более прозрачной.
Включение регламентного задания:
РегЗадание.Использование = Истина;
РегЗадание.Записать();
Иногда требуется запустить регламентное задание немедленно, вне зависимости от его текущего расписания. Для этого служит метод ВыполнитьСейчас(). Это инициирует однократный запуск.
При программной настройке регламентных заданий необходимо учитывать несколько важных моментов:
НайтиПоИмени().Записать() обязателен.Попытка-Исключение.Программное управление регламентными заданиями предоставляет разработчикам 1С высокую гибкость. Понимание работы с объектами РегламентноеЗадание и РасписаниеРегламентногоЗадания позволяет создавать стабильные и адаптируемые решения для автоматизации бизнеса.