# Справочник смарт-действий

> ⚠️ Символом **\*** помечены обязательные параметры

Каталог смарт-действий, доступных для вызова из SmartScript: создание и изменение задач, комментарии, подписчики, email, HTTP-запросы, действия с файлами, отчётами, ЭДО Диадок и СБИС, маршруты, оргструктура, ДП, подписи, чаты и системные операции. Здесь — как вызывать действия из SmartScript (частые действия, примеры), карта разделов справочника, типы данных и каталог событий; описания действий (кодовое имя, числовой ID, таблица параметров) — в разделах по группам, см. [§ Разделы справочника](#разделы-справочника). Используется при проектировании пакетов действий и интеграционных сценариев.


## Вызов смарт-действий из SmartScript

Все смарт-действия вызываются из Lua/JS-скриптов через `SMART:execute_action` (Lua) или `SMART.execute_action_in_task_context` (JS). Кодовое имя действия (enum `StandardAction`) — первый аргумент вызова.

### Частые действия — кодовые имена и ID

Кодовые имена и числовые ID самых востребованных смарт-действий:

| Русское название | Кодовое имя (StandardAction) | Enum ID |
|---|---|---|
| **Отправить комментарий** | `PostComment` | 1 |
| **Создать задачу** | `CreateTask` | 0 |
| **Добавить подписчика** | `AddSubscriber` | 2 |
| **Добавить исполнителя** | `AddPerformer` | 3 |
| **Изменить значение ДП** | `ChangeExtParamValue` | 5 |
| **Добавить строки ДП Таблица** | `AddTableRows` | 216 |
| **Изменить строки ДП Таблица** | `UpdateTableRows` | 217 |
| **Удалить строки ДП Таблица** | `DeleteTableRows` | 218 |
| **Изменить статус задачи** | `ChangeTaskStateForcibly` | 38 |
| **Выполнить переход** | `MakeStep` | 4 |
| **Отправить email** | `SendEmail` | 17 |
| **Отправить HTTP-запрос** | `SendHttpRequest` | 85 |
| **Создать файл отчёта** | `CreateReportFile` | 75 |
| **Выполнить смарт-скрипт** | `ExecuteSmartScript` | 106 |

### Отправить HTTP-запрос с JSON и ретраями (`HttpRequestJson`)

Выполняет HTTP-запрос с автоматической сериализацией JSON, обработкой статус-кодов, повторными попытками и нарастающими паузами. Заменяет ручной сбор URL, headers и парсинг ответа в Lua/JS.

| Параметр | Тип | Описание |
|----------|-----|----------|
| Method* | `String` | HTTP-метод: GET, POST, PUT, PATCH, DELETE |
| Url* | `String` | Базовый URL запроса |
| Query | `Object` | Объект query-параметров (автоматически добавляется к URL) |
| Headers | `Object` | Заголовки запроса (например, `{ "Authorization": "Bearer ..." }`) |
| BodyJson | `Object` | Тело запроса (автоматически сериализуется в JSON для POST/PUT/PATCH) |
| TimeoutMs | `Integer` | Таймаут запроса в мс (по умолчанию 15000) |
| ExpectedStatusCodes | `Collection<Integer>` | Ожидаемые успешные статус-коды (по умолчанию [200]) |
| FailOnUnexpected | `Boolean` | Если true — неожиданный статус считается ошибкой (по умолчанию true) |
| RetryPolicy | `Object` | Политика повторных попыток: `{ Retries: 3, BackoffMs: 500, BackoffMultiplier: 2, RetryOnStatuses: [429, 500, 502, 503, 504] }` |
| ResponseMode | `String` | Формат ответа: `Json` (авто-парсинг) или `Text` |

**Возвращает:**
```json
{
  "Ok": true,
  "StatusCode": 200,
  "ResponseHeaders": { "content-type": "application/json" },
  "Json": { "result": "..." },
  "Text": null,
  "Attempts": 1,
  "FinalUrl": "https://api.example.com/resource?a=1&b=text",
  "Error": null
}
```

Если `FailOnUnexpected=false` и получен неожиданный статус:
```json
{
  "Ok": false,
  "StatusCode": 403,
  "Json": null,
  "Text": "Forbidden",
  "Attempts": 1,
  "Error": {
    "Code": "unexpected_status",
    "Message": "Expected [200], got 403"
  }
}
```

**Пример (Lua):**
```lua
local r = SMART:execute_action('HttpRequestJson', CONTEXT.Id, 'task', {
  Method = "POST",
  Url = "https://api.example.com/users",
  Headers = { ["Authorization"] = "Bearer token123" },
  BodyJson = { name = "Иван", email = "ivan@example.com" },
  ExpectedStatusCodes = { 201 },
  RetryPolicy = { Retries = 3, BackoffMs = 500, BackoffMultiplier = 2, RetryOnStatuses = { 429, 500 } }
})

if r.Ok then
  SS:log("Пользователь создан: id=" .. r.Json.id)
else
  SS:log("Ошибка: " .. r.Error.Message)
end
```

### Примеры вызова из SmartScript

#### Отправить комментарий (PostComment)

Обязательные параметры действия — `CommentAuthor`, `CommentText`, `Task`, `ForcedEmail`, `CommentSMS`, `NoSubscription`, `TextAsHTML`. Пометка вопросом называется `MarkAsQuestion` (не `NeedsAnswer` — такого параметра у действия нет).

**Lua:**
```lua
SMART:execute_action('PostComment', CONTEXT.Id, 'task', {
    CommentAuthor = 3,          -- ОБЯЗАТЕЛЬНО: автор (UserID); 3 — Робот 1Ф
    CommentText = 'Текст комментария',
    Task = CONTEXT.Id,          -- ОБЯЗАТЕЛЬНО, иначе NullRef
    Recipients = {181},         -- адресаты (массив UserID), опционально
    ForcedEmail = false,        -- ОБЯЗАТЕЛЬНО: дублировать на почту
    CommentSMS = false,         -- ОБЯЗАТЕЛЬНО: дублировать по SMS
    NoSubscription = true,      -- ОБЯЗАТЕЛЬНО: не подписывать адресатов на задачу
    TextAsHTML = false,         -- ОБЯЗАТЕЛЬНО: трактовать текст как HTML
    MarkAsQuestion = false      -- пометить вопросом, опционально
})
```

**JavaScript:**
```javascript
SMART.execute_action_in_task_context("PostComment", taskId, {
    CommentAuthor: 3,           // ОБЯЗАТЕЛЬНО: автор (UserID); 3 — Робот 1Ф
    CommentText: "Текст комментария",
    Task: taskId,               // ОБЯЗАТЕЛЬНО, иначе NullRef
    Recipients: [181],          // адресаты (массив UserID), опционально
    ForcedEmail: false,         // ОБЯЗАТЕЛЬНО: дублировать на почту
    CommentSMS: false,          // ОБЯЗАТЕЛЬНО: дублировать по SMS
    NoSubscription: true,       // ОБЯЗАТЕЛЬНО: не подписывать адресатов на задачу
    TextAsHTML: false,          // ОБЯЗАТЕЛЬНО: трактовать текст как HTML
    MarkAsQuestion: false       // пометить вопросом, опционально
});
```

> **Важно:** параметр `Task` обязателен даже при использовании `execute_action_in_task_context`. Без него — `NullReferenceException`.
>
> **`CommentAuthor` обязателен и в событийных сценариях** (пакет на событии, анонимная публикация): без него `SessionUserId = -1` → `NullReferenceException` → HTTP 500.
>
> Полный перечень параметров с типами — [в справочнике действия](https://help.1forma.ru/domains/smart-actions/actions-reference-notifications.md#отправить-комментарий-postcomment).

#### Создать задачу (CreateTask)

**Lua** (текст задачи — `TaskText`, не `Text`; связи — `CreateLink`/`CreateSubtask`, не `MakeLinked`/`MakeSubTask` — таких параметров у действия нет):
```lua
SMART:execute_action('CreateTask', CONTEXT.Id, 'task', {
    Subcat = 5641,              -- ОБЯЗАТЕЛЬНО: ID категории (пример SubcatID, тип параметра: 1F.Subcat)
    Owner = 28,                 -- ОБЯЗАТЕЛЬНО: заказчик (UserID)
    TaskText = 'Текст задачи',
    CreateLink = true,          -- ОБЯЗАТЕЛЬНО: сделать связанной с текущей
    CreateSubtask = false,      -- ОБЯЗАТЕЛЬНО: сделать подзадачей
    NewTaskCopySubscribers = false,  -- ОБЯЗАТЕЛЬНО: копировать подписчиков из родительской
    CreateCopyFiles = false,    -- ОБЯЗАТЕЛЬНО: копировать вложения
    CopyParentText = false,     -- ОБЯЗАТЕЛЬНО: включать текст исходной
    CreateCopiesForEachPerformer = false,  -- ОБЯЗАТЕЛЬНО: каждому исполнителю отдельную копию
    Priority = 1                -- ОБЯЗАТЕЛЬНО: 0 — низкий, 1 — обычный, 3 — высокий
})
```

#### Изменить значение ДП (ChangeExtParamValue)

**Lua** (доп. параметр — `ExtParam`, не `ExtParamId` — такого параметра у действия нет):
```lua
SMART:execute_action('ChangeExtParamValue', CONTEXT.Id, 'task', {
    Task = CONTEXT.Id,          -- ОБЯЗАТЕЛЬНО: задача
    User = SESSION_USER.Id,     -- ОБЯЗАТЕЛЬНО: от чьего имени меняется ДП
    ExtParam = 12408,           -- ОБЯЗАТЕЛЬНО: ID доп. параметра
    Value = 'новое значение',
    WriteCommentOnChange = false -- ОБЯЗАТЕЛЬНО: писать комментарий о смене
})
```

#### Изменить статус (ChangeTaskStateForcibly)

**Lua:**
```lua
SMART:execute_action('ChangeTaskStateForcibly', CONTEXT.Id, 'task', {
    Task = CONTEXT.Id,
    Initiator = SESSION_USER.Id,
    State = 3                   -- ID целевого статуса
})
```

#### Асинхронный вызов

Последний аргумент `true` — выполнение в фоне (не блокирует скрипт):

```lua
SMART:execute_action('PostComment', CONTEXT.Id, 'task', {
    CommentAuthor = 3,
    CommentText = 'Фоновый комментарий',
    Task = CONTEXT.Id,
    ForcedEmail = false,
    CommentSMS = false,
    NoSubscription = true,
    TextAsHTML = false
}, true)
```

**Когда стартует фоновое действие.** Если на момент вызова `execute_action(..., true)` окружение скрипта ещё выполняет открытую транзакцию, запуск фонового действия откладывается до её успешной фиксации. При откате транзакции фоновое действие не выполняется. Если скрипт выполняется вне транзакции, действие стартует сразу. Поэтому между строкой с `execute_action(..., true)` и фактическим началом действия может пройти время — до завершения сохранения, в котором участвовал скрипт.

Это важно, когда фоновое действие меняет ту же задачу, которую сохраняет запустившая транзакция: смена статуса, добавление комментария и другие действия по той же задаче применяются после сохранения, а не параллельно ему. Форма вызова не менялась: четвёртый аргумент `true` — по-прежнему признак фонового выполнения, синхронный вызов (`false` или без аргумента) работает как раньше.

### Полный список кодовых имён

Полный список действий (enum `StandardAction`, ID 0–218) доступен в редакторе SmartScript → вкладка «Смарт-действия».

### Связанные документы

Смежные разделы:

- [Смарт-действия — администрирование](https://help.1forma.ru/domains/smart-actions/admin.md) — вызов `SMART:execute_action`, контекст, примеры
- [Паттерны и примеры](https://help.1forma.ru/domains/smart-actions/academy-patterns.md)


## Разделы справочника

Полный справочник действий (каждое — с кодовым именем, ID и таблицей параметров) разбит по группам:

| Раздел | Группы действий |
|---|---|
| [Задачи, связи, маршруты](https://help.1forma.ru/domains/smart-actions/actions-reference-tasks.md) | Категории, задачи, связи · Маршруты, переходы |
| [Оповещения, чаты, комментарии](https://help.1forma.ru/domains/smart-actions/actions-reference-notifications.md) | Оповещения · Чаты, комментарии, чек-листы |
| [Участники, оргструктура, группы](https://help.1forma.ru/domains/smart-actions/actions-reference-people.md) | Заказчики, исполнители, подписчики · Оргструктура, группы, пользователи |
| [ЭДО и подписи](https://help.1forma.ru/domains/smart-actions/actions-reference-edo.md) | Работа с операторами ЭДО (Диадок, СБИС, Контур.КЭДО) · Подписи |
| [Файлы, отчёты, данные, сроки, ДП](https://help.1forma.ru/domains/smart-actions/actions-reference-files-data.md) | Файлы и отчёты · Данные · Сроки и трудозатраты · ДП — модификация значений · Файлы (расширение) |
| [Системные действия](https://help.1forma.ru/domains/smart-actions/actions-reference-system.md) | HTTP, SQL, SmartScript, события, повторения |


## Типы данных

Типы параметров, используемые в таблицах параметров разделов справочника:

| Тип | Описание |
|-----|----------|
| `1F.Task` | Задача в системе |
| `1F.User` | Пользователь |
| `1F.UserGroup` | Группа пользователей |
| `1F.Subcat` | Категория |
| `1F.State` | Статус задачи |
| `1F.Step` | Переход по маршруту |
| `1F.File` | Файл |
| `1F.CustomerZone` | Личный кабинет |
| `Collection<T>` | Коллекция объектов типа T |
| `String` | Строка |
| `Integer` | Целое число |
| `Boolean` | Логическое значение |
| `DateTime` | Дата и время |
| `Money` | Денежная сумма |

---

## Каталог событий (EventID)

Полный реестр событий (197) с EventID, именем, группой и контекстными параметрами `@eventParam*` доступен в редакторе SmartScript. Используется для проектирования пакетов действий: на какое событие подписать пакет и какие данные доступны в контексте.

**Покрытие:**

- Всего событий: 197 (значения 0–196).
- С описанием параметров контекста: 127.
- Без задокументированного контекста: 69.

**Распределение по группам:**

| Группа | Событий |
|---|---:|
| Не классифицировано | 69 |
| Задачи и комментарии | 30 |
| Подписи | 22 |
| Ресурсное планирование | 15 |
| Сроки и даты | 12 |
| Связи и подзадачи | 12 |
| ДП и свойства задачи | 9 |
| Пользователи | 8 |
| Глобальные | 7 |
| Файлы | 6 |
| Другое | 3 |
| Exchange | 3 |

**Ключевые правила:**

1. События `Перед ...` отменяемы, если в пакете есть действие `Отменить`. Признак отмены определяет само окно ошибки — по объекту ошибки, поэтому кнопки обращения в поддержку в нём нет на всех путях, где ошибка приходит объектом; там, где окно получило готовый текст, признак до него не доходит.
2. Группы `Exchange`, `Глобальные`, `Пользователи` работают как глобальные (используются в «Общих SMART»).
3. Флаг «может быть глобальным» (`CanBeGlobal`): такое категорийное событие может срабатывать без привязки к категории (SubcatID=NULL). Первое такое событие — `AfterPostComment` (29).
4. Для событий ресурсного планирования параметр `Дата` приходит массивом — в SQL читается через `OPENJSON`.
5. Нумерация в C# enum нелинейная: `AfterSignatureSigned=70` объявлен после `BeforeSubscriberAdded=58`. В реестре — точные числовые значения.
