Автоматизации
Что такое автоматизация
Автоматизация — это правило вида «когда происходит X с записью этой сущности — выполнить Y», которое срабатывает автоматически на сервере, без участия человека. Это самый простой по сравнению с бизнес-процессами механизм: автоматизация не показывает пользователю никаких задач и не ждёт его действий, она просто выполняет заданную логику в момент события.
Настраиваются автоматизации в редакторе сущности, на вкладке Автоматизация (доступна после того, как сущность сохранена хотя бы раз). Список правил представлен раскрывающимися блоками; кнопка Add Rule добавляет новое правило, а в пустом состоянии есть ссылка Create your first rule.
Каждое правило состоит из:
- названия (поле «Rule Name»),
- триггера — события, при котором правило срабатывает,
- необязательного условия,
- одного или нескольких действий, которые выполняются при срабатывании.
Триггеры
Доступны полные события жизненного цикла записи плюс отдельный тип для запуска по расписанию:
| Триггер | Когда срабатывает |
|---|---|
| Before Create | До создания записи — подходит для проверок и подстановки значений по умолчанию |
| After Create | После создания записи — подходит для уведомлений и логирования |
| Before Update | До сохранения изменений записи — подходит для вычислений и проверок |
| After Update | После сохранения изменений — подходит для синхронизации с другими данными и аудита |
| Before Delete | До удаления записи — подходит для проверок, можно ли удалять |
| After Delete | После удаления записи — подходит для зачистки связанных данных |
| Scheduled (Cron) | По расписанию, без привязки к событию над конкретной записью — см. раздел Автоматизации по расписанию ниже |
На триггерах «Before» можно изменить данные записи перед сохранением (в скрипте действия доступен массив данных записи на запись/изменение). На триггерах «Before Create» и «Before Delete» можно прервать операцию — выбросив исключение в скрипте действия, что отменяет создание/удаление записи с сообщением об ошибке.
Условие
Для триггеров Before Update и After Update доступен флажок Выполнять только если поле изменилось. При включении нужно выбрать конкретное поле из списка полей сущности — правило сработает только если значение именно этого поля действительно изменилось при сохранении. Для других триггеров условие не показывается (оно неприменимо — например, на создании ещё нет «старого» значения для сравнения).
Других типов условий (несколько условий, операторы сравнения, AND/OR) на уровне самого правила нет — более сложная фильтрация (например, «поле изменилось и новое значение равно X») реализуется внутри скрипта действия на основе переданных данных.
Действия
В одном правиле может быть несколько действий, выполняемых последовательно. Доступно три типа:
Script Block (PHP) — выполнить скрипт
Произвольный PHP-скрипт, который выполняется в защищённой песочнице (запрещены опасные операции — выполнение команд, прямой доступ к файловой системе, работа с БД/Artisan напрямую и т.п.). Внутри скрипта доступны:
$data— данные записи. Изменение этого массива наbefore-триггерах сохраняется вместе с записью.$user— текущий пользователь (id, имя, email) илиnull, если действие вызвано системой (например, по расписанию).$oldData— данные записи до изменения (доступно только на триггерах update).$api— вспомогательный объект с методами для работы с данными:$api->get('table', $id),$api->find('table', 'field', 'value'),$api->query('table', $conditions, $limit)— чтение записей (включая выборку по условиям — единственный способ найти нужные записи в скриптах по расписанию);$api->updateRecord('table', $id, $data)— обновление другой записи;$api->getRelatedByTable(...),$api->addRelatedByTable(...),$api->unlinkRelatedByTable(...)— работа со связанными записями;$api->sendTelegram(...),$api->sendEmail(...),$api->sendPushNotification(...)— отправка уведомлений;$api->now(),$api->parseDate(...),$api->log(...)— служебные хелперы;$api->categoryPath(...),$api->categoryAncestors(...),$api->categoryIsDescendantOf(...),$api->categoryChildren(...),$api->categoryFindByName(...),$api->categoryFindByPath(...)— работа с древовидными справочниками категорий.
Для остановки сохранения записи скрипт должен выбросить исключение (throw new \Exception("текст ошибки")).
Set Category (no-code) — проставить категорию без кода
Действие без программирования: автоматически устанавливает значение в поле типа Category (см. Типы полей). Настраивается:
- Целевое поле — какое поле-категорию заполнять;
- Режим — Статическое значение (всегда один и тот же узел справочника) или Из другого поля (найти узел по значению текстового поля записи);
- при поиске из поля — искать По имени узла или По полному пути (с настраиваемым разделителем, например «Электроника/Телефоны»), с возможностью ограничить поиск конкретной родительской веткой;
- Если узел не найден — оставить поле как было, очистить поле, или прервать сохранение с ошибкой.
Если на это же поле также пишет какой-то бизнес-процесс, конструктор показывает предупреждение о потенциальном конфликте порядка выполнения.
Start Process (BPMN) — запустить бизнес-процесс
Запускает выбранный шаблон бизнес-процесса, передавая текущую запись как входные данные. Требует уже существующую запись, поэтому на триггере Before Create это действие не выполняет ничего (записи с id ещё не существует).
Действия Set Category и Start Process недоступны для триггера Scheduled (Cron) — для него можно использовать только Script Block (PHP).
Автоматизации по расписанию
Автоматизации с триггером Scheduled (Cron) — самый недавно добавленный механизм платформы. Они отличаются от остальных триггеров тем, что не привязаны к событию над одной записью, а запускаются по расписанию глобально для всей сущности. Это удобно для регулярных пакетных операций: проверка просроченных дедлайнов, расчёт SLA, периодическая очистка, синхронизация с внешними системами.
Как настроить
- Откройте вкладку Автоматизация сущности, создайте правило (Add Rule) или откройте существующее.
- В поле Trigger Event выберите Scheduled (Cron).
- Заполните Cron-выражение — стандартное cron-выражение из 5 полей (минута, час, день месяца, месяц, день недели). Рядом есть кнопки-пресеты для быстрой подстановки: Каждые 5 мин (
*/5 * * * *), Каждые 15 мин (*/15 * * * *), Ежечасно (0 * * * *), Ежедневно в 09:00 (0 9 * * *). - Флажком Активно правило можно временно приостановить без удаления (подпись в интерфейсе: «снимите галочку, чтобы приостановить без удаления»).
- Добавьте действие Script Block (PHP) — единственный поддерживаемый тип действия для расписаний. Поскольку расписание не привязано к конкретной записи, в скрипте нет готовых
$data/$oldData— нужные записи нужно самостоятельно найти через$api->query('table', $conditions, $limit), например выбрать все просроченные заявки и обновить их через$api->updateRecord(...). - Рядом с настройками расписания есть кнопка ▶ Запустить сейчас — она выполняет правило немедленно, не дожидаясь расписания, и сразу показывает результат («Выполнено успешно» или текст ошибки).
Как это работает технически
Расписания не требуют отдельной настройки на сервере — Laravel-планировщик каждую минуту запускает системную команду, которая проверяет cron-выражения всех включённых scheduled-правил по всем сущностям и определяет, какое из них «пора выполнить» (сравнивая cron-выражение с моментом последнего фактического запуска правила). Те правила, которые наступили, выполняются автоматически.
Где смотреть статус и историю запусков
Все scheduled-правила по всем сущностям сразу собраны на отдельном экране Cron-задачи (Управление приложением → Система → Cron-задачи, адрес /cron-jobs). Таблица показывает:
| Колонка | Содержание |
|---|---|
| Сущность | К какой сущности относится правило |
| Правило | Название автоматизации |
| Расписание | Cron-выражение |
| Активно | Активно / Приостановлено |
| Последний запуск | Дата и время последнего фактического выполнения |
| Статус | Успешно / Ошибка (при ошибке — текст ошибки во всплывающей подсказке) / Ещё не запускалось |
| Следующий запуск | Расчётное время следующего срабатывания по cron-выражению |
| Действия | Кнопки Запустить сейчас и Открыть сущность (переход в редактор сущности к этому правилу) |
Важно: для каждого правила хранится только последний результат выполнения (время, статус, текст ошибки при сбое), а не полная история всех прошлых запусков — экран показывает текущее состояние расписаний, а не журнал. Если правило выполняется несколько раз, более старые результаты не сохраняются — каждый новый запуск перезаписывает предыдущий результат для этого правила.
Чем автоматизация отличается от бизнес-процесса
Автоматизация и бизнес-процесс решают разные задачи, и в редакторе сущности это два отдельных механизма (вкладки Автоматизация и Процессы):
- Автоматизация — это серверная логика без участия человека: «если случилось X — сделай Y» или «по расписанию делай Y». Нет ни задач, ни ожидания чьего-либо решения. Подходит для проверок, вычислений, проставления значений, уведомлений и периодических операций.
- Бизнес-процесс — это BPMN-схема с явными задачами для людей: запрос на согласование, ожидание выполнения работы, ветвление по решению пользователя. Подходит, когда в цепочке обработки записи есть шаг, требующий чьего-то осознанного решения.
Обе системы могут изменять одни и те же поля записи (например, и автоматизация, и процесс способны сменить статус или заполнить поле категории) — именно поэтому редактор показывает предупреждение о потенциальном конфликте, если одно и то же поле пишут оба механизма. На практике для одной сущности часто используют оба: автоматизации — для рутинных проверок и расчётов, бизнес-процесс — для шагов, где нужно действие человека.