Как программно установить или изменить интервал автообновления и расписание регламентного задания в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки или администрирования систем на платформе 1С:Предприятие 8.3 часто возникает необходимость в гибкой настройке выполнения фоновых операций. Регламентные задания — это мощный инструмент для автоматизации рутинных задач, таких как обновление данных, формирование отчетов или очистка информации. Чтобы построить действительно эффективную систему, можно использовать готовый конвейер обработки задач, который позволяет создавать мощные цепочки фоновых процессов. Однако иногда стандартные средства конфигурации не позволяют в полной мере удовлетворить все требования к их периодичности. В таких случаях мы обращаемся к программному управлению расписанием регламентных заданий.

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

Основы работы с регламентными заданиями программно

Для программного управления регламентными заданиями в 1С мы будем использовать два ключевых объекта: РегламентноеЗадание и РасписаниеРегламентногоЗадания. Объект РегламентноеЗадание представляет само задание (его имя, метод, использование), а свойство Расписание этого объекта является экземпляром РасписаниеРегламентногоЗадания, которое и содержит всю информацию о периодичности выполнения.

Прежде всего, нам необходимо получить ссылку на нужное регламентное задание. Сделать это можно с помощью метода РегламентныеЗадания.НайтиПоИмени(), передав ему точное имя вашего задания.


// Определяем имя регламентного задания, которое хотим настроить
ИмяЗадания = "МоеРегламентноеЗадание"; 

// Получаем объект регламентного задания по его имени
РегЗадание = РегламентныеЗадания.НайтиПоИмени(ИмяЗадания);

Если РегЗадание = Неопределено Тогда
    Сообщить("Регламентное задание с именем '" + ИмяЗадания + "' не найдено. Проверьте правильность имени.", СтатусСообщения.Внимание);
    Возврат;
КонецЕсли;

// Дальнейшие действия будем выполнять с найденным РегЗадание

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

Настройка интервала повтора (периода автообновления)

Одной из наиболее частых задач является установка интервала повтора, то есть запуск задания каждые N минут или часов. Для этого мы создадим новый объект РасписаниеРегламентногоЗадания и настроим его свойства.

Рассмотрим по шагам, как установить интервал повтора в 15 минут:

  1. Создаем новый объект расписания: Нам понадобится новый экземпляр РасписаниеРегламентногоЗадания, который мы будем конфигурировать.
  2. Задаем начало и конец интервала: Свойства Начало и Конец объекта РасписаниеРегламентногоЗадания определяют временной диапазон, в течение которого расписание активно. Если мы хотим, чтобы задание запускалось в течение всего дня, можно указать начало и конец дня. Дата в этих значениях обычно не играет роли при установке интервала, поэтому часто используют дату начала эпохи '00010101000000'.
  3. Устанавливаем интервал повтора: Свойство ИнтервалПовтора принимает значение в секундах. Поэтому, если нам нужен интервал в минутах, необходимо умножить количество минут на 60.
  4. Настраиваем тип расписания: Для ежедневного запуска с интервалом, нам нужно убедиться, что не используются специфические настройки для дней недели, месяцев или годовых дат. То есть, свойства ИспользованиеДнейНедели, ИспользованиеМесяцев, ИспользованиеГодовыхДаты должны быть установлены в Ложь, если мы не хотим их использовать.
  5. Присваиваем новое расписание и записываем изменения: После настройки нового объекта расписания, мы присваиваем его свойству Расписание нашего РегламентногоЗадание и вызываем метод Записать().

Вот пример кода, реализующий эти шаги:


// ... (получаем РегЗадание, как показано выше)

// Определяем желаемый интервал повтора в минутах
ИнтервалПовтораВМинутах = 15; 

// Создаем новый объект расписания регламентного задания
НовоеРасписание = Новый РасписаниеРегламентногоЗадания;

// Устанавливаем параметры расписания для ежедневного выполнения с интервалом
// Начало и Конец определяют временной диапазон в рамках дня, в котором расписание активно.
НовоеРасписание.Начало = '00010101000000'; 
НовоеРасписание.Конец = '00010101235959'; 

// Устанавливаем интервал повтора в секундах
НовоеРасписание.ИнтервалПовтора = ИнтервалПовтораВМинутах * 60; 

// Отключаем использование специфических интервалов
НовоеРасписание.ИспользованиеДнейНедели = Ложь; 
НовоеРасписание.ИспользованиеМесяцев = Ложь;
НовоеРасписание.ИспользованиеГодовыхДаты = Ложь;

// Присваиваем новое расписание регламентному заданию
РегЗадание.Расписание = НовоеРасписание;

Попытка
    // Записываем изменения, чтобы они вступили в силу
    РегЗадание.Записать();
    Сообщить("Расписание для задания '" + ИмяЗадания + "' успешно обновлено. Интервал: " + ИнтервалПовтораВМинутах + " мин.");
Исключение
    Сообщить("Ошибка при записи расписания для задания '" + ИмяЗадания + "': " + ОписаниеОшибки(), СтатусСообщения.Ошибка);
КонецПопытки;

Помните, что сервер 1С периодически проверяет расписания регламентных заданий. Изменения, внесенные программно, вступят в силу при следующей проверке, обычно в течение нескольких минут.

Настройка расписания по конкретным точкам времени

