# События коллекции

## Введение

Триггеры типа "События коллекции" отслеживают события создания, обновления и удаления данных в коллекции. Когда происходит операция с данными в этой коллекции и она соответствует заданным условиям, запускается соответствующий рабочий процесс. Например, это может быть списание товаров со склада после создания нового заказа или ожидание ручной проверки после добавления нового комментария.

## Основное использование

Изменения в коллекции могут происходить в нескольких случаях:

1.  После создания данных.
2.  После обновления данных.
3.  После создания или обновления данных.
4.  После удаления данных.

![События коллекции_Выбор момента срабатывания](https://static-docs.nocobase.com/81275602742deb71e0c830eb97aa612c.png)

Вы можете выбрать момент срабатывания триггера в соответствии с вашими бизнес-потребностями. Если выбранный тип изменения включает обновление коллекции, вы также можете указать поля, которые должны измениться. Условие срабатывания будет выполнено только при изменении выбранных полей. Если поля не выбраны, это означает, что изменение любого поля может запустить рабочий процесс.

![События коллекции_Выбор измененных полей](https://static-docs.nocobase.com/874a1475f01298b3c00267b2b4674611.png)

Более того, вы можете настроить правила условий для каждого поля строки данных, которая вызывает срабатывание. Триггер сработает только в том случае, если поля соответствуют заданным условиям.

![События коллекции_Настройка условий для данных](https://static-docs.nocobase.com/264ae3835dcd75cee0eef7812c11fe0c.png)

После срабатывания события коллекции строка данных, которая его вызвала, будет внедрена в план выполнения как контекстные данные триггера. Эти данные могут быть использованы в качестве переменных последующими узлами в рабочем процессе. Однако, если последующим узлам необходимо использовать связанные поля этих данных, вам потребуется предварительно настроить предзагрузку связанных данных. Выбранные связанные данные будут внедрены в контекст вместе с триггером и могут быть выбраны и использованы иерархически.

## Полезные советы

### Запуск массовыми операциями с данными пока не поддерживается

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

### Операции с данными вне приложения не запускают события

Операции с коллекциями через вызовы HTTP API к интерфейсу приложения также могут запускать соответствующие события. Однако, если изменения данных производятся непосредственно через операции с базой данных, а не через приложение NocoBase, соответствующие события не будут запущены. Например, нативные триггеры базы данных не будут связаны с рабочими процессами в приложении.

Кроме того, использование узла SQL-операции для работы с базой данных эквивалентно прямым операциям с базой данных и также не будет запускать события коллекции.

### Внешние источники данных

Рабочие процессы поддерживают внешние источники данных начиная с версии `0.20`. Если вы используете плагин внешнего источника данных и событие коллекции настроено для внешнего источника данных, то соответствующие события коллекции будут запускаться при условии, что операции с данными этого источника выполняются внутри приложения (например, создание или обновление данных пользователем, а также операции с данными рабочего процесса). Однако, если изменения данных производятся через другие системы или непосредственно во внешней базе данных, события коллекции не будут запущены.

## Пример

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

Сначала создадим коллекции "Товары" и "Заказы" со следующими моделями данных:

| Название поля     | Тип поля           |
|-------------------|--------------------|
| Название товара   | Однострочный текст |
| Цена              | Число              |
| Остаток           | Целое число        |

| Название поля      | Тип поля                     |
|--------------------|------------------------------|
| Номер заказа       | Автоматический номер         |
| Товар заказа       | Многие к одному (Товары)     |
| Общая сумма заказа | Число                        |

И добавим базовые данные о товарах:

| Название товара | Цена | Остаток |
|-----------------|------|---------|
| iPhone 14 Pro   | 7999 | 10      |
| iPhone 13 Pro   | 5999 | 0       |

Затем создадим рабочий процесс, основанный на событии коллекции "Заказы":

![События коллекции_Пример_Запуск при создании заказа](https://static-docs.nocobase.com/094392a870dddc65aeb20357f62ddc08.png)

Вот несколько параметров конфигурации:

-   Коллекция: Выберите коллекцию "Заказы".
-   Момент срабатывания: Выберите "После создания данных".
-   Условия срабатывания: Оставьте пустым.
-   Предзагрузка связанных данных: Отметьте "Товары".

Затем настройте другие узлы в соответствии с логикой рабочего процесса: проверьте, больше ли остаток товара на складе нуля. Если да, спишите товар со склада; в противном случае заказ считается недействительным и должен быть удален:

![События коллекции_Пример_Оркестрация рабочего процесса создания заказа](https://static-docs.nocobase.com/7713ea1aaa0f52a0dc3c92aba5e58f05.png)

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

Активируйте этот рабочий процесс и протестируйте его, создав новый заказ через интерфейс. После оформления заказа на "iPhone 14 Pro" остаток соответствующего товара на складе уменьшится до 9. Если же заказ будет оформлен на "iPhone 13 Pro", то из-за недостаточного остатка заказ будет удален.

![События коллекции_Пример_Результат выполнения создания заказа](https://static-docs.nocobase.com/24cbe51e24ba4804b3bd48d99415c54f.png)