# Глава 6. Workflow — пусть система работает за нас

В прошлой главе мы добавили права, чтобы разные роли видели разное. Но все операции пока вручную: новая заявка пришла — надо самому посмотреть, статус сменился — никто не знает.

В этой главе с помощью [Workflow](/workflow) NocoBase **система начнёт работать сама** — настроим [условные ветвления](/workflow/nodes/condition) и узлы [автоматического обновления](/workflow/nodes/update) для автоматического перевода статуса заявки и записи времени её создания.

## 6.1 Что такое [Workflow](/workflow)

Workflow — это набор автоматизированных правил «если…, то…».

Аналогия: будильник на телефоне срабатывает каждый день в 8 утра. Будильник — простейший workflow: **выполнено условие (наступило 8 утра) — выполняется действие (звонит)**.

Workflow в NocoBase устроен так же:

![06-workflows-2026-03-20-13-25-38](https://static-docs.nocobase.com/06-workflows-2026-03-20-13-25-38.jpg)

- **[Триггер](/workflow/triggers/collection)**: точка входа. Например, «кто-то создал новую заявку» или «обновлена запись».
- **Условное ветвление**: опциональный шаг фильтрации. Например, «продолжаем только если обработчик не пустой».
- **Действия**: собственно работа. Например, «отправить уведомление» или «обновить поле».

Действия складываются в цепочку из узлов; типичные категории узлов:

- **Управление потоком**: условные ветвления, параллельные ветви, циклы, задержки
- **Работа с данными**: создание, обновление, чтение, удаление
- **Уведомления и внешние сервисы**: уведомления, HTTP-запросы, вычисления

В этом учебнике используются только самые распространённые из них — этого хватает на большинство сценариев.

### Типы триггеров

NocoBase предлагает несколько типов триггеров (выбираются при создании workflow):

| Триггер | Описание | Типичный сценарий |
|-------|------|---------|
| [**Событие таблицы**](/workflow/triggers/collection) | При создании, обновлении или удалении данных | Уведомление о новой заявке, журналирование смены статуса |
| [**Запланированная задача**](/workflow/triggers/schedule) | По cron или фиксированному времени | Ежедневный отчёт, регулярная очистка |
| [**Событие после операции**](../../workflow/triggers/post-action.md) | После действия пользователя в интерфейсе | Уведомление после отправки формы, журнал |
| **Согласование** | Запуск процесса согласования с многоступенчатой структурой | Согласование отпуска, закупки |
| **Кастомное действие** | Привязка к кастомной кнопке, срабатывает по клику | Архивирование, массовая операция |
| **Событие до операции** | Перехват действия, синхронное выполнение, потом проход | Валидация перед отправкой, автозаполнение |
| **AI Employee** | Workflow доступен AI-сотруднику как инструмент | Автоматические бизнес-операции AI |

В учебнике мы используем **Событие таблицы** и **Кастомное действие** — остальные настраиваются аналогично.

Workflow — встроенный plugin NocoBase, ничего дополнительно ставить не нужно.

## 6.2 Сценарий 1: новое заявление автоматически уведомляет обработчика

**Требование**: когда создаётся новая заявка с обозначенным обработчиком, система автоматически отправляет ему внутрисистемное сообщение «прилетела работа».

### Шаг 1. Создаём workflow

В правом верхнем углу откройте меню настройки plugin и зайдите в **Workflow management**.

![06-workflows-2026-03-14-23-50-45](https://static-docs.nocobase.com/06-workflows-2026-03-14-23-50-45.png)


Нажмите **«Создать»**, в диалоге:

- **Название**: «Уведомление обработчика о новой заявке»
- **Тип триггера**: **Событие таблицы**

![06-workflows-2026-03-14-23-53-37](https://static-docs.nocobase.com/06-workflows-2026-03-14-23-53-37.png)


Подтвердите, в списке нажмите ссылку **«Configure»** и зайдёте в редактор процесса.

### Шаг 2. Настраиваем триггер

Кликните на карточку триггера, откроется панель настройки:

- **[Таблица](/data-sources/data-modeling/collection)**: главный источник / «Заявки»
- **Когда срабатывает**: «После создания или обновления данных»
- **Изменённые [поля](/data-sources/data-modeling/collection-fields)**: отметьте «Обработчик (Assignee)» — триггер будет срабатывать только при изменении этого поля, лишних уведомлений не будет (при создании все поля считаются изменёнными, поэтому новое создание тоже сработает)
- **Условие срабатывания**: режим «удовлетворяет **любое** из условий», добавьте два:
  - `assignee_id` не пуст
  - `Assignee / ID` не пуст

  > Зачем два условия? Потому что в моменте триггера в форме может быть только внешний ключ (assignee_id) без подтянутого связного объекта, или наоборот — связной объект есть, а внешний ключ пуст. Связь по «ИЛИ» гарантирует срабатывание, если назначен обработчик.

- **Подгружать связные данные**: отметьте «Assignee» — узел уведомления будет использовать данные обработчика, их нужно подтянуть заранее в триггере.

![06-workflows-2026-03-14-23-58-31](https://static-docs.nocobase.com/06-workflows-2026-03-14-23-58-31.png)

Сохраните. Триггер сам уже выполнил фильтрацию по условию — отдельный узел условного ветвления не нужен.

### Шаг 3. Добавляем узел уведомления

Нажмите **+** под триггером, выберите узел **Notification**.

![06-workflows-2026-03-15-00-00-55](https://static-docs.nocobase.com/06-workflows-2026-03-15-00-00-55.png)

Откройте настройки узла. Первое поле — выбор **канала уведомления**, но ни одного канала ещё нет — список пустой. Создадим.

![06-workflows-2026-03-15-00-10-12](https://static-docs.nocobase.com/06-workflows-2026-03-15-00-10-12.png)


### Шаг 4. Создаём канал уведомлений

NocoBase поддерживает разные каналы:

| Тип канала | Описание |
|---------|------|
| **Внутрисистемное сообщение** | Уведомление в браузере, в реальном времени попадает в центр уведомлений пользователя |
| **Email** | Через SMTP, нужен настроенный почтовый сервер |

В учебнике используем самый простой — **внутрисистемное сообщение**:

1. Откройте plugin-настройки в правом верхнем углу, перейдите в **Notification management**.
2. Нажмите **«Новый канал»**.

![06-workflows-2026-03-15-00-13-07](https://static-docs.nocobase.com/06-workflows-2026-03-15-00-13-07.png)

3. Тип канала — **внутрисистемное сообщение**, имя — «Системные сообщения».
4. Сохраните.

![06-workflows-2026-03-15-00-17-55](https://static-docs.nocobase.com/06-workflows-2026-03-15-00-17-55.png)

### Шаг 5. Настраиваем узел уведомления

Возвращаемся в редактор workflow и открываем настройки узла Notification.

Параметры:

- **Канал уведомления**: выберите «Системные сообщения»
- **Получатель**: «Запрос пользователей → id = Переменная триггера / Триггерные данные / Обработчик / ID»
- **Заголовок**: например, «У Вас новая заявка». Поддерживаются переменные, можно добавить заголовок заявки: `Новая заявка: {{Триггерные данные / Заголовок}}`
- **Содержимое**: тело уведомления, тоже с переменными — приоритет, описание и т. д.

![06-workflows-2026-03-15-20-10-11](https://static-docs.nocobase.com/06-workflows-2026-03-15-20-10-11.png)

(Сейчас пойдём за адресом заявки — перед выходом не забудьте сохранить!)

- **Десктопная страница деталей**: путь URL детальной страницы заявки. Как получить: откройте на фронтенде любую заявку в виде окна деталей, скопируйте адрес из строки браузера, формат вроде `/admin/camcwbox2uc/view/d8f8e122d37/filterbytk/353072988225540`. Вставьте путь в поле; число после `filterbytk/` — это ID заявки. Замените эту часть переменной ID триггерных данных (выбор переменной → Триггерные данные → ID). После настройки клик по уведомлению в списке отправит пользователя сразу на страницу деталей и автоматически отметит уведомление как прочитанное.

![06-workflows-2026-03-15-00-28-32](https://static-docs.nocobase.com/06-workflows-2026-03-15-00-28-32.png)

![06-workflows-2026-03-15-20-15-19](https://static-docs.nocobase.com/06-workflows-2026-03-15-20-15-19.png)

- **Продолжать при ошибке отправки**: опционально; если включено, workflow не прервётся при ошибке отправки уведомления.

> После отправки обработчик увидит сообщение в **центре уведомлений** в правом верхнем углу, у непрочитанных будет красная точка. Клик по уведомлению — переход на страницу деталей.

### Шаг 6. Тест и активация

> Полная цепочка сценария 1 включает только два узла: триггер (с фильтрами) → уведомление. Просто и эффективно.

Не торопитесь активировать — workflow поддерживает **ручной запуск** для проверки на конкретных данных:

1. Нажмите **«Execute»** в правом верхнем углу (а не переключатель активации).
2. Выберите существующую заявку как триггерные данные.
  > Если в выборе заявки отображается ID, в Data sources → Collections → Заявки задайте «Заголовок» как title field.
![06-workflows-2026-03-15-19-47-57](https://static-docs.nocobase.com/06-workflows-2026-03-15-19-47-57.png)

3. Нажмите Execute — workflow выполнится и автоматически переключится на скопированную новую версию.
![06-workflows-2026-03-15-19-57-19](https://static-docs.nocobase.com/06-workflows-2026-03-15-19-57-19.png)

4. Нажмите три точки в правом верхнем углу и выберите **Execution history** — увидите запись только что выполненного запуска. Кликнув её, можно посмотреть детали: триггер, выполнение каждого узла, параметры.
![06-workflows-2026-03-15-19-58-34](https://static-docs.nocobase.com/06-workflows-2026-03-15-19-58-34.png)

![06-workflows-2026-03-15-20-01-02](https://static-docs.nocobase.com/06-workflows-2026-03-15-20-01-02.png)


5. Заявка была назначена Alice, переключимся под её аккаунт — уведомление пришло!

![06-workflows-2026-03-15-20-16-22](https://static-docs.nocobase.com/06-workflows-2026-03-15-20-16-22.png)

Клик переходит на страницу заявки и помечает уведомление прочитанным.

![06-workflows-2026-03-15-20-16-54](https://static-docs.nocobase.com/06-workflows-2026-03-15-20-16-54.png)


Убедившись, что всё работает, переключите тумблер активации в правом верхнем углу.

![06-workflows-2026-03-15-20-18-16](https://static-docs.nocobase.com/06-workflows-2026-03-15-20-18-16.png)

> **Внимание**: после первого выполнения workflow (включая ручное) становится **только для чтения** (серый), редактировать его нельзя. Чтобы изменить, нажмите **«Copy to new version»** и работайте на новой версии. Старая версия автоматически отключится.

![06-workflows-2026-03-15-20-19-11](https://static-docs.nocobase.com/06-workflows-2026-03-15-20-19-11.png)

Возвращаемся на страницу заявок, создаём новую с обработчиком, потом логинимся под обработчиком — в центре уведомлений должно появиться новое сообщение.

![06-workflows-2026-03-15-20-22-00](https://static-docs.nocobase.com/06-workflows-2026-03-15-20-22-00.gif)

Поздравляем, первый автоматический сценарий запущен!

## 6.3 Сценарий 2: смена статуса автоматически фиксирует время завершения

**Требование**: когда статус заявки становится «Завершено», система автоматически проставляет в поле «Время завершения» текущее время. Не надо записывать вручную и ничего не забудется.

> Если в таблице заявок ещё нет поля «Время завершения», добавьте поле типа **Date** в **Управление таблицами → Заявки** (см. Главу 2).
> ![06-workflows-2026-03-15-20-25-38](https://static-docs.nocobase.com/06-workflows-2026-03-15-20-25-38.png)

### Шаг 1. Новый workflow

Возвращаемся в Workflow management, нажимаем «Создать»:

- **Название**: «Автозапись времени завершения заявки»
- **Тип триггера**: **Кастомное действие** (срабатывает по клику кнопки, привязанной к workflow)
- **Режим выполнения**: синхронный
> О синхронном и асинхронном:
> - Асинхронный: после операции можно делать другие дела, workflow выполняется в фоне и уведомляет о результате
> - Синхронный: интерфейс ждёт окончания workflow, и только потом можно работать дальше

![06-workflows-2026-03-19-22-56-34](https://static-docs.nocobase.com/06-workflows-2026-03-19-22-56-34.png)

### Шаг 2. Настраиваем триггер

Откройте настройки триггера:

- **Таблица**: «Заявки»
- **Режим выполнения**: **однострочный** (за раз обрабатывается только текущая выбранная заявка)

![06-workflows-2026-03-19-22-58-21](https://static-docs.nocobase.com/06-workflows-2026-03-19-22-58-21.png)

<!-- TODO: дополнить скриншотом настройки триггера -->


### Шаг 3. Добавляем условное ветвление

В отличие от триггера события таблицы, у кастомного действия нет встроенных условий — добавляем узел условного ветвления сами:

![06-workflows-2026-03-15-20-39-14](https://static-docs.nocobase.com/06-workflows-2026-03-15-20-39-14.png)

Рекомендуем выбрать «Продолжать раздельно по «Да» и «Нет»» — удобно расширять.

- Условие: **Триггерные данные → Статус** не равно **Завершено** (только незавершённые заявки проходят дальше, повторно не обрабатываются)

![06-workflows-2026-03-19-22-37-59](https://static-docs.nocobase.com/06-workflows-2026-03-19-22-37-59.png)

### Шаг 4. Добавляем узел обновления данных

В ветке «Да» условного узла нажмите **+**, выберите **Update data**:

![06-workflows-2026-03-15-20-46-22](https://static-docs.nocobase.com/06-workflows-2026-03-15-20-46-22.png)

- **Таблица**: «Заявки»
- **Условие фильтрации**: ID = Триггерные данные → ID (обновим только текущую заявку)
- **Значения полей**:
  - Статус = **Завершено**
  - Время завершения = **Системная переменная / Системное время**

![06-workflows-2026-03-19-22-39-27](https://static-docs.nocobase.com/06-workflows-2026-03-19-22-39-27.png)

> Один узел делает сразу два дела — меняет статус и записывает время — без необходимости настраивать значения полей в кнопке.

### Шаг 5. Создаём кнопку «Завершить»

Workflow готов, но «Кастомное действие» нужно привязать к кнопке. Создадим кнопку «Завершить» в колонке операций списка заявок:

1. В режиме UI Editor в колонке операций таблицы заявок нажмите **«+»** и выберите операцию **«Trigger workflow»**.

![06-workflows-2026-03-19-22-41-31](https://static-docs.nocobase.com/06-workflows-2026-03-19-22-41-31.png)

2. В настройках кнопки измените заголовок на **«Завершить»** и выберите подходящую иконку (например, галочку).

![06-workflows-2026-03-19-22-43-39](https://static-docs.nocobase.com/06-workflows-2026-03-19-22-43-39.png)

3. Настройте **связное правило** для кнопки: при статусе «Завершено» кнопка скрывается (для уже завершённых заявок «Завершить» не нужен).
   - Условие: Текущая запись → Статус равен Завершено
   - Действие: скрыть

![06-workflows-2026-03-15-21-15-29](https://static-docs.nocobase.com/06-workflows-2026-03-15-21-15-29.png)

4. В настройках кнопки откройте **«Bind workflow»** и выберите наш workflow «Автозапись времени завершения заявки».

![06-workflows-2026-03-19-23-00-53](https://static-docs.nocobase.com/06-workflows-2026-03-19-23-00-53.png)

### Шаг 6. Настраиваем event-flow для обновления

Кнопка готова, но после клика таблица не обновится сама — пользователь не увидит изменений. Настроим **event flow** кнопки, чтобы после выполнения workflow таблица перезагружалась.

1. В настройках кнопки нажмите вторую иконку молнии (⚡) и откройте **Event flow**.
2. Настройте срабатывание:
   - **Триггер события**: выберите **Click**
   - **Время выполнения**: выберите **После всех потоков**
3. Нажмите **«Append step»** и выберите **«Refresh target block»**.

![06-workflows-2026-03-20-16-46-59](https://static-docs.nocobase.com/06-workflows-2026-03-20-16-46-59.png)

4. Найдите таблицу заявок текущей страницы, в её настройках выберите внизу **«Copy UID»** и вставьте UID в шаг обновления.

![06-workflows-2026-03-20-16-48-39](https://static-docs.nocobase.com/06-workflows-2026-03-20-16-48-39.png)

После клика по «Завершить» workflow выполняется и таблица обновляется — пользователь сразу видит изменения статуса и времени завершения.

### Шаг 7. Активация и тестирование

Возвращаемся в Workflow management и активируем workflow «Автозапись времени завершения заявки».

Откройте заявку со статусом «В обработке» и нажмите **«Завершить»** в колонке операций. Можно увидеть:

- Поле «Время завершения» автоматически заполнится текущим временем.
- Таблица обновится, кнопка «Завершить» исчезнет с этой заявки (связное правило сработало).

![06-workflows-2026-03-15-21-25-11](https://static-docs.nocobase.com/06-workflows-2026-03-15-21-25-11.gif)

Удобно? Это второй типичный сценарий workflow — **автоматическое обновление данных**. И благодаря связке «Кастомное действие + кнопка» мы получили точный механизм запуска: workflow выполняется только при клике по конкретной кнопке.

## 6.4 Просмотр истории выполнения

Сколько раз отработал workflow? Не было ли ошибок? NocoBase всё фиксирует.

В списке Workflow management у каждого workflow есть ссылка **Execution count** с числом запусков. По клику открывается подробная история:

- **Статус**: успех (зелёный) или провал (красный) — на виду
- **Время триггера**: когда сработал
- **Узлы**: внутри можно посмотреть результат каждого узла

![06-workflows-2026-03-15-21-25-38](https://static-docs.nocobase.com/06-workflows-2026-03-15-21-25-38.png)

Если выполнение провалилось, в деталях видно, какой узел сломался и какая ошибка. Это главный инструмент отладки.

![06-workflows-2026-03-15-21-36-16](https://static-docs.nocobase.com/06-workflows-2026-03-15-21-36-16.png)

## Итоги главы

В этой главе мы создали два простых, но полезных workflow:

- **Уведомление о новой заявке** (триггер — событие таблицы): автоматически уведомляет при создании или смене обработчика — кричать никому не нужно.
- **Автозапись времени завершения** (триггер — кастомное действие): после клика по «Завершить» автоматически проставляется время — никаких пропусков.

Два workflow показывают два разных механизма запуска. Настройка занимает менее 10 минут — и система уже работает сама. NocoBase поддерживает больше типов узлов (HTTP-запросы, вычисления, циклы и т. д.), но для старта этих комбинаций достаточно для большинства задач.

## Анонс следующей главы

Система автоматизирована, но не хватает **целостной картины**: всего сколько заявок? Какая категория преобладает? Сколько новых каждый день? В следующей главе с помощью [блоков](/interface-builder/blocks) графиков соберём **дашборд** — увидим всё одним взглядом.

## Связанные ресурсы

- [Обзор Workflow](/workflow) — основные концепции и сценарии
- [Триггер события таблицы](/workflow/triggers/collection) — настройка запуска при изменении данных
- [Узел обновления данных](/workflow/nodes/update) — настройка автообновления данных
