3ERP

3ERP - простая и бесплатная программа для бухгалтерского и оперативного учёта в учреждениях сферы торговли и услуг, общественного питания, складского хранения, автосервиса, медицины, логистики, производства, управления работами и заявками, поддерживающая до 100 пользователей, на русском языке и полностью бесплатная для 1 пользователя. На сайт (скачать)

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
    ВЫЧИСЛИТЬ _ = ЗАПИСАТЬ(Константы)
КОНЕЦ_ПРОЦЕДУРЫ
3556 | 0 | 3556 | 378 | 192 | 59