Иногда требуется, чтобы регламентное задание запускалось не просто с интервалом, а в строго определенные моменты времени в течение дня (например, в 9:00, 12:00, 15:00). Для настройки конкретных точек запуска объект РасписаниеРегламентногоЗадания предоставляет коллекцию ВремяНачала.

Рассмотрим, как настроить запуск в 9:00, 12:00 и 15:00:

  1. Создаем новое расписание: Аналогично предыдущему случаю.
  2. Устанавливаем использование дневного расписания: Для работы с конкретными точками времени внутри дня, мы явно устанавливаем ИспользованиеДневногоРасписания = Истина.
  3. Задаем общий диапазон времени: Свойства Начало и Конец теперь будут определять общий диапазон в рамках дня, в котором эти конкретные точки времени могут быть применены.
  4. Добавляем конкретные точки времени: Используем метод Добавить() коллекции ВремяНачала, передавая ему строковое представление времени (например, '00010101090000' для 9 утра).
  5. Присваиваем и записываем: Как и прежде, присваиваем новое расписание и сохраняем.

// ... (получаем РегЗадание, как показано выше)

// Создаем новый объект расписания регламентного задания
НовоеРасписание = Новый РасписаниеРегламентногоЗадания;

// Устанавливаем, что используем дневное расписание
НовоеРасписание.ИспользованиеДневногоРасписания = Истина;

// Определяем общий диапазон в рамках дня
НовоеРасписание.Начало = '00010101080000'; 
НовоеРасписание.Конец = '00010101180000'; 

// Добавляем конкретные моменты времени для запуска
НовоеРасписание.ВремяНачала.Добавить('00010101090000'); // Запуск в 9:00:00
НовоеРасписание.ВремяНачала.Добавить('00010101120000'); // Запуск в 12:00:00
НовоеРасписание.ВремяНачала.Добавить('00010101150000'); // Запуск в 15:00:00

// Присваиваем новое расписание регламентному заданию
РегЗадание.Расписание = НовоеРасписание;

Попытка
    // Записываем изменения
    РегЗадание.Записать();
    Сообщить("Расписание для задания '" + ИмяЗадания + "' успешно обновлено. Запуск в 9:00, 12:00, 15:00.");
Исключение
    Сообщить("Ошибка при записи расписания для задания '" + ИмяЗадания + "': " + ОписаниеОшибки(), СтатусСообщения.Ошибка);
КонецПопытки;

Расширенные настройки периодичности

Объект РасписаниеРегламентногоЗадания предоставляет гораздо больше возможностей для тонкой настройки периодичности. Если вам требуется максимально гибкая настройка в стиле Unix-систем, обратите внимание на конструктор Cron расписания, который поможет сформировать сложную строку расписания для различных нужд платформы.

Мы можем настроить расписание по:

  1. Дням недели: Если задание должно выполняться только по будням или выходным.
  2. Месяцам: Если задание актуально только в определенные периоды года.
  3. Годовым датам: Для выполнения задания в конкретные дни (например, 15 января).
  4. Дате начала и дате окончания расписания: Свойства ДатаНачала и ДатаОкончания позволяют задать общий временной период действия расписания.

Пример настройки расписания для запуска по будням с интервалом в 30 минут:


// ... (получаем РегЗадание, как показано выше)
НовоеРасписание = Новый РасписаниеРегламентногоЗадания;
НовоеРасписание.Начало = '00010101080000'; 
НовоеРасписание.Конец = '00010101170000'; 
НовоеРасписание.ИнтервалПовтора = 30 * 60; 
НовоеРасписание.ИспользованиеДнейНедели = Истина;
НовоеРасписание.ДниНедели.Добавить(ДеньНедели.Понедельник);
НовоеРасписание.ДниНедели.Добавить(ДеньНедели.Вторник);
НовоеРасписание.ДниНедели.Добавить(ДеньНедели.Среда);
НовоеРасписание.ДниНедели.Добавить(ДеньНедели.Четверг);
НовоеРасписание.ДниНедели.Добавить(ДеньНедели.Пятница);
// ... (запись задания)

Управление состоянием регламентного задания

Помимо расписания, мы можем программно управлять и активностью задания. Свойство Использование объекта РегламентноеЗадание позволяет включать или выключать его. При выполнении длительных процессов для удобства пользователей часто реализуется индикация прогресса выполнения фонового задания на управляемой форме, что делает работу системы более прозрачной.

Включение регламентного задания:


РегЗадание.Использование = Истина;
РегЗадание.Записать();

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

Особые моменты и рекомендации

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

  1. Проверка существования задания: Всегда проверяйте результат НайтиПоИмени().
  2. Сохранение изменений: Метод Записать() обязателен.
  3. Контекст выполнения: Код должен выполняться на стороне сервера.
  4. Обработка ошибок: Используйте блоки Попытка-Исключение.
  5. Отладка: Отладка регламентных заданий может быть сложной. Чтобы упростить этот процесс, используйте расширение для отладки внешних обработок, которое позволяет эффективно устанавливать точки останова в коде, участвующем в регламентных заданиях.

Программное управление регламентными заданиями предоставляет разработчикам 1С высокую гибкость. Понимание работы с объектами РегламентноеЗадание и РасписаниеРегламентногоЗадания позволяет создавать стабильные и адаптируемые решения для автоматизации бизнеса.

← На главную