14. Автоматизация по расписанию
Платформа позволяет выполнять процедуры по расписанию (CRON) и запускать фоновые задачи асинхронно.
14.1. Синтаксис расписания
РАСПИСАНИЕ ИмяРасписания
КРОН "секунды минуты часы дни месяцы дни_недели"
ВЫЗВАТЬ Процедура.ИмяПроцедуры
КОНЕЦ_РАСПИСАНИЯ
14.2. Формат CRON (6 полей)
| Поле | Диапазон |
|---|---|
| Секунды | 0-59 |
| Минуты | 0-59 |
| Часы | 0-23 |
| Дни месяца | 1-31 |
| Месяцы | 1-12 |
| Дни недели | 0-6 (0 = воскресенье) |
14.3. Примеры расписаний
# Каждые 10 секунд
РАСПИСАНИЕ ПроверкаНовых
КРОН "*/10 * * * * *"
ВЫЗВАТЬ Процедура.ПроверитьНовыеЗаказы
КОНЕЦ_РАСПИСАНИЯ
# Каждый час (в 0 минут)
РАСПИСАНИЕ ЧасовойОтчет
КРОН "0 0 * * * *"
ВЫЗВАТЬ Процедура.СформироватьОтчет
КОНЕЦ_РАСПИСАНИЯ
# Каждый день в 2 часа ночи
РАСПИСАНИЕ НочнаяОчистка
КРОН "0 0 2 * * *"
ВЫЗВАТЬ Процедура.ОчиститьСтарыеДанные
КОНЕЦ_РАСПИСАНИЯ
# Каждый понедельник в 9:00
РАСПИСАНИЕ ПонедельничныйОтчет
КРОН "0 0 9 * * 1"
ВЫЗВАТЬ Процедура.НедельныйОтчет
КОНЕЦ_РАСПИСАНИЯ
14.4. Фоновый вызов процедур
# Без аргументов
ВЫПОЛНИТЬ_ФОНОВО Процедура.ОтправитьУведомление
# С аргументами
ВЫПОЛНИТЬ_ФОНОВО Процедура.СоздатьПлатежку(data.id, data.Сумма)
14.5. Пример процедуры для расписания
ПРОЦЕДУРА ОчиститьСтарыеЗадачи
ВЫВЕСТИ "Запуск очистки старых задач"
# Находим задачи старше 30 дней
ВЫЧИСЛИТЬ Старые = НАЙТИ_ВСЕ("Задачи",
"Статус IN ('Закрыта', 'Отменена') AND Дата < date('now', '-30 days')")
ВЫЧИСЛИТЬ Удалено = 0
ЦИКЛ ПО Старые КАК Задача
ВЫЧИСЛИТЬ _ = УДАЛИТЬ_ОБЪЕКТ(Задача)
ВЫЧИСЛИТЬ Удалено = Удалено + 1
КОНЕЦ_ЦИКЛА
ВЫВЕСТИ "Удалено задач: " + Удалено
# Записываем результат в журнал
ВЫЧИСЛИТЬ Лог = СОЗДАТЬ("ЖурналОчистки")
ЗАПОЛНИТЬ Лог.Дата = ТЕКУЩАЯ_ДАТА_ВРЕМЯ()
ЗАПОЛНИТЬ Лог.УдаленоЗадач = Удалено
ВЫЧИСЛИТЬ _ = ЗАПИСАТЬ(Лог)
КОНЕЦ_ПРОЦЕДУРЫ
14.6. Предотвращение параллельного выполнения
ПРОЦЕДУРА ДолгаяЗадача
# Проверяем, не запущена ли уже
ЕСЛИ Константы.ФлагВыполнения == 1 ТО
ВЫВЕСТИ "Задача уже выполняется, пропускаем"
ВОЗВРАТ
КОНЕЦ
# Устанавливаем флаг
ЗАПОЛНИТЬ Константы.ФлагВыполнения = 1
ВЫЧИСЛИТЬ _ = ЗАПИСАТЬ(Константы)
# ... длительная работа ...
# Снимаем флаг
ЗАПОЛНИТЬ Константы.ФлагВыполнения = 0
ВЫЧИСЛИТЬ _ = ЗАПИСАТЬ(Константы)
КОНЕЦ_ПРОЦЕДУРЫ