---
pkg: '@nocobase/plugin-workflow-approval'
---

# Согласование

## Введение

Согласование — это тип процесса, специально разработанный для задач, инициируемых и обрабатываемых вручную, для принятия решения о статусе соответствующих данных. Обычно он используется для автоматизации офисных процессов или другого управления процессами принятия решений вручную, например, для создания и управления ручными процессами в таких сценариях, как «заявка на отпуск», «согласование возмещения расходов» и «согласование закупки сырья».

Плагин согласования предоставляет специализированный тип рабочего процесса (триггер) «Согласование (событие)» и специализированный для этого процесса узел «Согласование». В сочетании с уникальными пользовательскими коллекциями и пользовательскими блоками NocoBase вы можете быстро и гибко создавать и управлять различными сценариями согласования.

## Создание рабочего процесса

При создании рабочего процесса выберите тип «Согласование», чтобы создать рабочий процесс согласования:

![Триггер согласования_Создание рабочего процесса согласования](https://static-docs.nocobase.com/f52dda854f46a669e0c1c7fb487a17ea.png)

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

## Настройка триггера

![20251226102619](https://static-docs.nocobase.com/20251226102619.png)

### Привязка коллекции

Плагин согласования NocoBase разработан с учетом гибкости и может использоваться с любой пользовательской коллекцией, то есть конфигурация согласования не требует повторной настройки модели данных, а напрямую использует уже созданную коллекцию. Поэтому после входа в настройки триггера вам сначала нужно выбрать коллекцию, чтобы определить, для данных какой коллекции будет проводиться этот процесс:

![Триггер согласования_Настройка триггера_Выбор коллекции](https://static-docs.nocobase.com/20251226103223.png)

### Способ запуска

При инициировании согласования для бизнес-данных вы можете выбрать один из двух следующих способов запуска:

*   **Перед сохранением данных**

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

*   **После сохранения данных**

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

### Место инициирования согласования

Вы можете выбрать, где в системе можно инициировать согласование:

*   **Только в блоках данных**

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

*   **В блоках данных и в Центре задач**

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

### Кто может инициировать согласование

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

*   **Все пользователи**

    Все пользователи в системе могут инициировать это согласование.

*   **Только выбранные пользователи**

    Разрешить инициирование согласования только пользователям из указанного диапазона. Поддерживается множественный выбор.

    ![20251226114623](https://static-docs.nocobase.com/20251226114623.png)

### Настройка интерфейса формы инициатора

Наконец, вам необходимо настроить интерфейс формы инициатора. Этот интерфейс будет использоваться для операций отправки при инициировании из блока центра согласования и при повторном инициировании после отзыва пользователем. Нажмите кнопку настройки, чтобы открыть диалоговое окно:

![Триггер согласования_Настройка триггера_Форма инициатора](https://static-docs.nocobase.com/20251226130239.png)

Вы можете добавить форму для интерфейса инициатора на основе привязанной коллекции или добавить описательный текст (Markdown) для подсказок и руководства. Добавление блока формы является обязательным, иначе инициатор не сможет выполнять действия после входа в этот интерфейс.

После добавления блока формы, как и в обычном интерфейсе настройки формы, вы можете добавлять компоненты полей соответствующей коллекции и произвольно их располагать для организации содержимого, которое необходимо заполнить:

![Триггер согласования_Настройка триггера_Форма инициатора_Настройка полей](https://static-docs.nocobase.com/20251226130339.png)

В отличие от кнопки прямой отправки, вы также можете добавить кнопку действия «Сохранить черновик» для поддержки процессов временного сохранения:

![Триггер согласования_Настройка триггера_Форма инициатора_Настройка действий_Сохранить](https://static-docs.nocobase.com/20251226130512.png)

Если рабочий процесс согласования позволяет инициатору отозвать заявку, вам необходимо включить кнопку «Отзыв» в конфигурации интерфейса инициатора:

![Триггер согласования_Настройка триггера_Разрешить отзыв](https://static-docs.nocobase.com/20251226130637.png)

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

:::info{title=Подсказка}
После включения или удаления кнопки отзыва вам необходимо нажать «Сохранить» в диалоговом окне настройки триггера, чтобы изменения вступили в силу.
:::

### Карточка «Мои заявки» <Badge>2.0+</Badge>

Используется для настройки карточек задач в списке «Мои заявки» Центра задач.

![20260213005957](https://static-docs.nocobase.com/20260213005957.png)

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

После создания запроса на согласование в списке Центра задач будет видна настроенная карточка задачи:

![20260213010228](https://static-docs.nocobase.com/20260213010228.png)

### Режим отображения записей в процессе

*   **Снимок**

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

*   **Последняя версия**

    Заявитель и утверждающие всегда видят последнюю версию записи на протяжении всего процесса, независимо от того, в каком состоянии была запись до их действия. После завершения процесса они увидят финальную версию записи.

## Узел согласования

В рабочем процессе согласования необходимо использовать специализированный узел «Согласование» для настройки логики операций утверждающих по обработке (одобрению, отклонению или возврату) инициированного согласования. Узел «Согласование» может использоваться только в рабочих процессах согласования. Подробности см. в разделе [Узел согласования](../nodes/approval.md).

:::info{title=Подсказка}
Если в рабочем процессе согласования нет ни одного узла «Согласование», этот процесс будет одобрен автоматически.
:::

## Настройка инициирования согласования

После настройки и включения рабочего процесса согласования вы можете привязать этот рабочий процесс к кнопке отправки формы соответствующей коллекции, чтобы пользователи могли инициировать согласование при отправке:

![Инициировать согласование_Привязать рабочий процесс](https://static-docs.nocobase.com/20251226110710.png)

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

:::info{title=Подсказка}
В настоящее время кнопка для инициирования согласования поддерживает только кнопку «Отправить» (или «Сохранить») в формах создания или обновления. Кнопка «Запустить рабочий процесс» не поддерживается (эта кнопка может быть привязана только к «Событию настраиваемого действия»).
:::

## Центр задач

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

![20250310161203](https://static-docs.nocobase.com/20250310161203.png)

### Мои отправления

#### Просмотр инициированных согласований

![20250310161609](https://static-docs.nocobase.com/20250310161609.png)

#### Непосредственное инициирование нового согласования

![20250310161658](https://static-docs.nocobase.com/20250310161658.png)

### Мои задачи

#### Список задач

![20250310161934](https://static-docs.nocobase.com/20250310161934.png)

#### Детали задачи

![20250310162111](https://static-docs.nocobase.com/20250310162111.png)

## HTTP API

### Инициатор

#### Инициирование из коллекции

Для инициирования из блока данных вы можете выполнить вызов следующим образом (на примере кнопки создания в коллекции `posts`):

```bash
curl -X POST -H 'Authorization: Bearer <your token>' -H 'X-Role: <roleName>' -d \
  '{
    "title": "Hello, world!",
    "content": "This is a test post."
  }'
  "http://localhost:3000/api/posts:create?triggerWorkflows=workflowKey"
```

Здесь параметр URL `triggerWorkflows` — это ключ рабочего процесса; несколько рабочих процессов разделяются запятыми. Этот ключ можно получить, наведя курсор мыши на имя рабочего процесса в верхней части холста рабочего процесса:

![Рабочий процесс_Ключ_Метод просмотра](https://static-docs.nocobase.com/20240426135108.png)

После успешного вызова будет запущен рабочий процесс согласования для соответствующей коллекции `posts`.

:::info{title="Подсказка"}
Поскольку внешние вызовы также должны основываться на личности пользователя, при вызове через HTTP API необходимо предоставлять информацию для аутентификации, как и при запросах из обычного интерфейса, включая заголовок `Authorization` или параметр `token` (токен, полученный при входе), а также заголовок `X-Role` (имя текущей роли пользователя).
:::

Если вам нужно запустить событие для данных в связи «один-к-одному» (связь «один-ко-многим» пока не поддерживается) в этой операции, вы можете использовать `!` в параметрах, чтобы указать триггерные данные для поля связи:

```bash
curl -X POST -H 'Authorization: Bearer <your token>' -H 'X-Role: <roleName>' -d \
  '{
    "title": "Hello, world!",
    "content": "This is a test post.",
    "category": {
      "title": "Test category"
    }
  }'
  "http://localhost:3000/api/posts:create?triggerWorkflows=workflowKey!category"
```

После успешного вызова будет запущено событие согласования для соответствующей коллекции `categories`.

:::info{title="Подсказка"}
При вызове через HTTP API для запуска событий после операции также необходимо обращать внимание на статус включения рабочего процесса и соответствие конфигурации коллекции, иначе вызов может не увенчаться успехом или возникнет ошибка.
:::

#### Инициирование из Центра согласования

```bash
curl -X POST -H 'Authorization: Bearer <your token>' -H 'X-Role: <roleName>' -d \
  '{
    "collectionName": "<collection name>",
    "workflowId": <workflow id>,
    "data": { "<field>": "<value>" },
    "status": <initial approval status>,
  }'
  "http://localhost:3000/api/approvals:create"
```

**Параметры**

* `collectionName`: Имя целевой коллекции для инициирования согласования, обязательно.
* `workflowId`: ID рабочего процесса, используемого для инициирования согласования, обязательно.
* `data`: Поля записи коллекции, создаваемой при инициировании согласования, обязательно.
* `status`: Статус создаваемой записи при инициировании согласования, обязательно. Возможные значения:
  * `0`: Черновик, означает сохранение без отправки на согласование.
  * `2`: Отправить на согласование, означает, что инициатор отправляет заявку на согласование и входит в процесс согласования.

#### Сохранение и отправка

Когда инициированное (или отозванное) согласование находится в статусе черновика, вы можете снова сохранить или отправить его через следующий интерфейс:

```bash
curl -X POST -H 'Authorization: Bearer <your token>' -H 'X-Role: <roleName>' -d \
  '{
    "data": { "<field>": "<value>" },
    "status": 2
  }'
  "http://localhost:3000/api/approvals:update/<approval id>"
```

#### Получение списка инициированных согласований

```bash
curl -X GET -H 'Authorization: Bearer <your token>' -H 'X-Role: <roleName>' \
  "http://localhost:3000/api/approvals:listMine"
```

#### Отзыв

Инициатор может отозвать запись, которая в данный момент находится на согласовании, через следующий интерфейс:

```bash
curl -X POST -H 'Authorization: Bearer <your token>' -H 'X-Role: <roleName>' -d \
  "http://localhost:3000/api/approvals:withdraw/<approval id>"
```

**Параметры**

* `<approval id>`: ID записи согласования для отзыва, обязательно.

### Утверждающий

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

#### Получение записей обработки согласования

Задачи — это записи обработки согласования. Вы можете получить все записи обработки согласования текущего пользователя через следующий интерфейс:

```bash
curl -X GET -H 'Authorization: Bearer <your token>' \
  "http://localhost:3000/api/approvalRecords:listMine"
```

Здесь `approvalRecords` выступает как ресурс коллекции, поэтому вы также можете использовать общие условия запроса, такие как `filter`, `sort`, `pageSize` и `page`.

#### Получение одной записи обработки согласования

```bash
curl -X GET -H 'Authorization: Bearer <your token>' \
  "http://localhost:3000/api/approvalRecords:get/<record id>"
```

#### Одобрение и отклонение

```bash
curl -X POST -H 'Authorization: Bearer <your token>' -d \
  '{
    "status": 2,
    "comment": "Looks good to me.",
    "data": { "<field to modify>": "<value>" }
  }'
  "http://localhost:3000/api/approvalRecords:submit/<record id>"
```

**Параметры**

* `<record id>`: ID записи для обработки согласования, обязательно.
* `status`: Поле статуса обработки согласования, `2` означает «Одобрить», `-1` означает «Отклонить», обязательно.
* `comment`: Примечание к обработке согласования, необязательно.
* `data`: Изменения записи коллекции в текущем узле согласования после одобрения, необязательно (действует только при одобрении).

#### Возврат <Badge>v1.9.0+</Badge>

До версии v1.9.0 возврат использовал тот же интерфейс, что и «Одобрить» и «Отклонить», с использованием `"status": 1` для обозначения возврата.

Начиная с версии v1.9.0, для возврата появился отдельный интерфейс:

```bash
curl -X POST -H 'Authorization: Bearer <your token>' -d \
  '{
    "returnToNodeKey": "<node key>",
  }'
  "http://localhost:3000/api/approvalRecords:return/<record id>"
```

**Параметры**

* `<record id>`: ID записи для обработки согласования, обязательно.
* `returnToNodeKey`: Ключ целевого узла для возврата, необязательно. Если в узле настроен диапазон узлов для возврата, этот параметр можно использовать для указания узла, к которому нужно вернуться. Если не настроено, значение передавать не нужно, по умолчанию будет выполнен возврат в начальную точку для повторной отправки инициатором.

#### Делегирование

```bash
curl -X POST -H 'Authorization: Bearer <your token>' -d \
  '{
    "assignee": <user id>,
  }'
  "http://localhost:3000/api/approvalRecords:delegate/<record id>"
```

**Параметры**

* `<record id>`: ID записи для обработки согласования, обязательно.
* `assignee`: ID пользователя для делегирования, обязательно.

#### Добавление подписанта

```bash
curl -X POST -H 'Authorization: Bearer <your token>' -d \
  '{
    "assignees": [<user id>],
    "order": <order>,
  }'
  "http://localhost:3000/api/approvalRecords:add/<record id>"
```

**Параметры**

* `<record id>`: ID записи для обработки согласования, обязательно.
* `assignees`: Список ID пользователей для добавления в качестве подписантов, обязательно.
* `order`: Порядок добавления подписанта, `-1` означает «до меня», `1` означает «после меня».