> ## Documentation Index
> Fetch the complete documentation index at: https://docs.twenty.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Рабочие процессы

> Поставляйте готовые рабочие процессы вместе с приложением.

## Определите рабочий процесс

Приложения могут включать рабочие процессы. Каждый вызов `defineWorkflow()` описывает один рабочий процесс: триггер и выполняемые им шаги. При установке Twenty создает его как активный рабочий процесс в рабочей области, готовый к запуску.

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

```ts src/workflows/score-new-companies.ts theme={null}
import {
  defineWorkflow,
  STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS,
} from 'twenty-sdk/define';

const COMPANY = STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.company.universalIdentifier;
const SCORE_COMPANY_FUNCTION = '0f6c0b3e-8a4f-4f0e-9d0a-3c1e5b7a2d41';

const SCORE_NEW_COMPANIES = {
  workflow: 'c2a4e6f8-1b3d-4f5a-8c7e-9d0b2a4c6e81',
  trigger: 'c2a4e6f8-1b3d-4f5a-8c7e-9d0b2a4c6e82',
  score: 'c2a4e6f8-1b3d-4f5a-8c7e-9d0b2a4c6e83',
  save: 'c2a4e6f8-1b3d-4f5a-8c7e-9d0b2a4c6e84',
};

export default defineWorkflow({
  universalIdentifier: SCORE_NEW_COMPANIES.workflow,
  name: 'Score new companies',
  version: {
    trigger: {
      universalIdentifier: SCORE_NEW_COMPANIES.trigger,
      type: 'DATABASE_EVENT',
      settings: {
        objectUniversalIdentifier: COMPANY,
        action: 'created',
      },
      nextStepIds: [SCORE_NEW_COMPANIES.score],
    },
    steps: [
      {
        universalIdentifier: SCORE_NEW_COMPANIES.score,
        name: 'Score the company',
        type: 'LOGIC_FUNCTION',
        logicFunctionUniversalIdentifier: SCORE_COMPANY_FUNCTION,
        input: { companyName: '{{trigger.properties.after.name}}' },
        nextStepIds: [SCORE_NEW_COMPANIES.save],
      },
      {
        universalIdentifier: SCORE_NEW_COMPANIES.save,
        name: 'Save the score',
        type: 'UPDATE_RECORD',
        input: {
          objectUniversalIdentifier: COMPANY,
          objectRecordId: '{{trigger.recordId}}',
          objectRecord: { leadScore: `{{${SCORE_NEW_COMPANIES.score}.score}}` },
          fieldsToUpdate: ['leadScore'],
        },
        nextStepIds: [],
      },
    ],
  },
});
```

Основные моменты:

* Рабочий процесс, его триггер и каждый шаг должны иметь собственный `universalIdentifier`. Сохраняйте их неизменными между релизами: по ним Twenty сопоставляет установленный рабочий процесс при следующей установке.
* `nextStepIds` связывает граф. Триггер указывает на первые шаги, а каждый шаг указывает на шаги, выполняемые после него.
* Шаг считывает предыдущий вывод с помощью `{{trigger.\<path>}}` или `{{\<step universalIdentifier>.\<path>}}`.
* Сборка проверяет всё определение: неподдерживаемые типы триггеров или шагов, повреждённые связи между шагами и ссылки на неизвестные шаги приводят к её сбою.

## Ссылки на другие сущности

Шаги и триггеры ссылаются на метаданные по универсальному идентификатору, а не по имени или id:

* **Объекты и поля**: собственные объекты и поля вашего приложения или стандартные через `STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS`. В приведённом выше примере предполагается, что приложение также определяет числовое поле `leadScore` в Company с помощью [`defineField()`](https://docs.twenty.com/ru/developers/extend/apps/data/extending-objects): шаг записи, который записывает поле, отсутствующее в рабочем пространстве, приводит к сбою установки.
* **Логические функции**: собственные функции вашего приложения, доступные как [действие рабочего процесса](https://docs.twenty.com/ru/developers/extend/apps/logic/logic-functions.md#exposing-a-function-as-an-ai-tool-or-workflow-action) с `workflowActionTriggerSettings`. Пользовательское приложение рабочего пространства также может ссылаться на действия рабочих процессов других приложений, установленных в рабочем пространстве, как это могут рабочие процессы, созданные в приложении.
* **Агенты**: собственные агенты вашего приложения из [`defineAgent()`](https://docs.twenty.com/ru/developers/extend/apps/logic/skills-and-agents).

Ссылка, которую Twenty не может разрешить, приводит к сбою установки.

## Триггеры

| Тип | Запускается, когда | Настройки |
| - | - | - |
| `MANUAL` | Пользователь запускает его | `availability` (необязательно): `GLOBAL` или `SINGLE_RECORD` / `BULK_RECORDS` с `objectUniversalIdentifier`. Добавляет пункт меню команд с необязательными `icon` и `isPinned`. |
| `CRON` | По расписанию | `type`: `DAYS`, `HOURS` или `MINUTES` с `schedule` либо `CUSTOM` с cron `pattern`. |
| `DATABASE_EVENT` | Запись изменяется | `objectUniversalIdentifier`, `action` (`created`, `updated`, `deleted`, `upserted`), необязательные отслеживаемые `fieldUniversalIdentifiers` (только для обновлений и upsert) и `filter`. |
| `WEBHOOK` | HTTP-запрос поступает на URL рабочего процесса | `httpMethod` (`GET` или `POST`) и `expectedBody` для `POST`. |

Ручной рабочий процесс без `availability` не получает пункта меню команд.

Рабочий процесс webhook прослушивает `https://\<your-twenty-domain>/webhooks/workflows/\<workspaceId>/\<workflowId>`, где `workflowId` — это id установленного рабочего процесса. Тело запроса доступно как `{{trigger.\<path>}}`.

## Шаги

Рабочие процессы приложения поддерживают следующие типы шагов: `LOGIC_FUNCTION`, `AI_AGENT`, `HTTP_REQUEST`, `CLASSIFY`, `CREATE_RECORD`, `UPDATE_RECORD`, `UPSERT_RECORD`, `DELETE_RECORD`, `FIND_RECORDS`, `PICK_RECORD`, `FILTER`, `IF_ELSE`, `ITERATOR`, `FORM`, `DELAY`, `WAIT_FOR_EVENT`, `SEND_EMAIL`, `DRAFT_EMAIL`, `CREATE_CALENDAR_EVENT` и `EMPTY`.

Их входные данные соответствуют шагам [конструктора рабочих процессов](https://docs.twenty.com/ru/user-guide/workflows/capabilities/workflow-actions.md), но вместо имён используются универсальные идентификаторы:

* Шаги записи используют `objectUniversalIdentifier` вместо имени объекта.
* Фильтры и сортировки ссылаются на поля с помощью `fieldMetadataUniversalIdentifier`.
* Поля формы типа `RECORD` именуют свой объект с помощью `settings.objectUniversalIdentifier`. Поля типа `SELECT` и `MULTI_SELECT` предлагают варианты существующего поля того же типа, именуемого с помощью `settings.selectedFieldUniversalIdentifier`.
* Чтобы выполнить собственный код, используйте шаг `LOGIC_FUNCTION`. Шаг Code в конструкторе недоступен.
* Шаги электронной почты и календаря выполняются, только если роль вашего приложения имеет соответствующий флаг разрешения: `SystemPermissionFlag.SEND_EMAIL_TOOL` для `SEND_EMAIL` и `DRAFT_EMAIL`, `SystemPermissionFlag.CREATE_CALENDAR_EVENT_TOOL` для `CREATE_CALENDAR_EVENT`. Рабочая область предоставляет его при установке приложения, после чего шаг может использовать любую подключенную учетную запись в рабочей области, как рабочий процесс, созданный в приложении.
* Идентификаторы подключенных учетных записей локальны для каждой рабочей области, поэтому не задавайте такой идентификатор жестко в коде. Передайте учетную запись в качестве переменной. Шаги электронной почты также принимают идентификатор участника рабочего пространства, например `{{trigger.properties.after.assigneeId}}`, который разрешается в первую учетную запись этого участника, способную отправлять сообщения.

## После установки

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


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.