bitrix24-mcp-bridge 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -11
- package/actions.example.json +1 -0
- package/dist/cli.js +21 -8
- package/docs/api-notes.md +156 -26
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -65,18 +65,39 @@ daemon после любой правки, затрагивающей конфи
|
|
|
65
65
|
|
|
66
66
|
## Инструменты
|
|
67
67
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
Помимо `bitrix_help` / `bitrix_status` / `bitrix_call`, мост регистрирует типизированные обёртки
|
|
69
|
+
над каталогом (разумные дефолты + схема параметров). Регистрируются только те, чьё имя есть в
|
|
70
|
+
`actions.json`. Точная выборка — через необязательный `params` (мержится последним, перекрывает
|
|
71
|
+
дефолты). Каждый принимает необязательный `portal` (alias; по умолчанию — из `config.json`).
|
|
72
|
+
Обёртки в основном read-only; мутирующие помечены ⚠. `bitrix_call` выполняет любой разрешённый
|
|
73
|
+
каталогом вызов, включая мутирующие.
|
|
71
74
|
|
|
72
75
|
| Инструмент | Назначение |
|
|
73
76
|
|---|---|
|
|
74
|
-
| `bitrix_help` | справка по API/params (
|
|
75
|
-
| `bitrix_status` | какие порталы сконфигурированы и
|
|
76
|
-
| `bitrix_call` | любой разрешённый вызов из каталога по имени |
|
|
77
|
-
|
|
|
77
|
+
| `bitrix_help` | справка по API/params (= `docs/api-notes.md`) |
|
|
78
|
+
| `bitrix_status` | какие порталы сконфигурированы и подключены |
|
|
79
|
+
| `bitrix_call` | любой разрешённый вызов из каталога по имени (в т.ч. мутирующий) |
|
|
80
|
+
| *Задачи* | |
|
|
81
|
+
| `bitrix_tasks_list` / `bitrix_task_get` | список задач / карточка |
|
|
82
|
+
| `bitrix_task_get_v2` | карточка через v2-подсистему (JSON) |
|
|
83
|
+
| `bitrix_task_scrum_info` | scrum-инфо (спринт / эпик / story points) |
|
|
84
|
+
| `bitrix_task_files` | файлы задачи |
|
|
85
|
+
| `bitrix_task_views_count` | счётчик просмотров |
|
|
86
|
+
| `bitrix_task_subtasks` / `bitrix_task_related` | подзадачи / связанные задачи |
|
|
87
|
+
| *Проекты* | |
|
|
78
88
|
| `bitrix_projects_list` / `bitrix_project_get` | рабочие группы / проекты |
|
|
79
|
-
|
|
|
89
|
+
| *Чаты* | |
|
|
90
|
+
| `bitrix_chats_recent` | недавние чаты (REST) |
|
|
91
|
+
| `bitrix_recent_load` / `bitrix_recent_tail` | недавние по секции (в т.ч. `tasksTask` — чаты задач) + листание |
|
|
92
|
+
| `bitrix_chat_load` | открыть чат по `dialogId`/`chatId` |
|
|
93
|
+
| `bitrix_chat_messages` | последние сообщения чата |
|
|
94
|
+
| `bitrix_chat_history` | листать историю вглубь |
|
|
95
|
+
| `bitrix_chat_get_dialog_id` | резолв dialogId по externalId |
|
|
96
|
+
| `bitrix_chat_mark_read` ⚠ / `bitrix_chat_read_all` ⚠ | пометить сообщения / все чаты прочитанными |
|
|
97
|
+
| *Люди / поиск* | |
|
|
98
|
+
| `bitrix_user_get` | карточка пользователя |
|
|
99
|
+
| `bitrix_entity_selector` / `bitrix_entity_search` | загрузка селектора / текстовый поиск сущностей |
|
|
100
|
+
| `bitrix_entity_chat` | chatId чата связанного объекта (задача/группа/CRM) через `im.chat.get` |
|
|
80
101
|
|
|
81
102
|
`bitrix_help` — единственный источник конвенций params (select/filter/order/пагинация,
|
|
82
103
|
имена полей). Он отдаёт `docs/api-notes.md`, так что любому агенту не нужен доступ к репозиторию.
|
|
@@ -161,18 +182,37 @@ bun run src/index.ts --daemon # daemon вручную
|
|
|
161
182
|
bun run src/index.ts setup # интерактивная настройка
|
|
162
183
|
bun test # юнит-тесты (bun:test)
|
|
163
184
|
bun run typecheck # tsc --noEmit (сервер + extension)
|
|
164
|
-
bun run build:
|
|
185
|
+
bun run build:dist # бандл сервера → dist/cli.js
|
|
186
|
+
bun run build:ext # dev-сборка расширения → extension/dist/ (загружаемое)
|
|
187
|
+
bun run sync:runtime # применить репо-изменения к живому daemon (см. ниже)
|
|
165
188
|
```
|
|
166
189
|
|
|
167
|
-
`.env` — **только dev
|
|
168
|
-
`
|
|
190
|
+
`.env` — **только dev-оверрайды** (gitignored). Токен / origin / порт берутся из общего
|
|
191
|
+
`~/.bitrix24-mcp-bridge/config.json` (через `loadConfig`) — дублировать их в `.env` не нужно, иначе
|
|
192
|
+
dev-токен разойдётся с daemon. Осмысленно держать там лишь `BITRIX_CATALOG` (указывает
|
|
193
|
+
dev-сборку/daemon на репозиторный `actions.json`). В проде весь конфиг — в
|
|
169
194
|
`~/.bitrix24-mcp-bridge/config.json`, который пишет `setup`.
|
|
170
195
|
|
|
196
|
+
**Репо ≠ живой daemon.** Daemon, к которому ходят агенты, читает **runtime-папку**
|
|
197
|
+
(`~/.bitrix24-mcp-bridge/actions.json` + запущенный `dist/cli.js`), а не файлы репозитория. После
|
|
198
|
+
правки каталога или кода сервера выполни **`bun run sync:runtime`**: она пересоберёт бандл, скопирует
|
|
199
|
+
репо-`actions.json` в runtime-папку и погасит daemon (следующий вызов агента поднимет свежий). Без
|
|
200
|
+
этого новые инструменты/методы агенту не видны.
|
|
201
|
+
|
|
171
202
|
Дистрибуция: `bin` `bitrix24-bridge` → `dist/cli.js`; npm-хук `prepare` при установке
|
|
172
203
|
собирает и `dist/cli.js`, и статичные бандлы расширения (`extension/dist/`), которые
|
|
173
204
|
`setup` затем копирует в runtime-домашнюю папку. Публикуемые файлы перечислены в `files`
|
|
174
205
|
(`dist`, `extension/dist`, `docs/api-notes.md`, `actions.example.json`).
|
|
175
206
|
|
|
207
|
+
### Релизы
|
|
208
|
+
|
|
209
|
+
Версионирование и публикация автоматизированы (conventional commits →
|
|
210
|
+
[release-please](.github/workflows/release-please.yml)): бот ведёт release-PR с bump'ом версии и
|
|
211
|
+
`CHANGELOG.md`; при его мерже создаётся GitHub Release/тег и пакет публикуется в npm через **OIDC
|
|
212
|
+
Trusted Publisher** (с provenance, без токенов). CI ([`.github/workflows/ci.yml`](.github/workflows/ci.yml))
|
|
213
|
+
гоняет `typecheck` + тесты на push/PR. Ручная до-публикация застрявшего релиза — `workflow_dispatch`
|
|
214
|
+
на `release-please`.
|
|
215
|
+
|
|
176
216
|
## Документация
|
|
177
217
|
|
|
178
218
|
- [docs/RUNBOOK.md](docs/RUNBOOK.md) — установка, настройка, повседневная работа, диагностика
|
package/actions.example.json
CHANGED
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
"chat.dialogId": { "action": "im.v2.Chat.getDialogId", "method": "POST" },
|
|
24
24
|
"chat.read.all": { "action": "im.v2.Chat.readAll", "method": "POST" },
|
|
25
25
|
"im.user.get": { "endpoint": "/rest/im.user.get.json", "method": "POST" },
|
|
26
|
+
"im.chat.get": { "endpoint": "/rest/im.chat.get.json", "method": "POST" },
|
|
26
27
|
|
|
27
28
|
"task.subtasks": { "action": "tasks.v2.Task.Relation.Child.list", "method": "POST", "bodyType": "json" },
|
|
28
29
|
"task.related": { "action": "tasks.v2.Task.Relation.Related.list", "method": "POST", "bodyType": "json" }
|
package/dist/cli.js
CHANGED
|
@@ -25296,7 +25296,7 @@ function loadCatalog(path) {
|
|
|
25296
25296
|
// src/tools/help.ts
|
|
25297
25297
|
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
25298
25298
|
var API_NOTES = fileURLToPath2(new URL("../../docs/api-notes.md", import.meta.url));
|
|
25299
|
-
var HELP = '# Bitrix24 API notes (reverse-engineered)\n\n\u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A \u043F\u043E \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u043C\u0443 API Bitrix24, \u0434\u043E\u0431\u044B\u0442\u044B\u0439 **\u0436\u0438\u0432\u044B\u043C \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C** (\u0443 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 ajax-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u043E\u0432\n\u043D\u0435\u0442 \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u043E\u0439 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0438). \u041F\u0440\u0435\u0434\u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D \u0434\u043B\u044F \u043B\u044E\u0431\u043E\u0433\u043E \u0418\u0418-\u0430\u0433\u0435\u043D\u0442\u0430 \u0438\u043B\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0432\u044B\u0437\u044B\u0432\u0430\u0435\u0442\n\u044D\u0442\u0438 \u043C\u0435\u0442\u043E\u0434\u044B \u0447\u0435\u0440\u0435\u0437 \u043C\u043E\u0441\u0442 (`bitrix_call` / \u0442\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B) \u0438\u043B\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044F\u0435\u0442 \u043A\u0430\u0442\u0430\u043B\u043E\u0433.\n\n\u041D\u0430\u0431\u043B\u044E\u0434\u0435\u043D\u0438\u044F \u0441\u043D\u044F\u0442\u044B \u043D\u0430 \u043F\u043E\u0440\u0442\u0430\u043B\u0435 `example.bitrix24.ru` (\u043E\u0431\u043B\u0430\u043A\u043E, \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 **im.v2**, \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435\n**scrum-\u0431\u043E\u0440\u0434\u0430**). \u0418\u043C\u0435\u043D\u0430 \u043F\u043E\u043B\u0435\u0439 \u0438 \u043A\u043E\u043D\u0432\u0435\u043D\u0446\u0438\u0438 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B \u0434\u043B\u044F \u043E\u0431\u043B\u0430\u0447\u043D\u043E\u0433\u043E Bitrix24, \u043D\u043E \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0435 \u043D\u0430 \u0434\u0440\u0443\u0433\u043E\u0439\n\u043F\u043E\u0440\u0442\u0430\u043B \u0441\u0432\u0435\u0440\u044F\u0439\u0441\u044F \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C (`docs/reconnaissance.md`).\n\n---\n\n## 1. \u041A\u0430\u043A \u0432\u044B\u0437\u044B\u0432\u0430\u0442\u044C\n\n- **`bitrix_call { name, params }`** \u2014 \u0443\u043D\u0438\u0432\u0435\u0440\u0441\u0430\u043B\u044C\u043D\u044B\u0439 \u0432\u044B\u0437\u043E\u0432 \u043B\u044E\u0431\u043E\u0433\u043E \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043D\u043D\u043E\u0433\u043E \u0438\u043C\u0435\u043D\u0438 \u0438\u0437 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430\n (`actions.json`). `params` \u2014 \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 Bitrix (\u0441\u043C. \u0440\u0430\u0437\u0434\u0435\u043B 3). \u041A\u0430\u0442\u0430\u043B\u043E\u0433 \u043C\u043E\u0436\u0435\u0442 \u0432\u043A\u043B\u044E\u0447\u0430\u0442\u044C\n \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0435 \u0432\u044B\u0437\u043E\u0432\u044B; allowlist (`actions.json`) \u2014 \u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\u043D\u043D\u0430\u044F \u0433\u0440\u0430\u043D\u0438\u0446\u0430, \u043D\u0435 \u0440\u0435\u0436\u0438\u043C \u0447\u0442\u0435\u043D\u0438\u044F.\n- **\u0422\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B** \u2014 \u043E\u0431\u0451\u0440\u0442\u043A\u0438 \u0441 \u0440\u0430\u0437\u0443\u043C\u043D\u044B\u043C\u0438 \u0434\u0435\u0444\u043E\u043B\u0442\u0430\u043C\u0438 \u043D\u0430\u0434 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u043E\u043C. \u0422\u043E\u0447\u043D\u0430\u044F \u0432\u044B\u0431\u043E\u0440\u043A\u0430 \u2014 \u0447\u0435\u0440\u0435\u0437\n \u043E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0439 `params`, \u043E\u043D \u043C\u0435\u0440\u0436\u0438\u0442\u0441\u044F **\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u043C** \u0438 \u043F\u0435\u0440\u0435\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u0434\u0435\u0444\u043E\u043B\u0442\u044B. \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044E\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0442\u0435,\n \u0447\u044C\u0451 \u0438\u043C\u044F \u0435\u0441\u0442\u044C \u0432 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0435 (`actions.json`); \u0438\u043D\u0430\u0447\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u0435\u0442\u0441\u044F. \u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u043D\u0430\u0431\u043E\u0440:\n - \u0417\u0430\u0434\u0430\u0447\u0438: `bitrix_tasks_list`, `bitrix_task_get`, `bitrix_task_get_v2` (v2/JSON),\n `bitrix_task_scrum_info`, `bitrix_task_files`, `bitrix_task_views_count`,\n `bitrix_task_subtasks` (\u043F\u043E\u0434\u0437\u0430\u0434\u0430\u0447\u0438), `bitrix_task_related` (\u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435).\n - \u041F\u0440\u043E\u0435\u043A\u0442\u044B: `bitrix_projects_list`, `bitrix_project_get`.\n - \u0427\u0430\u0442\u044B: `bitrix_chats_recent`, `bitrix_recent_load` (\u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u043F\u043E \u0441\u0435\u043A\u0446\u0438\u0438 \u2014 \u0432 \u0442.\u0447. `tasksTask` =\n \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447), `bitrix_recent_tail` (\u043B\u0438\u0441\u0442\u0430\u0442\u044C \u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u0432\u0433\u043B\u0443\u0431\u044C), `bitrix_chat_load` (\u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043F\u043E\n `dialogId`/`chatId`), `bitrix_chat_messages`, `bitrix_chat_history` (\u043B\u0438\u0441\u0442\u0430\u0442\u044C \u0432\u0433\u043B\u0443\u0431\u044C \u043F\u043E `beforeId`),\n `bitrix_chat_get_dialog_id` (dialogId \u043F\u043E externalId), `bitrix_chat_mark_read` (\u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439),\n `bitrix_chat_read_all` (\u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439).\n - \u041B\u044E\u0434\u0438/\u043F\u043E\u0438\u0441\u043A: `bitrix_user_get` (\u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u044E\u0437\u0435\u0440\u0430), `bitrix_entity_selector` (\u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0441\u0435\u043B\u0435\u043A\u0442\u043E\u0440\u0430),\n `bitrix_entity_search` (\u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u043F\u043E\u0438\u0441\u043A \u0447\u0430\u0442\u043E\u0432/\u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 `ui.entityselector.doSearch`).\n\n \u041B\u044E\u0431\u043E\u0435 \u0438\u043C\u044F \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u0438 \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E \u0447\u0435\u0440\u0435\u0437 `bitrix_call { name, params }`.\n- **`bitrix_help`** \u2014 \u044D\u0442\u043E\u0442 \u0436\u0435 \u0433\u0430\u0439\u0434, \u043E\u0442\u0434\u0430\u0451\u0442\u0441\u044F \u0447\u0435\u0440\u0435\u0437 MCP (\u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 + resource `bitrix://api-notes`).\n \u0418\u0441\u0442\u043E\u0447\u043D\u0438\u043A \u2014 **\u044D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B** (`docs/api-notes.md`).\n\n\u041F\u043E\u043B\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A \u0438\u043C\u0451\u043D \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u043E\u0442\u0434\u0430\u0451\u0442 `bitrix_call` \u0432 \u0441\u0432\u043E\u0451\u043C \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0438 (`deps.catalog.names()`).\n\n---\n\n## 2. \u0424\u043E\u0440\u043C\u0430\u0442 \u043E\u0442\u0432\u0435\u0442\u0430 (\u0432\u0430\u0436\u043D\u043E!)\n\nAjax-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u044B (`/bitrix/services/main/ajax.php`) \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0442 HTTP 200 \u0441 \u043A\u043E\u043D\u0432\u0435\u0440\u0442\u043E\u043C:\n\n```jsonc\n{ "status": "success" | "error",\n "data": { ... },\n "errors": [] } // \u041F\u0423\u0421\u0422\u041E\u0419 \u043C\u0430\u0441\u0441\u0438\u0432 \u043F\u0440\u0438 \u0443\u0441\u043F\u0435\u0445\u0435! (\u0432 JS [] \u2014 truthy)\n```\n\n- \u0423\u0441\u043F\u0435\u0445 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442\u0441\u044F `status:"success"` \u0438/\u0438\u043B\u0438 **\u043F\u0443\u0441\u0442\u044B\u043C** `errors`. \u041D\u0435\u043F\u0443\u0441\u0442\u043E\u0439 `errors` / `status:"error"` /\n top-level `error` \u2014 \u0440\u0435\u0430\u043B\u044C\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430 (\u043C\u043E\u0441\u0442 \u043C\u0430\u043F\u043F\u0438\u0442 \u044D\u0442\u043E \u0432 `ok:false`).\n- REST-\u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u044B (`/rest/*.json`) \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0442 \u0438\u043D\u0430\u0447\u0435: `{ "result": \u2026, "next", "total", "time" }` \u2014 \u0431\u0435\u0437 `errors`.\n\n---\n\n## 3. \u0422\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442: form vs json (\u0440\u0430\u0437\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043F\u043E \u043C\u0435\u0442\u043E\u0434\u0443!)\n\n\u0423 \u043A\u0430\u0436\u0434\u043E\u0439 \u0437\u0430\u043F\u0438\u0441\u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0435\u0441\u0442\u044C **`bodyType`** \u2014 \u043A\u0430\u043A \u043C\u043E\u0441\u0442 \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u043B\u043E:\n\n- **`bodyType: "form"`** (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E) \u2014 `application/x-www-form-urlencoded`; \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E\u0441\u0442\u044C \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044F\n PHP-\u0441\u0442\u0438\u043B\u0435\u043C (`filter[STATUS]=2`, `select[0]=ID`). \u041E\u0431\u044A\u0435\u043A\u0442 \u0432 `params` \u0440\u0435\u043A\u0443\u0440\u0441\u0438\u0432\u043D\u043E \u0440\u0430\u0437\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0432 \u0442\u0430\u043A\u0438\u0435\n \u043A\u043B\u044E\u0447\u0438. \u041A\u043B\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043A\u0438\u0435 `tasks.task.*`, \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 `im.v2.*`, REST \u2014 \u0432\u0441\u0451 \u044D\u0442\u043E \u0444\u043E\u0440\u043C\u0430.\n- **`bodyType: "json"`** \u2014 \u0442\u0435\u043B\u043E \u0443\u0445\u043E\u0434\u0438\u0442 \u043A\u0430\u043A `JSON.stringify(params)` \u0441 `Content-Type: application/json`.\n \u0422\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 **`tasks.v2.*`** (\u043D\u0430\u043F\u0440. `tasks.v2.Task.get` \u0436\u0434\u0451\u0442 `{"task":{"id":N}}`) \u0438 `ui.entityselector.*`.\n `params` \u043F\u0440\u0438 \u044D\u0442\u043E\u043C \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0435\u0442 \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u0443\u044E \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0443 \u043A\u0430\u043A \u0435\u0441\u0442\u044C (\u043D\u0435 \u0440\u0430\u0437\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0432 bracket-\u043A\u043B\u044E\u0447\u0438).\n\n> \u0418\u0441\u0442\u043E\u0440\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u0437\u0430\u043C\u0435\u0442\u043A\u0430: \u0440\u0430\u043D\u044C\u0448\u0435 \u043C\u043E\u0441\u0442 \u0443\u043C\u0435\u043B \u0442\u043E\u043B\u044C\u043A\u043E \u0444\u043E\u0440\u043C\u0443, \u0438 `tasks.v2.*` \u0431\u044B\u043B\u0438 \u043D\u0435\u043F\u0440\u0438\u0433\u043E\u0434\u043D\u044B. \u0422\u0435\u043F\u0435\u0440\u044C\n> \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0430\u043D\u044B \u2014 \u0432 \u0437\u0430\u043F\u0438\u0441\u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0441\u0442\u0430\u0432\u044C `"bodyType": "json"`, \u0438 \u043C\u043E\u0441\u0442 \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442 \u0438\u0445 \u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u043E.\n\n**CSRF / sessid:** \u043C\u043E\u0441\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0448\u043B\u0451\u0442 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A **`X-Bitrix-Csrf-Token: <sessid>`** (\u0441\u0432\u0435\u0436\u0438\u0439\n`BX.bitrix_sessid()`). Form-\u0442\u0435\u043B\u0430 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043D\u0435\u0441\u0443\u0442 `sessid` \u043F\u043E\u043B\u0435\u043C \u0432 \u0442\u0435\u043B\u0435 (legacy REST \u044D\u0442\u043E \u0442\u0440\u0435\u0431\u0443\u0435\u0442);\nJSON-\u0442\u0435\u043B\u0430 \u043D\u0435\u0441\u0443\u0442 sessid **\u0442\u043E\u043B\u044C\u043A\u043E** \u0432 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0435. \u041E\u0442\u0432\u0435\u0442 `invalid_csrf`/`invalid_authentication` = \u0441\u0435\u0441\u0441\u0438\u044F\n\u043F\u0440\u043E\u0442\u0443\u0445\u043B\u0430 (\u043F\u0435\u0440\u0435\u043B\u043E\u0433\u0438\u043D\u044C\u0441\u044F \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435).\n\n| \u041C\u0435\u0442\u043E\u0434 (action / endpoint) | bodyType | \u0413\u0434\u0435 `select`/`filter`/`order` | \u041F\u0430\u0433\u0438\u043D\u0430\u0446\u0438\u044F |\n|---|---|---|---|\n| `tasks.task.list` | form | **\u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C**: `select[]`, `filter{}`, `order{}` | `start` (\u0441\u0434\u0432\u0438\u0433, \u0448\u0430\u0433 50) |\n| `tasks.task.get` | form | \u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C: `taskId`, `select[]` | \u2014 |\n| `tasks.v2.Task.get` | **json** | `{"task": {"id": N}}` | \u2014 |\n| `tasks.v2.Scrum.getTaskInfo` | **json** | `{"taskId": N}` | \u2014 |\n| `tasks.v2.File.listObjects` | **json** | `{"ids": [N,\u2026]}` | \u2014 |\n| `tasks.v2.Task.View.User.count` | **json** | `{"task": {"id": N}}` | \u2014 |\n| `tasks.v2.Task.Relation.Child.list` | **json** | `{"taskId": N, "withIds":true, "navigation":{"size":N}}` | `navigation` |\n| `tasks.v2.Task.Relation.Related.list` | **json** | `{"taskId": N, \u2026}` (\u043A\u0430\u043A Child) | `navigation` |\n| `socialnetwork.api.workgroup.list` | form | **\u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C**: `select[]`, `order{}`, `filter{}` | (nav \u2014 \u043D\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u043E) |\n| `socialnetwork.api.workgroup.get` | form | **\u043E\u0431\u0451\u0440\u043D\u0443\u0442\u043E**: `params[groupId]`, `params[select][]` | \u2014 |\n| `/rest/im.recent.list.json` | form (rest) | \u043F\u043B\u043E\u0441\u043A\u043E: `LIMIT`, `SKIP_OPENLINES`, `UNREAD_ONLY`, \u2026 | `LIMIT` |\n| `/rest/im.user.get.json` | form (rest) | \u043F\u043B\u043E\u0441\u043A\u043E: `ID` | \u2014 |\n| `im.v2.Recent.load` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `limit`, `filter[recentSection]`, `filter[unread]`, `filter[parentId]` | `im.v2.Recent.tail` |\n| `im.v2.Recent.tail` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `limit`, `filter[lastMessageDate]` (\u043A\u0443\u0440\u0441\u043E\u0440), `filter[recentSection]` | `filter[lastMessageDate]` |\n| `im.v2.Chat.load` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `dialogId`\\|`chatId`, `messageLimit` | \u2014 |\n| `im.v2.Chat.getDialogId` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `externalId` | \u2014 |\n| `im.v2.Chat.Message.list` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `limit` | \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u044F\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u2014 \u043D\u0430\u0437\u0430\u0434 **\u043D\u0435 \u043B\u0438\u0441\u0442\u0430\u0435\u0442**, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 `.tail` |\n| `im.v2.Chat.Message.tail` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `limit`, `filter[lastId]`, `order[id]` | **\u0441\u043C. \u0440\u0430\u0437\u0434\u0435\u043B 6** |\n| `im.v2.Chat.Message.read` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `ids[]`, `actionUuid` | \u2014 (\u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439) |\n| `im.v2.Chat.readAll` | form | \u0431\u0435\u0437 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 | \u2014 (\u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439) |\n| `ui.entityselector.load` | **json** | `{"dialog": {entities,preselectedItems,\u2026}}` | \u2014 |\n| `ui.entityselector.doSearch` | **json** | `{"dialog": {\u2026}, "searchQuery": {"query": "...", "queryWords": ["..."]}}` | \u2014 |\n\n---\n\n## 4. \u041A\u0430\u0442\u0430\u043B\u043E\u0433: \u0438\u043C\u044F \u2192 action \u2192 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B\n\n| \u0418\u043C\u044F (`actions.json`) | action / endpoint | bodyType | \u041A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 params |\n|---|---|---|---|\n| `tasks.list` | `tasks.task.list` | form | `filter{RESPONSIBLE_ID,REAL_STATUS,GROUP_ID,\u2026}`, `select[]`, `order{}`, `start` |\n| `task.get` | `tasks.task.get` | form | `taskId`, `select[]` |\n| `task.v2.get` | `tasks.v2.Task.get` | json | `task.id` (id \u0437\u0430\u0434\u0430\u0447\u0438) |\n| `task.scrum.info` | `tasks.v2.Scrum.getTaskInfo` | json | `taskId` |\n| `task.files` | `tasks.v2.File.listObjects` | json | `ids` (\u043C\u0430\u0441\u0441\u0438\u0432 id) |\n| `task.views.count` | `tasks.v2.Task.View.User.count` | json | `task.id` (id \u0437\u0430\u0434\u0430\u0447\u0438) |\n| `task.subtasks` | `tasks.v2.Task.Relation.Child.list` | json | `taskId`, `navigation{size}` |\n| `task.related` | `tasks.v2.Task.Relation.Related.list` | json | `taskId`, `navigation{size}` |\n| `projects.list` | `socialnetwork.api.workgroup.list` | form | `select[]`, `order{}`, `filter{}` |\n| `projects.get` | `socialnetwork.api.workgroup.get` | form | `params[groupId]`, `params[select][]` |\n| `chats.recent` | `/rest/im.recent.list.json` | form | `LIMIT`, `UNREAD_ONLY`, `SKIP_OPENLINES` |\n| `recent.load` | `im.v2.Recent.load` | form | `filter[recentSection]` (`tasksTask`/`collab`/\u2026), `limit`, `filter[unread]` |\n| `recent.tail` | `im.v2.Recent.tail` | form | `filter[lastMessageDate]`, `filter[recentSection]`, `limit` |\n| `chat.load` | `im.v2.Chat.load` | form | `dialogId`\\|`chatId`, `messageLimit` |\n| `chat.dialogId` | `im.v2.Chat.getDialogId` | form | `externalId` (\u043D\u0430\u043F\u0440. `"sg"+groupId`) |\n| `chat.messages` | `im.v2.Chat.Message.list` | form | `chatId`, `limit` (\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435; \u0432\u0433\u043B\u0443\u0431\u044C \u2014 `chat.messages.tail`) |\n| `chat.messages.tail` | `im.v2.Chat.Message.tail` | form | `chatId`, `filter[lastId]`, `order[id]`, `limit` |\n| `chat.message.read` | `im.v2.Chat.Message.read` | form | `chatId`, `ids[0]`, `actionUuid` |\n| `chat.read.all` | `im.v2.Chat.readAll` | form | \u2014 (\u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439) |\n| `im.user.get` | `/rest/im.user.get.json` | form | `ID` |\n| `entityselector.load` | `ui.entityselector.load` | json | `dialog` (\u043E\u0431\u044A\u0435\u043A\u0442) |\n| `entityselector.search` | `ui.entityselector.doSearch` | json | `dialog`, `searchQuery{query,queryWords}` |\n\n---\n\n## 5. \u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A \u043F\u043E\u043B\u0435\u0439\n\n**\u0417\u0430\u0434\u0430\u0447\u0430** (`tasks.task.*`): `ID`, `TITLE`, `DESCRIPTION`, `STATUS`, `REAL_STATUS`, `RESPONSIBLE_ID`,\n`CREATED_BY`, `CREATED_DATE`, `CHANGED_DATE`, `DEADLINE`, `CLOSED_DATE`, `PRIORITY`, `GROUP_ID`,\n`TAGS`, `TIME_ESTIMATE`, `UF_*`. \u041E\u0442\u0432\u0435\u0442 \u0442\u0430\u043A\u0436\u0435 \u043F\u043E\u0434\u043A\u043B\u0430\u0434\u044B\u0432\u0430\u0435\u0442 \u043E\u0431\u044A\u0435\u043A\u0442\u044B `group`, `responsible`, `creator`, `action`.\n\n\u0421\u0442\u0430\u0442\u0443\u0441\u044B \u0437\u0430\u0434\u0430\u0447\u0438 (`STATUS`): `1` \u041D\u043E\u0432\u0430\u044F \xB7 `2` \u0416\u0434\u0451\u0442 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \xB7 `3` \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \xB7 `4` \u0416\u0434\u0451\u0442 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044F \xB7\n`5` \u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430 \xB7 `6` \u041E\u0442\u043B\u043E\u0436\u0435\u043D\u0430 \xB7 `7` \u041E\u0442\u043A\u043B\u043E\u043D\u0435\u043D\u0430.\n\n**\u0417\u0430\u0434\u0430\u0447\u0430 v2** (`tasks.v2.*`): id \u0437\u0430\u0434\u0430\u0447\u0438 \u043F\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044F \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E \u2014 **`{"task": {"id": N}}`** (\u0443 `Task.get` \u0438\n`Task.View.User.count`), \u0430 \u0443 `Scrum.getTaskInfo` \u0438 `Relation.*` \u2014 \u043F\u043B\u043E\u0441\u043A\u043E `{"taskId": N}`. \u042D\u0442\u043E \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u0430\u044F\n\u043F\u043E\u0434\u0441\u0438\u0441\u0442\u0435\u043C\u0430 scrum-\u0431\u043E\u0440\u0434\u0430; \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0443 \u043E\u0442\u0432\u0435\u0442\u0430 \u0441\u0432\u0435\u0440\u044C \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C \u2014 \u0432 \u0437\u0430\u0445\u0432\u0430\u0442\u0435 \u0432\u0438\u0434\u043D\u044B \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0437\u0430\u043F\u0440\u043E\u0441\u0430.\n\n**\u0413\u0440\u0443\u043F\u043F\u0430/\u043F\u0440\u043E\u0435\u043A\u0442 \u2014 \u0441\u043F\u0438\u0441\u043E\u043A** (`workgroup.list`, camelCase \u0432 \u043E\u0442\u0432\u0435\u0442\u0435): `ID`, `NAME`, `DESCRIPTION`,\n`NUMBER_OF_MEMBERS`, `OWNER_ID`, `DATE_CREATE`, `PROJECT` (Y/N), `TYPE`.\n**\u0413\u0440\u0443\u043F\u043F\u0430 \u2014 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430** (`workgroup.get`): \u043F\u043B\u044E\u0441 `OWNER_DATA`, `SUBJECT_DATA`, `MEMBERS[]`,\n`MODERATOR_MEMBERS[]`, `CHAT_ID`, `DIALOG_ID`, `IMAGE_ID`, UF-\u043F\u043E\u043B\u044F.\n\n**\u041D\u0435\u0434\u0430\u0432\u043D\u0438\u0439 \u0447\u0430\u0442** (`im.recent.list`): `chat_id`, `title`, `type`, `message{id,text,date,author_id}`,\n`last_id`, `unread`, `pinned`, `user{\u2026}`, `chat{\u2026}`.\n**\u041D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u043F\u043E \u0441\u0435\u043A\u0446\u0438\u0438** (`im.v2.Recent.load`): \u0444\u0438\u043B\u044C\u0442\u0440 `filter[recentSection]` \u2014 `default` (\u043E\u0431\u044B\u0447\u043D\u044B\u0435\n\u0434\u0438\u0430\u043B\u043E\u0433\u0438), **`tasksTask` (\u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447)**, `collab`/`collabDefault` (\u043A\u043E\u043B\u043B\u0430\u0431\u044B). \u041B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u0432\u0433\u043B\u0443\u0431\u044C \u2014\n`im.v2.Recent.tail` \u0441 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u043C `filter[lastMessageDate]` (ISO-\u0434\u0430\u0442\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B).\n**\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u044E\u0437\u0435\u0440\u0430** (`im.user.get`): `id`, `name`, `first_name`, `last_name`, `avatar`, `work_position`,\n`gender`, `status`, `online` \u2014 \u0440\u0435\u0437\u043E\u043B\u0432 \u0430\u0432\u0442\u043E\u0440\u0430 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F (`authorId`) \u0432 \u0438\u043C\u044F.\n**\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435** (`im.v2.Chat.Message.*`): `id`, `chatId`, `authorId`, `date`, `text`, `params`, `viewed`.\n\u041E\u0442\u0432\u0435\u0442 \u0442\u0430\u043A\u0436\u0435 \u043D\u0435\u0441\u0451\u0442 `users[]` (\u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0438), `additionalMessages[]`, `hasPrevPage`/`hasNextPage`.\n`chatId` \u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 `im.recent.list` (`chat_id`) \u0438\u043B\u0438 \u0438\u0437 `workgroup.get` (`CHAT_ID`/`DIALOG_ID`).\n\n**\u0410\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044F \u0447\u0430\u0442\u0430 (`chat.load`): `dialogId` vs `chatId`.** `chat.load` \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442 \u043B\u044E\u0431\u043E\u0439 \u0438\u0437 \u0434\u0432\u0443\u0445:\n- `dialogId` = **ID \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F** (\u0447\u0438\u0441\u043B\u043E, \u043D\u0430\u043F\u0440. `11`) \u2192 **\u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 1-\u043D\u0430-1** \u0441 \u044D\u0442\u0438\u043C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C.\n- `dialogId` = **`"chat"+CHAT_ID`** (\u043D\u0430\u043F\u0440. `"chat7111"`) \u2192 **\u0433\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439 \u0447\u0430\u0442** (\u043F\u0440\u043E\u0435\u043A\u0442\u0430/\u0437\u0430\u0434\u0430\u0447\u0438/\u043A\u0430\u043D\u0430\u043B\u0430).\n- `chatId` = \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 `CHAT_ID` \u2014 \u0442\u043E \u0436\u0435, \u0447\u0442\u043E \u0433\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439 `dialogId`, \u043D\u043E \u0431\u0435\u0437 \u043F\u0440\u0435\u0444\u0438\u043A\u0441\u0430.\n\n\u041E\u0442\u0432\u0435\u0442 `chat.load` \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 `chatId` \u2014 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 \u0435\u0433\u043E \u0434\u0430\u043B\u044C\u0448\u0435 \u0434\u043B\u044F `chat.messages` /\n`chat.messages.tail` (\u043B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u0432\u0433\u043B\u0443\u0431\u044C) \u0438 `chat.message.read` (\u044D\u0442\u0438 \u0442\u0440\u0438 \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 \u043F\u043E `chatId`, \u043D\u0435 \u043F\u043E `dialogId`).\n\n---\n\n## 6. \u041F\u0440\u0438\u043C\u0435\u0440\u044B \u0432\u044B\u0437\u043E\u0432\u043E\u0432\n\n```jsonc\n// \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0433\u043E 55, \u043F\u043E \u0434\u0435\u0434\u043B\u0430\u0439\u043D\u0443, \u0432\u0442\u043E\u0440\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430\nbitrix_tasks_list { "params": { "filter": {"RESPONSIBLE_ID":55,"REAL_STATUS":2},\n "order": {"DEADLINE":"asc"}, "start": 50 } }\n\n// \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u043D\u044B\u043C \u043D\u0430\u0431\u043E\u0440\u043E\u043C \u043F\u043E\u043B\u0435\u0439\nbitrix_task_get { "taskId": 4229, "params": { "select": ["ID","TITLE","DESCRIPTION","TAGS","TIME_ESTIMATE"] } }\n\n// \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 v2-\u043F\u043E\u0434\u0441\u0438\u0441\u0442\u0435\u043C\u0443 (JSON-\u0442\u0435\u043B\u043E; id \u0432\u043B\u043E\u0436\u0435\u043D \u0432 task)\nbitrix_task_get_v2 { "taskId": 4229 } // \u2192 { "task": { "id": 4229 } }\nbitrix_call { "name": "task.v2.get", "params": { "task": { "id": 4229 } } }\n\n// \u0444\u0430\u0439\u043B\u044B \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043A \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u043E\u0432 (v2, JSON-\u0442\u0435\u043B\u043E); \u043F\u043E\u0434\u0437\u0430\u0434\u0430\u0447\u0438/\u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435\nbitrix_call { "name": "task.files", "params": { "ids": [4229] } }\nbitrix_call { "name": "task.views.count", "params": { "task": { "id": 4229 } } }\nbitrix_task_subtasks { "taskId": 4229 }\nbitrix_task_related { "taskId": 4229 }\n\n// \u043F\u0440\u043E\u0435\u043A\u0442\u044B \u043F\u043E \u0434\u0430\u0442\u0435 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F; \u043F\u043E\u043B\u043D\u0430\u044F \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0433\u0440\u0443\u043F\u043F\u044B\nbitrix_projects_list { "params": { "order": {"DATE_CREATE":"desc"} } }\nbitrix_project_get { "groupId": 15 }\n\n// \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0447\u0430\u0442 (\u043F\u0435\u0440\u0432\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F)\nbitrix_chat_load { "chatId": 485, "messageLimit": 50 }\n\n// \u041B\u0418\u0421\u0422\u0410\u041D\u0418\u0415 \u0418\u0421\u0422\u041E\u0420\u0418\u0418 \u0412\u0413\u041B\u0423\u0411\u042C (\u0441\u0442\u0430\u0440\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F): beforeId = \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 id \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\n// \u0438\u0437 \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B. \u041F\u043E\u0432\u0442\u043E\u0440\u044F\u0439, \u0443\u043C\u0435\u043D\u044C\u0448\u0430\u044F beforeId, \u0434\u043E \u043D\u0430\u0447\u0430\u043B\u0430 \u0438\u0441\u0442\u043E\u0440\u0438\u0438 (order DESC \u2014 \u0434\u0435\u0444\u043E\u043B\u0442).\nbitrix_chat_history { "chatId": 485, "beforeId": 1861279 }\n\n// \u043F\u043E\u043C\u0435\u0442\u0438\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u043C\u0438 (\u041C\u0423\u0422\u0418\u0420\u0423\u042E\u0429\u0418\u0419). actionUuid \u0433\u0435\u043D\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.\nbitrix_chat_mark_read { "chatId": 40271, "ids": [1884131] }\n```\n\n### 6.1. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0439: \u0447\u0430\u0442 \u0441 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u044B\u043C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C\n\n\u041B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 1-\u043D\u0430-1 \u0430\u0434\u0440\u0435\u0441\u0443\u0435\u0442\u0441\u044F `dialogId` = **ID \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F**. Id \u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 \u0437\u0430\u0434\u0430\u0447\u0438\n(`RESPONSIBLE_ID`/`CREATED_BY`), \u0438\u0437 `bitrix_chats_recent`, \u043B\u0438\u0431\u043E \u0440\u0435\u0437\u043E\u043B\u0432\u0438\u0442\u0441\u044F \u043F\u043E\u0438\u0441\u043A\u043E\u043C (\xA76.3).\n\n```jsonc\n// 1) \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 \u0441 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C 11 \u2192 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 chatId\nbitrix_chat_load { "dialogId": 11 }\n// 2) \u043B\u0438\u0441\u0442\u0430\u0442\u044C \u0435\u0433\u043E \u0438\u0441\u0442\u043E\u0440\u0438\u044E \u0432\u0433\u043B\u0443\u0431\u044C \u043F\u043E chatId \u0438\u0437 \u043E\u0442\u0432\u0435\u0442\u0430 \u0448\u0430\u0433\u0430 1\nbitrix_chat_history { "chatId": 485, "beforeId": 1861279 }\n```\n\n### 6.2. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0439: \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 (\u0447\u0430\u0442) \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438\n\n\u0423 \u043A\u0430\u0436\u0434\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0435\u0441\u0442\u044C \u0441\u0432\u043E\u0439 im-\u0447\u0430\u0442-\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435. \u0414\u0432\u0430 \u043F\u0443\u0442\u0438 \u043D\u0430\u0439\u0442\u0438 \u0435\u0433\u043E `chatId`:\n\n**\u0410. \u0427\u0435\u0440\u0435\u0437 \u0441\u043F\u0438\u0441\u043E\u043A \u0447\u0430\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447 (\u043F\u0440\u044F\u043C\u043E\u0439).** `im.v2.Recent.load` \u0441 \u0441\u0435\u043A\u0446\u0438\u0435\u0439 `tasksTask` \u043E\u0442\u0434\u0430\u0451\u0442 \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447\n(\u0432 `bitrix_chats_recent` / `/rest/im.recent.list` \u0438\u0445 \u041D\u0415\u0422). \u041B\u0438\u0441\u0442\u0430\u0442\u044C \u0432\u0433\u043B\u0443\u0431\u044C \u2014 `bitrix_recent_tail`.\n\n```jsonc\nbitrix_recent_load { "section": "tasksTask" } // \u2192 \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447 \u0441 chatId/dialogId\nbitrix_recent_tail { "section": "tasksTask", "lastMessageDate": "2026-06-29T17:25:38+03:00" }\n// \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u044B\u0439 \u0447\u0430\u0442 \u0438 \u043B\u0438\u0441\u0442\u0430\u0442\u044C \u0438\u0441\u0442\u043E\u0440\u0438\u044E\nbitrix_chat_load { "dialogId": "chat38849" } // \u0438\u043B\u0438 { "chatId": 38849 }\nbitrix_chat_history { "chatId": 38849, "beforeId": 1722353 }\n```\n\n**\u0411. \u041F\u043E\u0438\u0441\u043A\u043E\u043C \u043F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E \u0437\u0430\u0434\u0430\u0447\u0438** \u2014 `bitrix_entity_search` \u0441 \u0441\u0435\u043A\u0446\u0438\u0435\u0439 `tasksTask`:\n\n```jsonc\nbitrix_entity_search { "query": "\u0442\u0440\u0435\u043A\u0435\u0440", "section": "tasksTask" }\n```\n\n**\u0427\u0430\u0442 \u041F\u0420\u041E\u0415\u041A\u0422\u0410 \u0437\u0430\u0434\u0430\u0447\u0438** (\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B, \u043D\u0435 \u0441\u0430\u043C\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438) \u2014 \u0447\u0435\u0440\u0435\u0437 `GROUP_ID`:\n\n```jsonc\nbitrix_task_get { "taskId": 4229, "params": { "select": ["ID","GROUP_ID"] } }\nbitrix_project_get { "groupId": 15 } // \u043E\u0442\u0434\u0430\u0451\u0442 CHAT_ID / DIALOG_ID\nbitrix_chat_load { "dialogId": "chat7111" }\nbitrix_chat_get_dialog_id { "externalId": "sg15" } // \u043B\u0438\u0431\u043E \u0440\u0435\u0437\u043E\u043B\u0432 dialogId \u0441\u043E\u0446\u0433\u0440\u0443\u043F\u043F\u044B \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E\n```\n\n### 6.3. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0439: \u043F\u043E\u0438\u0441\u043A \u0447\u0430\u0442\u0430 / \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\n\n\u0422\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u043F\u043E\u0438\u0441\u043A \u2014 `bitrix_entity_search` (\u043E\u0431\u0451\u0440\u0442\u043A\u0430 \u043D\u0430\u0434 `ui.entityselector.doSearch`): \u0441\u0430\u043C \u0441\u043E\u0431\u0438\u0440\u0430\u0435\u0442\n\u0434\u0438\u0430\u043B\u043E\u0433 `IM_CHAT_SEARCH` \u0438 `searchQuery` \u0438\u0437 \u0441\u0442\u0440\u043E\u043A\u0438:\n\n```jsonc\nbitrix_entity_search { "query": "\u0434\u043C\u0438\u0442\u0440\u0438\u0439" } // \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0447\u0430\u0442\u043E\u0432/\u0434\u0438\u0430\u043B\u043E\u0433\u043E\u0432\nbitrix_entity_search { "query": "\u0442\u0440\u0435\u043A\u0435\u0440", "section": "tasksTask" } // \u0441\u0440\u0435\u0434\u0438 \u0447\u0430\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447\n```\n\n\u0411\u044B\u0441\u0442\u0440\u044B\u0439 \u043F\u0443\u0442\u044C \u0431\u0435\u0437 \u043F\u043E\u0438\u0441\u043A\u0430 \u2014 \u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u0447\u0430\u0442\u044B \u0438 \u0444\u0438\u043B\u044C\u0442\u0440\u0430\u0446\u0438\u044F \u043D\u0430 \u0441\u0442\u043E\u0440\u043E\u043D\u0435 \u0430\u0433\u0435\u043D\u0442\u0430; \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0430\u0432\u0442\u043E\u0440\u0430 \u043F\u043E id:\n\n```jsonc\nbitrix_chats_recent { } // \u0441\u043E\u043F\u043E\u0441\u0442\u0430\u0432\u044C \u043F\u043E title / user\nbitrix_recent_load { "section": "tasksTask" }\nbitrix_user_get { "userId": 11 } // \u0440\u0435\u0437\u043E\u043B\u0432 authorId \u2192 \u0438\u043C\u044F\n```\n\n### 6.4. \u041B\u0435\u0433\u0430\u0441\u0438-\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 (HTML-\u043F\u043E\u0434\u0434\u043E\u043C\u0435\u043D \u2014 \u043F\u043E\u043A\u0430 \u041D\u0415 \u0432 \u043C\u043E\u0441\u0442\u0435)\n\n\u0423 \u0437\u0430\u0434\u0430\u0447 \u0434\u0432\u0430 \u043D\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043C\u044B\u0445 \u0444\u0438\u0434\u0430 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u044F:\n- **im.v2-\u0447\u0430\u0442** \u2014 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u043D\u044B\u0439 JSON, \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044F \u0443\u0436\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 (\xA76.2); \u043E\u0431\u044B\u0447\u043D\u043E \u044D\u0442\u043E\u0433\u043E \u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E.\n- **\u0424\u043E\u0440\u0443\u043C\u043D\u044B\u0435 \u043B\u0435\u0433\u0430\u0441\u0438-\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438** \u2014 \u0440\u0435\u043D\u0434\u0435\u0440\u044F\u0442\u0441\u044F \u043A\u0430\u043A **HTML** \u0432 side-slider\'\u0435. \u042D\u0442\u043E \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0439\n \xABHTML-\u043F\u043E\u0434\u0434\u043E\u043C\u0435\u043D\xBB \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u0433\u043E API, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 **\u0442\u0435\u043A\u0443\u0449\u0438\u0439 \u043C\u043E\u0441\u0442 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442** (\u0431\u043B\u043E\u043A\u0435\u0440\u044B \u043D\u0438\u0436\u0435).\n\n**\u041A\u0430\u043A \u0433\u0440\u0443\u0437\u044F\u0442\u0441\u044F (\u0440\u0435\u0432\u0435\u0440\u0441).** \u041F\u0435\u0440\u0432\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u2014 GET HTML-\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B iframe (\u0441\u0435\u0440\u0432\u0435\u0440 \u0442\u0443\u0442 \u0436\u0435 \u043C\u0438\u043D\u0442\u0438\u0442 \u043F\u043E\u0434\u043F\u0438\u0441\u044C):\n\n```\nGET /task/comments/<taskId>/?IFRAME=Y&IFRAME_TYPE=SIDE_SLIDER \u2192 HTML (\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 + signedParameters)\n```\n\n\u041B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u2014 POST \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043D\u043E\u0433\u043E ajax (\u0444\u043E\u0440\u043C\u0430, \u043E\u0442\u0434\u0430\u0451\u0442 HTML-\u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442):\n\n```\nPOST /bitrix/services/main/ajax.php?mode=class&c=bitrix:forum.comments&action=navigateComment\nform: AJAX_POST=Y, ENTITY_XML_ID=TASK_<taskId>, taskId=<taskId>, MODE=LIST,\n FILTER[<ID]=<\u043A\u0443\u0440\u0441\u043E\u0440: id, \u0414\u041E \u043A\u043E\u0442\u043E\u0440\u043E\u0433\u043E \u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0441\u0442\u0430\u0440\u044B\u0435>, PAGEN_1=1,\n signedParameters=<\u043F\u043E\u0434\u043F\u0438\u0441\u0430\u043D\u043D\u044B\u0439 blob>, IFRAME=Y, IFRAME_TYPE=SIDE_SLIDER\nheaders: bx-ajax: true, x-bitrix-site-id: s1 (\u043F\u043B\u044E\u0441 \u043E\u0431\u044B\u0447\u043D\u044B\u0439 X-Bitrix-Csrf-Token)\n```\n\n`signedParameters` \u2014 base64 PHP-\u043C\u0430\u0441\u0441\u0438\u0432\u0430 + HMAC-\u043F\u043E\u0434\u043F\u0438\u0441\u044C \u0441\u0435\u0440\u0432\u0435\u0440\u0430; \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442\n`FORUM_ID, ENTITY_TYPE=TK, ENTITY_ID=<taskId>, ENTITY_XML_ID=TASK_<taskId>, \u2026`. **\u041F\u043E\u0434\u0434\u0435\u043B\u0430\u0442\u044C \u043D\u0435\u043B\u044C\u0437\u044F** \u2014\n\u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 HTML \u043F\u0435\u0440\u0432\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B.\n\n**\u041F\u043E\u0447\u0435\u043C\u0443 \u043F\u043E\u043A\u0430 \u043D\u0435 \u0432 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0435 (3 \u0431\u043B\u043E\u043A\u0435\u0440\u0430):**\n1. \u041C\u043E\u0441\u0442 \u043F\u0430\u0440\u0441\u0438\u0442 \u043E\u0442\u0432\u0435\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u0430\u043A JSON (`extension/src/connector.ts` \u2192 `resp.json()`) \u2014 HTML \u0431\u0440\u043E\u0441\u0438\u0442 \u0438\u0441\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435.\n2. Path-\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432 URL (`/task/comments/<taskId>/`) \u2014 \u0437\u0430\u043F\u0438\u0441\u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u043D\u044B, \u0448\u0430\u0431\u043B\u043E\u043D\u043E\u0432 \u043F\u0443\u0442\u0438 \u043D\u0435\u0442.\n3. `signedParameters` + \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0438 `bx-ajax`/`x-bitrix-site-id` \u2014 \u043D\u0443\u0436\u0435\u043D \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 GET HTML-\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B.\n\n**\u0427\u0442\u043E\u0431\u044B \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C** (\u0431\u0443\u0434\u0443\u0449\u0430\u044F \u0440\u0430\u0431\u043E\u0442\u0430): \u043D\u0430\u0443\u0447\u0438\u0442\u044C \u043C\u043E\u0441\u0442 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044C text/HTML \u043F\u0440\u0438 \u043D\u0435-JSON \u043E\u0442\u0432\u0435\u0442\u0435 \u0438\n\u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044C path-\u0448\u0430\u0431\u043B\u043E\u043D \u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u0430; \u0437\u0430\u0442\u0435\u043C \u043E\u0431\u0451\u0440\u0442\u043A\u0430 `bitrix_task_comments { taskId }` (GET \u043F\u0435\u0440\u0432\u043E\u0439\n\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B), \u0430 \u043B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u2014 \u0447\u0435\u0440\u0435\u0437 `navigateComment` \u0441 \u0432\u044B\u043F\u0430\u0440\u0441\u0435\u043D\u043D\u044B\u043C `signedParameters`.\n\n> \u0422\u043E\u0442 \u0436\u0435 HTML-\u043F\u043E\u0434\u0434\u043E\u043C\u0435\u043D: **\u0434\u0435\u0442\u0430\u043B\u0438 \u0437\u0432\u043E\u043D\u043A\u0430** \u2014 `GET /call/detail/<callId>?IFRAME=Y&IFRAME_TYPE=SIDE_SLIDER`\n> (\u043E\u0442\u0434\u0430\u0451\u0442 HTML). \u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438\u044F \u0438\u0434\u0435\u043D\u0442\u0438\u0447\u043D\u044B.\n\n---\n\n## 7. \u041A\u0430\u043A \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044C (\u043D\u043E\u0432\u044B\u0439 \u0434\u043E\u043C\u0435\u043D: \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C, \u0434\u0438\u0441\u043A, CRM, \u2026)\n\n1. \u0421\u043D\u0438\u043C\u0438 \u0440\u0435\u0430\u043B\u044C\u043D\u044B\u0435 \u0432\u044B\u0437\u043E\u0432\u044B (`docs/reconnaissance.md` \u2014 \u0430\u0432\u0442\u043E-\u0437\u0430\u043F\u0438\u0441\u044C `bun run capture` \u0438\u043B\u0438 HAR \u2192\n `bun run catalog:draft`). \u0427\u0435\u0440\u043D\u043E\u0432\u0438\u043A `actions.draft.json` \u043D\u0430\u043A\u0430\u043F\u043B\u0438\u0432\u0430\u0435\u0442 **\u0432\u0441\u0435 \u0443\u043D\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u043A\u043E\u043C\u0431\u0438\u043D\u0430\u0446\u0438\u0438\n \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432** \u043D\u0430 \u044D\u043A\u0448\u0435\u043D \u0438 \u043F\u0440\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 `bodyType` (form/json) \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.\n2. \u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0438 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 \u043F\u043E \u0440\u0430\u0437\u0434\u0435\u043B\u0443 3: \u0435\u0441\u043B\u0438 \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A \u043F\u043E\u043A\u0430\u0437\u0430\u043B `"bodyType": "json"` \u2014 \u043F\u0435\u0440\u0435\u043D\u0435\u0441\u0438 \u0435\u0433\u043E \u0432 \u0437\u0430\u043F\u0438\u0441\u044C.\n3. \u0414\u043E\u0431\u0430\u0432\u044C \u0437\u0430\u043F\u0438\u0441\u044C \u0432 `actions.json` (\u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0435\u0439 \u2014 \u043A\u0430\u0442\u0430\u043B\u043E\u0433 \u044D\u0442\u043E \u0434\u043E\u043F\u0443\u0441\u043A\u0430\u0435\u0442). \u041F\u0440\u043E\u0432\u0435\u0440\u044C \u0447\u0435\u0440\u0435\u0437\n `bitrix_call { name, params }`.\n4. \u0415\u0441\u043B\u0438 \u0443\u0434\u043E\u0431\u043D\u043E \u2014 \u043E\u0431\u0435\u0440\u043D\u0438 \u0432 \u0442\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u0432 `src/tools/register.ts` (\u0441 \u0434\u0435\u0444\u043E\u043B\u0442\u043D\u044B\u043C `select`).\n\n> `actions.json` / `actions.draft.json` \u2014 \u0434\u0430\u043D\u043D\u044B\u0435 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0433\u043E \u043F\u043E\u0440\u0442\u0430\u043B\u0430 (gitignored). \u042D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B\n> (`api-notes.md`) \u2014 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u043C\u044B\u0435 \u0437\u043D\u0430\u043D\u0438\u044F \u043E \u0441\u0430\u043C\u043E\u043C API; \u0434\u0435\u0440\u0436\u0438 \u0435\u0433\u043E \u0432 \u0430\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u043E\u043C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0438 \u043F\u0440\u0438 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0438\n> \u043D\u043E\u0432\u044B\u0445 \u043C\u0435\u0442\u043E\u0434\u043E\u0432.\n' ? '# Bitrix24 API notes (reverse-engineered)\n\n\u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A \u043F\u043E \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u043C\u0443 API Bitrix24, \u0434\u043E\u0431\u044B\u0442\u044B\u0439 **\u0436\u0438\u0432\u044B\u043C \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C** (\u0443 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 ajax-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u043E\u0432\n\u043D\u0435\u0442 \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u043E\u0439 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0438). \u041F\u0440\u0435\u0434\u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D \u0434\u043B\u044F \u043B\u044E\u0431\u043E\u0433\u043E \u0418\u0418-\u0430\u0433\u0435\u043D\u0442\u0430 \u0438\u043B\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0432\u044B\u0437\u044B\u0432\u0430\u0435\u0442\n\u044D\u0442\u0438 \u043C\u0435\u0442\u043E\u0434\u044B \u0447\u0435\u0440\u0435\u0437 \u043C\u043E\u0441\u0442 (`bitrix_call` / \u0442\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B) \u0438\u043B\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044F\u0435\u0442 \u043A\u0430\u0442\u0430\u043B\u043E\u0433.\n\n\u041D\u0430\u0431\u043B\u044E\u0434\u0435\u043D\u0438\u044F \u0441\u043D\u044F\u0442\u044B \u043D\u0430 \u043F\u043E\u0440\u0442\u0430\u043B\u0435 `example.bitrix24.ru` (\u043E\u0431\u043B\u0430\u043A\u043E, \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 **im.v2**, \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435\n**scrum-\u0431\u043E\u0440\u0434\u0430**). \u0418\u043C\u0435\u043D\u0430 \u043F\u043E\u043B\u0435\u0439 \u0438 \u043A\u043E\u043D\u0432\u0435\u043D\u0446\u0438\u0438 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B \u0434\u043B\u044F \u043E\u0431\u043B\u0430\u0447\u043D\u043E\u0433\u043E Bitrix24, \u043D\u043E \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0435 \u043D\u0430 \u0434\u0440\u0443\u0433\u043E\u0439\n\u043F\u043E\u0440\u0442\u0430\u043B \u0441\u0432\u0435\u0440\u044F\u0439\u0441\u044F \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C (`docs/reconnaissance.md`).\n\n---\n\n## 1. \u041A\u0430\u043A \u0432\u044B\u0437\u044B\u0432\u0430\u0442\u044C\n\n- **`bitrix_call { name, params }`** \u2014 \u0443\u043D\u0438\u0432\u0435\u0440\u0441\u0430\u043B\u044C\u043D\u044B\u0439 \u0432\u044B\u0437\u043E\u0432 \u043B\u044E\u0431\u043E\u0433\u043E \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043D\u043D\u043E\u0433\u043E \u0438\u043C\u0435\u043D\u0438 \u0438\u0437 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430\n (`actions.json`). `params` \u2014 \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 Bitrix (\u0441\u043C. \u0440\u0430\u0437\u0434\u0435\u043B 3). \u041A\u0430\u0442\u0430\u043B\u043E\u0433 \u043C\u043E\u0436\u0435\u0442 \u0432\u043A\u043B\u044E\u0447\u0430\u0442\u044C\n \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0435 \u0432\u044B\u0437\u043E\u0432\u044B; allowlist (`actions.json`) \u2014 \u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\u043D\u043D\u0430\u044F \u0433\u0440\u0430\u043D\u0438\u0446\u0430, \u043D\u0435 \u0440\u0435\u0436\u0438\u043C \u0447\u0442\u0435\u043D\u0438\u044F.\n- **\u0422\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B** \u2014 \u043E\u0431\u0451\u0440\u0442\u043A\u0438 \u0441 \u0440\u0430\u0437\u0443\u043C\u043D\u044B\u043C\u0438 \u0434\u0435\u0444\u043E\u043B\u0442\u0430\u043C\u0438 \u043D\u0430\u0434 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u043E\u043C. \u0422\u043E\u0447\u043D\u0430\u044F \u0432\u044B\u0431\u043E\u0440\u043A\u0430 \u2014 \u0447\u0435\u0440\u0435\u0437\n \u043E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0439 `params`, \u043E\u043D \u043C\u0435\u0440\u0436\u0438\u0442\u0441\u044F **\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u043C** \u0438 \u043F\u0435\u0440\u0435\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u0434\u0435\u0444\u043E\u043B\u0442\u044B. \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044E\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0442\u0435,\n \u0447\u044C\u0451 \u0438\u043C\u044F \u0435\u0441\u0442\u044C \u0432 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0435 (`actions.json`); \u0438\u043D\u0430\u0447\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u0435\u0442\u0441\u044F. \u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u043D\u0430\u0431\u043E\u0440:\n - \u0417\u0430\u0434\u0430\u0447\u0438: `bitrix_tasks_list`, `bitrix_task_get`, `bitrix_task_get_v2` (v2/JSON),\n `bitrix_task_scrum_info`, `bitrix_task_files`, `bitrix_task_views_count`,\n `bitrix_task_subtasks` (\u043F\u043E\u0434\u0437\u0430\u0434\u0430\u0447\u0438), `bitrix_task_related` (\u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435).\n - \u041F\u0440\u043E\u0435\u043A\u0442\u044B: `bitrix_projects_list`, `bitrix_project_get`.\n - \u0427\u0430\u0442\u044B: `bitrix_chats_recent`, `bitrix_recent_load` (\u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u043F\u043E \u0441\u0435\u043A\u0446\u0438\u0438 \u2014 \u0432 \u0442.\u0447. `tasksTask` =\n \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447), `bitrix_recent_tail` (\u043B\u0438\u0441\u0442\u0430\u0442\u044C \u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u0432\u0433\u043B\u0443\u0431\u044C), `bitrix_chat_load` (\u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043F\u043E\n `dialogId`/`chatId`), `bitrix_chat_messages`, `bitrix_chat_history` (\u043B\u0438\u0441\u0442\u0430\u0442\u044C \u0432\u0433\u043B\u0443\u0431\u044C \u043F\u043E `beforeId`),\n `bitrix_chat_get_dialog_id` (dialogId \u043F\u043E externalId), `bitrix_chat_mark_read` (\u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439),\n `bitrix_chat_read_all` (\u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439).\n - \u041B\u044E\u0434\u0438/\u043F\u043E\u0438\u0441\u043A: `bitrix_user_get` (\u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u044E\u0437\u0435\u0440\u0430), `bitrix_entity_selector` (\u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0441\u0435\u043B\u0435\u043A\u0442\u043E\u0440\u0430),\n `bitrix_entity_search` (\u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u043F\u043E\u0438\u0441\u043A \u0447\u0430\u0442\u043E\u0432/\u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 `ui.entityselector.doSearch`).\n\n \u041B\u044E\u0431\u043E\u0435 \u0438\u043C\u044F \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u0438 \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E \u0447\u0435\u0440\u0435\u0437 `bitrix_call { name, params }`.\n- **`bitrix_help`** \u2014 \u044D\u0442\u043E\u0442 \u0436\u0435 \u0433\u0430\u0439\u0434, \u043E\u0442\u0434\u0430\u0451\u0442\u0441\u044F \u0447\u0435\u0440\u0435\u0437 MCP (\u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 + resource `bitrix://api-notes`).\n \u0418\u0441\u0442\u043E\u0447\u043D\u0438\u043A \u2014 **\u044D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B** (`docs/api-notes.md`).\n\n\u041F\u043E\u043B\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A \u0438\u043C\u0451\u043D \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u043E\u0442\u0434\u0430\u0451\u0442 `bitrix_call` \u0432 \u0441\u0432\u043E\u0451\u043C \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0438 (`deps.catalog.names()`).\n\n---\n\n## 2. \u0424\u043E\u0440\u043C\u0430\u0442 \u043E\u0442\u0432\u0435\u0442\u0430 (\u0432\u0430\u0436\u043D\u043E!)\n\nAjax-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u044B (`/bitrix/services/main/ajax.php`) \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0442 HTTP 200 \u0441 \u043A\u043E\u043D\u0432\u0435\u0440\u0442\u043E\u043C:\n\n```jsonc\n{ "status": "success" | "error",\n "data": { ... },\n "errors": [] } // \u041F\u0423\u0421\u0422\u041E\u0419 \u043C\u0430\u0441\u0441\u0438\u0432 \u043F\u0440\u0438 \u0443\u0441\u043F\u0435\u0445\u0435! (\u0432 JS [] \u2014 truthy)\n```\n\n- \u0423\u0441\u043F\u0435\u0445 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442\u0441\u044F `status:"success"` \u0438/\u0438\u043B\u0438 **\u043F\u0443\u0441\u0442\u044B\u043C** `errors`. \u041D\u0435\u043F\u0443\u0441\u0442\u043E\u0439 `errors` / `status:"error"` /\n top-level `error` \u2014 \u0440\u0435\u0430\u043B\u044C\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430 (\u043C\u043E\u0441\u0442 \u043C\u0430\u043F\u043F\u0438\u0442 \u044D\u0442\u043E \u0432 `ok:false`).\n- REST-\u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u044B (`/rest/*.json`) \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0442 \u0438\u043D\u0430\u0447\u0435: `{ "result": \u2026, "next", "total", "time" }` \u2014 \u0431\u0435\u0437 `errors`.\n\n---\n\n## 3. \u0422\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442: form vs json (\u0440\u0430\u0437\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043F\u043E \u043C\u0435\u0442\u043E\u0434\u0443!)\n\n\u0423 \u043A\u0430\u0436\u0434\u043E\u0439 \u0437\u0430\u043F\u0438\u0441\u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0435\u0441\u0442\u044C **`bodyType`** \u2014 \u043A\u0430\u043A \u043C\u043E\u0441\u0442 \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u043B\u043E:\n\n- **`bodyType: "form"`** (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E) \u2014 `application/x-www-form-urlencoded`; \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E\u0441\u0442\u044C \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044F\n PHP-\u0441\u0442\u0438\u043B\u0435\u043C (`filter[STATUS]=2`, `select[0]=ID`). \u041E\u0431\u044A\u0435\u043A\u0442 \u0432 `params` \u0440\u0435\u043A\u0443\u0440\u0441\u0438\u0432\u043D\u043E \u0440\u0430\u0437\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0432 \u0442\u0430\u043A\u0438\u0435\n \u043A\u043B\u044E\u0447\u0438. \u041A\u043B\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043A\u0438\u0435 `tasks.task.*`, \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 `im.v2.*`, REST \u2014 \u0432\u0441\u0451 \u044D\u0442\u043E \u0444\u043E\u0440\u043C\u0430.\n- **`bodyType: "json"`** \u2014 \u0442\u0435\u043B\u043E \u0443\u0445\u043E\u0434\u0438\u0442 \u043A\u0430\u043A `JSON.stringify(params)` \u0441 `Content-Type: application/json`.\n \u0422\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 **`tasks.v2.*`** (\u043D\u0430\u043F\u0440. `tasks.v2.Task.get` \u0436\u0434\u0451\u0442 `{"task":{"id":N}}`) \u0438 `ui.entityselector.*`.\n `params` \u043F\u0440\u0438 \u044D\u0442\u043E\u043C \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0435\u0442 \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u0443\u044E \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0443 \u043A\u0430\u043A \u0435\u0441\u0442\u044C (\u043D\u0435 \u0440\u0430\u0437\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0432 bracket-\u043A\u043B\u044E\u0447\u0438).\n\n> \u0418\u0441\u0442\u043E\u0440\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u0437\u0430\u043C\u0435\u0442\u043A\u0430: \u0440\u0430\u043D\u044C\u0448\u0435 \u043C\u043E\u0441\u0442 \u0443\u043C\u0435\u043B \u0442\u043E\u043B\u044C\u043A\u043E \u0444\u043E\u0440\u043C\u0443, \u0438 `tasks.v2.*` \u0431\u044B\u043B\u0438 \u043D\u0435\u043F\u0440\u0438\u0433\u043E\u0434\u043D\u044B. \u0422\u0435\u043F\u0435\u0440\u044C\n> \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0430\u043D\u044B \u2014 \u0432 \u0437\u0430\u043F\u0438\u0441\u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0441\u0442\u0430\u0432\u044C `"bodyType": "json"`, \u0438 \u043C\u043E\u0441\u0442 \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442 \u0438\u0445 \u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u043E.\n\n**CSRF / sessid:** \u043C\u043E\u0441\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0448\u043B\u0451\u0442 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A **`X-Bitrix-Csrf-Token: <sessid>`** (\u0441\u0432\u0435\u0436\u0438\u0439\n`BX.bitrix_sessid()`). Form-\u0442\u0435\u043B\u0430 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043D\u0435\u0441\u0443\u0442 `sessid` \u043F\u043E\u043B\u0435\u043C \u0432 \u0442\u0435\u043B\u0435 (legacy REST \u044D\u0442\u043E \u0442\u0440\u0435\u0431\u0443\u0435\u0442);\nJSON-\u0442\u0435\u043B\u0430 \u043D\u0435\u0441\u0443\u0442 sessid **\u0442\u043E\u043B\u044C\u043A\u043E** \u0432 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0435. \u041E\u0442\u0432\u0435\u0442 `invalid_csrf`/`invalid_authentication` = \u0441\u0435\u0441\u0441\u0438\u044F\n\u043F\u0440\u043E\u0442\u0443\u0445\u043B\u0430 (\u043F\u0435\u0440\u0435\u043B\u043E\u0433\u0438\u043D\u044C\u0441\u044F \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435).\n\n| \u041C\u0435\u0442\u043E\u0434 (action / endpoint) | bodyType | \u0413\u0434\u0435 `select`/`filter`/`order` | \u041F\u0430\u0433\u0438\u043D\u0430\u0446\u0438\u044F |\n|---|---|---|---|\n| `tasks.task.list` | form | **\u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C**: `select[]`, `filter{}`, `order{}` | `start` (\u0441\u0434\u0432\u0438\u0433, \u0448\u0430\u0433 50) |\n| `tasks.task.get` | form | \u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C: `taskId`, `select[]` | \u2014 |\n| `tasks.v2.Task.get` | **json** | `{"task": {"id": N}}` | \u2014 |\n| `tasks.v2.Scrum.getTaskInfo` | **json** | `{"taskId": N}` | \u2014 |\n| `tasks.v2.File.listObjects` | **json** | `{"ids": [N,\u2026]}` | \u2014 |\n| `tasks.v2.Task.View.User.count` | **json** | `{"task": {"id": N}}` | \u2014 |\n| `tasks.v2.Task.Relation.Child.list` | **json** | `{"taskId": N, "withIds":true, "navigation":{"size":N}}` | `navigation` |\n| `tasks.v2.Task.Relation.Related.list` | **json** | `{"taskId": N, \u2026}` (\u043A\u0430\u043A Child) | `navigation` |\n| `socialnetwork.api.workgroup.list` | form | **\u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C**: `select[]`, `order{}`, `filter{}` | (nav \u2014 \u043D\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u043E) |\n| `socialnetwork.api.workgroup.get` | form | **\u043E\u0431\u0451\u0440\u043D\u0443\u0442\u043E**: `params[groupId]`, `params[select][]` | \u2014 |\n| `/rest/im.recent.list.json` | form (rest) | \u043F\u043B\u043E\u0441\u043A\u043E: `LIMIT`, `SKIP_OPENLINES`, `UNREAD_ONLY`, \u2026 | `LIMIT` |\n| `/rest/im.user.get.json` | form (rest) | \u043F\u043B\u043E\u0441\u043A\u043E: `ID` | \u2014 |\n| `im.v2.Recent.load` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `limit`, `filter[recentSection]`, `filter[unread]`, `filter[parentId]` | `im.v2.Recent.tail` |\n| `im.v2.Recent.tail` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `limit`, `filter[lastMessageDate]` (\u043A\u0443\u0440\u0441\u043E\u0440), `filter[recentSection]` | `filter[lastMessageDate]` |\n| `im.v2.Chat.load` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `dialogId`\\|`chatId`, `messageLimit` | \u2014 |\n| `im.v2.Chat.getDialogId` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `externalId` | \u2014 |\n| `im.v2.Chat.Message.list` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `limit` | \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u044F\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u2014 \u043D\u0430\u0437\u0430\u0434 **\u043D\u0435 \u043B\u0438\u0441\u0442\u0430\u0435\u0442**, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 `.tail` |\n| `im.v2.Chat.Message.tail` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `limit`, `filter[lastId]`, `order[id]` | **\u0441\u043C. \u0440\u0430\u0437\u0434\u0435\u043B 6** |\n| `im.v2.Chat.Message.read` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `ids[]`, `actionUuid` | \u2014 (\u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439) |\n| `im.v2.Chat.readAll` | form | \u0431\u0435\u0437 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 | \u2014 (\u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439) |\n| `ui.entityselector.load` | **json** | `{"dialog": {entities,preselectedItems,\u2026}}` | \u2014 |\n| `ui.entityselector.doSearch` | **json** | `{"dialog": {\u2026}, "searchQuery": {"query": "...", "queryWords": ["..."]}}` | \u2014 |\n\n---\n\n## 4. \u041A\u0430\u0442\u0430\u043B\u043E\u0433: \u0438\u043C\u044F \u2192 action \u2192 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B\n\n| \u0418\u043C\u044F (`actions.json`) | action / endpoint | bodyType | \u041A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 params |\n|---|---|---|---|\n| `tasks.list` | `tasks.task.list` | form | `filter{RESPONSIBLE_ID,REAL_STATUS,GROUP_ID,\u2026}`, `select[]`, `order{}`, `start` |\n| `task.get` | `tasks.task.get` | form | `taskId`, `select[]` |\n| `task.v2.get` | `tasks.v2.Task.get` | json | `task.id` (id \u0437\u0430\u0434\u0430\u0447\u0438) |\n| `task.scrum.info` | `tasks.v2.Scrum.getTaskInfo` | json | `taskId` |\n| `task.files` | `tasks.v2.File.listObjects` | json | `ids` (\u043C\u0430\u0441\u0441\u0438\u0432 id) |\n| `task.views.count` | `tasks.v2.Task.View.User.count` | json | `task.id` (id \u0437\u0430\u0434\u0430\u0447\u0438) |\n| `task.subtasks` | `tasks.v2.Task.Relation.Child.list` | json | `taskId`, `navigation{size}` |\n| `task.related` | `tasks.v2.Task.Relation.Related.list` | json | `taskId`, `navigation{size}` |\n| `projects.list` | `socialnetwork.api.workgroup.list` | form | `select[]`, `order{}`, `filter{}` |\n| `projects.get` | `socialnetwork.api.workgroup.get` | form | `params[groupId]`, `params[select][]` |\n| `chats.recent` | `/rest/im.recent.list.json` | form | `LIMIT`, `UNREAD_ONLY`, `SKIP_OPENLINES` |\n| `recent.load` | `im.v2.Recent.load` | form | `filter[recentSection]` (`tasksTask`/`collab`/\u2026), `limit`, `filter[unread]` |\n| `recent.tail` | `im.v2.Recent.tail` | form | `filter[lastMessageDate]`, `filter[recentSection]`, `limit` |\n| `chat.load` | `im.v2.Chat.load` | form | `dialogId`\\|`chatId`, `messageLimit` |\n| `chat.dialogId` | `im.v2.Chat.getDialogId` | form | `externalId` (\u043D\u0430\u043F\u0440. `"sg"+groupId`) |\n| `chat.messages` | `im.v2.Chat.Message.list` | form | `chatId`, `limit` (\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435; \u0432\u0433\u043B\u0443\u0431\u044C \u2014 `chat.messages.tail`) |\n| `chat.messages.tail` | `im.v2.Chat.Message.tail` | form | `chatId`, `filter[lastId]`, `order[id]`, `limit` |\n| `chat.message.read` | `im.v2.Chat.Message.read` | form | `chatId`, `ids[0]`, `actionUuid` |\n| `chat.read.all` | `im.v2.Chat.readAll` | form | \u2014 (\u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439) |\n| `im.user.get` | `/rest/im.user.get.json` | form | `ID` |\n| `entityselector.load` | `ui.entityselector.load` | json | `dialog` (\u043E\u0431\u044A\u0435\u043A\u0442) |\n| `entityselector.search` | `ui.entityselector.doSearch` | json | `dialog`, `searchQuery{query,queryWords}` |\n\n---\n\n## 5. \u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A \u043F\u043E\u043B\u0435\u0439\n\n**\u0417\u0430\u0434\u0430\u0447\u0430** (`tasks.task.*`): `ID`, `TITLE`, `DESCRIPTION`, `STATUS`, `REAL_STATUS`, `RESPONSIBLE_ID`,\n`CREATED_BY`, `CREATED_DATE`, `CHANGED_DATE`, `DEADLINE`, `CLOSED_DATE`, `PRIORITY`, `GROUP_ID`,\n`TAGS`, `TIME_ESTIMATE`, `UF_*`. \u041E\u0442\u0432\u0435\u0442 \u0442\u0430\u043A\u0436\u0435 \u043F\u043E\u0434\u043A\u043B\u0430\u0434\u044B\u0432\u0430\u0435\u0442 \u043E\u0431\u044A\u0435\u043A\u0442\u044B `group`, `responsible`, `creator`, `action`.\n\n\u0421\u0442\u0430\u0442\u0443\u0441\u044B \u0437\u0430\u0434\u0430\u0447\u0438 (`STATUS`): `1` \u041D\u043E\u0432\u0430\u044F \xB7 `2` \u0416\u0434\u0451\u0442 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \xB7 `3` \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \xB7 `4` \u0416\u0434\u0451\u0442 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044F \xB7\n`5` \u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430 \xB7 `6` \u041E\u0442\u043B\u043E\u0436\u0435\u043D\u0430 \xB7 `7` \u041E\u0442\u043A\u043B\u043E\u043D\u0435\u043D\u0430.\n\n**\u0417\u0430\u0434\u0430\u0447\u0430 v2** (`tasks.v2.*`): id \u0437\u0430\u0434\u0430\u0447\u0438 \u043F\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044F \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E \u2014 **`{"task": {"id": N}}`** (\u0443 `Task.get` \u0438\n`Task.View.User.count`), \u0430 \u0443 `Scrum.getTaskInfo` \u0438 `Relation.*` \u2014 \u043F\u043B\u043E\u0441\u043A\u043E `{"taskId": N}`. \u042D\u0442\u043E \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u0430\u044F\n\u043F\u043E\u0434\u0441\u0438\u0441\u0442\u0435\u043C\u0430 scrum-\u0431\u043E\u0440\u0434\u0430; \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0443 \u043E\u0442\u0432\u0435\u0442\u0430 \u0441\u0432\u0435\u0440\u044C \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C \u2014 \u0432 \u0437\u0430\u0445\u0432\u0430\u0442\u0435 \u0432\u0438\u0434\u043D\u044B \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0437\u0430\u043F\u0440\u043E\u0441\u0430.\n\n**\u0413\u0440\u0443\u043F\u043F\u0430/\u043F\u0440\u043E\u0435\u043A\u0442 \u2014 \u0441\u043F\u0438\u0441\u043E\u043A** (`workgroup.list`, camelCase \u0432 \u043E\u0442\u0432\u0435\u0442\u0435): `ID`, `NAME`, `DESCRIPTION`,\n`NUMBER_OF_MEMBERS`, `OWNER_ID`, `DATE_CREATE`, `PROJECT` (Y/N), `TYPE`.\n**\u0413\u0440\u0443\u043F\u043F\u0430 \u2014 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430** (`workgroup.get`): \u043F\u043B\u044E\u0441 `OWNER_DATA`, `SUBJECT_DATA`, `MEMBERS[]`,\n`MODERATOR_MEMBERS[]`, `CHAT_ID`, `DIALOG_ID`, `IMAGE_ID`, UF-\u043F\u043E\u043B\u044F.\n\n**\u041D\u0435\u0434\u0430\u0432\u043D\u0438\u0439 \u0447\u0430\u0442** (`im.recent.list`): `chat_id`, `title`, `type`, `message{id,text,date,author_id}`,\n`last_id`, `unread`, `pinned`, `user{\u2026}`, `chat{\u2026}`.\n**\u041D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u043F\u043E \u0441\u0435\u043A\u0446\u0438\u0438** (`im.v2.Recent.load`): \u0444\u0438\u043B\u044C\u0442\u0440 `filter[recentSection]` \u2014 `default` (\u043E\u0431\u044B\u0447\u043D\u044B\u0435\n\u0434\u0438\u0430\u043B\u043E\u0433\u0438), **`tasksTask` (\u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447)**, `collab`/`collabDefault` (\u043A\u043E\u043B\u043B\u0430\u0431\u044B). \u041B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u0432\u0433\u043B\u0443\u0431\u044C \u2014\n`im.v2.Recent.tail` \u0441 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u043C `filter[lastMessageDate]` (ISO-\u0434\u0430\u0442\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B).\n**\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u044E\u0437\u0435\u0440\u0430** (`im.user.get`): `id`, `name`, `first_name`, `last_name`, `avatar`, `work_position`,\n`gender`, `status`, `online` \u2014 \u0440\u0435\u0437\u043E\u043B\u0432 \u0430\u0432\u0442\u043E\u0440\u0430 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F (`authorId`) \u0432 \u0438\u043C\u044F.\n**\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435** (`im.v2.Chat.Message.*`): `id`, `chatId`, `authorId`, `date`, `text`, `params`, `viewed`.\n\u041E\u0442\u0432\u0435\u0442 \u0442\u0430\u043A\u0436\u0435 \u043D\u0435\u0441\u0451\u0442 `users[]` (\u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0438), `additionalMessages[]`, `hasPrevPage`/`hasNextPage`.\n`chatId` \u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 `im.recent.list` (`chat_id`) \u0438\u043B\u0438 \u0438\u0437 `workgroup.get` (`CHAT_ID`/`DIALOG_ID`).\n\n**\u0410\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044F \u0447\u0430\u0442\u0430 (`chat.load`): `dialogId` vs `chatId`.** `chat.load` \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442 \u043B\u044E\u0431\u043E\u0439 \u0438\u0437 \u0434\u0432\u0443\u0445:\n- `dialogId` = **ID \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F** (\u0447\u0438\u0441\u043B\u043E, \u043D\u0430\u043F\u0440. `11`) \u2192 **\u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 1-\u043D\u0430-1** \u0441 \u044D\u0442\u0438\u043C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C.\n- `dialogId` = **`"chat"+CHAT_ID`** (\u043D\u0430\u043F\u0440. `"chat7111"`) \u2192 **\u0433\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439 \u0447\u0430\u0442** (\u043F\u0440\u043E\u0435\u043A\u0442\u0430/\u0437\u0430\u0434\u0430\u0447\u0438/\u043A\u0430\u043D\u0430\u043B\u0430).\n- `chatId` = \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 `CHAT_ID` \u2014 \u0442\u043E \u0436\u0435, \u0447\u0442\u043E \u0433\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439 `dialogId`, \u043D\u043E \u0431\u0435\u0437 \u043F\u0440\u0435\u0444\u0438\u043A\u0441\u0430.\n\n\u041E\u0442\u0432\u0435\u0442 `chat.load` \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 `chatId` \u2014 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 \u0435\u0433\u043E \u0434\u0430\u043B\u044C\u0448\u0435 \u0434\u043B\u044F `chat.messages` /\n`chat.messages.tail` (\u043B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u0432\u0433\u043B\u0443\u0431\u044C) \u0438 `chat.message.read` (\u044D\u0442\u0438 \u0442\u0440\u0438 \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 \u043F\u043E `chatId`, \u043D\u0435 \u043F\u043E `dialogId`).\n\n---\n\n## 6. \u041F\u0440\u0438\u043C\u0435\u0440\u044B \u0432\u044B\u0437\u043E\u0432\u043E\u0432\n\n```jsonc\n// \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0433\u043E 55, \u043F\u043E \u0434\u0435\u0434\u043B\u0430\u0439\u043D\u0443, \u0432\u0442\u043E\u0440\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430\nbitrix_tasks_list { "params": { "filter": {"RESPONSIBLE_ID":55,"REAL_STATUS":2},\n "order": {"DEADLINE":"asc"}, "start": 50 } }\n\n// \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u043D\u044B\u043C \u043D\u0430\u0431\u043E\u0440\u043E\u043C \u043F\u043E\u043B\u0435\u0439\nbitrix_task_get { "taskId": 4229, "params": { "select": ["ID","TITLE","DESCRIPTION","TAGS","TIME_ESTIMATE"] } }\n\n// \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 v2-\u043F\u043E\u0434\u0441\u0438\u0441\u0442\u0435\u043C\u0443 (JSON-\u0442\u0435\u043B\u043E; id \u0432\u043B\u043E\u0436\u0435\u043D \u0432 task)\nbitrix_task_get_v2 { "taskId": 4229 } // \u2192 { "task": { "id": 4229 } }\nbitrix_call { "name": "task.v2.get", "params": { "task": { "id": 4229 } } }\n\n// \u0444\u0430\u0439\u043B\u044B \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043A \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u043E\u0432 (v2, JSON-\u0442\u0435\u043B\u043E); \u043F\u043E\u0434\u0437\u0430\u0434\u0430\u0447\u0438/\u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435\nbitrix_call { "name": "task.files", "params": { "ids": [4229] } }\nbitrix_call { "name": "task.views.count", "params": { "task": { "id": 4229 } } }\nbitrix_task_subtasks { "taskId": 4229 }\nbitrix_task_related { "taskId": 4229 }\n\n// \u043F\u0440\u043E\u0435\u043A\u0442\u044B \u043F\u043E \u0434\u0430\u0442\u0435 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F; \u043F\u043E\u043B\u043D\u0430\u044F \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0433\u0440\u0443\u043F\u043F\u044B\nbitrix_projects_list { "params": { "order": {"DATE_CREATE":"desc"} } }\nbitrix_project_get { "groupId": 15 }\n\n// \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0447\u0430\u0442 (\u043F\u0435\u0440\u0432\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F)\nbitrix_chat_load { "chatId": 485, "messageLimit": 50 }\n\n// \u041B\u0418\u0421\u0422\u0410\u041D\u0418\u0415 \u0418\u0421\u0422\u041E\u0420\u0418\u0418 \u0412\u0413\u041B\u0423\u0411\u042C (\u0441\u0442\u0430\u0440\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F): beforeId = \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 id \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\n// \u0438\u0437 \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B. \u041F\u043E\u0432\u0442\u043E\u0440\u044F\u0439, \u0443\u043C\u0435\u043D\u044C\u0448\u0430\u044F beforeId, \u0434\u043E \u043D\u0430\u0447\u0430\u043B\u0430 \u0438\u0441\u0442\u043E\u0440\u0438\u0438 (order DESC \u2014 \u0434\u0435\u0444\u043E\u043B\u0442).\nbitrix_chat_history { "chatId": 485, "beforeId": 1861279 }\n\n// \u043F\u043E\u043C\u0435\u0442\u0438\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u043C\u0438 (\u041C\u0423\u0422\u0418\u0420\u0423\u042E\u0429\u0418\u0419). actionUuid \u0433\u0435\u043D\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.\nbitrix_chat_mark_read { "chatId": 40271, "ids": [1884131] }\n```\n\n### 6.1. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0439: \u0447\u0430\u0442 \u0441 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u044B\u043C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C\n\n\u041B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 1-\u043D\u0430-1 \u0430\u0434\u0440\u0435\u0441\u0443\u0435\u0442\u0441\u044F `dialogId` = **ID \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F**. Id \u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 \u0437\u0430\u0434\u0430\u0447\u0438\n(`RESPONSIBLE_ID`/`CREATED_BY`), \u0438\u0437 `bitrix_chats_recent`, \u043B\u0438\u0431\u043E \u0440\u0435\u0437\u043E\u043B\u0432\u0438\u0442\u0441\u044F \u043F\u043E\u0438\u0441\u043A\u043E\u043C (\xA76.3).\n\n```jsonc\n// 1) \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 \u0441 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C 11 \u2192 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 chatId\nbitrix_chat_load { "dialogId": 11 }\n// 2) \u043B\u0438\u0441\u0442\u0430\u0442\u044C \u0435\u0433\u043E \u0438\u0441\u0442\u043E\u0440\u0438\u044E \u0432\u0433\u043B\u0443\u0431\u044C \u043F\u043E chatId \u0438\u0437 \u043E\u0442\u0432\u0435\u0442\u0430 \u0448\u0430\u0433\u0430 1\nbitrix_chat_history { "chatId": 485, "beforeId": 1861279 }\n```\n\n### 6.2. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0439: \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 (\u0447\u0430\u0442) \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438\n\n\u0423 \u043A\u0430\u0436\u0434\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0435\u0441\u0442\u044C \u0441\u0432\u043E\u0439 im-\u0447\u0430\u0442-\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435. \u0414\u0432\u0430 \u043F\u0443\u0442\u0438 \u043D\u0430\u0439\u0442\u0438 \u0435\u0433\u043E `chatId`:\n\n**\u0410. \u0427\u0435\u0440\u0435\u0437 \u0441\u043F\u0438\u0441\u043E\u043A \u0447\u0430\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447 (\u043F\u0440\u044F\u043C\u043E\u0439).** `im.v2.Recent.load` \u0441 \u0441\u0435\u043A\u0446\u0438\u0435\u0439 `tasksTask` \u043E\u0442\u0434\u0430\u0451\u0442 \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447\n(\u0432 `bitrix_chats_recent` / `/rest/im.recent.list` \u0438\u0445 \u041D\u0415\u0422). \u041B\u0438\u0441\u0442\u0430\u0442\u044C \u0432\u0433\u043B\u0443\u0431\u044C \u2014 `bitrix_recent_tail`.\n\n```jsonc\nbitrix_recent_load { "section": "tasksTask" } // \u2192 \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447 \u0441 chatId/dialogId\nbitrix_recent_tail { "section": "tasksTask", "lastMessageDate": "2026-06-29T17:25:38+03:00" }\n// \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u044B\u0439 \u0447\u0430\u0442 \u0438 \u043B\u0438\u0441\u0442\u0430\u0442\u044C \u0438\u0441\u0442\u043E\u0440\u0438\u044E\nbitrix_chat_load { "dialogId": "chat38849" } // \u0438\u043B\u0438 { "chatId": 38849 }\nbitrix_chat_history { "chatId": 38849, "beforeId": 1722353 }\n```\n\n**\u0411. \u041F\u043E\u0438\u0441\u043A\u043E\u043C \u043F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E \u0437\u0430\u0434\u0430\u0447\u0438** \u2014 `bitrix_entity_search` \u0441 \u0441\u0435\u043A\u0446\u0438\u0435\u0439 `tasksTask`:\n\n```jsonc\nbitrix_entity_search { "query": "\u0442\u0440\u0435\u043A\u0435\u0440", "section": "tasksTask" }\n```\n\n**\u0427\u0430\u0442 \u041F\u0420\u041E\u0415\u041A\u0422\u0410 \u0437\u0430\u0434\u0430\u0447\u0438** (\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B, \u043D\u0435 \u0441\u0430\u043C\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438) \u2014 \u0447\u0435\u0440\u0435\u0437 `GROUP_ID`:\n\n```jsonc\nbitrix_task_get { "taskId": 4229, "params": { "select": ["ID","GROUP_ID"] } }\nbitrix_project_get { "groupId": 15 } // \u043E\u0442\u0434\u0430\u0451\u0442 CHAT_ID / DIALOG_ID\nbitrix_chat_load { "dialogId": "chat7111" }\nbitrix_chat_get_dialog_id { "externalId": "sg15" } // \u043B\u0438\u0431\u043E \u0440\u0435\u0437\u043E\u043B\u0432 dialogId \u0441\u043E\u0446\u0433\u0440\u0443\u043F\u043F\u044B \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E\n```\n\n### 6.3. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0439: \u043F\u043E\u0438\u0441\u043A \u0447\u0430\u0442\u0430 / \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\n\n\u0422\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u043F\u043E\u0438\u0441\u043A \u2014 `bitrix_entity_search` (\u043E\u0431\u0451\u0440\u0442\u043A\u0430 \u043D\u0430\u0434 `ui.entityselector.doSearch`): \u0441\u0430\u043C \u0441\u043E\u0431\u0438\u0440\u0430\u0435\u0442\n\u0434\u0438\u0430\u043B\u043E\u0433 `IM_CHAT_SEARCH` \u0438 `searchQuery` \u0438\u0437 \u0441\u0442\u0440\u043E\u043A\u0438:\n\n```jsonc\nbitrix_entity_search { "query": "\u0434\u043C\u0438\u0442\u0440\u0438\u0439" } // \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0447\u0430\u0442\u043E\u0432/\u0434\u0438\u0430\u043B\u043E\u0433\u043E\u0432\nbitrix_entity_search { "query": "\u0442\u0440\u0435\u043A\u0435\u0440", "section": "tasksTask" } // \u0441\u0440\u0435\u0434\u0438 \u0447\u0430\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447\n```\n\n\u0411\u044B\u0441\u0442\u0440\u044B\u0439 \u043F\u0443\u0442\u044C \u0431\u0435\u0437 \u043F\u043E\u0438\u0441\u043A\u0430 \u2014 \u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u0447\u0430\u0442\u044B \u0438 \u0444\u0438\u043B\u044C\u0442\u0440\u0430\u0446\u0438\u044F \u043D\u0430 \u0441\u0442\u043E\u0440\u043E\u043D\u0435 \u0430\u0433\u0435\u043D\u0442\u0430; \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0430\u0432\u0442\u043E\u0440\u0430 \u043F\u043E id:\n\n```jsonc\nbitrix_chats_recent { } // \u0441\u043E\u043F\u043E\u0441\u0442\u0430\u0432\u044C \u043F\u043E title / user\nbitrix_recent_load { "section": "tasksTask" }\nbitrix_user_get { "userId": 11 } // \u0440\u0435\u0437\u043E\u043B\u0432 authorId \u2192 \u0438\u043C\u044F\n```\n\n### 6.4. \u041B\u0435\u0433\u0430\u0441\u0438-\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 (HTML-\u043F\u043E\u0434\u0434\u043E\u043C\u0435\u043D \u2014 \u043F\u043E\u043A\u0430 \u041D\u0415 \u0432 \u043C\u043E\u0441\u0442\u0435)\n\n\u0423 \u0437\u0430\u0434\u0430\u0447 \u0434\u0432\u0430 \u043D\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043C\u044B\u0445 \u0444\u0438\u0434\u0430 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u044F:\n- **im.v2-\u0447\u0430\u0442** \u2014 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u043D\u044B\u0439 JSON, \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044F \u0443\u0436\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 (\xA76.2); \u043E\u0431\u044B\u0447\u043D\u043E \u044D\u0442\u043E\u0433\u043E \u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E.\n- **\u0424\u043E\u0440\u0443\u043C\u043D\u044B\u0435 \u043B\u0435\u0433\u0430\u0441\u0438-\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438** \u2014 \u0440\u0435\u043D\u0434\u0435\u0440\u044F\u0442\u0441\u044F \u043A\u0430\u043A **HTML** \u0432 side-slider\'\u0435. \u042D\u0442\u043E \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0439\n \xABHTML-\u043F\u043E\u0434\u0434\u043E\u043C\u0435\u043D\xBB \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u0433\u043E API, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 **\u0442\u0435\u043A\u0443\u0449\u0438\u0439 \u043C\u043E\u0441\u0442 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442** (\u0431\u043B\u043E\u043A\u0435\u0440\u044B \u043D\u0438\u0436\u0435).\n\n**\u041A\u0430\u043A \u0433\u0440\u0443\u0437\u044F\u0442\u0441\u044F (\u0440\u0435\u0432\u0435\u0440\u0441).** \u041F\u0435\u0440\u0432\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u2014 GET HTML-\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B iframe (\u0441\u0435\u0440\u0432\u0435\u0440 \u0442\u0443\u0442 \u0436\u0435 \u043C\u0438\u043D\u0442\u0438\u0442 \u043F\u043E\u0434\u043F\u0438\u0441\u044C):\n\n```\nGET /task/comments/<taskId>/?IFRAME=Y&IFRAME_TYPE=SIDE_SLIDER \u2192 HTML (\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 + signedParameters)\n```\n\n\u041B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u2014 POST \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043D\u043E\u0433\u043E ajax (\u0444\u043E\u0440\u043C\u0430, \u043E\u0442\u0434\u0430\u0451\u0442 HTML-\u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442):\n\n```\nPOST /bitrix/services/main/ajax.php?mode=class&c=bitrix:forum.comments&action=navigateComment\nform: AJAX_POST=Y, ENTITY_XML_ID=TASK_<taskId>, taskId=<taskId>, MODE=LIST,\n FILTER[<ID]=<\u043A\u0443\u0440\u0441\u043E\u0440: id, \u0414\u041E \u043A\u043E\u0442\u043E\u0440\u043E\u0433\u043E \u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0441\u0442\u0430\u0440\u044B\u0435>, PAGEN_1=1,\n signedParameters=<\u043F\u043E\u0434\u043F\u0438\u0441\u0430\u043D\u043D\u044B\u0439 blob>, IFRAME=Y, IFRAME_TYPE=SIDE_SLIDER\nheaders: bx-ajax: true, x-bitrix-site-id: s1 (\u043F\u043B\u044E\u0441 \u043E\u0431\u044B\u0447\u043D\u044B\u0439 X-Bitrix-Csrf-Token)\n```\n\n`signedParameters` \u2014 base64 PHP-\u043C\u0430\u0441\u0441\u0438\u0432\u0430 + HMAC-\u043F\u043E\u0434\u043F\u0438\u0441\u044C \u0441\u0435\u0440\u0432\u0435\u0440\u0430; \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442\n`FORUM_ID, ENTITY_TYPE=TK, ENTITY_ID=<taskId>, ENTITY_XML_ID=TASK_<taskId>, \u2026`. **\u041F\u043E\u0434\u0434\u0435\u043B\u0430\u0442\u044C \u043D\u0435\u043B\u044C\u0437\u044F** \u2014\n\u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 HTML \u043F\u0435\u0440\u0432\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B.\n\n**\u041F\u043E\u0447\u0435\u043C\u0443 \u043F\u043E\u043A\u0430 \u043D\u0435 \u0432 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0435 (3 \u0431\u043B\u043E\u043A\u0435\u0440\u0430):**\n1. \u041C\u043E\u0441\u0442 \u043F\u0430\u0440\u0441\u0438\u0442 \u043E\u0442\u0432\u0435\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u0430\u043A JSON (`extension/src/connector.ts` \u2192 `resp.json()`) \u2014 HTML \u0431\u0440\u043E\u0441\u0438\u0442 \u0438\u0441\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435.\n2. Path-\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432 URL (`/task/comments/<taskId>/`) \u2014 \u0437\u0430\u043F\u0438\u0441\u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u043D\u044B, \u0448\u0430\u0431\u043B\u043E\u043D\u043E\u0432 \u043F\u0443\u0442\u0438 \u043D\u0435\u0442.\n3. `signedParameters` + \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0438 `bx-ajax`/`x-bitrix-site-id` \u2014 \u043D\u0443\u0436\u0435\u043D \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 GET HTML-\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B.\n\n**\u0427\u0442\u043E\u0431\u044B \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C** (\u0431\u0443\u0434\u0443\u0449\u0430\u044F \u0440\u0430\u0431\u043E\u0442\u0430): \u043D\u0430\u0443\u0447\u0438\u0442\u044C \u043C\u043E\u0441\u0442 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044C text/HTML \u043F\u0440\u0438 \u043D\u0435-JSON \u043E\u0442\u0432\u0435\u0442\u0435 \u0438\n\u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044C path-\u0448\u0430\u0431\u043B\u043E\u043D \u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u0430; \u0437\u0430\u0442\u0435\u043C \u043E\u0431\u0451\u0440\u0442\u043A\u0430 `bitrix_task_comments { taskId }` (GET \u043F\u0435\u0440\u0432\u043E\u0439\n\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B), \u0430 \u043B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u2014 \u0447\u0435\u0440\u0435\u0437 `navigateComment` \u0441 \u0432\u044B\u043F\u0430\u0440\u0441\u0435\u043D\u043D\u044B\u043C `signedParameters`.\n\n> \u0422\u043E\u0442 \u0436\u0435 HTML-\u043F\u043E\u0434\u0434\u043E\u043C\u0435\u043D: **\u0434\u0435\u0442\u0430\u043B\u0438 \u0437\u0432\u043E\u043D\u043A\u0430** \u2014 `GET /call/detail/<callId>?IFRAME=Y&IFRAME_TYPE=SIDE_SLIDER`\n> (\u043E\u0442\u0434\u0430\u0451\u0442 HTML). \u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438\u044F \u0438\u0434\u0435\u043D\u0442\u0438\u0447\u043D\u044B.\n\n---\n\n## 7. \u041A\u0430\u043A \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044C (\u043D\u043E\u0432\u044B\u0439 \u0434\u043E\u043C\u0435\u043D: \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C, \u0434\u0438\u0441\u043A, CRM, \u2026)\n\n1. \u0421\u043D\u0438\u043C\u0438 \u0440\u0435\u0430\u043B\u044C\u043D\u044B\u0435 \u0432\u044B\u0437\u043E\u0432\u044B (`docs/reconnaissance.md` \u2014 \u0430\u0432\u0442\u043E-\u0437\u0430\u043F\u0438\u0441\u044C `bun run capture` \u0438\u043B\u0438 HAR \u2192\n `bun run catalog:draft`). \u0427\u0435\u0440\u043D\u043E\u0432\u0438\u043A `actions.draft.json` \u043D\u0430\u043A\u0430\u043F\u043B\u0438\u0432\u0430\u0435\u0442 **\u0432\u0441\u0435 \u0443\u043D\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u043A\u043E\u043C\u0431\u0438\u043D\u0430\u0446\u0438\u0438\n \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432** \u043D\u0430 \u044D\u043A\u0448\u0435\u043D \u0438 \u043F\u0440\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 `bodyType` (form/json) \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.\n2. \u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0438 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 \u043F\u043E \u0440\u0430\u0437\u0434\u0435\u043B\u0443 3: \u0435\u0441\u043B\u0438 \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A \u043F\u043E\u043A\u0430\u0437\u0430\u043B `"bodyType": "json"` \u2014 \u043F\u0435\u0440\u0435\u043D\u0435\u0441\u0438 \u0435\u0433\u043E \u0432 \u0437\u0430\u043F\u0438\u0441\u044C.\n3. \u0414\u043E\u0431\u0430\u0432\u044C \u0437\u0430\u043F\u0438\u0441\u044C \u0432 `actions.json` (\u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0435\u0439 \u2014 \u043A\u0430\u0442\u0430\u043B\u043E\u0433 \u044D\u0442\u043E \u0434\u043E\u043F\u0443\u0441\u043A\u0430\u0435\u0442). \u041F\u0440\u043E\u0432\u0435\u0440\u044C \u0447\u0435\u0440\u0435\u0437\n `bitrix_call { name, params }`.\n4. \u0415\u0441\u043B\u0438 \u0443\u0434\u043E\u0431\u043D\u043E \u2014 \u043E\u0431\u0435\u0440\u043D\u0438 \u0432 \u0442\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u0432 `src/tools/register.ts` (\u0441 \u0434\u0435\u0444\u043E\u043B\u0442\u043D\u044B\u043C `select`).\n\n> `actions.json` / `actions.draft.json` \u2014 \u0434\u0430\u043D\u043D\u044B\u0435 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0433\u043E \u043F\u043E\u0440\u0442\u0430\u043B\u0430 (gitignored). \u042D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B\n> (`api-notes.md`) \u2014 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u043C\u044B\u0435 \u0437\u043D\u0430\u043D\u0438\u044F \u043E \u0441\u0430\u043C\u043E\u043C API; \u0434\u0435\u0440\u0436\u0438 \u0435\u0433\u043E \u0432 \u0430\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u043E\u043C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0438 \u043F\u0440\u0438 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0438\n> \u043D\u043E\u0432\u044B\u0445 \u043C\u0435\u0442\u043E\u0434\u043E\u0432.\n' : load();
|
|
25299
|
+
var HELP = '# Bitrix24 API notes (reverse-engineered)\n\n\u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A \u043F\u043E API Bitrix24, \u0434\u043E\u0431\u044B\u0442\u044B\u0439 **\u0436\u0438\u0432\u044B\u043C \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C**. \u0427\u0430\u0441\u0442\u044C \u0432\u044B\u0437\u043E\u0432\u043E\u0432 \u043C\u043E\u0441\u0442\u0430 \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u0435\u0442 \u0441\n**\u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u043C REST** (`tasks.task.*`, `im.recent.list`, `im.user.get`, `socialnetwork.api.workgroup.*`) \u2014\n\u043F\u043E \u043D\u0438\u043C \u0435\u0441\u0442\u044C \u043E\u0444\u0438\u0446\u0438\u0430\u043B\u044C\u043D\u0430\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u044F; \u0447\u0430\u0441\u0442\u044C \u2014 **\u0441\u0443\u0433\u0443\u0431\u043E \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0435 ajax-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u044B**\n(`im.v2.*`, `tasks.v2.*`, `ui.entityselector.*`), \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0445 \u0434\u043E\u043A\u043E\u0432 \u043F\u043E \u043A\u043E\u0442\u043E\u0440\u044B\u043C \u043D\u0435\u0442, \u0442\u043E\u043B\u044C\u043A\u043E \u0440\u0435\u0432\u0435\u0440\u0441.\n\u041F\u0440\u0435\u0434\u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D \u0434\u043B\u044F \u043B\u044E\u0431\u043E\u0433\u043E \u0418\u0418-\u0430\u0433\u0435\u043D\u0442\u0430 \u0438\u043B\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0432\u044B\u0437\u044B\u0432\u0430\u0435\u0442 \u044D\u0442\u0438 \u043C\u0435\u0442\u043E\u0434\u044B \u0447\u0435\u0440\u0435\u0437 \u043C\u043E\u0441\u0442\n(`bitrix_call` / \u0442\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B) \u0438\u043B\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044F\u0435\u0442 \u043A\u0430\u0442\u0430\u043B\u043E\u0433.\n\n> **\u041E\u0444\u0438\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0435 REST-\u0434\u043E\u043A\u0438** \u2014 [`apidocs.bitrix24.com`](https://apidocs.bitrix24.com) (\u0438\u0441\u0445\u043E\u0434\u043D\u0438\u043A\u0438:\n> [`github.com/bitrix24/b24restdocs`](https://github.com/bitrix24/b24restdocs); \u0430\u0433\u0435\u043D\u0442\u0443 \u0441 MCP context7 \u2014\n> \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430 `/bitrix24/b24restdocs`). \u0414\u043B\u044F \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u043E-\u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u043C\u0435\u0442\u043E\u0434\u043E\u0432 \u0434\u043E\u043A\u0438 \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u043C\u044B \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E;\n> \u0434\u043B\u044F \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 `im.v2.*`/`tasks.v2.*` \u2014 \u043A\u0430\u043A **\u0441\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u044B\u0439 \u0430\u043D\u0430\u043B\u043E\u0433** (\u043A\u043E\u043D\u0432\u0435\u0440\u0442/\u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043F\u043E\u043B\u0435\u0439 \u043C\u043E\u0433\u0443\u0442\n> \u043E\u0442\u043B\u0438\u0447\u0430\u0442\u044C\u0441\u044F, \u0441\u0432\u0435\u0440\u044F\u0439 \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C). \u0414\u0430\u043B\u044C\u0448\u0435 \u043F\u043E \u0442\u0435\u043A\u0441\u0442\u0443 \u0442\u0430\u043A\u0438\u0435 \u043E\u0442\u0441\u044B\u043B\u043A\u0438 \u043F\u043E\u043C\u0435\u0447\u0435\u043D\u044B **\u{1F4D6}**; \u0438\u0434\u0438 \u043F\u043E \u043D\u0438\u043C, \u0435\u0441\u043B\u0438 \u043D\u0443\u0436\u043D\u0430\n> \u0434\u0435\u0442\u0430\u043B\u044C, \u043A\u043E\u0442\u043E\u0440\u043E\u0439 \u0437\u0434\u0435\u0441\u044C \u043D\u0435\u0442.\n\n\u041D\u0430\u0431\u043B\u044E\u0434\u0435\u043D\u0438\u044F \u0441\u043D\u044F\u0442\u044B \u043D\u0430 \u043F\u043E\u0440\u0442\u0430\u043B\u0435 `example.bitrix24.ru` (\u043E\u0431\u043B\u0430\u043A\u043E, \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 **im.v2**, \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435\n**scrum-\u0431\u043E\u0440\u0434\u0430**). \u0418\u043C\u0435\u043D\u0430 \u043F\u043E\u043B\u0435\u0439 \u0438 \u043A\u043E\u043D\u0432\u0435\u043D\u0446\u0438\u0438 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B \u0434\u043B\u044F \u043E\u0431\u043B\u0430\u0447\u043D\u043E\u0433\u043E Bitrix24, \u043D\u043E \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0435 \u043D\u0430 \u0434\u0440\u0443\u0433\u043E\u0439\n\u043F\u043E\u0440\u0442\u0430\u043B \u0441\u0432\u0435\u0440\u044F\u0439\u0441\u044F \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C (`docs/reconnaissance.md`).\n\n---\n\n## 1. \u041A\u0430\u043A \u0432\u044B\u0437\u044B\u0432\u0430\u0442\u044C\n\n- **`bitrix_call { name, params }`** \u2014 \u0443\u043D\u0438\u0432\u0435\u0440\u0441\u0430\u043B\u044C\u043D\u044B\u0439 \u0432\u044B\u0437\u043E\u0432 \u043B\u044E\u0431\u043E\u0433\u043E \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043D\u043D\u043E\u0433\u043E \u0438\u043C\u0435\u043D\u0438 \u0438\u0437 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430\n (`actions.json`). `params` \u2014 \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 Bitrix (\u0441\u043C. \u0440\u0430\u0437\u0434\u0435\u043B 3). \u041A\u0430\u0442\u0430\u043B\u043E\u0433 \u043C\u043E\u0436\u0435\u0442 \u0432\u043A\u043B\u044E\u0447\u0430\u0442\u044C\n \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0435 \u0432\u044B\u0437\u043E\u0432\u044B; allowlist (`actions.json`) \u2014 \u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\u043D\u043D\u0430\u044F \u0433\u0440\u0430\u043D\u0438\u0446\u0430, \u043D\u0435 \u0440\u0435\u0436\u0438\u043C \u0447\u0442\u0435\u043D\u0438\u044F.\n- **\u0422\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B** \u2014 \u043E\u0431\u0451\u0440\u0442\u043A\u0438 \u0441 \u0440\u0430\u0437\u0443\u043C\u043D\u044B\u043C\u0438 \u0434\u0435\u0444\u043E\u043B\u0442\u0430\u043C\u0438 \u043D\u0430\u0434 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u043E\u043C. \u0422\u043E\u0447\u043D\u0430\u044F \u0432\u044B\u0431\u043E\u0440\u043A\u0430 \u2014 \u0447\u0435\u0440\u0435\u0437\n \u043E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0439 `params`, \u043E\u043D \u043C\u0435\u0440\u0436\u0438\u0442\u0441\u044F **\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u043C** \u0438 \u043F\u0435\u0440\u0435\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u0434\u0435\u0444\u043E\u043B\u0442\u044B. \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044E\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0442\u0435,\n \u0447\u044C\u0451 \u0438\u043C\u044F \u0435\u0441\u0442\u044C \u0432 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0435 (`actions.json`); \u0438\u043D\u0430\u0447\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u0435\u0442\u0441\u044F. \u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u043D\u0430\u0431\u043E\u0440:\n - \u0417\u0430\u0434\u0430\u0447\u0438: `bitrix_tasks_list`, `bitrix_task_get`, `bitrix_task_get_v2` (v2/JSON),\n `bitrix_task_scrum_info`, `bitrix_task_files`, `bitrix_task_views_count`,\n `bitrix_task_subtasks` (\u043F\u043E\u0434\u0437\u0430\u0434\u0430\u0447\u0438), `bitrix_task_related` (\u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435).\n - \u041F\u0440\u043E\u0435\u043A\u0442\u044B: `bitrix_projects_list`, `bitrix_project_get`.\n - \u0427\u0430\u0442\u044B: `bitrix_chats_recent`, `bitrix_recent_load` (\u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u043F\u043E \u0441\u0435\u043A\u0446\u0438\u0438 \u2014 \u0432 \u0442.\u0447. `tasksTask` =\n \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447), `bitrix_recent_tail` (\u043B\u0438\u0441\u0442\u0430\u0442\u044C \u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u0432\u0433\u043B\u0443\u0431\u044C), `bitrix_chat_load` (\u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043F\u043E\n `dialogId`/`chatId`), `bitrix_chat_messages`, `bitrix_chat_history` (\u043B\u0438\u0441\u0442\u0430\u0442\u044C \u0432\u0433\u043B\u0443\u0431\u044C \u043F\u043E `beforeId`),\n `bitrix_chat_get_dialog_id` (dialogId \u043F\u043E externalId), `bitrix_chat_mark_read` (\u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439),\n `bitrix_chat_read_all` (\u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439).\n - \u041B\u044E\u0434\u0438/\u043F\u043E\u0438\u0441\u043A: `bitrix_user_get` (\u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u044E\u0437\u0435\u0440\u0430), `bitrix_entity_selector` (\u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0441\u0435\u043B\u0435\u043A\u0442\u043E\u0440\u0430),\n `bitrix_entity_search` (\u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u043F\u043E\u0438\u0441\u043A \u0447\u0430\u0442\u043E\u0432/\u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 `ui.entityselector.doSearch`),\n `bitrix_entity_chat` (chatId \u0447\u0430\u0442\u0430 \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0433\u043E \u043E\u0431\u044A\u0435\u043A\u0442\u0430: \u0437\u0430\u0434\u0430\u0447\u0438/\u0433\u0440\u0443\u043F\u043F\u044B/CRM \u2014 \u0447\u0435\u0440\u0435\u0437 `im.chat.get`).\n\n \u041B\u044E\u0431\u043E\u0435 \u0438\u043C\u044F \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u0438 \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E \u0447\u0435\u0440\u0435\u0437 `bitrix_call { name, params }`.\n- **`bitrix_help`** \u2014 \u044D\u0442\u043E\u0442 \u0436\u0435 \u0433\u0430\u0439\u0434, \u043E\u0442\u0434\u0430\u0451\u0442\u0441\u044F \u0447\u0435\u0440\u0435\u0437 MCP (\u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 + resource `bitrix://api-notes`).\n \u0418\u0441\u0442\u043E\u0447\u043D\u0438\u043A \u2014 **\u044D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B** (`docs/api-notes.md`).\n\n\u041F\u043E\u043B\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A \u0438\u043C\u0451\u043D \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u043E\u0442\u0434\u0430\u0451\u0442 `bitrix_call` \u0432 \u0441\u0432\u043E\u0451\u043C \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0438 (`deps.catalog.names()`).\n\n---\n\n## 2. \u0424\u043E\u0440\u043C\u0430\u0442 \u043E\u0442\u0432\u0435\u0442\u0430 (\u0432\u0430\u0436\u043D\u043E!)\n\nAjax-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u044B (`/bitrix/services/main/ajax.php`) \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0442 HTTP 200 \u0441 \u043A\u043E\u043D\u0432\u0435\u0440\u0442\u043E\u043C:\n\n```jsonc\n{ "status": "success" | "error",\n "data": { ... },\n "errors": [] } // \u041F\u0423\u0421\u0422\u041E\u0419 \u043C\u0430\u0441\u0441\u0438\u0432 \u043F\u0440\u0438 \u0443\u0441\u043F\u0435\u0445\u0435! (\u0432 JS [] \u2014 truthy)\n```\n\n- \u0423\u0441\u043F\u0435\u0445 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442\u0441\u044F `status:"success"` \u0438/\u0438\u043B\u0438 **\u043F\u0443\u0441\u0442\u044B\u043C** `errors`. \u041D\u0435\u043F\u0443\u0441\u0442\u043E\u0439 `errors` / `status:"error"` /\n top-level `error` \u2014 \u0440\u0435\u0430\u043B\u044C\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430 (\u043C\u043E\u0441\u0442 \u043C\u0430\u043F\u043F\u0438\u0442 \u044D\u0442\u043E \u0432 `ok:false`).\n- REST-\u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u044B (`/rest/*.json`) \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0442 \u0438\u043D\u0430\u0447\u0435: `{ "result": \u2026, "next", "total", "time" }` \u2014 \u0431\u0435\u0437 `errors`.\n\n---\n\n## 3. \u0422\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442: form vs json (\u0440\u0430\u0437\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043F\u043E \u043C\u0435\u0442\u043E\u0434\u0443!)\n\n\u0423 \u043A\u0430\u0436\u0434\u043E\u0439 \u0437\u0430\u043F\u0438\u0441\u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0435\u0441\u0442\u044C **`bodyType`** \u2014 \u043A\u0430\u043A \u043C\u043E\u0441\u0442 \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u043B\u043E:\n\n- **`bodyType: "form"`** (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E) \u2014 `application/x-www-form-urlencoded`; \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E\u0441\u0442\u044C \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044F\n PHP-\u0441\u0442\u0438\u043B\u0435\u043C (`filter[STATUS]=2`, `select[0]=ID`). \u041E\u0431\u044A\u0435\u043A\u0442 \u0432 `params` \u0440\u0435\u043A\u0443\u0440\u0441\u0438\u0432\u043D\u043E \u0440\u0430\u0437\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0432 \u0442\u0430\u043A\u0438\u0435\n \u043A\u043B\u044E\u0447\u0438. \u041A\u043B\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043A\u0438\u0435 `tasks.task.*`, \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 `im.v2.*`, REST \u2014 \u0432\u0441\u0451 \u044D\u0442\u043E \u0444\u043E\u0440\u043C\u0430.\n- **`bodyType: "json"`** \u2014 \u0442\u0435\u043B\u043E \u0443\u0445\u043E\u0434\u0438\u0442 \u043A\u0430\u043A `JSON.stringify(params)` \u0441 `Content-Type: application/json`.\n \u0422\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 **`tasks.v2.*`** (\u043D\u0430\u043F\u0440. `tasks.v2.Task.get` \u0436\u0434\u0451\u0442 `{"task":{"id":N}}`) \u0438 `ui.entityselector.*`.\n `params` \u043F\u0440\u0438 \u044D\u0442\u043E\u043C \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0435\u0442 \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u0443\u044E \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0443 \u043A\u0430\u043A \u0435\u0441\u0442\u044C (\u043D\u0435 \u0440\u0430\u0437\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0432 bracket-\u043A\u043B\u044E\u0447\u0438).\n\n> \u0418\u0441\u0442\u043E\u0440\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u0437\u0430\u043C\u0435\u0442\u043A\u0430: \u0440\u0430\u043D\u044C\u0448\u0435 \u043C\u043E\u0441\u0442 \u0443\u043C\u0435\u043B \u0442\u043E\u043B\u044C\u043A\u043E \u0444\u043E\u0440\u043C\u0443, \u0438 `tasks.v2.*` \u0431\u044B\u043B\u0438 \u043D\u0435\u043F\u0440\u0438\u0433\u043E\u0434\u043D\u044B. \u0422\u0435\u043F\u0435\u0440\u044C\n> \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0430\u043D\u044B \u2014 \u0432 \u0437\u0430\u043F\u0438\u0441\u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0441\u0442\u0430\u0432\u044C `"bodyType": "json"`, \u0438 \u043C\u043E\u0441\u0442 \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442 \u0438\u0445 \u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u043E.\n\n**CSRF / sessid:** \u043C\u043E\u0441\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0448\u043B\u0451\u0442 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A **`X-Bitrix-Csrf-Token: <sessid>`** (\u0441\u0432\u0435\u0436\u0438\u0439\n`BX.bitrix_sessid()`). Form-\u0442\u0435\u043B\u0430 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043D\u0435\u0441\u0443\u0442 `sessid` \u043F\u043E\u043B\u0435\u043C \u0432 \u0442\u0435\u043B\u0435 (legacy REST \u044D\u0442\u043E \u0442\u0440\u0435\u0431\u0443\u0435\u0442);\nJSON-\u0442\u0435\u043B\u0430 \u043D\u0435\u0441\u0443\u0442 sessid **\u0442\u043E\u043B\u044C\u043A\u043E** \u0432 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0435. \u041E\u0442\u0432\u0435\u0442 `invalid_csrf`/`invalid_authentication` = \u0441\u0435\u0441\u0441\u0438\u044F\n\u043F\u0440\u043E\u0442\u0443\u0445\u043B\u0430 (\u043F\u0435\u0440\u0435\u043B\u043E\u0433\u0438\u043D\u044C\u0441\u044F \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435).\n\n| \u041C\u0435\u0442\u043E\u0434 (action / endpoint) | bodyType | \u0413\u0434\u0435 `select`/`filter`/`order` | \u041F\u0430\u0433\u0438\u043D\u0430\u0446\u0438\u044F |\n|---|---|---|---|\n| `tasks.task.list` | form | **\u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C**: `select[]`, `filter{}`, `order{}` | `start` (\u0441\u0434\u0432\u0438\u0433, \u0448\u0430\u0433 50) |\n| `tasks.task.get` | form | \u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C: `taskId`, `select[]` | \u2014 |\n| `tasks.v2.Task.get` | **json** | `{"task": {"id": N}}` | \u2014 |\n| `tasks.v2.Scrum.getTaskInfo` | **json** | `{"taskId": N}` | \u2014 |\n| `tasks.v2.File.listObjects` | **json** | `{"ids": [N,\u2026]}` | \u2014 |\n| `tasks.v2.Task.View.User.count` | **json** | `{"task": {"id": N}}` | \u2014 |\n| `tasks.v2.Task.Relation.Child.list` | **json** | `{"taskId": N, "withIds":true, "navigation":{"size":N}}` | `navigation` |\n| `tasks.v2.Task.Relation.Related.list` | **json** | `{"taskId": N, \u2026}` (\u043A\u0430\u043A Child) | `navigation` |\n| `socialnetwork.api.workgroup.list` | form | **\u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C**: `select[]`, `order{}`, `filter{}` | `start` (\u0448\u0430\u0433 50; `start=(N-1)*50`, `-1` \u2014 \u043E\u0442\u0432\u0435\u0442 \u0431\u0435\u0437 `total`) \u{1F4D6} |\n| `socialnetwork.api.workgroup.get` | form | **\u043E\u0431\u0451\u0440\u043D\u0443\u0442\u043E**: `params[groupId]`, `params[select][]` | \u2014 |\n| `/rest/im.recent.list.json` | form (rest) | \u043F\u043B\u043E\u0441\u043A\u043E: `LIMIT`, `SKIP_OPENLINES`, `UNREAD_ONLY`, \u2026 | `LIMIT` |\n| `/rest/im.user.get.json` | form (rest) | \u043F\u043B\u043E\u0441\u043A\u043E: `ID` | \u2014 |\n| `/rest/im.chat.get.json` | form (rest) | \u043F\u043B\u043E\u0441\u043A\u043E: `ENTITY_TYPE`, `ENTITY_ID` | \u2014 |\n| `im.v2.Recent.load` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `limit`, `filter[recentSection]`, `filter[unread]`, `filter[parentId]` | `im.v2.Recent.tail` |\n| `im.v2.Recent.tail` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `limit`, `filter[lastMessageDate]` (\u043A\u0443\u0440\u0441\u043E\u0440), `filter[recentSection]` | `filter[lastMessageDate]` |\n| `im.v2.Chat.load` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `dialogId`\\|`chatId`, `messageLimit` | \u2014 |\n| `im.v2.Chat.getDialogId` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `externalId` | \u2014 |\n| `im.v2.Chat.Message.list` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `limit` | \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u044F\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u2014 \u043D\u0430\u0437\u0430\u0434 **\u043D\u0435 \u043B\u0438\u0441\u0442\u0430\u0435\u0442**, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 `.tail` |\n| `im.v2.Chat.Message.tail` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `limit`, `filter[lastId]`, `order[id]` | **\u0441\u043C. \u0440\u0430\u0437\u0434\u0435\u043B 6** |\n| `im.v2.Chat.Message.read` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `ids[]`, `actionUuid` | \u2014 (\u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439) |\n| `im.v2.Chat.readAll` | form | \u0431\u0435\u0437 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 | \u2014 (\u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439) |\n| `ui.entityselector.load` | **json** | `{"dialog": {entities,preselectedItems,\u2026}}` | \u2014 |\n| `ui.entityselector.doSearch` | **json** | `{"dialog": {\u2026}, "searchQuery": {"query": "...", "queryWords": ["..."]}}` | \u2014 |\n\n---\n\n## 4. \u041A\u0430\u0442\u0430\u043B\u043E\u0433: \u0438\u043C\u044F \u2192 action \u2192 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B\n\n| \u0418\u043C\u044F (`actions.json`) | action / endpoint | bodyType | \u041A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 params |\n|---|---|---|---|\n| `tasks.list` | `tasks.task.list` | form | `filter{RESPONSIBLE_ID,REAL_STATUS,GROUP_ID,\u2026}`, `select[]`, `order{}`, `start` |\n| `task.get` | `tasks.task.get` | form | `taskId`, `select[]` |\n| `task.v2.get` | `tasks.v2.Task.get` | json | `task.id` (id \u0437\u0430\u0434\u0430\u0447\u0438) |\n| `task.scrum.info` | `tasks.v2.Scrum.getTaskInfo` | json | `taskId` |\n| `task.files` | `tasks.v2.File.listObjects` | json | `ids` (\u043C\u0430\u0441\u0441\u0438\u0432 id) |\n| `task.views.count` | `tasks.v2.Task.View.User.count` | json | `task.id` (id \u0437\u0430\u0434\u0430\u0447\u0438) |\n| `task.subtasks` | `tasks.v2.Task.Relation.Child.list` | json | `taskId`, `navigation{size}` |\n| `task.related` | `tasks.v2.Task.Relation.Related.list` | json | `taskId`, `navigation{size}` |\n| `projects.list` | `socialnetwork.api.workgroup.list` | form | `select[]`, `order{}`, `filter{}` |\n| `projects.get` | `socialnetwork.api.workgroup.get` | form | `params[groupId]`, `params[select][]` |\n| `chats.recent` | `/rest/im.recent.list.json` | form | `LIMIT`, `UNREAD_ONLY`, `SKIP_OPENLINES` |\n| `recent.load` | `im.v2.Recent.load` | form | `filter[recentSection]` (`tasksTask`/`collab`/\u2026), `limit`, `filter[unread]` |\n| `recent.tail` | `im.v2.Recent.tail` | form | `filter[lastMessageDate]`, `filter[recentSection]`, `limit` |\n| `chat.load` | `im.v2.Chat.load` | form | `dialogId`\\|`chatId`, `messageLimit` |\n| `chat.dialogId` | `im.v2.Chat.getDialogId` | form | `externalId` (\u043D\u0430\u043F\u0440. `"sg"+groupId`) |\n| `chat.messages` | `im.v2.Chat.Message.list` | form | `chatId`, `limit` (\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435; \u0432\u0433\u043B\u0443\u0431\u044C \u2014 `chat.messages.tail`) |\n| `chat.messages.tail` | `im.v2.Chat.Message.tail` | form | `chatId`, `filter[lastId]`, `order[id]`, `limit` |\n| `chat.message.read` | `im.v2.Chat.Message.read` | form | `chatId`, `ids[0]`, `actionUuid` |\n| `chat.read.all` | `im.v2.Chat.readAll` | form | \u2014 (\u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439) |\n| `im.user.get` | `/rest/im.user.get.json` | form | `ID` |\n| `im.chat.get` | `/rest/im.chat.get.json` | form | `ENTITY_TYPE`, `ENTITY_ID` (\u043D\u0430\u043F\u0440. `TASKS_TASK`+taskId) |\n| `entityselector.load` | `ui.entityselector.load` | json | `dialog` (\u043E\u0431\u044A\u0435\u043A\u0442) |\n| `entityselector.search` | `ui.entityselector.doSearch` | json | `dialog`, `searchQuery{query,queryWords}` |\n\n---\n\n## 5. \u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A \u043F\u043E\u043B\u0435\u0439\n\n**\u0417\u0430\u0434\u0430\u0447\u0430** (`tasks.task.*`) \u2014 \u043F\u043E\u043B\u044F \u0434\u043B\u044F `select`/`filter` \u0432 UPPER_CASE: `ID`, `TITLE`, `DESCRIPTION`,\n`STATUS`, `REAL_STATUS`, `RESPONSIBLE_ID`, `CREATED_BY`, `CREATED_DATE`, `CHANGED_DATE`, `DEADLINE`,\n`CLOSED_DATE`, `PRIORITY`, `GROUP_ID`, `TAGS`, `TIME_ESTIMATE`, **`CHAT_ID`** (id im-\u0447\u0430\u0442\u0430 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u044F\n\u0437\u0430\u0434\u0430\u0447\u0438 \u2014 \u043F\u0440\u044F\u043C\u043E\u0439 \u0440\u0435\u0437\u043E\u043B\u0432\u0435\u0440 `taskId \u2192 chatId`, \u0441\u043C. \xA76.3), `UF_*`. \u041E\u0442\u0432\u0435\u0442 ajax \u0442\u0430\u043A\u0436\u0435 \u043F\u043E\u0434\u043A\u043B\u0430\u0434\u044B\u0432\u0430\u0435\u0442 \u043E\u0431\u044A\u0435\u043A\u0442\u044B\n`group`, `responsible`, `creator`, `action`.\n\n\u{1F4D6} \u043E\u0444\u0438\u0446. (`tasks.task.get` / `tasks.task.list`) \u2014 \u043F\u043E\u043B\u043D\u044B\u0439 \u043D\u0430\u0431\u043E\u0440 \u043F\u043E\u043B\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438, \u0441\u0440\u0435\u0434\u0438 \u043F\u0440\u043E\u0447\u0435\u0433\u043E: `parentId`,\n`stageId`, `sprintId`, `backlogId`, `commentsCount`, `serviceCommentsCount`, `timeEstimate`,\n`timeSpentInLogs`, `favorite`, `flowId`, `mark`, `accomplices[]`, `auditors[]`, `checklist{}`,\n`subStatus`. \u0412 \u043E\u0444\u0438\u0446\u0438\u0430\u043B\u044C\u043D\u043E\u043C REST-\u043E\u0442\u0432\u0435\u0442\u0435 \u043F\u043E\u043B\u044F \u043F\u0440\u0438\u0445\u043E\u0434\u044F\u0442 **camelCase** (`groupId`, `responsibleId`), \u0442\u043E\u0433\u0434\u0430\n\u043A\u0430\u043A \u0432 `select`/`filter` \u043E\u043D\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 **UPPER_CASE**; \u043D\u0430\u0448 ajax-\u0432\u0430\u0440\u0438\u0430\u043D\u0442 \u043C\u043E\u0436\u0435\u0442 \u043E\u0442\u0434\u0430\u0432\u0430\u0442\u044C \u0438\u043D\u0430\u0447\u0435 \u2014 \u0441\u0432\u0435\u0440\u044F\u0439\n\u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C. \u0414\u043E\u043F. \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F \u0432\u043A\u043B\u044E\u0447\u0430\u044E\u0442\u0441\u044F \u0444\u043B\u0430\u0433\u043E\u043C `params{WITH_TIMER_INFO, WITH_RESULT_INFO, WITH_PARSED_DESCRIPTION}`.\n\n\u0421\u0442\u0430\u0442\u0443\u0441\u044B (`REAL_STATUS` \u2014 \xAB\u043D\u0430\u0441\u0442\u043E\u044F\u0449\u0435\u0435\xBB \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435): `1` \u041D\u043E\u0432\u0430\u044F \xB7 `2` \u0416\u0434\u0451\u0442 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \xB7\n`3` \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \xB7 `4` \u0416\u0434\u0451\u0442 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044F \xB7 `5` \u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430 \xB7 `6` \u041E\u0442\u043B\u043E\u0436\u0435\u043D\u0430 \xB7 `7` \u041E\u0442\u043A\u043B\u043E\u043D\u0435\u043D\u0430. \u041F\u043E\u043B\u0435 `STATUS`\n\u043F\u043E\u0432\u0435\u0440\u0445 \u044D\u0442\u043E\u0433\u043E \u043D\u0435\u0441\u0451\u0442 **\u043C\u0435\u0442\u0430-\u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F** \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F (\u043F\u043E\u0447\u0442\u0438 \u043F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043D\u0430 / \u043D\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u043D\u0430 / \u043F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043D\u0430),\n\u043F\u043E\u044D\u0442\u043E\u043C\u0443 \xAB\u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043B\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0435\u0439\u0447\u0430\u0441\xBB \u0444\u0438\u043B\u044C\u0442\u0440\u0443\u0439 \u043F\u043E **`REAL_STATUS`** (\u043D\u0430\u043F\u0440. `{"REAL_STATUS":3}`), \u0430 \u043D\u0435\n\u043F\u043E `STATUS` (\u{1F4D6} `tasks.task.list`).\n\n**\u0424\u0438\u043B\u044C\u0442\u0440 `tasks.task.list`.** \u041F\u0435\u0440\u0435\u0434 \u0438\u043C\u0435\u043D\u0435\u043C \u043F\u043E\u043B\u044F \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044F \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440: `!` (\u043D\u0435 \u0440\u0430\u0432\u043D\u043E / \u0438\u0441\u043A\u043B\u044E\u0447\u0438\u0442\u044C),\n`<`, `<=`, `>`, `>=`, `%` (LIKE-\u043F\u043E\u0434\u0441\u0442\u0440\u043E\u043A\u0430). \u041D\u0430\u043F\u0440. `{"!REAL_STATUS":5}` \u2014 \u0432\u0441\u0435 **\u043D\u0435\u0437\u0430\u043A\u0440\u044B\u0442\u044B\u0435**,\n`{">=DEADLINE":"2026-07-01"}` \u2014 \u0434\u0435\u0434\u043B\u0430\u0439\u043D \u043D\u0435 \u0440\u0430\u043D\u044C\u0448\u0435 \u0434\u0430\u0442\u044B, `{"%TITLE":"\u043A\u0430\u0440\u0442\u0430"}` \u2014 \u043F\u043E \u043F\u043E\u0434\u0441\u0442\u0440\u043E\u043A\u0435 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044F.\n\u0424\u0438\u043B\u044C\u0442\u0440\u0443\u0435\u043C\u044B\u0435 \u043F\u043E\u043B\u044F: `ID`, `PARENT_ID`, `GROUP_ID`, `CREATED_BY`, `RESPONSIBLE_ID`, `ACCOMPLICE`,\n`AUDITOR`, `REAL_STATUS`, `STATUS`, `PRIORITY`, `TAG`, `STAGE_ID`, `SPRINT_ID`, `BACKLOG_ID`,\n`DEADLINE`, `*_DATE`, `UF_CRM_TASK`.\n\n> **\xAB\u041C\u043E\u0438 \u0437\u0430\u0434\u0430\u0447\u0438\xBB \u2260 \u0442\u043E\u043B\u044C\u043A\u043E `RESPONSIBLE_ID`.** \u0420\u043E\u043B\u0438 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0430 \u0440\u0430\u0437\u0434\u0435\u043B\u044C\u043D\u044B: \u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439\n> (`RESPONSIBLE_ID`), \u0441\u043E\u0438\u0441\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C (`ACCOMPLICE`), \u043D\u0430\u0431\u043B\u044E\u0434\u0430\u0442\u0435\u043B\u044C (`AUDITOR`), \u043F\u043E\u0441\u0442\u0430\u043D\u043E\u0432\u0449\u0438\u043A\n> (`CREATED_BY`). \u0415\u0434\u0438\u043D\u043E\u0433\u043E \xAB\u043B\u044E\u0431\u0430\u044F \u0440\u043E\u043B\u044C\xBB \u043F\u043E\u043B\u044F \u0432 `list` \u043D\u0435\u0442 \u2014 \u0447\u0442\u043E\u0431\u044B \u0441\u043E\u0431\u0440\u0430\u0442\u044C **\u0432\u0441\u0435** \u0441\u0432\u043E\u0438 \u0437\u0430\u0434\u0430\u0447\u0438,\n> \u043E\u0431\u044A\u0435\u0434\u0438\u043D\u0438 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0432\u044B\u0437\u043E\u0432\u043E\u0432 (\u043C\u0438\u043D\u0438\u043C\u0443\u043C `RESPONSIBLE_ID` + `ACCOMPLICE`). \u0422\u043E\u043D\u043A\u043E\u0441\u0442\u044C:\n> \u0432 **`filter`** \u0440\u043E\u043B\u0438 \u0432 **\u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u043C** \u0447\u0438\u0441\u043B\u0435 (`ACCOMPLICE`/`AUDITOR`), \u0430 \u0432 **`select`** \u2014 \u0432\u043E\n> **\u043C\u043D\u043E\u0436\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u043C** (`ACCOMPLICES`/`AUDITORS`). \u041D\u0435 \u043F\u0443\u0442\u0430\u0439.\n\n> **Scrum-\u0437\u0430\u0434\u0430\u0447\u0438 (\u0441\u043F\u0440\u0438\u043D\u0442\u044B).** \u041F\u043E\u043B\u0435 `SPRINT_ID` \u043D\u0430 \u0437\u0430\u0434\u0430\u0447\u0435 \u0438 \u0436\u0451\u0441\u0442\u043A\u0438\u0439 \u0444\u0438\u043B\u044C\u0442\u0440 `filter[SPRINT_ID]`\n> \u043C\u043E\u0433\u0443\u0442 \u0440\u0430\u0441\u0445\u043E\u0434\u0438\u0442\u044C\u0441\u044F: \u0437\u0430\u0434\u0430\u0447\u0430 \u0447\u0438\u0441\u043B\u0438\u0442\u0441\u044F \u0437\u0430 \u0441\u043F\u0440\u0438\u043D\u0442\u043E\u043C \u043F\u043E \u0441\u0432\u043E\u0435\u043C\u0443 \u043F\u043E\u043B\u044E, \u043D\u043E \u043D\u0435 \u043F\u043E\u043F\u0430\u0434\u0430\u0435\u0442 \u0432 \u0432\u044B\u0431\u043E\u0440\u043A\u0443 \u043F\u043E \u0444\u0438\u043B\u044C\u0442\u0440\u0443\n> (\u0432\u0435\u0440\u043E\u044F\u0442\u043D\u043E, \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u0430 \u0432 \u0431\u044D\u043A\u043B\u043E\u0433 \u0438\u043B\u0438 \u0432 \u0438\u043D\u043E\u0439 stage). \u0415\u0441\u043B\u0438 \u043F\u043E \u0444\u0438\u043B\u044C\u0442\u0440\u0443 \xAB\u043C\u0430\u043B\u043E\u0432\u0430\u0442\u043E\xBB \u2014 \u043F\u0435\u0440\u0435\u043F\u0440\u043E\u0432\u0435\u0440\u044C \u0431\u0435\u0437 \u043D\u0435\u0433\u043E\n> \u0438 \u043E\u0442\u0444\u0438\u043B\u044C\u0442\u0440\u0443\u0439 \u043F\u043E `SPRINT_ID`/`STAGE_ID` \u043D\u0430 \u0441\u0442\u043E\u0440\u043E\u043D\u0435 \u0430\u0433\u0435\u043D\u0442\u0430. \u0422\u043E\u0447\u043D\u043E\u0433\u043E API \u043A\u043E\u043B\u043E\u043D\u043E\u043A scrum-\u0434\u043E\u0441\u043A\u0438\n> (`STAGE_ID` \u2192 \u0438\u043C\u044F \u043A\u043E\u043B\u043E\u043D\u043A\u0438) \u0432 \u0442\u0435\u043A\u0443\u0449\u0435\u043C \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0435 \u043D\u0435\u0442 \u2014 \u044D\u0442\u043E \u043A\u0430\u043D\u0434\u0438\u0434\u0430\u0442 \u043D\u0430 \u0440\u0435\u0432\u0435\u0440\u0441.\n\n**\u0417\u0430\u0434\u0430\u0447\u0430 v2** (`tasks.v2.*`): id \u0437\u0430\u0434\u0430\u0447\u0438 \u043F\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044F \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E \u2014 **`{"task": {"id": N}}`** (\u0443 `Task.get` \u0438\n`Task.View.User.count`), \u0430 \u0443 `Scrum.getTaskInfo` \u0438 `Relation.*` \u2014 \u043F\u043B\u043E\u0441\u043A\u043E `{"taskId": N}`. \u042D\u0442\u043E \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u0430\u044F\n\u043F\u043E\u0434\u0441\u0438\u0441\u0442\u0435\u043C\u0430 scrum-\u0431\u043E\u0440\u0434\u0430; \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0443 \u043E\u0442\u0432\u0435\u0442\u0430 \u0441\u0432\u0435\u0440\u044C \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C \u2014 \u0432 \u0437\u0430\u0445\u0432\u0430\u0442\u0435 \u0432\u0438\u0434\u043D\u044B \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0437\u0430\u043F\u0440\u043E\u0441\u0430.\n\n**\u0413\u0440\u0443\u043F\u043F\u0430/\u043F\u0440\u043E\u0435\u043A\u0442 \u2014 \u0441\u043F\u0438\u0441\u043E\u043A** (`workgroup.list`, camelCase \u0432 \u043E\u0442\u0432\u0435\u0442\u0435): `ID`, `NAME`, `DESCRIPTION`,\n`NUMBER_OF_MEMBERS`, `OWNER_ID`, `DATE_CREATE`, `PROJECT` (Y/N), `TYPE`.\n\u{1F4D6} \u043E\u0444\u0438\u0446. (`socialnetwork.api.workgroup.list`) \u2014 \u0444\u0438\u043B\u044C\u0442\u0440\u0443\u0435\u043C\u044B\u0435 \u043F\u043E\u043B\u044F: `ID`, `NAME`, `OWNER_ID`, `ACTIVE`,\n`VISIBLE`, `OPENED`, `CLOSED`, `PROJECT` (Y=\u043F\u0440\u043E\u0435\u043A\u0442/N=\u0433\u0440\u0443\u043F\u043F\u0430), `SUBJECT_ID`, `SITE_ID`, `DATE_CREATE`,\n`DATE_UPDATE`, `DATE_ACTIVITY`; \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u044B \u0444\u0438\u043B\u044C\u0442\u0440\u0430 `>= > <= < % =% %= !% != !`; \u0431\u0435\u0437 `select` \u0432\u0435\u0440\u043D\u0451\u0442\u0441\u044F\n\u0442\u043E\u043B\u044C\u043A\u043E `ID`. \u0421\u0442\u0430\u0440\u044B\u0439 \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0439 \u0430\u043D\u0430\u043B\u043E\u0433 \u2014 `sonet_group.get` (\u0442\u0435 \u0436\u0435 \u043F\u043E\u043B\u044F/\u043F\u0430\u0433\u0438\u043D\u0430\u0446\u0438\u044F, \u043A\u043B\u044E\u0447\u0438 `FILTER`/`ORDER`\n\u043A\u0430\u043F\u0441\u043E\u043C).\n**\u0413\u0440\u0443\u043F\u043F\u0430 \u2014 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430** (`workgroup.get`): \u043F\u043B\u044E\u0441 `OWNER_DATA`, `SUBJECT_DATA`, `MEMBERS[]`,\n`MODERATOR_MEMBERS[]`, `CHAT_ID`, `DIALOG_ID`, `IMAGE_ID`, UF-\u043F\u043E\u043B\u044F.\n\n**\u041D\u0435\u0434\u0430\u0432\u043D\u0438\u0439 \u0447\u0430\u0442** (`im.recent.list`): `id` (\u044D\u0442\u043E dialogId: \u0447\u0438\u0441\u043B\u043E = \u044E\u0437\u0435\u0440, `"chat"+N` = \u0447\u0430\u0442), `chat_id`,\n`type` (`user`/`chat`), `title`, `message{id,text,file,author_id,date,status,uuid}`, `counter` (\u0447\u0438\u0441\u043B\u043E\n\u043D\u0435\u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u0445), `unread` (bool), `last_id`, `pinned`, `date_update`, `date_last_activity`, `user{\u2026}`,\n`chat{\u2026 entity_type, entity_id, owner, \u2026}`. \u0415\u0441\u0442\u044C \u043B\u0438 \u0435\u0449\u0451 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B \u2014 \u0444\u043B\u0430\u0433\u0438 `hasMore`/`hasMorePages`\n(\u{1F4D6} `im.recent.list`).\n**\u041D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u043F\u043E \u0441\u0435\u043A\u0446\u0438\u0438** (`im.v2.Recent.load`): \u0444\u0438\u043B\u044C\u0442\u0440 `filter[recentSection]` \u2014 `default` (\u043E\u0431\u044B\u0447\u043D\u044B\u0435\n\u0434\u0438\u0430\u043B\u043E\u0433\u0438), **`tasksTask` (\u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447)**, `collab`/`collabDefault` (\u043A\u043E\u043B\u043B\u0430\u0431\u044B). \u041B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u0432\u0433\u043B\u0443\u0431\u044C \u2014\n`im.v2.Recent.tail` \u0441 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u043C `filter[lastMessageDate]` (ISO-\u0434\u0430\u0442\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B).\n**\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u044E\u0437\u0435\u0440\u0430** (`im.user.get`): `id`, `name`, `first_name`, `last_name`, `avatar`, `work_position`,\n`gender`, `status`, `online` \u2014 \u0440\u0435\u0437\u043E\u043B\u0432 \u0430\u0432\u0442\u043E\u0440\u0430 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F (`authorId`) \u0432 \u0438\u043C\u044F.\n**\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435** (`im.v2.Chat.Message.*`): `id`, `chatId`, `authorId`, `date`, `text`, `params`, `viewed`.\n\u041E\u0442\u0432\u0435\u0442 \u0442\u0430\u043A\u0436\u0435 \u043D\u0435\u0441\u0451\u0442 `users[]` (\u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0438), `additionalMessages[]`, `hasPrevPage`/`hasNextPage`.\n`chatId` \u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 `im.recent.list` (`chat_id`) \u0438\u043B\u0438 \u0438\u0437 `workgroup.get` (`CHAT_ID`/`DIALOG_ID`).\n\n**\u0410\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044F \u0447\u0430\u0442\u0430 (`chat.load`): `dialogId` vs `chatId`.** `chat.load` \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442 \u043B\u044E\u0431\u043E\u0439 \u0438\u0437 \u0434\u0432\u0443\u0445:\n- `dialogId` = **ID \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F** (\u0447\u0438\u0441\u043B\u043E, \u043D\u0430\u043F\u0440. `11`) \u2192 **\u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 1-\u043D\u0430-1** \u0441 \u044D\u0442\u0438\u043C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C.\n- `dialogId` = **`"chat"+CHAT_ID`** (\u043D\u0430\u043F\u0440. `"chat7111"`) \u2192 **\u0433\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439 \u0447\u0430\u0442** (\u043F\u0440\u043E\u0435\u043A\u0442\u0430/\u0437\u0430\u0434\u0430\u0447\u0438/\u043A\u0430\u043D\u0430\u043B\u0430).\n- `chatId` = \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 `CHAT_ID` \u2014 \u0442\u043E \u0436\u0435, \u0447\u0442\u043E \u0433\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439 `dialogId`, \u043D\u043E \u0431\u0435\u0437 \u043F\u0440\u0435\u0444\u0438\u043A\u0441\u0430.\n\n\u{1F4D6} \u043E\u0444\u0438\u0446. \u0444\u043E\u0440\u043C\u0430\u0442 `DIALOG_ID` (`im.dialog.get`): `XXX` \u2014 \u043B\u0438\u0447\u043D\u044B\u0439 (userId), `chatXXX` \u2014 \u0447\u0430\u0442, **`sgXXX`** \u2014\n\u0447\u0430\u0442 \u0441\u043E\u0446\u0433\u0440\u0443\u043F\u043F\u044B/\u043F\u0440\u043E\u0435\u043A\u0442\u0430 \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E (\u043D\u0430\u043F\u0440. `sg15`). \u0412 \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u043E\u043C REST \u044D\u0442\u043E \u0435\u0434\u0438\u043D\u044B\u0439 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440; \u043D\u0430\u0448 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0439\n`im.v2.Chat.load` \u043D\u0430\u0434\u0451\u0436\u043D\u043E \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442 `dialogId`/`chatId`, \u0430 \u0444\u043E\u0440\u043C\u0443 `sgXXX` \u0434\u043B\u044F \u043D\u0435\u0433\u043E \u0441\u0432\u0435\u0440\u044C \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C \u2014\n\u0433\u0430\u0440\u0430\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u043F\u0443\u0442\u044C \u043A \u0447\u0430\u0442\u0443 \u0433\u0440\u0443\u043F\u043F\u044B \u044D\u0442\u043E `bitrix_chat_get_dialog_id { externalId:"sg<groupId>" }`.\n\n\u041E\u0442\u0432\u0435\u0442 `chat.load` \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 `chatId` \u2014 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 \u0435\u0433\u043E \u0434\u0430\u043B\u044C\u0448\u0435 \u0434\u043B\u044F `chat.messages` /\n`chat.messages.tail` (\u043B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u0432\u0433\u043B\u0443\u0431\u044C) \u0438 `chat.message.read` (\u044D\u0442\u0438 \u0442\u0440\u0438 \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 \u043F\u043E `chatId`, \u043D\u0435 \u043F\u043E `dialogId`).\n\n---\n\n## 6. \u041F\u0440\u0438\u043C\u0435\u0440\u044B \u0432\u044B\u0437\u043E\u0432\u043E\u0432\n\n```jsonc\n// \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0433\u043E 55, \u043F\u043E \u0434\u0435\u0434\u043B\u0430\u0439\u043D\u0443, \u0432\u0442\u043E\u0440\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430\nbitrix_tasks_list { "params": { "filter": {"RESPONSIBLE_ID":55,"REAL_STATUS":2},\n "order": {"DEADLINE":"asc"}, "start": 50 } }\n\n// \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u043D\u044B\u043C \u043D\u0430\u0431\u043E\u0440\u043E\u043C \u043F\u043E\u043B\u0435\u0439\nbitrix_task_get { "taskId": 4229, "params": { "select": ["ID","TITLE","DESCRIPTION","TAGS","TIME_ESTIMATE"] } }\n\n// \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 v2-\u043F\u043E\u0434\u0441\u0438\u0441\u0442\u0435\u043C\u0443 (JSON-\u0442\u0435\u043B\u043E; id \u0432\u043B\u043E\u0436\u0435\u043D \u0432 task)\nbitrix_task_get_v2 { "taskId": 4229 } // \u2192 { "task": { "id": 4229 } }\nbitrix_call { "name": "task.v2.get", "params": { "task": { "id": 4229 } } }\n\n// \u0444\u0430\u0439\u043B\u044B \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043A \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u043E\u0432 (v2, JSON-\u0442\u0435\u043B\u043E); \u043F\u043E\u0434\u0437\u0430\u0434\u0430\u0447\u0438/\u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435\nbitrix_call { "name": "task.files", "params": { "ids": [4229] } }\nbitrix_call { "name": "task.views.count", "params": { "task": { "id": 4229 } } }\nbitrix_task_subtasks { "taskId": 4229 }\nbitrix_task_related { "taskId": 4229 }\n\n// \u043F\u0440\u043E\u0435\u043A\u0442\u044B \u043F\u043E \u0434\u0430\u0442\u0435 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F; \u043F\u043E\u043B\u043D\u0430\u044F \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0433\u0440\u0443\u043F\u043F\u044B\nbitrix_projects_list { "params": { "order": {"DATE_CREATE":"desc"} } }\nbitrix_project_get { "groupId": 15 }\n\n// \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0447\u0430\u0442 (\u043F\u0435\u0440\u0432\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F)\nbitrix_chat_load { "chatId": 485, "messageLimit": 50 }\n\n// \u041B\u0418\u0421\u0422\u0410\u041D\u0418\u0415 \u0418\u0421\u0422\u041E\u0420\u0418\u0418 \u0412\u0413\u041B\u0423\u0411\u042C (\u0441\u0442\u0430\u0440\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F): beforeId = \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 id \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\n// \u0438\u0437 \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B. \u041F\u043E\u0432\u0442\u043E\u0440\u044F\u0439, \u0443\u043C\u0435\u043D\u044C\u0448\u0430\u044F beforeId, \u0434\u043E \u043D\u0430\u0447\u0430\u043B\u0430 \u0438\u0441\u0442\u043E\u0440\u0438\u0438 (order DESC \u2014 \u0434\u0435\u0444\u043E\u043B\u0442).\nbitrix_chat_history { "chatId": 485, "beforeId": 1861279 }\n\n// \u043F\u043E\u043C\u0435\u0442\u0438\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u043C\u0438 (\u041C\u0423\u0422\u0418\u0420\u0423\u042E\u0429\u0418\u0419). actionUuid \u0433\u0435\u043D\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.\nbitrix_chat_mark_read { "chatId": 40271, "ids": [1884131] }\n```\n\n### 6.1. \u041C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 (IM): \u043C\u043E\u0434\u0435\u043B\u044C \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 \u0438 \u043A\u0430\u043A \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C `chatId`\n\n**IM** (`im.v2`) \u2014 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0439 \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 Bitrix24. \u0412\u0441\u0451 \u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u2014 \u044D\u0442\u043E **\u0447\u0430\u0442\u044B**: \u043B\u0438\u0447\u043D\u044B\u0435\n1-\u043D\u0430-1, \u0433\u0440\u0443\u043F\u043F\u043E\u0432\u044B\u0435 (\u043F\u0440\u043E\u0435\u043A\u0442\u043E\u0432, \u043A\u0430\u043D\u0430\u043B\u043E\u0432) \u0438 **\u0447\u0430\u0442\u044B-\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u044F \u0437\u0430\u0434\u0430\u0447**. \u0423 \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u0447\u0430\u0442\u0430 \u0435\u0441\u0442\u044C \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439\n**`chatId`** \u2014 \u044D\u0442\u043E \u043A\u043B\u044E\u0447 \u043A\u043E \u0432\u0441\u0435\u043C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F\u043C \u0441 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\u043C\u0438 (`bitrix_chat_messages`,\n`bitrix_chat_history`, `bitrix_chat_mark_read`). \u041F\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043C \u0447\u0438\u0442\u0430\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F, \u043D\u0443\u0436\u043D\u043E **\u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C\n`chatId`** \u2014 \u043F\u043E\u0447\u0442\u0438 \u043B\u044E\u0431\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430 \u0430\u0433\u0435\u043D\u0442\u0430 \u0437\u0434\u0435\u0441\u044C \u0438\u043C\u0435\u043D\u043D\u043E \u0432 \u044D\u0442\u043E\u043C \u0448\u0430\u0433\u0435.\n\n**\u0422\u0440\u0438 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440\u0430 \u043E\u0434\u043D\u043E\u0433\u043E \u0447\u0430\u0442\u0430** (\u043D\u0435 \u043F\u0443\u0442\u0430\u0439 \u2014 \u0433\u043E\u0434\u044F\u0442\u0441\u044F \u0434\u043B\u044F \u0440\u0430\u0437\u043D\u044B\u0445 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0439):\n\n| \u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 | \u0427\u0442\u043E \u044D\u0442\u043E | \u041F\u0440\u0438\u043C\u0435\u0440 | \u041A\u0443\u0434\u0430 \u043F\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044C |\n|---|---|---|---|\n| `chatId` | \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 id \u0447\u0430\u0442\u0430 | `485` | \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F / \u0438\u0441\u0442\u043E\u0440\u0438\u044F / \u043E\u0442\u043C\u0435\u0442\u043A\u0430 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u043C |\n| `dialogId` | \u0430\u0434\u0440\u0435\u0441 \u0434\u043B\u044F \u041E\u0422\u041A\u0420\u042B\u0422\u0418\u042F: `userId` (\u043B\u0438\u0447\u043D\u044B\u0439 1-\u043D\u0430-1) **\u0438\u043B\u0438** `"chat"+chatId` (\u0433\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439) | `11`, `"chat485"` | `bitrix_chat_load` |\n| `externalId` | \u0432\u043D\u0435\u0448\u043D\u0438\u0439 \u043A\u043B\u044E\u0447 \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u2192 \u0440\u0435\u0437\u043E\u043B\u0432\u0438\u0442\u0441\u044F \u0432 `dialogId` | `"sg15"` (\u0441\u043E\u0446\u0433\u0440\u0443\u043F\u043F\u0430 15) | `bitrix_chat_get_dialog_id` |\n\n\u041A\u043B\u044E\u0447\u0435\u0432\u043E\u0435: **\u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 \u0441 \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u043E\u043C = \u0435\u0433\u043E `userId` \u0432 \u0440\u043E\u043B\u0438 `dialogId`** (\u043E\u0442\u0434\u0435\u043B\u044C\u043D\u043E\u0433\u043E \xABid \u0447\u0430\u0442\u0430\xBB \u0443\n1-\u043D\u0430-1 \u0437\u043D\u0430\u0442\u044C \u043D\u0435 \u043D\u0443\u0436\u043D\u043E). `bitrix_chat_load` \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442 `dialogId` **\u0438\u043B\u0438** `chatId` \u0438 \u0432\u0441\u0435\u0433\u0434\u0430\n**\u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 `chatId`** \u2014 \u0434\u0430\u043B\u044C\u0448\u0435 \u043E\u043F\u0435\u0440\u0438\u0440\u0443\u0435\u0448\u044C \u0438\u043C.\n\n**\u041A\u0430\u043A \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C `chatId` \u2014 \u043F\u043E \u0446\u0435\u043B\u0438 (\u0434\u0435\u0440\u0435\u0432\u043E \u0440\u0435\u0448\u0435\u043D\u0438\u0439):**\n\n| \u0425\u043E\u0447\u0443 \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0447\u0430\u0442\u2026 | \u0428\u0430\u0433\u0438 |\n|---|---|\n| **\u0441 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C \u043F\u043E \u0418\u041C\u0415\u041D\u0418** | `bitrix_entity_search { query:"\u0434\u043C\u0438\u0442\u0440\u0438\u0439" }` \u2192 \u0432\u0435\u0440\u043D\u0451\u0442 \u0434\u0438\u0430\u043B\u043E\u0433 \u0441 `dialogId` = \u0435\u0433\u043E userId \u2192 `bitrix_chat_load { dialogId }` |\n| **\u0441 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C, id \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043D** | `bitrix_chat_load { dialogId: <userId> }` (userId \u2014 \u0438\u0437 \u0437\u0430\u0434\u0430\u0447\u0438 `RESPONSIBLE_ID`/`CREATED_BY`, \u0438\u0437 `bitrix_chats_recent`, \u0438\u0437 `bitrix_user_get`) |\n| **\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u0417\u0410\u0414\u0410\u0427\u0418** | `bitrix_recent_load { section:"tasksTask" }` **\u0438\u043B\u0438** `bitrix_entity_search { query:"<\u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435>", section:"tasksTask" }` \u2192 `chatId`/`dialogId` \u2192 `bitrix_chat_load` (\xA76.3) |\n| **\u041F\u0420\u041E\u0415\u041A\u0422\u0410/\u0433\u0440\u0443\u043F\u043F\u044B** | `bitrix_task_get`\u2192`GROUP_ID`\u2192`bitrix_project_get`\u2192`CHAT_ID`; \u043B\u0438\u0431\u043E `bitrix_chat_get_dialog_id { externalId:"sg<groupId>" }` |\n| **\u043D\u0435 \u0437\u043D\u0430\u044E \u0442\u043E\u0447\u043D\u043E, \u043A\u0430\u043A\u043E\u0439** | `bitrix_chats_recent` (\u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435, \u0441\u043E\u043F\u043E\u0441\u0442\u0430\u0432\u044C \u043F\u043E `title`/`user`) \u0438\u043B\u0438 `bitrix_entity_search { query }` (\u043F\u043E\u0438\u0441\u043A \u043F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E) |\n\n> \u041F\u043E\u0447\u0435\u043C\u0443 \u043D\u0435 \xAB\u043F\u0440\u043E\u0441\u0442\u043E \u0441\u043F\u0438\u0441\u043E\u043A \u0447\u0430\u0442\u043E\u0432\xBB: `bitrix_chats_recent` (`im.recent.list`) \u043E\u0442\u0434\u0430\u0451\u0442 \u043B\u0438\u0448\u044C \u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u0438\n> **\u0431\u0435\u0437 \u0447\u0430\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447**. \u0414\u043B\u044F \u043F\u043E\u0438\u0441\u043A\u0430 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0433\u043E \u0447\u0430\u0442\u0430 \u2014 `bitrix_entity_search`; \u0434\u043B\u044F \u0447\u0430\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447 \u2014\n> `bitrix_recent_load { section:"tasksTask" }`.\n\n\u{1F4D6} \u041F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0435 \u0430\u043D\u0430\u043B\u043E\u0433\u0438 \u0447\u0442\u0435\u043D\u0438\u044F \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 (\u0435\u0441\u043B\u0438 \u043D\u0443\u0436\u043D\u043E \u0433\u043B\u0443\u0431\u0436\u0435 \u0440\u0430\u0437\u043E\u0431\u0440\u0430\u0442\u044C\u0441\u044F \u0432 \u043C\u043E\u0434\u0435\u043B\u0438): `im.dialog.messages.get`\n\u2014 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u043E\u0442\u0434\u0430\u0451\u0442 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435 (\u0434\u0435\u0444\u043E\u043B\u0442 20, \u043C\u0430\u043A\u0441 50), \u043B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 `LAST_ID` (\u0441\u0442\u0430\u0440\u0435\u0435) / `FIRST_ID` (\u043D\u043E\u0432\u0435\u0435);\n`imbot.v2 chat.getMessageContext` \u2014 \u043E\u0442\u0432\u0435\u0442 `messages[]` (oldest\u2192newest) + `users[]` +\n`hasPrevPage`/`hasNextPage`, \u0447\u0442\u043E **\u0441\u043E\u0432\u043F\u0430\u0434\u0430\u0435\u0442 \u043F\u043E \u0444\u043E\u0440\u043C\u0435** \u0441 \u043D\u0430\u0448\u0438\u043C\u0438 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u043C\u0438 `im.v2.Chat.Message.*`.\n\n### 6.2. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0439: \u0447\u0430\u0442 \u0441 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u044B\u043C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C\n\n\u041B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 1-\u043D\u0430-1 \u0430\u0434\u0440\u0435\u0441\u0443\u0435\u0442\u0441\u044F `dialogId` = **ID \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F**. Id \u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 \u0437\u0430\u0434\u0430\u0447\u0438\n(`RESPONSIBLE_ID`/`CREATED_BY`), \u0438\u0437 `bitrix_chats_recent`, \u043B\u0438\u0431\u043E \u0440\u0435\u0437\u043E\u043B\u0432\u0438\u0442\u0441\u044F \u043F\u043E\u0438\u0441\u043A\u043E\u043C \u043F\u043E \u0438\u043C\u0435\u043D\u0438 (\xA76.4).\n\n```jsonc\n// 1) \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 \u0441 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C 11 \u2192 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 chatId\nbitrix_chat_load { "dialogId": 11 }\n// 2) \u043B\u0438\u0441\u0442\u0430\u0442\u044C \u0435\u0433\u043E \u0438\u0441\u0442\u043E\u0440\u0438\u044E \u0432\u0433\u043B\u0443\u0431\u044C \u043F\u043E chatId \u0438\u0437 \u043E\u0442\u0432\u0435\u0442\u0430 \u0448\u0430\u0433\u0430 1\nbitrix_chat_history { "chatId": 485, "beforeId": 1861279 }\n```\n\n### 6.3. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0439: \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 (\u0447\u0430\u0442) \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438\n\n\u0423 \u043A\u0430\u0436\u0434\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0435\u0441\u0442\u044C \u0441\u0432\u043E\u0439 im-\u0447\u0430\u0442-\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435. \u0421\u0430\u043C\u044B\u0439 \u043D\u0430\u0434\u0451\u0436\u043D\u044B\u0439 \u043F\u0443\u0442\u044C \u2014 \u043F\u0440\u044F\u043C\u043E\u0439 \u0440\u0435\u0437\u043E\u043B\u0432 \u0438\u0437 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0437\u0430\u0434\u0430\u0447\u0438;\n\u043F\u043E\u0438\u0441\u043A \u043F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E \u2014 \u0437\u0430\u043F\u0430\u0441\u043D\u043E\u0439.\n\n**\u0410. \u041F\u0440\u044F\u043C\u043E\u0439 \u2014 `CHAT_ID` \u0438\u0437 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 (\u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u043E).** `bitrix_task_get` \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 `CHAT_ID`\n\u0447\u0430\u0442\u0430-\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u044F (\u043E\u043D \u0432\u0445\u043E\u0434\u0438\u0442 \u0432 \u0434\u0435\u0444\u043E\u043B\u0442\u043D\u044B\u0439 `select`). \u042D\u0442\u043E \u043F\u0440\u044F\u043C\u043E\u0439 `taskId \u2192 chatId` **\u0431\u0435\u0437** \u043F\u043E\u0438\u0441\u043A\u0430 \u043F\u043E\n\u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E \u0438 \u0431\u0435\u0437 \u0440\u0438\u0441\u043A\u0430 \u043F\u0440\u043E\u043C\u0430\u0445\u0430 \u043F\u043E \u0442\u0451\u0437\u043A\u0430\u043C-\u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430\u043C:\n\n```jsonc\nbitrix_task_get { "taskId": 28373 } // \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 CHAT_ID = id \u0447\u0430\u0442\u0430 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u044F\nbitrix_chat_load { "chatId": <CHAT_ID> }\nbitrix_chat_history { "chatId": <CHAT_ID>, "beforeId": <\u043C\u0438\u043D id \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B> }\n```\n\n\u{1F4D6} \u043E\u0444\u0438\u0446.: \u0432 `tasks.task.get` \u043F\u043E\u043B\u0435 `CHAT_ID` \u043E\u0442\u0434\u0430\u0451\u0442\u0441\u044F \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E (tasks-new.md). \u041E\u0431\u0449\u0438\u0439\n\u0440\u0435\u0437\u043E\u043B\u0432\u0435\u0440-\u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u0430 \u2014 **`bitrix_entity_chat`** (\u043E\u0431\u0451\u0440\u0442\u043A\u0430 \u043D\u0430\u0434 `im.chat.get`): \u043F\u043E \u043F\u0430\u0440\u0435\n`entityType`/`entityId` \u043E\u0442\u0434\u0430\u0451\u0442 chatId \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0433\u043E \u043E\u0431\u044A\u0435\u043A\u0442\u0430 \u2014 \u0434\u043B\u044F \u0437\u0430\u0434\u0430\u0447\u0438 `entityType="TASKS_TASK"`,\n`entityId=<taskId>`; \u0442\u0430\u043A \u0436\u0435 \u0430\u0434\u0440\u0435\u0441\u0443\u044E\u0442\u0441\u044F \u0447\u0430\u0442\u044B `SONET_GROUP` (\u0433\u0440\u0443\u043F\u043F\u0430/\u043F\u0440\u043E\u0435\u043A\u0442), `CRM`, `CALENDAR`, `MAIL`,\n`VIDEOCONF`, `CALL`:\n\n```jsonc\nbitrix_entity_chat { "entityType": "TASKS_TASK", "entityId": 28373 } // \u2192 chatId\nbitrix_chat_load { "chatId": <chatId> }\n```\n\n**\u0411. \u0427\u0435\u0440\u0435\u0437 \u0441\u043F\u0438\u0441\u043E\u043A \u0447\u0430\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447.** `im.v2.Recent.load` \u0441 \u0441\u0435\u043A\u0446\u0438\u0435\u0439 `tasksTask` \u043E\u0442\u0434\u0430\u0451\u0442 \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447\n(\u0432 `bitrix_chats_recent` / `/rest/im.recent.list` \u0438\u0445 \u041D\u0415\u0422). \u041B\u0438\u0441\u0442\u0430\u0442\u044C \u0432\u0433\u043B\u0443\u0431\u044C \u2014 `bitrix_recent_tail`.\n\n```jsonc\nbitrix_recent_load { "section": "tasksTask" } // \u2192 \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447 \u0441 chatId/dialogId\nbitrix_recent_tail { "section": "tasksTask", "lastMessageDate": "2026-06-29T17:25:38+03:00" }\n// \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u044B\u0439 \u0447\u0430\u0442 \u0438 \u043B\u0438\u0441\u0442\u0430\u0442\u044C \u0438\u0441\u0442\u043E\u0440\u0438\u044E\nbitrix_chat_load { "dialogId": "chat38849" } // \u0438\u043B\u0438 { "chatId": 38849 }\nbitrix_chat_history { "chatId": 38849, "beforeId": 1722353 }\n```\n\n**\u0412. \u041F\u043E\u0438\u0441\u043A\u043E\u043C \u043F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E \u0437\u0430\u0434\u0430\u0447\u0438** \u2014 `bitrix_entity_search` \u0441 \u0441\u0435\u043A\u0446\u0438\u0435\u0439 `tasksTask` (\u0437\u0430\u043F\u0430\u0441\u043D\u043E\u0439, \u043C\u0430\u0442\u0447 \u043F\u043E \u0442\u0435\u043A\u0441\u0442\u0443):\n\n```jsonc\nbitrix_entity_search { "query": "\u0442\u0440\u0435\u043A\u0435\u0440", "section": "tasksTask" }\n```\n\n**\u0427\u0430\u0442 \u041F\u0420\u041E\u0415\u041A\u0422\u0410 \u0437\u0430\u0434\u0430\u0447\u0438** (\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B, \u043D\u0435 \u0441\u0430\u043C\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438) \u2014 \u0447\u0435\u0440\u0435\u0437 `GROUP_ID`:\n\n```jsonc\nbitrix_task_get { "taskId": 4229, "params": { "select": ["ID","GROUP_ID"] } }\nbitrix_project_get { "groupId": 15 } // \u043E\u0442\u0434\u0430\u0451\u0442 CHAT_ID / DIALOG_ID\nbitrix_chat_load { "dialogId": "chat7111" }\nbitrix_chat_get_dialog_id { "externalId": "sg15" } // \u043B\u0438\u0431\u043E \u0440\u0435\u0437\u043E\u043B\u0432 dialogId \u0441\u043E\u0446\u0433\u0440\u0443\u043F\u043F\u044B \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E\n```\n\n### 6.4. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0439: \u043F\u043E\u0438\u0441\u043A \u0447\u0430\u0442\u0430 / \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\n\n\u0422\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u043F\u043E\u0438\u0441\u043A \u2014 `bitrix_entity_search` (\u043E\u0431\u0451\u0440\u0442\u043A\u0430 \u043D\u0430\u0434 `ui.entityselector.doSearch`): \u0441\u0430\u043C \u0441\u043E\u0431\u0438\u0440\u0430\u0435\u0442\n\u0434\u0438\u0430\u043B\u043E\u0433 `IM_CHAT_SEARCH` \u0438 `searchQuery` \u0438\u0437 \u0441\u0442\u0440\u043E\u043A\u0438. `ui.entityselector.*` \u2014 **\u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0439 UI-\u043C\u0435\u0442\u043E\u0434, \u0432\n\u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0445 \u0434\u043E\u043A\u0430\u0445 \u0435\u0433\u043E \u043D\u0435\u0442** (\u0444\u043E\u0440\u043C\u0430 \u0437\u0430\u043F\u0440\u043E\u0441\u0430/\u043E\u0442\u0432\u0435\u0442\u0430 \u2014 \u0442\u043E\u043B\u044C\u043A\u043E \u0440\u0435\u0432\u0435\u0440\u0441); \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0435 \u0430\u043D\u0430\u043B\u043E\u0433\u0438 \u0434\u043B\u044F \u043F\u043E\u0438\u0441\u043A\u0430 \u043B\u044E\u0434\u0435\u0439 \u2014\n`user.get`/`user.search`, \u0434\u043B\u044F \u0447\u0430\u0442\u043E\u0432 \u2014 `im.recent.list` + \u0444\u0438\u043B\u044C\u0442\u0440\u0430\u0446\u0438\u044F \u043D\u0430 \u0441\u0442\u043E\u0440\u043E\u043D\u0435 \u0430\u0433\u0435\u043D\u0442\u0430.\n\n```jsonc\nbitrix_entity_search { "query": "\u0434\u043C\u0438\u0442\u0440\u0438\u0439" } // \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0447\u0430\u0442\u043E\u0432/\u0434\u0438\u0430\u043B\u043E\u0433\u043E\u0432\nbitrix_entity_search { "query": "\u0442\u0440\u0435\u043A\u0435\u0440", "section": "tasksTask" } // \u0441\u0440\u0435\u0434\u0438 \u0447\u0430\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447\n```\n\n\u0411\u044B\u0441\u0442\u0440\u044B\u0439 \u043F\u0443\u0442\u044C \u0431\u0435\u0437 \u043F\u043E\u0438\u0441\u043A\u0430 \u2014 \u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u0447\u0430\u0442\u044B \u0438 \u0444\u0438\u043B\u044C\u0442\u0440\u0430\u0446\u0438\u044F \u043D\u0430 \u0441\u0442\u043E\u0440\u043E\u043D\u0435 \u0430\u0433\u0435\u043D\u0442\u0430; \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0430\u0432\u0442\u043E\u0440\u0430 \u043F\u043E id:\n\n```jsonc\nbitrix_chats_recent { } // \u0441\u043E\u043F\u043E\u0441\u0442\u0430\u0432\u044C \u043F\u043E title / user\nbitrix_recent_load { "section": "tasksTask" }\nbitrix_user_get { "userId": 11 } // \u0440\u0435\u0437\u043E\u043B\u0432 authorId \u2192 \u0438\u043C\u044F\n```\n\n### 6.5. \u041B\u0435\u0433\u0430\u0441\u0438-\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 (HTML-\u043F\u043E\u0434\u0434\u043E\u043C\u0435\u043D \u2014 \u043F\u043E\u043A\u0430 \u041D\u0415 \u0432 \u043C\u043E\u0441\u0442\u0435)\n\n\u0423 \u0437\u0430\u0434\u0430\u0447 \u0434\u0432\u0430 \u043D\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043C\u044B\u0445 \u0444\u0438\u0434\u0430 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u044F:\n- **im.v2-\u0447\u0430\u0442** \u2014 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u043D\u044B\u0439 JSON, \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044F \u0443\u0436\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 (\xA76.3); \u043E\u0431\u044B\u0447\u043D\u043E \u044D\u0442\u043E\u0433\u043E \u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E.\n- **\u0424\u043E\u0440\u0443\u043C\u043D\u044B\u0435 \u043B\u0435\u0433\u0430\u0441\u0438-\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438** \u2014 \u0440\u0435\u043D\u0434\u0435\u0440\u044F\u0442\u0441\u044F \u043A\u0430\u043A **HTML** \u0432 side-slider\'\u0435. \u042D\u0442\u043E \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0439\n \xABHTML-\u043F\u043E\u0434\u0434\u043E\u043C\u0435\u043D\xBB \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u0433\u043E API, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 **\u0442\u0435\u043A\u0443\u0449\u0438\u0439 \u043C\u043E\u0441\u0442 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442** (\u0431\u043B\u043E\u043A\u0435\u0440\u044B \u043D\u0438\u0436\u0435).\n\n**\u041A\u0430\u043A \u0433\u0440\u0443\u0437\u044F\u0442\u0441\u044F (\u0440\u0435\u0432\u0435\u0440\u0441).** \u041F\u0435\u0440\u0432\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u2014 GET HTML-\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B iframe (\u0441\u0435\u0440\u0432\u0435\u0440 \u0442\u0443\u0442 \u0436\u0435 \u043C\u0438\u043D\u0442\u0438\u0442 \u043F\u043E\u0434\u043F\u0438\u0441\u044C):\n\n```\nGET /task/comments/<taskId>/?IFRAME=Y&IFRAME_TYPE=SIDE_SLIDER \u2192 HTML (\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 + signedParameters)\n```\n\n\u041B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u2014 POST \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043D\u043E\u0433\u043E ajax (\u0444\u043E\u0440\u043C\u0430, \u043E\u0442\u0434\u0430\u0451\u0442 HTML-\u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442):\n\n```\nPOST /bitrix/services/main/ajax.php?mode=class&c=bitrix:forum.comments&action=navigateComment\nform: AJAX_POST=Y, ENTITY_XML_ID=TASK_<taskId>, taskId=<taskId>, MODE=LIST,\n FILTER[<ID]=<\u043A\u0443\u0440\u0441\u043E\u0440: id, \u0414\u041E \u043A\u043E\u0442\u043E\u0440\u043E\u0433\u043E \u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0441\u0442\u0430\u0440\u044B\u0435>, PAGEN_1=1,\n signedParameters=<\u043F\u043E\u0434\u043F\u0438\u0441\u0430\u043D\u043D\u044B\u0439 blob>, IFRAME=Y, IFRAME_TYPE=SIDE_SLIDER\nheaders: bx-ajax: true, x-bitrix-site-id: s1 (\u043F\u043B\u044E\u0441 \u043E\u0431\u044B\u0447\u043D\u044B\u0439 X-Bitrix-Csrf-Token)\n```\n\n`signedParameters` \u2014 base64 PHP-\u043C\u0430\u0441\u0441\u0438\u0432\u0430 + HMAC-\u043F\u043E\u0434\u043F\u0438\u0441\u044C \u0441\u0435\u0440\u0432\u0435\u0440\u0430; \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442\n`FORUM_ID, ENTITY_TYPE=TK, ENTITY_ID=<taskId>, ENTITY_XML_ID=TASK_<taskId>, \u2026`. **\u041F\u043E\u0434\u0434\u0435\u043B\u0430\u0442\u044C \u043D\u0435\u043B\u044C\u0437\u044F** \u2014\n\u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 HTML \u043F\u0435\u0440\u0432\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B.\n\n**\u041F\u043E\u0447\u0435\u043C\u0443 \u043F\u043E\u043A\u0430 \u043D\u0435 \u0432 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0435 (3 \u0431\u043B\u043E\u043A\u0435\u0440\u0430):**\n1. \u041C\u043E\u0441\u0442 \u043F\u0430\u0440\u0441\u0438\u0442 \u043E\u0442\u0432\u0435\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u0430\u043A JSON (`extension/src/connector.ts` \u2192 `resp.json()`) \u2014 HTML \u0431\u0440\u043E\u0441\u0438\u0442 \u0438\u0441\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435.\n2. Path-\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432 URL (`/task/comments/<taskId>/`) \u2014 \u0437\u0430\u043F\u0438\u0441\u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u043D\u044B, \u0448\u0430\u0431\u043B\u043E\u043D\u043E\u0432 \u043F\u0443\u0442\u0438 \u043D\u0435\u0442.\n3. `signedParameters` + \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0438 `bx-ajax`/`x-bitrix-site-id` \u2014 \u043D\u0443\u0436\u0435\u043D \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 GET HTML-\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B.\n\n**\u0427\u0442\u043E\u0431\u044B \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C** (\u0431\u0443\u0434\u0443\u0449\u0430\u044F \u0440\u0430\u0431\u043E\u0442\u0430): \u043D\u0430\u0443\u0447\u0438\u0442\u044C \u043C\u043E\u0441\u0442 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044C text/HTML \u043F\u0440\u0438 \u043D\u0435-JSON \u043E\u0442\u0432\u0435\u0442\u0435 \u0438\n\u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044C path-\u0448\u0430\u0431\u043B\u043E\u043D \u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u0430; \u0437\u0430\u0442\u0435\u043C \u043E\u0431\u0451\u0440\u0442\u043A\u0430 `bitrix_task_comments { taskId }` (GET \u043F\u0435\u0440\u0432\u043E\u0439\n\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B), \u0430 \u043B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u2014 \u0447\u0435\u0440\u0435\u0437 `navigateComment` \u0441 \u0432\u044B\u043F\u0430\u0440\u0441\u0435\u043D\u043D\u044B\u043C `signedParameters`.\n\n> \u0422\u043E\u0442 \u0436\u0435 HTML-\u043F\u043E\u0434\u0434\u043E\u043C\u0435\u043D: **\u0434\u0435\u0442\u0430\u043B\u0438 \u0437\u0432\u043E\u043D\u043A\u0430** \u2014 `GET /call/detail/<callId>?IFRAME=Y&IFRAME_TYPE=SIDE_SLIDER`\n> (\u043E\u0442\u0434\u0430\u0451\u0442 HTML). \u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438\u044F \u0438\u0434\u0435\u043D\u0442\u0438\u0447\u043D\u044B.\n\n---\n\n## 7. \u041A\u0430\u043A \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044C (\u043D\u043E\u0432\u044B\u0439 \u0434\u043E\u043C\u0435\u043D: \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C, \u0434\u0438\u0441\u043A, CRM, \u2026)\n\n> \u0421\u043E\u0432\u0435\u0442: \u0441\u043F\u0435\u0440\u0432\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u044C, \u0437\u0430\u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u043D \u043B\u0438 \u043C\u0435\u0442\u043E\u0434 \u0432 \u{1F4D6} [`apidocs.bitrix24.com`](https://apidocs.bitrix24.com)\n> (context7: `/bitrix24/b24restdocs`). \u0414\u043B\u044F \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0445 `*.list`/`*.get` \u0442\u0430\u043C \u0433\u043E\u0442\u043E\u0432\u044B\u0435 \u043F\u043E\u043B\u044F, \u0444\u0438\u043B\u044C\u0442\u0440\u044B \u0438\n> \u043F\u0430\u0433\u0438\u043D\u0430\u0446\u0438\u044F \u2014 \u0440\u0435\u0432\u0435\u0440\u0441 \u0442\u043E\u0433\u0434\u0430 \u043D\u0443\u0436\u0435\u043D \u043B\u0438\u0448\u044C \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 (form/json) \u0438 \u043A\u043E\u043D\u0432\u0435\u0440\u0442 \u043E\u0442\u0432\u0435\u0442\u0430. \u0414\u043B\u044F\n> \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 `im.v2.*`/`tasks.v2.*`/UI-\u043C\u0435\u0442\u043E\u0434\u043E\u0432 \u0434\u043E\u043A\u043E\u0432 \u043D\u0435\u0442 \u2014 \u0442\u043E\u043B\u044C\u043A\u043E \u0440\u0435\u0432\u0435\u0440\u0441 (`docs/reconnaissance.md`).\n\n1. \u0421\u043D\u0438\u043C\u0438 \u0440\u0435\u0430\u043B\u044C\u043D\u044B\u0435 \u0432\u044B\u0437\u043E\u0432\u044B (`docs/reconnaissance.md` \u2014 \u0430\u0432\u0442\u043E-\u0437\u0430\u043F\u0438\u0441\u044C `bun run capture` \u0438\u043B\u0438 HAR \u2192\n `bun run catalog:draft`). \u0427\u0435\u0440\u043D\u043E\u0432\u0438\u043A `actions.draft.json` \u043D\u0430\u043A\u0430\u043F\u043B\u0438\u0432\u0430\u0435\u0442 **\u0432\u0441\u0435 \u0443\u043D\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u043A\u043E\u043C\u0431\u0438\u043D\u0430\u0446\u0438\u0438\n \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432** \u043D\u0430 \u044D\u043A\u0448\u0435\u043D \u0438 \u043F\u0440\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 `bodyType` (form/json) \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.\n2. \u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0438 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 \u043F\u043E \u0440\u0430\u0437\u0434\u0435\u043B\u0443 3: \u0435\u0441\u043B\u0438 \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A \u043F\u043E\u043A\u0430\u0437\u0430\u043B `"bodyType": "json"` \u2014 \u043F\u0435\u0440\u0435\u043D\u0435\u0441\u0438 \u0435\u0433\u043E \u0432 \u0437\u0430\u043F\u0438\u0441\u044C.\n3. \u0414\u043E\u0431\u0430\u0432\u044C \u0437\u0430\u043F\u0438\u0441\u044C \u0432 `actions.json` (\u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0435\u0439 \u2014 \u043A\u0430\u0442\u0430\u043B\u043E\u0433 \u044D\u0442\u043E \u0434\u043E\u043F\u0443\u0441\u043A\u0430\u0435\u0442).\n4. \u0415\u0441\u043B\u0438 \u0443\u0434\u043E\u0431\u043D\u043E \u2014 \u043E\u0431\u0435\u0440\u043D\u0438 \u0432 \u0442\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u0432 `src/tools/register.ts` (\u043E\u0431\u0451\u0440\u0442\u043A\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044F\n \u0442\u043E\u043B\u044C\u043A\u043E \u0435\u0441\u043B\u0438 \u0435\u0451 `catalogName` \u0435\u0441\u0442\u044C \u0432 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0435).\n5. **`bun run sync:runtime`** \u2014 \u0434\u043E\u0441\u0442\u0430\u0432\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0436\u0438\u0432\u043E\u043C\u0443 daemon: \u043F\u0435\u0440\u0435\u0441\u043E\u0431\u0440\u0430\u0442\u044C \u0431\u0430\u043D\u0434\u043B, \u0441\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C\n \u0440\u0435\u043F\u043E-`actions.json` \u0432 `~/.bitrix24-mcp-bridge/actions.json` \u0438 \u043F\u043E\u0433\u0430\u0441\u0438\u0442\u044C daemon. \u0411\u0435\u0437 \u044D\u0442\u043E\u0433\u043E \u0430\u0433\u0435\u043D\u0442\n \u043D\u043E\u0432\u044B\u0445 \u0438\u043C\u0451\u043D/\u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u043D\u0435 \u0443\u0432\u0438\u0434\u0438\u0442 (daemon \u0447\u0438\u0442\u0430\u0435\u0442 runtime-\u043F\u0430\u043F\u043A\u0443, \u043D\u0435 \u0440\u0435\u043F\u043E). \u041F\u0440\u043E\u0432\u0435\u0440\u044C \u0447\u0435\u0440\u0435\u0437\n `bitrix_call { name, params }` \u0438\u043B\u0438 \u043D\u043E\u0432\u0443\u044E \u043E\u0431\u0451\u0440\u0442\u043A\u0443.\n\n> `actions.json` / `actions.draft.json` \u2014 \u0434\u0430\u043D\u043D\u044B\u0435 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0433\u043E \u043F\u043E\u0440\u0442\u0430\u043B\u0430 (gitignored). \u042D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B\n> (`api-notes.md`) \u2014 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u043C\u044B\u0435 \u0437\u043D\u0430\u043D\u0438\u044F \u043E \u0441\u0430\u043C\u043E\u043C API; \u0434\u0435\u0440\u0436\u0438 \u0435\u0433\u043E \u0432 \u0430\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u043E\u043C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0438 \u043F\u0440\u0438 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0438\n> \u043D\u043E\u0432\u044B\u0445 \u043C\u0435\u0442\u043E\u0434\u043E\u0432.\n' ? '# Bitrix24 API notes (reverse-engineered)\n\n\u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A \u043F\u043E API Bitrix24, \u0434\u043E\u0431\u044B\u0442\u044B\u0439 **\u0436\u0438\u0432\u044B\u043C \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C**. \u0427\u0430\u0441\u0442\u044C \u0432\u044B\u0437\u043E\u0432\u043E\u0432 \u043C\u043E\u0441\u0442\u0430 \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u0435\u0442 \u0441\n**\u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u043C REST** (`tasks.task.*`, `im.recent.list`, `im.user.get`, `socialnetwork.api.workgroup.*`) \u2014\n\u043F\u043E \u043D\u0438\u043C \u0435\u0441\u0442\u044C \u043E\u0444\u0438\u0446\u0438\u0430\u043B\u044C\u043D\u0430\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u044F; \u0447\u0430\u0441\u0442\u044C \u2014 **\u0441\u0443\u0433\u0443\u0431\u043E \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0435 ajax-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u044B**\n(`im.v2.*`, `tasks.v2.*`, `ui.entityselector.*`), \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0445 \u0434\u043E\u043A\u043E\u0432 \u043F\u043E \u043A\u043E\u0442\u043E\u0440\u044B\u043C \u043D\u0435\u0442, \u0442\u043E\u043B\u044C\u043A\u043E \u0440\u0435\u0432\u0435\u0440\u0441.\n\u041F\u0440\u0435\u0434\u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D \u0434\u043B\u044F \u043B\u044E\u0431\u043E\u0433\u043E \u0418\u0418-\u0430\u0433\u0435\u043D\u0442\u0430 \u0438\u043B\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0432\u044B\u0437\u044B\u0432\u0430\u0435\u0442 \u044D\u0442\u0438 \u043C\u0435\u0442\u043E\u0434\u044B \u0447\u0435\u0440\u0435\u0437 \u043C\u043E\u0441\u0442\n(`bitrix_call` / \u0442\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B) \u0438\u043B\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044F\u0435\u0442 \u043A\u0430\u0442\u0430\u043B\u043E\u0433.\n\n> **\u041E\u0444\u0438\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0435 REST-\u0434\u043E\u043A\u0438** \u2014 [`apidocs.bitrix24.com`](https://apidocs.bitrix24.com) (\u0438\u0441\u0445\u043E\u0434\u043D\u0438\u043A\u0438:\n> [`github.com/bitrix24/b24restdocs`](https://github.com/bitrix24/b24restdocs); \u0430\u0433\u0435\u043D\u0442\u0443 \u0441 MCP context7 \u2014\n> \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430 `/bitrix24/b24restdocs`). \u0414\u043B\u044F \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u043E-\u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u043C\u0435\u0442\u043E\u0434\u043E\u0432 \u0434\u043E\u043A\u0438 \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u043C\u044B \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E;\n> \u0434\u043B\u044F \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 `im.v2.*`/`tasks.v2.*` \u2014 \u043A\u0430\u043A **\u0441\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u044B\u0439 \u0430\u043D\u0430\u043B\u043E\u0433** (\u043A\u043E\u043D\u0432\u0435\u0440\u0442/\u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043F\u043E\u043B\u0435\u0439 \u043C\u043E\u0433\u0443\u0442\n> \u043E\u0442\u043B\u0438\u0447\u0430\u0442\u044C\u0441\u044F, \u0441\u0432\u0435\u0440\u044F\u0439 \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C). \u0414\u0430\u043B\u044C\u0448\u0435 \u043F\u043E \u0442\u0435\u043A\u0441\u0442\u0443 \u0442\u0430\u043A\u0438\u0435 \u043E\u0442\u0441\u044B\u043B\u043A\u0438 \u043F\u043E\u043C\u0435\u0447\u0435\u043D\u044B **\u{1F4D6}**; \u0438\u0434\u0438 \u043F\u043E \u043D\u0438\u043C, \u0435\u0441\u043B\u0438 \u043D\u0443\u0436\u043D\u0430\n> \u0434\u0435\u0442\u0430\u043B\u044C, \u043A\u043E\u0442\u043E\u0440\u043E\u0439 \u0437\u0434\u0435\u0441\u044C \u043D\u0435\u0442.\n\n\u041D\u0430\u0431\u043B\u044E\u0434\u0435\u043D\u0438\u044F \u0441\u043D\u044F\u0442\u044B \u043D\u0430 \u043F\u043E\u0440\u0442\u0430\u043B\u0435 `example.bitrix24.ru` (\u043E\u0431\u043B\u0430\u043A\u043E, \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 **im.v2**, \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435\n**scrum-\u0431\u043E\u0440\u0434\u0430**). \u0418\u043C\u0435\u043D\u0430 \u043F\u043E\u043B\u0435\u0439 \u0438 \u043A\u043E\u043D\u0432\u0435\u043D\u0446\u0438\u0438 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B \u0434\u043B\u044F \u043E\u0431\u043B\u0430\u0447\u043D\u043E\u0433\u043E Bitrix24, \u043D\u043E \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0435 \u043D\u0430 \u0434\u0440\u0443\u0433\u043E\u0439\n\u043F\u043E\u0440\u0442\u0430\u043B \u0441\u0432\u0435\u0440\u044F\u0439\u0441\u044F \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C (`docs/reconnaissance.md`).\n\n---\n\n## 1. \u041A\u0430\u043A \u0432\u044B\u0437\u044B\u0432\u0430\u0442\u044C\n\n- **`bitrix_call { name, params }`** \u2014 \u0443\u043D\u0438\u0432\u0435\u0440\u0441\u0430\u043B\u044C\u043D\u044B\u0439 \u0432\u044B\u0437\u043E\u0432 \u043B\u044E\u0431\u043E\u0433\u043E \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043D\u043D\u043E\u0433\u043E \u0438\u043C\u0435\u043D\u0438 \u0438\u0437 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430\n (`actions.json`). `params` \u2014 \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 Bitrix (\u0441\u043C. \u0440\u0430\u0437\u0434\u0435\u043B 3). \u041A\u0430\u0442\u0430\u043B\u043E\u0433 \u043C\u043E\u0436\u0435\u0442 \u0432\u043A\u043B\u044E\u0447\u0430\u0442\u044C\n \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0435 \u0432\u044B\u0437\u043E\u0432\u044B; allowlist (`actions.json`) \u2014 \u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\u043D\u043D\u0430\u044F \u0433\u0440\u0430\u043D\u0438\u0446\u0430, \u043D\u0435 \u0440\u0435\u0436\u0438\u043C \u0447\u0442\u0435\u043D\u0438\u044F.\n- **\u0422\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B** \u2014 \u043E\u0431\u0451\u0440\u0442\u043A\u0438 \u0441 \u0440\u0430\u0437\u0443\u043C\u043D\u044B\u043C\u0438 \u0434\u0435\u0444\u043E\u043B\u0442\u0430\u043C\u0438 \u043D\u0430\u0434 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u043E\u043C. \u0422\u043E\u0447\u043D\u0430\u044F \u0432\u044B\u0431\u043E\u0440\u043A\u0430 \u2014 \u0447\u0435\u0440\u0435\u0437\n \u043E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0439 `params`, \u043E\u043D \u043C\u0435\u0440\u0436\u0438\u0442\u0441\u044F **\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u043C** \u0438 \u043F\u0435\u0440\u0435\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u0434\u0435\u0444\u043E\u043B\u0442\u044B. \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044E\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0442\u0435,\n \u0447\u044C\u0451 \u0438\u043C\u044F \u0435\u0441\u0442\u044C \u0432 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0435 (`actions.json`); \u0438\u043D\u0430\u0447\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u0435\u0442\u0441\u044F. \u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u043D\u0430\u0431\u043E\u0440:\n - \u0417\u0430\u0434\u0430\u0447\u0438: `bitrix_tasks_list`, `bitrix_task_get`, `bitrix_task_get_v2` (v2/JSON),\n `bitrix_task_scrum_info`, `bitrix_task_files`, `bitrix_task_views_count`,\n `bitrix_task_subtasks` (\u043F\u043E\u0434\u0437\u0430\u0434\u0430\u0447\u0438), `bitrix_task_related` (\u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435).\n - \u041F\u0440\u043E\u0435\u043A\u0442\u044B: `bitrix_projects_list`, `bitrix_project_get`.\n - \u0427\u0430\u0442\u044B: `bitrix_chats_recent`, `bitrix_recent_load` (\u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u043F\u043E \u0441\u0435\u043A\u0446\u0438\u0438 \u2014 \u0432 \u0442.\u0447. `tasksTask` =\n \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447), `bitrix_recent_tail` (\u043B\u0438\u0441\u0442\u0430\u0442\u044C \u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u0432\u0433\u043B\u0443\u0431\u044C), `bitrix_chat_load` (\u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043F\u043E\n `dialogId`/`chatId`), `bitrix_chat_messages`, `bitrix_chat_history` (\u043B\u0438\u0441\u0442\u0430\u0442\u044C \u0432\u0433\u043B\u0443\u0431\u044C \u043F\u043E `beforeId`),\n `bitrix_chat_get_dialog_id` (dialogId \u043F\u043E externalId), `bitrix_chat_mark_read` (\u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439),\n `bitrix_chat_read_all` (\u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439).\n - \u041B\u044E\u0434\u0438/\u043F\u043E\u0438\u0441\u043A: `bitrix_user_get` (\u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u044E\u0437\u0435\u0440\u0430), `bitrix_entity_selector` (\u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0441\u0435\u043B\u0435\u043A\u0442\u043E\u0440\u0430),\n `bitrix_entity_search` (\u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u043F\u043E\u0438\u0441\u043A \u0447\u0430\u0442\u043E\u0432/\u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 `ui.entityselector.doSearch`),\n `bitrix_entity_chat` (chatId \u0447\u0430\u0442\u0430 \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0433\u043E \u043E\u0431\u044A\u0435\u043A\u0442\u0430: \u0437\u0430\u0434\u0430\u0447\u0438/\u0433\u0440\u0443\u043F\u043F\u044B/CRM \u2014 \u0447\u0435\u0440\u0435\u0437 `im.chat.get`).\n\n \u041B\u044E\u0431\u043E\u0435 \u0438\u043C\u044F \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u0438 \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E \u0447\u0435\u0440\u0435\u0437 `bitrix_call { name, params }`.\n- **`bitrix_help`** \u2014 \u044D\u0442\u043E\u0442 \u0436\u0435 \u0433\u0430\u0439\u0434, \u043E\u0442\u0434\u0430\u0451\u0442\u0441\u044F \u0447\u0435\u0440\u0435\u0437 MCP (\u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 + resource `bitrix://api-notes`).\n \u0418\u0441\u0442\u043E\u0447\u043D\u0438\u043A \u2014 **\u044D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B** (`docs/api-notes.md`).\n\n\u041F\u043E\u043B\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A \u0438\u043C\u0451\u043D \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u043E\u0442\u0434\u0430\u0451\u0442 `bitrix_call` \u0432 \u0441\u0432\u043E\u0451\u043C \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0438 (`deps.catalog.names()`).\n\n---\n\n## 2. \u0424\u043E\u0440\u043C\u0430\u0442 \u043E\u0442\u0432\u0435\u0442\u0430 (\u0432\u0430\u0436\u043D\u043E!)\n\nAjax-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u044B (`/bitrix/services/main/ajax.php`) \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0442 HTTP 200 \u0441 \u043A\u043E\u043D\u0432\u0435\u0440\u0442\u043E\u043C:\n\n```jsonc\n{ "status": "success" | "error",\n "data": { ... },\n "errors": [] } // \u041F\u0423\u0421\u0422\u041E\u0419 \u043C\u0430\u0441\u0441\u0438\u0432 \u043F\u0440\u0438 \u0443\u0441\u043F\u0435\u0445\u0435! (\u0432 JS [] \u2014 truthy)\n```\n\n- \u0423\u0441\u043F\u0435\u0445 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442\u0441\u044F `status:"success"` \u0438/\u0438\u043B\u0438 **\u043F\u0443\u0441\u0442\u044B\u043C** `errors`. \u041D\u0435\u043F\u0443\u0441\u0442\u043E\u0439 `errors` / `status:"error"` /\n top-level `error` \u2014 \u0440\u0435\u0430\u043B\u044C\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430 (\u043C\u043E\u0441\u0442 \u043C\u0430\u043F\u043F\u0438\u0442 \u044D\u0442\u043E \u0432 `ok:false`).\n- REST-\u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u044B (`/rest/*.json`) \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0442 \u0438\u043D\u0430\u0447\u0435: `{ "result": \u2026, "next", "total", "time" }` \u2014 \u0431\u0435\u0437 `errors`.\n\n---\n\n## 3. \u0422\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442: form vs json (\u0440\u0430\u0437\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043F\u043E \u043C\u0435\u0442\u043E\u0434\u0443!)\n\n\u0423 \u043A\u0430\u0436\u0434\u043E\u0439 \u0437\u0430\u043F\u0438\u0441\u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0435\u0441\u0442\u044C **`bodyType`** \u2014 \u043A\u0430\u043A \u043C\u043E\u0441\u0442 \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u043B\u043E:\n\n- **`bodyType: "form"`** (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E) \u2014 `application/x-www-form-urlencoded`; \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E\u0441\u0442\u044C \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044F\n PHP-\u0441\u0442\u0438\u043B\u0435\u043C (`filter[STATUS]=2`, `select[0]=ID`). \u041E\u0431\u044A\u0435\u043A\u0442 \u0432 `params` \u0440\u0435\u043A\u0443\u0440\u0441\u0438\u0432\u043D\u043E \u0440\u0430\u0437\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0432 \u0442\u0430\u043A\u0438\u0435\n \u043A\u043B\u044E\u0447\u0438. \u041A\u043B\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043A\u0438\u0435 `tasks.task.*`, \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 `im.v2.*`, REST \u2014 \u0432\u0441\u0451 \u044D\u0442\u043E \u0444\u043E\u0440\u043C\u0430.\n- **`bodyType: "json"`** \u2014 \u0442\u0435\u043B\u043E \u0443\u0445\u043E\u0434\u0438\u0442 \u043A\u0430\u043A `JSON.stringify(params)` \u0441 `Content-Type: application/json`.\n \u0422\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 **`tasks.v2.*`** (\u043D\u0430\u043F\u0440. `tasks.v2.Task.get` \u0436\u0434\u0451\u0442 `{"task":{"id":N}}`) \u0438 `ui.entityselector.*`.\n `params` \u043F\u0440\u0438 \u044D\u0442\u043E\u043C \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0435\u0442 \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u0443\u044E \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0443 \u043A\u0430\u043A \u0435\u0441\u0442\u044C (\u043D\u0435 \u0440\u0430\u0437\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0432 bracket-\u043A\u043B\u044E\u0447\u0438).\n\n> \u0418\u0441\u0442\u043E\u0440\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u0437\u0430\u043C\u0435\u0442\u043A\u0430: \u0440\u0430\u043D\u044C\u0448\u0435 \u043C\u043E\u0441\u0442 \u0443\u043C\u0435\u043B \u0442\u043E\u043B\u044C\u043A\u043E \u0444\u043E\u0440\u043C\u0443, \u0438 `tasks.v2.*` \u0431\u044B\u043B\u0438 \u043D\u0435\u043F\u0440\u0438\u0433\u043E\u0434\u043D\u044B. \u0422\u0435\u043F\u0435\u0440\u044C\n> \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0430\u043D\u044B \u2014 \u0432 \u0437\u0430\u043F\u0438\u0441\u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0441\u0442\u0430\u0432\u044C `"bodyType": "json"`, \u0438 \u043C\u043E\u0441\u0442 \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442 \u0438\u0445 \u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u043E.\n\n**CSRF / sessid:** \u043C\u043E\u0441\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0448\u043B\u0451\u0442 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A **`X-Bitrix-Csrf-Token: <sessid>`** (\u0441\u0432\u0435\u0436\u0438\u0439\n`BX.bitrix_sessid()`). Form-\u0442\u0435\u043B\u0430 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043D\u0435\u0441\u0443\u0442 `sessid` \u043F\u043E\u043B\u0435\u043C \u0432 \u0442\u0435\u043B\u0435 (legacy REST \u044D\u0442\u043E \u0442\u0440\u0435\u0431\u0443\u0435\u0442);\nJSON-\u0442\u0435\u043B\u0430 \u043D\u0435\u0441\u0443\u0442 sessid **\u0442\u043E\u043B\u044C\u043A\u043E** \u0432 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0435. \u041E\u0442\u0432\u0435\u0442 `invalid_csrf`/`invalid_authentication` = \u0441\u0435\u0441\u0441\u0438\u044F\n\u043F\u0440\u043E\u0442\u0443\u0445\u043B\u0430 (\u043F\u0435\u0440\u0435\u043B\u043E\u0433\u0438\u043D\u044C\u0441\u044F \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435).\n\n| \u041C\u0435\u0442\u043E\u0434 (action / endpoint) | bodyType | \u0413\u0434\u0435 `select`/`filter`/`order` | \u041F\u0430\u0433\u0438\u043D\u0430\u0446\u0438\u044F |\n|---|---|---|---|\n| `tasks.task.list` | form | **\u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C**: `select[]`, `filter{}`, `order{}` | `start` (\u0441\u0434\u0432\u0438\u0433, \u0448\u0430\u0433 50) |\n| `tasks.task.get` | form | \u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C: `taskId`, `select[]` | \u2014 |\n| `tasks.v2.Task.get` | **json** | `{"task": {"id": N}}` | \u2014 |\n| `tasks.v2.Scrum.getTaskInfo` | **json** | `{"taskId": N}` | \u2014 |\n| `tasks.v2.File.listObjects` | **json** | `{"ids": [N,\u2026]}` | \u2014 |\n| `tasks.v2.Task.View.User.count` | **json** | `{"task": {"id": N}}` | \u2014 |\n| `tasks.v2.Task.Relation.Child.list` | **json** | `{"taskId": N, "withIds":true, "navigation":{"size":N}}` | `navigation` |\n| `tasks.v2.Task.Relation.Related.list` | **json** | `{"taskId": N, \u2026}` (\u043A\u0430\u043A Child) | `navigation` |\n| `socialnetwork.api.workgroup.list` | form | **\u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C**: `select[]`, `order{}`, `filter{}` | `start` (\u0448\u0430\u0433 50; `start=(N-1)*50`, `-1` \u2014 \u043E\u0442\u0432\u0435\u0442 \u0431\u0435\u0437 `total`) \u{1F4D6} |\n| `socialnetwork.api.workgroup.get` | form | **\u043E\u0431\u0451\u0440\u043D\u0443\u0442\u043E**: `params[groupId]`, `params[select][]` | \u2014 |\n| `/rest/im.recent.list.json` | form (rest) | \u043F\u043B\u043E\u0441\u043A\u043E: `LIMIT`, `SKIP_OPENLINES`, `UNREAD_ONLY`, \u2026 | `LIMIT` |\n| `/rest/im.user.get.json` | form (rest) | \u043F\u043B\u043E\u0441\u043A\u043E: `ID` | \u2014 |\n| `/rest/im.chat.get.json` | form (rest) | \u043F\u043B\u043E\u0441\u043A\u043E: `ENTITY_TYPE`, `ENTITY_ID` | \u2014 |\n| `im.v2.Recent.load` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `limit`, `filter[recentSection]`, `filter[unread]`, `filter[parentId]` | `im.v2.Recent.tail` |\n| `im.v2.Recent.tail` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `limit`, `filter[lastMessageDate]` (\u043A\u0443\u0440\u0441\u043E\u0440), `filter[recentSection]` | `filter[lastMessageDate]` |\n| `im.v2.Chat.load` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `dialogId`\\|`chatId`, `messageLimit` | \u2014 |\n| `im.v2.Chat.getDialogId` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `externalId` | \u2014 |\n| `im.v2.Chat.Message.list` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `limit` | \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u044F\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u2014 \u043D\u0430\u0437\u0430\u0434 **\u043D\u0435 \u043B\u0438\u0441\u0442\u0430\u0435\u0442**, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 `.tail` |\n| `im.v2.Chat.Message.tail` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `limit`, `filter[lastId]`, `order[id]` | **\u0441\u043C. \u0440\u0430\u0437\u0434\u0435\u043B 6** |\n| `im.v2.Chat.Message.read` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `ids[]`, `actionUuid` | \u2014 (\u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439) |\n| `im.v2.Chat.readAll` | form | \u0431\u0435\u0437 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 | \u2014 (\u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439) |\n| `ui.entityselector.load` | **json** | `{"dialog": {entities,preselectedItems,\u2026}}` | \u2014 |\n| `ui.entityselector.doSearch` | **json** | `{"dialog": {\u2026}, "searchQuery": {"query": "...", "queryWords": ["..."]}}` | \u2014 |\n\n---\n\n## 4. \u041A\u0430\u0442\u0430\u043B\u043E\u0433: \u0438\u043C\u044F \u2192 action \u2192 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B\n\n| \u0418\u043C\u044F (`actions.json`) | action / endpoint | bodyType | \u041A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 params |\n|---|---|---|---|\n| `tasks.list` | `tasks.task.list` | form | `filter{RESPONSIBLE_ID,REAL_STATUS,GROUP_ID,\u2026}`, `select[]`, `order{}`, `start` |\n| `task.get` | `tasks.task.get` | form | `taskId`, `select[]` |\n| `task.v2.get` | `tasks.v2.Task.get` | json | `task.id` (id \u0437\u0430\u0434\u0430\u0447\u0438) |\n| `task.scrum.info` | `tasks.v2.Scrum.getTaskInfo` | json | `taskId` |\n| `task.files` | `tasks.v2.File.listObjects` | json | `ids` (\u043C\u0430\u0441\u0441\u0438\u0432 id) |\n| `task.views.count` | `tasks.v2.Task.View.User.count` | json | `task.id` (id \u0437\u0430\u0434\u0430\u0447\u0438) |\n| `task.subtasks` | `tasks.v2.Task.Relation.Child.list` | json | `taskId`, `navigation{size}` |\n| `task.related` | `tasks.v2.Task.Relation.Related.list` | json | `taskId`, `navigation{size}` |\n| `projects.list` | `socialnetwork.api.workgroup.list` | form | `select[]`, `order{}`, `filter{}` |\n| `projects.get` | `socialnetwork.api.workgroup.get` | form | `params[groupId]`, `params[select][]` |\n| `chats.recent` | `/rest/im.recent.list.json` | form | `LIMIT`, `UNREAD_ONLY`, `SKIP_OPENLINES` |\n| `recent.load` | `im.v2.Recent.load` | form | `filter[recentSection]` (`tasksTask`/`collab`/\u2026), `limit`, `filter[unread]` |\n| `recent.tail` | `im.v2.Recent.tail` | form | `filter[lastMessageDate]`, `filter[recentSection]`, `limit` |\n| `chat.load` | `im.v2.Chat.load` | form | `dialogId`\\|`chatId`, `messageLimit` |\n| `chat.dialogId` | `im.v2.Chat.getDialogId` | form | `externalId` (\u043D\u0430\u043F\u0440. `"sg"+groupId`) |\n| `chat.messages` | `im.v2.Chat.Message.list` | form | `chatId`, `limit` (\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435; \u0432\u0433\u043B\u0443\u0431\u044C \u2014 `chat.messages.tail`) |\n| `chat.messages.tail` | `im.v2.Chat.Message.tail` | form | `chatId`, `filter[lastId]`, `order[id]`, `limit` |\n| `chat.message.read` | `im.v2.Chat.Message.read` | form | `chatId`, `ids[0]`, `actionUuid` |\n| `chat.read.all` | `im.v2.Chat.readAll` | form | \u2014 (\u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439) |\n| `im.user.get` | `/rest/im.user.get.json` | form | `ID` |\n| `im.chat.get` | `/rest/im.chat.get.json` | form | `ENTITY_TYPE`, `ENTITY_ID` (\u043D\u0430\u043F\u0440. `TASKS_TASK`+taskId) |\n| `entityselector.load` | `ui.entityselector.load` | json | `dialog` (\u043E\u0431\u044A\u0435\u043A\u0442) |\n| `entityselector.search` | `ui.entityselector.doSearch` | json | `dialog`, `searchQuery{query,queryWords}` |\n\n---\n\n## 5. \u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A \u043F\u043E\u043B\u0435\u0439\n\n**\u0417\u0430\u0434\u0430\u0447\u0430** (`tasks.task.*`) \u2014 \u043F\u043E\u043B\u044F \u0434\u043B\u044F `select`/`filter` \u0432 UPPER_CASE: `ID`, `TITLE`, `DESCRIPTION`,\n`STATUS`, `REAL_STATUS`, `RESPONSIBLE_ID`, `CREATED_BY`, `CREATED_DATE`, `CHANGED_DATE`, `DEADLINE`,\n`CLOSED_DATE`, `PRIORITY`, `GROUP_ID`, `TAGS`, `TIME_ESTIMATE`, **`CHAT_ID`** (id im-\u0447\u0430\u0442\u0430 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u044F\n\u0437\u0430\u0434\u0430\u0447\u0438 \u2014 \u043F\u0440\u044F\u043C\u043E\u0439 \u0440\u0435\u0437\u043E\u043B\u0432\u0435\u0440 `taskId \u2192 chatId`, \u0441\u043C. \xA76.3), `UF_*`. \u041E\u0442\u0432\u0435\u0442 ajax \u0442\u0430\u043A\u0436\u0435 \u043F\u043E\u0434\u043A\u043B\u0430\u0434\u044B\u0432\u0430\u0435\u0442 \u043E\u0431\u044A\u0435\u043A\u0442\u044B\n`group`, `responsible`, `creator`, `action`.\n\n\u{1F4D6} \u043E\u0444\u0438\u0446. (`tasks.task.get` / `tasks.task.list`) \u2014 \u043F\u043E\u043B\u043D\u044B\u0439 \u043D\u0430\u0431\u043E\u0440 \u043F\u043E\u043B\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438, \u0441\u0440\u0435\u0434\u0438 \u043F\u0440\u043E\u0447\u0435\u0433\u043E: `parentId`,\n`stageId`, `sprintId`, `backlogId`, `commentsCount`, `serviceCommentsCount`, `timeEstimate`,\n`timeSpentInLogs`, `favorite`, `flowId`, `mark`, `accomplices[]`, `auditors[]`, `checklist{}`,\n`subStatus`. \u0412 \u043E\u0444\u0438\u0446\u0438\u0430\u043B\u044C\u043D\u043E\u043C REST-\u043E\u0442\u0432\u0435\u0442\u0435 \u043F\u043E\u043B\u044F \u043F\u0440\u0438\u0445\u043E\u0434\u044F\u0442 **camelCase** (`groupId`, `responsibleId`), \u0442\u043E\u0433\u0434\u0430\n\u043A\u0430\u043A \u0432 `select`/`filter` \u043E\u043D\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 **UPPER_CASE**; \u043D\u0430\u0448 ajax-\u0432\u0430\u0440\u0438\u0430\u043D\u0442 \u043C\u043E\u0436\u0435\u0442 \u043E\u0442\u0434\u0430\u0432\u0430\u0442\u044C \u0438\u043D\u0430\u0447\u0435 \u2014 \u0441\u0432\u0435\u0440\u044F\u0439\n\u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C. \u0414\u043E\u043F. \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F \u0432\u043A\u043B\u044E\u0447\u0430\u044E\u0442\u0441\u044F \u0444\u043B\u0430\u0433\u043E\u043C `params{WITH_TIMER_INFO, WITH_RESULT_INFO, WITH_PARSED_DESCRIPTION}`.\n\n\u0421\u0442\u0430\u0442\u0443\u0441\u044B (`REAL_STATUS` \u2014 \xAB\u043D\u0430\u0441\u0442\u043E\u044F\u0449\u0435\u0435\xBB \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435): `1` \u041D\u043E\u0432\u0430\u044F \xB7 `2` \u0416\u0434\u0451\u0442 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \xB7\n`3` \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \xB7 `4` \u0416\u0434\u0451\u0442 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044F \xB7 `5` \u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430 \xB7 `6` \u041E\u0442\u043B\u043E\u0436\u0435\u043D\u0430 \xB7 `7` \u041E\u0442\u043A\u043B\u043E\u043D\u0435\u043D\u0430. \u041F\u043E\u043B\u0435 `STATUS`\n\u043F\u043E\u0432\u0435\u0440\u0445 \u044D\u0442\u043E\u0433\u043E \u043D\u0435\u0441\u0451\u0442 **\u043C\u0435\u0442\u0430-\u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F** \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F (\u043F\u043E\u0447\u0442\u0438 \u043F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043D\u0430 / \u043D\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u043D\u0430 / \u043F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043D\u0430),\n\u043F\u043E\u044D\u0442\u043E\u043C\u0443 \xAB\u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043B\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0435\u0439\u0447\u0430\u0441\xBB \u0444\u0438\u043B\u044C\u0442\u0440\u0443\u0439 \u043F\u043E **`REAL_STATUS`** (\u043D\u0430\u043F\u0440. `{"REAL_STATUS":3}`), \u0430 \u043D\u0435\n\u043F\u043E `STATUS` (\u{1F4D6} `tasks.task.list`).\n\n**\u0424\u0438\u043B\u044C\u0442\u0440 `tasks.task.list`.** \u041F\u0435\u0440\u0435\u0434 \u0438\u043C\u0435\u043D\u0435\u043C \u043F\u043E\u043B\u044F \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044F \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440: `!` (\u043D\u0435 \u0440\u0430\u0432\u043D\u043E / \u0438\u0441\u043A\u043B\u044E\u0447\u0438\u0442\u044C),\n`<`, `<=`, `>`, `>=`, `%` (LIKE-\u043F\u043E\u0434\u0441\u0442\u0440\u043E\u043A\u0430). \u041D\u0430\u043F\u0440. `{"!REAL_STATUS":5}` \u2014 \u0432\u0441\u0435 **\u043D\u0435\u0437\u0430\u043A\u0440\u044B\u0442\u044B\u0435**,\n`{">=DEADLINE":"2026-07-01"}` \u2014 \u0434\u0435\u0434\u043B\u0430\u0439\u043D \u043D\u0435 \u0440\u0430\u043D\u044C\u0448\u0435 \u0434\u0430\u0442\u044B, `{"%TITLE":"\u043A\u0430\u0440\u0442\u0430"}` \u2014 \u043F\u043E \u043F\u043E\u0434\u0441\u0442\u0440\u043E\u043A\u0435 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044F.\n\u0424\u0438\u043B\u044C\u0442\u0440\u0443\u0435\u043C\u044B\u0435 \u043F\u043E\u043B\u044F: `ID`, `PARENT_ID`, `GROUP_ID`, `CREATED_BY`, `RESPONSIBLE_ID`, `ACCOMPLICE`,\n`AUDITOR`, `REAL_STATUS`, `STATUS`, `PRIORITY`, `TAG`, `STAGE_ID`, `SPRINT_ID`, `BACKLOG_ID`,\n`DEADLINE`, `*_DATE`, `UF_CRM_TASK`.\n\n> **\xAB\u041C\u043E\u0438 \u0437\u0430\u0434\u0430\u0447\u0438\xBB \u2260 \u0442\u043E\u043B\u044C\u043A\u043E `RESPONSIBLE_ID`.** \u0420\u043E\u043B\u0438 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0430 \u0440\u0430\u0437\u0434\u0435\u043B\u044C\u043D\u044B: \u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439\n> (`RESPONSIBLE_ID`), \u0441\u043E\u0438\u0441\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C (`ACCOMPLICE`), \u043D\u0430\u0431\u043B\u044E\u0434\u0430\u0442\u0435\u043B\u044C (`AUDITOR`), \u043F\u043E\u0441\u0442\u0430\u043D\u043E\u0432\u0449\u0438\u043A\n> (`CREATED_BY`). \u0415\u0434\u0438\u043D\u043E\u0433\u043E \xAB\u043B\u044E\u0431\u0430\u044F \u0440\u043E\u043B\u044C\xBB \u043F\u043E\u043B\u044F \u0432 `list` \u043D\u0435\u0442 \u2014 \u0447\u0442\u043E\u0431\u044B \u0441\u043E\u0431\u0440\u0430\u0442\u044C **\u0432\u0441\u0435** \u0441\u0432\u043E\u0438 \u0437\u0430\u0434\u0430\u0447\u0438,\n> \u043E\u0431\u044A\u0435\u0434\u0438\u043D\u0438 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0432\u044B\u0437\u043E\u0432\u043E\u0432 (\u043C\u0438\u043D\u0438\u043C\u0443\u043C `RESPONSIBLE_ID` + `ACCOMPLICE`). \u0422\u043E\u043D\u043A\u043E\u0441\u0442\u044C:\n> \u0432 **`filter`** \u0440\u043E\u043B\u0438 \u0432 **\u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u043C** \u0447\u0438\u0441\u043B\u0435 (`ACCOMPLICE`/`AUDITOR`), \u0430 \u0432 **`select`** \u2014 \u0432\u043E\n> **\u043C\u043D\u043E\u0436\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u043C** (`ACCOMPLICES`/`AUDITORS`). \u041D\u0435 \u043F\u0443\u0442\u0430\u0439.\n\n> **Scrum-\u0437\u0430\u0434\u0430\u0447\u0438 (\u0441\u043F\u0440\u0438\u043D\u0442\u044B).** \u041F\u043E\u043B\u0435 `SPRINT_ID` \u043D\u0430 \u0437\u0430\u0434\u0430\u0447\u0435 \u0438 \u0436\u0451\u0441\u0442\u043A\u0438\u0439 \u0444\u0438\u043B\u044C\u0442\u0440 `filter[SPRINT_ID]`\n> \u043C\u043E\u0433\u0443\u0442 \u0440\u0430\u0441\u0445\u043E\u0434\u0438\u0442\u044C\u0441\u044F: \u0437\u0430\u0434\u0430\u0447\u0430 \u0447\u0438\u0441\u043B\u0438\u0442\u0441\u044F \u0437\u0430 \u0441\u043F\u0440\u0438\u043D\u0442\u043E\u043C \u043F\u043E \u0441\u0432\u043E\u0435\u043C\u0443 \u043F\u043E\u043B\u044E, \u043D\u043E \u043D\u0435 \u043F\u043E\u043F\u0430\u0434\u0430\u0435\u0442 \u0432 \u0432\u044B\u0431\u043E\u0440\u043A\u0443 \u043F\u043E \u0444\u0438\u043B\u044C\u0442\u0440\u0443\n> (\u0432\u0435\u0440\u043E\u044F\u0442\u043D\u043E, \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u0430 \u0432 \u0431\u044D\u043A\u043B\u043E\u0433 \u0438\u043B\u0438 \u0432 \u0438\u043D\u043E\u0439 stage). \u0415\u0441\u043B\u0438 \u043F\u043E \u0444\u0438\u043B\u044C\u0442\u0440\u0443 \xAB\u043C\u0430\u043B\u043E\u0432\u0430\u0442\u043E\xBB \u2014 \u043F\u0435\u0440\u0435\u043F\u0440\u043E\u0432\u0435\u0440\u044C \u0431\u0435\u0437 \u043D\u0435\u0433\u043E\n> \u0438 \u043E\u0442\u0444\u0438\u043B\u044C\u0442\u0440\u0443\u0439 \u043F\u043E `SPRINT_ID`/`STAGE_ID` \u043D\u0430 \u0441\u0442\u043E\u0440\u043E\u043D\u0435 \u0430\u0433\u0435\u043D\u0442\u0430. \u0422\u043E\u0447\u043D\u043E\u0433\u043E API \u043A\u043E\u043B\u043E\u043D\u043E\u043A scrum-\u0434\u043E\u0441\u043A\u0438\n> (`STAGE_ID` \u2192 \u0438\u043C\u044F \u043A\u043E\u043B\u043E\u043D\u043A\u0438) \u0432 \u0442\u0435\u043A\u0443\u0449\u0435\u043C \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0435 \u043D\u0435\u0442 \u2014 \u044D\u0442\u043E \u043A\u0430\u043D\u0434\u0438\u0434\u0430\u0442 \u043D\u0430 \u0440\u0435\u0432\u0435\u0440\u0441.\n\n**\u0417\u0430\u0434\u0430\u0447\u0430 v2** (`tasks.v2.*`): id \u0437\u0430\u0434\u0430\u0447\u0438 \u043F\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044F \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E \u2014 **`{"task": {"id": N}}`** (\u0443 `Task.get` \u0438\n`Task.View.User.count`), \u0430 \u0443 `Scrum.getTaskInfo` \u0438 `Relation.*` \u2014 \u043F\u043B\u043E\u0441\u043A\u043E `{"taskId": N}`. \u042D\u0442\u043E \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u0430\u044F\n\u043F\u043E\u0434\u0441\u0438\u0441\u0442\u0435\u043C\u0430 scrum-\u0431\u043E\u0440\u0434\u0430; \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0443 \u043E\u0442\u0432\u0435\u0442\u0430 \u0441\u0432\u0435\u0440\u044C \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C \u2014 \u0432 \u0437\u0430\u0445\u0432\u0430\u0442\u0435 \u0432\u0438\u0434\u043D\u044B \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0437\u0430\u043F\u0440\u043E\u0441\u0430.\n\n**\u0413\u0440\u0443\u043F\u043F\u0430/\u043F\u0440\u043E\u0435\u043A\u0442 \u2014 \u0441\u043F\u0438\u0441\u043E\u043A** (`workgroup.list`, camelCase \u0432 \u043E\u0442\u0432\u0435\u0442\u0435): `ID`, `NAME`, `DESCRIPTION`,\n`NUMBER_OF_MEMBERS`, `OWNER_ID`, `DATE_CREATE`, `PROJECT` (Y/N), `TYPE`.\n\u{1F4D6} \u043E\u0444\u0438\u0446. (`socialnetwork.api.workgroup.list`) \u2014 \u0444\u0438\u043B\u044C\u0442\u0440\u0443\u0435\u043C\u044B\u0435 \u043F\u043E\u043B\u044F: `ID`, `NAME`, `OWNER_ID`, `ACTIVE`,\n`VISIBLE`, `OPENED`, `CLOSED`, `PROJECT` (Y=\u043F\u0440\u043E\u0435\u043A\u0442/N=\u0433\u0440\u0443\u043F\u043F\u0430), `SUBJECT_ID`, `SITE_ID`, `DATE_CREATE`,\n`DATE_UPDATE`, `DATE_ACTIVITY`; \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u044B \u0444\u0438\u043B\u044C\u0442\u0440\u0430 `>= > <= < % =% %= !% != !`; \u0431\u0435\u0437 `select` \u0432\u0435\u0440\u043D\u0451\u0442\u0441\u044F\n\u0442\u043E\u043B\u044C\u043A\u043E `ID`. \u0421\u0442\u0430\u0440\u044B\u0439 \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0439 \u0430\u043D\u0430\u043B\u043E\u0433 \u2014 `sonet_group.get` (\u0442\u0435 \u0436\u0435 \u043F\u043E\u043B\u044F/\u043F\u0430\u0433\u0438\u043D\u0430\u0446\u0438\u044F, \u043A\u043B\u044E\u0447\u0438 `FILTER`/`ORDER`\n\u043A\u0430\u043F\u0441\u043E\u043C).\n**\u0413\u0440\u0443\u043F\u043F\u0430 \u2014 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430** (`workgroup.get`): \u043F\u043B\u044E\u0441 `OWNER_DATA`, `SUBJECT_DATA`, `MEMBERS[]`,\n`MODERATOR_MEMBERS[]`, `CHAT_ID`, `DIALOG_ID`, `IMAGE_ID`, UF-\u043F\u043E\u043B\u044F.\n\n**\u041D\u0435\u0434\u0430\u0432\u043D\u0438\u0439 \u0447\u0430\u0442** (`im.recent.list`): `id` (\u044D\u0442\u043E dialogId: \u0447\u0438\u0441\u043B\u043E = \u044E\u0437\u0435\u0440, `"chat"+N` = \u0447\u0430\u0442), `chat_id`,\n`type` (`user`/`chat`), `title`, `message{id,text,file,author_id,date,status,uuid}`, `counter` (\u0447\u0438\u0441\u043B\u043E\n\u043D\u0435\u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u0445), `unread` (bool), `last_id`, `pinned`, `date_update`, `date_last_activity`, `user{\u2026}`,\n`chat{\u2026 entity_type, entity_id, owner, \u2026}`. \u0415\u0441\u0442\u044C \u043B\u0438 \u0435\u0449\u0451 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B \u2014 \u0444\u043B\u0430\u0433\u0438 `hasMore`/`hasMorePages`\n(\u{1F4D6} `im.recent.list`).\n**\u041D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u043F\u043E \u0441\u0435\u043A\u0446\u0438\u0438** (`im.v2.Recent.load`): \u0444\u0438\u043B\u044C\u0442\u0440 `filter[recentSection]` \u2014 `default` (\u043E\u0431\u044B\u0447\u043D\u044B\u0435\n\u0434\u0438\u0430\u043B\u043E\u0433\u0438), **`tasksTask` (\u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447)**, `collab`/`collabDefault` (\u043A\u043E\u043B\u043B\u0430\u0431\u044B). \u041B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u0432\u0433\u043B\u0443\u0431\u044C \u2014\n`im.v2.Recent.tail` \u0441 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u043C `filter[lastMessageDate]` (ISO-\u0434\u0430\u0442\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B).\n**\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u044E\u0437\u0435\u0440\u0430** (`im.user.get`): `id`, `name`, `first_name`, `last_name`, `avatar`, `work_position`,\n`gender`, `status`, `online` \u2014 \u0440\u0435\u0437\u043E\u043B\u0432 \u0430\u0432\u0442\u043E\u0440\u0430 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F (`authorId`) \u0432 \u0438\u043C\u044F.\n**\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435** (`im.v2.Chat.Message.*`): `id`, `chatId`, `authorId`, `date`, `text`, `params`, `viewed`.\n\u041E\u0442\u0432\u0435\u0442 \u0442\u0430\u043A\u0436\u0435 \u043D\u0435\u0441\u0451\u0442 `users[]` (\u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0438), `additionalMessages[]`, `hasPrevPage`/`hasNextPage`.\n`chatId` \u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 `im.recent.list` (`chat_id`) \u0438\u043B\u0438 \u0438\u0437 `workgroup.get` (`CHAT_ID`/`DIALOG_ID`).\n\n**\u0410\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044F \u0447\u0430\u0442\u0430 (`chat.load`): `dialogId` vs `chatId`.** `chat.load` \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442 \u043B\u044E\u0431\u043E\u0439 \u0438\u0437 \u0434\u0432\u0443\u0445:\n- `dialogId` = **ID \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F** (\u0447\u0438\u0441\u043B\u043E, \u043D\u0430\u043F\u0440. `11`) \u2192 **\u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 1-\u043D\u0430-1** \u0441 \u044D\u0442\u0438\u043C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C.\n- `dialogId` = **`"chat"+CHAT_ID`** (\u043D\u0430\u043F\u0440. `"chat7111"`) \u2192 **\u0433\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439 \u0447\u0430\u0442** (\u043F\u0440\u043E\u0435\u043A\u0442\u0430/\u0437\u0430\u0434\u0430\u0447\u0438/\u043A\u0430\u043D\u0430\u043B\u0430).\n- `chatId` = \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 `CHAT_ID` \u2014 \u0442\u043E \u0436\u0435, \u0447\u0442\u043E \u0433\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439 `dialogId`, \u043D\u043E \u0431\u0435\u0437 \u043F\u0440\u0435\u0444\u0438\u043A\u0441\u0430.\n\n\u{1F4D6} \u043E\u0444\u0438\u0446. \u0444\u043E\u0440\u043C\u0430\u0442 `DIALOG_ID` (`im.dialog.get`): `XXX` \u2014 \u043B\u0438\u0447\u043D\u044B\u0439 (userId), `chatXXX` \u2014 \u0447\u0430\u0442, **`sgXXX`** \u2014\n\u0447\u0430\u0442 \u0441\u043E\u0446\u0433\u0440\u0443\u043F\u043F\u044B/\u043F\u0440\u043E\u0435\u043A\u0442\u0430 \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E (\u043D\u0430\u043F\u0440. `sg15`). \u0412 \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u043E\u043C REST \u044D\u0442\u043E \u0435\u0434\u0438\u043D\u044B\u0439 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440; \u043D\u0430\u0448 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0439\n`im.v2.Chat.load` \u043D\u0430\u0434\u0451\u0436\u043D\u043E \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442 `dialogId`/`chatId`, \u0430 \u0444\u043E\u0440\u043C\u0443 `sgXXX` \u0434\u043B\u044F \u043D\u0435\u0433\u043E \u0441\u0432\u0435\u0440\u044C \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C \u2014\n\u0433\u0430\u0440\u0430\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u043F\u0443\u0442\u044C \u043A \u0447\u0430\u0442\u0443 \u0433\u0440\u0443\u043F\u043F\u044B \u044D\u0442\u043E `bitrix_chat_get_dialog_id { externalId:"sg<groupId>" }`.\n\n\u041E\u0442\u0432\u0435\u0442 `chat.load` \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 `chatId` \u2014 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 \u0435\u0433\u043E \u0434\u0430\u043B\u044C\u0448\u0435 \u0434\u043B\u044F `chat.messages` /\n`chat.messages.tail` (\u043B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u0432\u0433\u043B\u0443\u0431\u044C) \u0438 `chat.message.read` (\u044D\u0442\u0438 \u0442\u0440\u0438 \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 \u043F\u043E `chatId`, \u043D\u0435 \u043F\u043E `dialogId`).\n\n---\n\n## 6. \u041F\u0440\u0438\u043C\u0435\u0440\u044B \u0432\u044B\u0437\u043E\u0432\u043E\u0432\n\n```jsonc\n// \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0433\u043E 55, \u043F\u043E \u0434\u0435\u0434\u043B\u0430\u0439\u043D\u0443, \u0432\u0442\u043E\u0440\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430\nbitrix_tasks_list { "params": { "filter": {"RESPONSIBLE_ID":55,"REAL_STATUS":2},\n "order": {"DEADLINE":"asc"}, "start": 50 } }\n\n// \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u043D\u044B\u043C \u043D\u0430\u0431\u043E\u0440\u043E\u043C \u043F\u043E\u043B\u0435\u0439\nbitrix_task_get { "taskId": 4229, "params": { "select": ["ID","TITLE","DESCRIPTION","TAGS","TIME_ESTIMATE"] } }\n\n// \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 v2-\u043F\u043E\u0434\u0441\u0438\u0441\u0442\u0435\u043C\u0443 (JSON-\u0442\u0435\u043B\u043E; id \u0432\u043B\u043E\u0436\u0435\u043D \u0432 task)\nbitrix_task_get_v2 { "taskId": 4229 } // \u2192 { "task": { "id": 4229 } }\nbitrix_call { "name": "task.v2.get", "params": { "task": { "id": 4229 } } }\n\n// \u0444\u0430\u0439\u043B\u044B \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043A \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u043E\u0432 (v2, JSON-\u0442\u0435\u043B\u043E); \u043F\u043E\u0434\u0437\u0430\u0434\u0430\u0447\u0438/\u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435\nbitrix_call { "name": "task.files", "params": { "ids": [4229] } }\nbitrix_call { "name": "task.views.count", "params": { "task": { "id": 4229 } } }\nbitrix_task_subtasks { "taskId": 4229 }\nbitrix_task_related { "taskId": 4229 }\n\n// \u043F\u0440\u043E\u0435\u043A\u0442\u044B \u043F\u043E \u0434\u0430\u0442\u0435 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F; \u043F\u043E\u043B\u043D\u0430\u044F \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0433\u0440\u0443\u043F\u043F\u044B\nbitrix_projects_list { "params": { "order": {"DATE_CREATE":"desc"} } }\nbitrix_project_get { "groupId": 15 }\n\n// \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0447\u0430\u0442 (\u043F\u0435\u0440\u0432\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F)\nbitrix_chat_load { "chatId": 485, "messageLimit": 50 }\n\n// \u041B\u0418\u0421\u0422\u0410\u041D\u0418\u0415 \u0418\u0421\u0422\u041E\u0420\u0418\u0418 \u0412\u0413\u041B\u0423\u0411\u042C (\u0441\u0442\u0430\u0440\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F): beforeId = \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 id \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\n// \u0438\u0437 \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B. \u041F\u043E\u0432\u0442\u043E\u0440\u044F\u0439, \u0443\u043C\u0435\u043D\u044C\u0448\u0430\u044F beforeId, \u0434\u043E \u043D\u0430\u0447\u0430\u043B\u0430 \u0438\u0441\u0442\u043E\u0440\u0438\u0438 (order DESC \u2014 \u0434\u0435\u0444\u043E\u043B\u0442).\nbitrix_chat_history { "chatId": 485, "beforeId": 1861279 }\n\n// \u043F\u043E\u043C\u0435\u0442\u0438\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u043C\u0438 (\u041C\u0423\u0422\u0418\u0420\u0423\u042E\u0429\u0418\u0419). actionUuid \u0433\u0435\u043D\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.\nbitrix_chat_mark_read { "chatId": 40271, "ids": [1884131] }\n```\n\n### 6.1. \u041C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 (IM): \u043C\u043E\u0434\u0435\u043B\u044C \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 \u0438 \u043A\u0430\u043A \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C `chatId`\n\n**IM** (`im.v2`) \u2014 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0439 \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 Bitrix24. \u0412\u0441\u0451 \u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u2014 \u044D\u0442\u043E **\u0447\u0430\u0442\u044B**: \u043B\u0438\u0447\u043D\u044B\u0435\n1-\u043D\u0430-1, \u0433\u0440\u0443\u043F\u043F\u043E\u0432\u044B\u0435 (\u043F\u0440\u043E\u0435\u043A\u0442\u043E\u0432, \u043A\u0430\u043D\u0430\u043B\u043E\u0432) \u0438 **\u0447\u0430\u0442\u044B-\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u044F \u0437\u0430\u0434\u0430\u0447**. \u0423 \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u0447\u0430\u0442\u0430 \u0435\u0441\u0442\u044C \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439\n**`chatId`** \u2014 \u044D\u0442\u043E \u043A\u043B\u044E\u0447 \u043A\u043E \u0432\u0441\u0435\u043C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F\u043C \u0441 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\u043C\u0438 (`bitrix_chat_messages`,\n`bitrix_chat_history`, `bitrix_chat_mark_read`). \u041F\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043C \u0447\u0438\u0442\u0430\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F, \u043D\u0443\u0436\u043D\u043E **\u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C\n`chatId`** \u2014 \u043F\u043E\u0447\u0442\u0438 \u043B\u044E\u0431\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430 \u0430\u0433\u0435\u043D\u0442\u0430 \u0437\u0434\u0435\u0441\u044C \u0438\u043C\u0435\u043D\u043D\u043E \u0432 \u044D\u0442\u043E\u043C \u0448\u0430\u0433\u0435.\n\n**\u0422\u0440\u0438 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440\u0430 \u043E\u0434\u043D\u043E\u0433\u043E \u0447\u0430\u0442\u0430** (\u043D\u0435 \u043F\u0443\u0442\u0430\u0439 \u2014 \u0433\u043E\u0434\u044F\u0442\u0441\u044F \u0434\u043B\u044F \u0440\u0430\u0437\u043D\u044B\u0445 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0439):\n\n| \u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 | \u0427\u0442\u043E \u044D\u0442\u043E | \u041F\u0440\u0438\u043C\u0435\u0440 | \u041A\u0443\u0434\u0430 \u043F\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044C |\n|---|---|---|---|\n| `chatId` | \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 id \u0447\u0430\u0442\u0430 | `485` | \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F / \u0438\u0441\u0442\u043E\u0440\u0438\u044F / \u043E\u0442\u043C\u0435\u0442\u043A\u0430 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u043C |\n| `dialogId` | \u0430\u0434\u0440\u0435\u0441 \u0434\u043B\u044F \u041E\u0422\u041A\u0420\u042B\u0422\u0418\u042F: `userId` (\u043B\u0438\u0447\u043D\u044B\u0439 1-\u043D\u0430-1) **\u0438\u043B\u0438** `"chat"+chatId` (\u0433\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439) | `11`, `"chat485"` | `bitrix_chat_load` |\n| `externalId` | \u0432\u043D\u0435\u0448\u043D\u0438\u0439 \u043A\u043B\u044E\u0447 \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u2192 \u0440\u0435\u0437\u043E\u043B\u0432\u0438\u0442\u0441\u044F \u0432 `dialogId` | `"sg15"` (\u0441\u043E\u0446\u0433\u0440\u0443\u043F\u043F\u0430 15) | `bitrix_chat_get_dialog_id` |\n\n\u041A\u043B\u044E\u0447\u0435\u0432\u043E\u0435: **\u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 \u0441 \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u043E\u043C = \u0435\u0433\u043E `userId` \u0432 \u0440\u043E\u043B\u0438 `dialogId`** (\u043E\u0442\u0434\u0435\u043B\u044C\u043D\u043E\u0433\u043E \xABid \u0447\u0430\u0442\u0430\xBB \u0443\n1-\u043D\u0430-1 \u0437\u043D\u0430\u0442\u044C \u043D\u0435 \u043D\u0443\u0436\u043D\u043E). `bitrix_chat_load` \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442 `dialogId` **\u0438\u043B\u0438** `chatId` \u0438 \u0432\u0441\u0435\u0433\u0434\u0430\n**\u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 `chatId`** \u2014 \u0434\u0430\u043B\u044C\u0448\u0435 \u043E\u043F\u0435\u0440\u0438\u0440\u0443\u0435\u0448\u044C \u0438\u043C.\n\n**\u041A\u0430\u043A \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C `chatId` \u2014 \u043F\u043E \u0446\u0435\u043B\u0438 (\u0434\u0435\u0440\u0435\u0432\u043E \u0440\u0435\u0448\u0435\u043D\u0438\u0439):**\n\n| \u0425\u043E\u0447\u0443 \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0447\u0430\u0442\u2026 | \u0428\u0430\u0433\u0438 |\n|---|---|\n| **\u0441 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C \u043F\u043E \u0418\u041C\u0415\u041D\u0418** | `bitrix_entity_search { query:"\u0434\u043C\u0438\u0442\u0440\u0438\u0439" }` \u2192 \u0432\u0435\u0440\u043D\u0451\u0442 \u0434\u0438\u0430\u043B\u043E\u0433 \u0441 `dialogId` = \u0435\u0433\u043E userId \u2192 `bitrix_chat_load { dialogId }` |\n| **\u0441 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C, id \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043D** | `bitrix_chat_load { dialogId: <userId> }` (userId \u2014 \u0438\u0437 \u0437\u0430\u0434\u0430\u0447\u0438 `RESPONSIBLE_ID`/`CREATED_BY`, \u0438\u0437 `bitrix_chats_recent`, \u0438\u0437 `bitrix_user_get`) |\n| **\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u0417\u0410\u0414\u0410\u0427\u0418** | `bitrix_recent_load { section:"tasksTask" }` **\u0438\u043B\u0438** `bitrix_entity_search { query:"<\u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435>", section:"tasksTask" }` \u2192 `chatId`/`dialogId` \u2192 `bitrix_chat_load` (\xA76.3) |\n| **\u041F\u0420\u041E\u0415\u041A\u0422\u0410/\u0433\u0440\u0443\u043F\u043F\u044B** | `bitrix_task_get`\u2192`GROUP_ID`\u2192`bitrix_project_get`\u2192`CHAT_ID`; \u043B\u0438\u0431\u043E `bitrix_chat_get_dialog_id { externalId:"sg<groupId>" }` |\n| **\u043D\u0435 \u0437\u043D\u0430\u044E \u0442\u043E\u0447\u043D\u043E, \u043A\u0430\u043A\u043E\u0439** | `bitrix_chats_recent` (\u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435, \u0441\u043E\u043F\u043E\u0441\u0442\u0430\u0432\u044C \u043F\u043E `title`/`user`) \u0438\u043B\u0438 `bitrix_entity_search { query }` (\u043F\u043E\u0438\u0441\u043A \u043F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E) |\n\n> \u041F\u043E\u0447\u0435\u043C\u0443 \u043D\u0435 \xAB\u043F\u0440\u043E\u0441\u0442\u043E \u0441\u043F\u0438\u0441\u043E\u043A \u0447\u0430\u0442\u043E\u0432\xBB: `bitrix_chats_recent` (`im.recent.list`) \u043E\u0442\u0434\u0430\u0451\u0442 \u043B\u0438\u0448\u044C \u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u0438\n> **\u0431\u0435\u0437 \u0447\u0430\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447**. \u0414\u043B\u044F \u043F\u043E\u0438\u0441\u043A\u0430 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0433\u043E \u0447\u0430\u0442\u0430 \u2014 `bitrix_entity_search`; \u0434\u043B\u044F \u0447\u0430\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447 \u2014\n> `bitrix_recent_load { section:"tasksTask" }`.\n\n\u{1F4D6} \u041F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0435 \u0430\u043D\u0430\u043B\u043E\u0433\u0438 \u0447\u0442\u0435\u043D\u0438\u044F \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 (\u0435\u0441\u043B\u0438 \u043D\u0443\u0436\u043D\u043E \u0433\u043B\u0443\u0431\u0436\u0435 \u0440\u0430\u0437\u043E\u0431\u0440\u0430\u0442\u044C\u0441\u044F \u0432 \u043C\u043E\u0434\u0435\u043B\u0438): `im.dialog.messages.get`\n\u2014 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u043E\u0442\u0434\u0430\u0451\u0442 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435 (\u0434\u0435\u0444\u043E\u043B\u0442 20, \u043C\u0430\u043A\u0441 50), \u043B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 `LAST_ID` (\u0441\u0442\u0430\u0440\u0435\u0435) / `FIRST_ID` (\u043D\u043E\u0432\u0435\u0435);\n`imbot.v2 chat.getMessageContext` \u2014 \u043E\u0442\u0432\u0435\u0442 `messages[]` (oldest\u2192newest) + `users[]` +\n`hasPrevPage`/`hasNextPage`, \u0447\u0442\u043E **\u0441\u043E\u0432\u043F\u0430\u0434\u0430\u0435\u0442 \u043F\u043E \u0444\u043E\u0440\u043C\u0435** \u0441 \u043D\u0430\u0448\u0438\u043C\u0438 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u043C\u0438 `im.v2.Chat.Message.*`.\n\n### 6.2. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0439: \u0447\u0430\u0442 \u0441 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u044B\u043C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C\n\n\u041B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 1-\u043D\u0430-1 \u0430\u0434\u0440\u0435\u0441\u0443\u0435\u0442\u0441\u044F `dialogId` = **ID \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F**. Id \u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 \u0437\u0430\u0434\u0430\u0447\u0438\n(`RESPONSIBLE_ID`/`CREATED_BY`), \u0438\u0437 `bitrix_chats_recent`, \u043B\u0438\u0431\u043E \u0440\u0435\u0437\u043E\u043B\u0432\u0438\u0442\u0441\u044F \u043F\u043E\u0438\u0441\u043A\u043E\u043C \u043F\u043E \u0438\u043C\u0435\u043D\u0438 (\xA76.4).\n\n```jsonc\n// 1) \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 \u0441 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C 11 \u2192 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 chatId\nbitrix_chat_load { "dialogId": 11 }\n// 2) \u043B\u0438\u0441\u0442\u0430\u0442\u044C \u0435\u0433\u043E \u0438\u0441\u0442\u043E\u0440\u0438\u044E \u0432\u0433\u043B\u0443\u0431\u044C \u043F\u043E chatId \u0438\u0437 \u043E\u0442\u0432\u0435\u0442\u0430 \u0448\u0430\u0433\u0430 1\nbitrix_chat_history { "chatId": 485, "beforeId": 1861279 }\n```\n\n### 6.3. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0439: \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 (\u0447\u0430\u0442) \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438\n\n\u0423 \u043A\u0430\u0436\u0434\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0435\u0441\u0442\u044C \u0441\u0432\u043E\u0439 im-\u0447\u0430\u0442-\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435. \u0421\u0430\u043C\u044B\u0439 \u043D\u0430\u0434\u0451\u0436\u043D\u044B\u0439 \u043F\u0443\u0442\u044C \u2014 \u043F\u0440\u044F\u043C\u043E\u0439 \u0440\u0435\u0437\u043E\u043B\u0432 \u0438\u0437 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0437\u0430\u0434\u0430\u0447\u0438;\n\u043F\u043E\u0438\u0441\u043A \u043F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E \u2014 \u0437\u0430\u043F\u0430\u0441\u043D\u043E\u0439.\n\n**\u0410. \u041F\u0440\u044F\u043C\u043E\u0439 \u2014 `CHAT_ID` \u0438\u0437 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 (\u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u043E).** `bitrix_task_get` \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 `CHAT_ID`\n\u0447\u0430\u0442\u0430-\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u044F (\u043E\u043D \u0432\u0445\u043E\u0434\u0438\u0442 \u0432 \u0434\u0435\u0444\u043E\u043B\u0442\u043D\u044B\u0439 `select`). \u042D\u0442\u043E \u043F\u0440\u044F\u043C\u043E\u0439 `taskId \u2192 chatId` **\u0431\u0435\u0437** \u043F\u043E\u0438\u0441\u043A\u0430 \u043F\u043E\n\u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E \u0438 \u0431\u0435\u0437 \u0440\u0438\u0441\u043A\u0430 \u043F\u0440\u043E\u043C\u0430\u0445\u0430 \u043F\u043E \u0442\u0451\u0437\u043A\u0430\u043C-\u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430\u043C:\n\n```jsonc\nbitrix_task_get { "taskId": 28373 } // \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 CHAT_ID = id \u0447\u0430\u0442\u0430 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u044F\nbitrix_chat_load { "chatId": <CHAT_ID> }\nbitrix_chat_history { "chatId": <CHAT_ID>, "beforeId": <\u043C\u0438\u043D id \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B> }\n```\n\n\u{1F4D6} \u043E\u0444\u0438\u0446.: \u0432 `tasks.task.get` \u043F\u043E\u043B\u0435 `CHAT_ID` \u043E\u0442\u0434\u0430\u0451\u0442\u0441\u044F \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E (tasks-new.md). \u041E\u0431\u0449\u0438\u0439\n\u0440\u0435\u0437\u043E\u043B\u0432\u0435\u0440-\u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u0430 \u2014 **`bitrix_entity_chat`** (\u043E\u0431\u0451\u0440\u0442\u043A\u0430 \u043D\u0430\u0434 `im.chat.get`): \u043F\u043E \u043F\u0430\u0440\u0435\n`entityType`/`entityId` \u043E\u0442\u0434\u0430\u0451\u0442 chatId \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0433\u043E \u043E\u0431\u044A\u0435\u043A\u0442\u0430 \u2014 \u0434\u043B\u044F \u0437\u0430\u0434\u0430\u0447\u0438 `entityType="TASKS_TASK"`,\n`entityId=<taskId>`; \u0442\u0430\u043A \u0436\u0435 \u0430\u0434\u0440\u0435\u0441\u0443\u044E\u0442\u0441\u044F \u0447\u0430\u0442\u044B `SONET_GROUP` (\u0433\u0440\u0443\u043F\u043F\u0430/\u043F\u0440\u043E\u0435\u043A\u0442), `CRM`, `CALENDAR`, `MAIL`,\n`VIDEOCONF`, `CALL`:\n\n```jsonc\nbitrix_entity_chat { "entityType": "TASKS_TASK", "entityId": 28373 } // \u2192 chatId\nbitrix_chat_load { "chatId": <chatId> }\n```\n\n**\u0411. \u0427\u0435\u0440\u0435\u0437 \u0441\u043F\u0438\u0441\u043E\u043A \u0447\u0430\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447.** `im.v2.Recent.load` \u0441 \u0441\u0435\u043A\u0446\u0438\u0435\u0439 `tasksTask` \u043E\u0442\u0434\u0430\u0451\u0442 \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447\n(\u0432 `bitrix_chats_recent` / `/rest/im.recent.list` \u0438\u0445 \u041D\u0415\u0422). \u041B\u0438\u0441\u0442\u0430\u0442\u044C \u0432\u0433\u043B\u0443\u0431\u044C \u2014 `bitrix_recent_tail`.\n\n```jsonc\nbitrix_recent_load { "section": "tasksTask" } // \u2192 \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447 \u0441 chatId/dialogId\nbitrix_recent_tail { "section": "tasksTask", "lastMessageDate": "2026-06-29T17:25:38+03:00" }\n// \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u044B\u0439 \u0447\u0430\u0442 \u0438 \u043B\u0438\u0441\u0442\u0430\u0442\u044C \u0438\u0441\u0442\u043E\u0440\u0438\u044E\nbitrix_chat_load { "dialogId": "chat38849" } // \u0438\u043B\u0438 { "chatId": 38849 }\nbitrix_chat_history { "chatId": 38849, "beforeId": 1722353 }\n```\n\n**\u0412. \u041F\u043E\u0438\u0441\u043A\u043E\u043C \u043F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E \u0437\u0430\u0434\u0430\u0447\u0438** \u2014 `bitrix_entity_search` \u0441 \u0441\u0435\u043A\u0446\u0438\u0435\u0439 `tasksTask` (\u0437\u0430\u043F\u0430\u0441\u043D\u043E\u0439, \u043C\u0430\u0442\u0447 \u043F\u043E \u0442\u0435\u043A\u0441\u0442\u0443):\n\n```jsonc\nbitrix_entity_search { "query": "\u0442\u0440\u0435\u043A\u0435\u0440", "section": "tasksTask" }\n```\n\n**\u0427\u0430\u0442 \u041F\u0420\u041E\u0415\u041A\u0422\u0410 \u0437\u0430\u0434\u0430\u0447\u0438** (\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B, \u043D\u0435 \u0441\u0430\u043C\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438) \u2014 \u0447\u0435\u0440\u0435\u0437 `GROUP_ID`:\n\n```jsonc\nbitrix_task_get { "taskId": 4229, "params": { "select": ["ID","GROUP_ID"] } }\nbitrix_project_get { "groupId": 15 } // \u043E\u0442\u0434\u0430\u0451\u0442 CHAT_ID / DIALOG_ID\nbitrix_chat_load { "dialogId": "chat7111" }\nbitrix_chat_get_dialog_id { "externalId": "sg15" } // \u043B\u0438\u0431\u043E \u0440\u0435\u0437\u043E\u043B\u0432 dialogId \u0441\u043E\u0446\u0433\u0440\u0443\u043F\u043F\u044B \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E\n```\n\n### 6.4. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0439: \u043F\u043E\u0438\u0441\u043A \u0447\u0430\u0442\u0430 / \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\n\n\u0422\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u043F\u043E\u0438\u0441\u043A \u2014 `bitrix_entity_search` (\u043E\u0431\u0451\u0440\u0442\u043A\u0430 \u043D\u0430\u0434 `ui.entityselector.doSearch`): \u0441\u0430\u043C \u0441\u043E\u0431\u0438\u0440\u0430\u0435\u0442\n\u0434\u0438\u0430\u043B\u043E\u0433 `IM_CHAT_SEARCH` \u0438 `searchQuery` \u0438\u0437 \u0441\u0442\u0440\u043E\u043A\u0438. `ui.entityselector.*` \u2014 **\u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0439 UI-\u043C\u0435\u0442\u043E\u0434, \u0432\n\u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0445 \u0434\u043E\u043A\u0430\u0445 \u0435\u0433\u043E \u043D\u0435\u0442** (\u0444\u043E\u0440\u043C\u0430 \u0437\u0430\u043F\u0440\u043E\u0441\u0430/\u043E\u0442\u0432\u0435\u0442\u0430 \u2014 \u0442\u043E\u043B\u044C\u043A\u043E \u0440\u0435\u0432\u0435\u0440\u0441); \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0435 \u0430\u043D\u0430\u043B\u043E\u0433\u0438 \u0434\u043B\u044F \u043F\u043E\u0438\u0441\u043A\u0430 \u043B\u044E\u0434\u0435\u0439 \u2014\n`user.get`/`user.search`, \u0434\u043B\u044F \u0447\u0430\u0442\u043E\u0432 \u2014 `im.recent.list` + \u0444\u0438\u043B\u044C\u0442\u0440\u0430\u0446\u0438\u044F \u043D\u0430 \u0441\u0442\u043E\u0440\u043E\u043D\u0435 \u0430\u0433\u0435\u043D\u0442\u0430.\n\n```jsonc\nbitrix_entity_search { "query": "\u0434\u043C\u0438\u0442\u0440\u0438\u0439" } // \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0447\u0430\u0442\u043E\u0432/\u0434\u0438\u0430\u043B\u043E\u0433\u043E\u0432\nbitrix_entity_search { "query": "\u0442\u0440\u0435\u043A\u0435\u0440", "section": "tasksTask" } // \u0441\u0440\u0435\u0434\u0438 \u0447\u0430\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447\n```\n\n\u0411\u044B\u0441\u0442\u0440\u044B\u0439 \u043F\u0443\u0442\u044C \u0431\u0435\u0437 \u043F\u043E\u0438\u0441\u043A\u0430 \u2014 \u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u0447\u0430\u0442\u044B \u0438 \u0444\u0438\u043B\u044C\u0442\u0440\u0430\u0446\u0438\u044F \u043D\u0430 \u0441\u0442\u043E\u0440\u043E\u043D\u0435 \u0430\u0433\u0435\u043D\u0442\u0430; \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0430\u0432\u0442\u043E\u0440\u0430 \u043F\u043E id:\n\n```jsonc\nbitrix_chats_recent { } // \u0441\u043E\u043F\u043E\u0441\u0442\u0430\u0432\u044C \u043F\u043E title / user\nbitrix_recent_load { "section": "tasksTask" }\nbitrix_user_get { "userId": 11 } // \u0440\u0435\u0437\u043E\u043B\u0432 authorId \u2192 \u0438\u043C\u044F\n```\n\n### 6.5. \u041B\u0435\u0433\u0430\u0441\u0438-\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 (HTML-\u043F\u043E\u0434\u0434\u043E\u043C\u0435\u043D \u2014 \u043F\u043E\u043A\u0430 \u041D\u0415 \u0432 \u043C\u043E\u0441\u0442\u0435)\n\n\u0423 \u0437\u0430\u0434\u0430\u0447 \u0434\u0432\u0430 \u043D\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043C\u044B\u0445 \u0444\u0438\u0434\u0430 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u044F:\n- **im.v2-\u0447\u0430\u0442** \u2014 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u043D\u044B\u0439 JSON, \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044F \u0443\u0436\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 (\xA76.3); \u043E\u0431\u044B\u0447\u043D\u043E \u044D\u0442\u043E\u0433\u043E \u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E.\n- **\u0424\u043E\u0440\u0443\u043C\u043D\u044B\u0435 \u043B\u0435\u0433\u0430\u0441\u0438-\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438** \u2014 \u0440\u0435\u043D\u0434\u0435\u0440\u044F\u0442\u0441\u044F \u043A\u0430\u043A **HTML** \u0432 side-slider\'\u0435. \u042D\u0442\u043E \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0439\n \xABHTML-\u043F\u043E\u0434\u0434\u043E\u043C\u0435\u043D\xBB \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u0433\u043E API, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 **\u0442\u0435\u043A\u0443\u0449\u0438\u0439 \u043C\u043E\u0441\u0442 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442** (\u0431\u043B\u043E\u043A\u0435\u0440\u044B \u043D\u0438\u0436\u0435).\n\n**\u041A\u0430\u043A \u0433\u0440\u0443\u0437\u044F\u0442\u0441\u044F (\u0440\u0435\u0432\u0435\u0440\u0441).** \u041F\u0435\u0440\u0432\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u2014 GET HTML-\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B iframe (\u0441\u0435\u0440\u0432\u0435\u0440 \u0442\u0443\u0442 \u0436\u0435 \u043C\u0438\u043D\u0442\u0438\u0442 \u043F\u043E\u0434\u043F\u0438\u0441\u044C):\n\n```\nGET /task/comments/<taskId>/?IFRAME=Y&IFRAME_TYPE=SIDE_SLIDER \u2192 HTML (\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 + signedParameters)\n```\n\n\u041B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u2014 POST \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043D\u043E\u0433\u043E ajax (\u0444\u043E\u0440\u043C\u0430, \u043E\u0442\u0434\u0430\u0451\u0442 HTML-\u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442):\n\n```\nPOST /bitrix/services/main/ajax.php?mode=class&c=bitrix:forum.comments&action=navigateComment\nform: AJAX_POST=Y, ENTITY_XML_ID=TASK_<taskId>, taskId=<taskId>, MODE=LIST,\n FILTER[<ID]=<\u043A\u0443\u0440\u0441\u043E\u0440: id, \u0414\u041E \u043A\u043E\u0442\u043E\u0440\u043E\u0433\u043E \u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0441\u0442\u0430\u0440\u044B\u0435>, PAGEN_1=1,\n signedParameters=<\u043F\u043E\u0434\u043F\u0438\u0441\u0430\u043D\u043D\u044B\u0439 blob>, IFRAME=Y, IFRAME_TYPE=SIDE_SLIDER\nheaders: bx-ajax: true, x-bitrix-site-id: s1 (\u043F\u043B\u044E\u0441 \u043E\u0431\u044B\u0447\u043D\u044B\u0439 X-Bitrix-Csrf-Token)\n```\n\n`signedParameters` \u2014 base64 PHP-\u043C\u0430\u0441\u0441\u0438\u0432\u0430 + HMAC-\u043F\u043E\u0434\u043F\u0438\u0441\u044C \u0441\u0435\u0440\u0432\u0435\u0440\u0430; \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442\n`FORUM_ID, ENTITY_TYPE=TK, ENTITY_ID=<taskId>, ENTITY_XML_ID=TASK_<taskId>, \u2026`. **\u041F\u043E\u0434\u0434\u0435\u043B\u0430\u0442\u044C \u043D\u0435\u043B\u044C\u0437\u044F** \u2014\n\u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 HTML \u043F\u0435\u0440\u0432\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B.\n\n**\u041F\u043E\u0447\u0435\u043C\u0443 \u043F\u043E\u043A\u0430 \u043D\u0435 \u0432 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0435 (3 \u0431\u043B\u043E\u043A\u0435\u0440\u0430):**\n1. \u041C\u043E\u0441\u0442 \u043F\u0430\u0440\u0441\u0438\u0442 \u043E\u0442\u0432\u0435\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u0430\u043A JSON (`extension/src/connector.ts` \u2192 `resp.json()`) \u2014 HTML \u0431\u0440\u043E\u0441\u0438\u0442 \u0438\u0441\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435.\n2. Path-\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432 URL (`/task/comments/<taskId>/`) \u2014 \u0437\u0430\u043F\u0438\u0441\u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u043D\u044B, \u0448\u0430\u0431\u043B\u043E\u043D\u043E\u0432 \u043F\u0443\u0442\u0438 \u043D\u0435\u0442.\n3. `signedParameters` + \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0438 `bx-ajax`/`x-bitrix-site-id` \u2014 \u043D\u0443\u0436\u0435\u043D \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 GET HTML-\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B.\n\n**\u0427\u0442\u043E\u0431\u044B \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C** (\u0431\u0443\u0434\u0443\u0449\u0430\u044F \u0440\u0430\u0431\u043E\u0442\u0430): \u043D\u0430\u0443\u0447\u0438\u0442\u044C \u043C\u043E\u0441\u0442 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044C text/HTML \u043F\u0440\u0438 \u043D\u0435-JSON \u043E\u0442\u0432\u0435\u0442\u0435 \u0438\n\u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044C path-\u0448\u0430\u0431\u043B\u043E\u043D \u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u0430; \u0437\u0430\u0442\u0435\u043C \u043E\u0431\u0451\u0440\u0442\u043A\u0430 `bitrix_task_comments { taskId }` (GET \u043F\u0435\u0440\u0432\u043E\u0439\n\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B), \u0430 \u043B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u2014 \u0447\u0435\u0440\u0435\u0437 `navigateComment` \u0441 \u0432\u044B\u043F\u0430\u0440\u0441\u0435\u043D\u043D\u044B\u043C `signedParameters`.\n\n> \u0422\u043E\u0442 \u0436\u0435 HTML-\u043F\u043E\u0434\u0434\u043E\u043C\u0435\u043D: **\u0434\u0435\u0442\u0430\u043B\u0438 \u0437\u0432\u043E\u043D\u043A\u0430** \u2014 `GET /call/detail/<callId>?IFRAME=Y&IFRAME_TYPE=SIDE_SLIDER`\n> (\u043E\u0442\u0434\u0430\u0451\u0442 HTML). \u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438\u044F \u0438\u0434\u0435\u043D\u0442\u0438\u0447\u043D\u044B.\n\n---\n\n## 7. \u041A\u0430\u043A \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044C (\u043D\u043E\u0432\u044B\u0439 \u0434\u043E\u043C\u0435\u043D: \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C, \u0434\u0438\u0441\u043A, CRM, \u2026)\n\n> \u0421\u043E\u0432\u0435\u0442: \u0441\u043F\u0435\u0440\u0432\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u044C, \u0437\u0430\u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u043D \u043B\u0438 \u043C\u0435\u0442\u043E\u0434 \u0432 \u{1F4D6} [`apidocs.bitrix24.com`](https://apidocs.bitrix24.com)\n> (context7: `/bitrix24/b24restdocs`). \u0414\u043B\u044F \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0445 `*.list`/`*.get` \u0442\u0430\u043C \u0433\u043E\u0442\u043E\u0432\u044B\u0435 \u043F\u043E\u043B\u044F, \u0444\u0438\u043B\u044C\u0442\u0440\u044B \u0438\n> \u043F\u0430\u0433\u0438\u043D\u0430\u0446\u0438\u044F \u2014 \u0440\u0435\u0432\u0435\u0440\u0441 \u0442\u043E\u0433\u0434\u0430 \u043D\u0443\u0436\u0435\u043D \u043B\u0438\u0448\u044C \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 (form/json) \u0438 \u043A\u043E\u043D\u0432\u0435\u0440\u0442 \u043E\u0442\u0432\u0435\u0442\u0430. \u0414\u043B\u044F\n> \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 `im.v2.*`/`tasks.v2.*`/UI-\u043C\u0435\u0442\u043E\u0434\u043E\u0432 \u0434\u043E\u043A\u043E\u0432 \u043D\u0435\u0442 \u2014 \u0442\u043E\u043B\u044C\u043A\u043E \u0440\u0435\u0432\u0435\u0440\u0441 (`docs/reconnaissance.md`).\n\n1. \u0421\u043D\u0438\u043C\u0438 \u0440\u0435\u0430\u043B\u044C\u043D\u044B\u0435 \u0432\u044B\u0437\u043E\u0432\u044B (`docs/reconnaissance.md` \u2014 \u0430\u0432\u0442\u043E-\u0437\u0430\u043F\u0438\u0441\u044C `bun run capture` \u0438\u043B\u0438 HAR \u2192\n `bun run catalog:draft`). \u0427\u0435\u0440\u043D\u043E\u0432\u0438\u043A `actions.draft.json` \u043D\u0430\u043A\u0430\u043F\u043B\u0438\u0432\u0430\u0435\u0442 **\u0432\u0441\u0435 \u0443\u043D\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u043A\u043E\u043C\u0431\u0438\u043D\u0430\u0446\u0438\u0438\n \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432** \u043D\u0430 \u044D\u043A\u0448\u0435\u043D \u0438 \u043F\u0440\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 `bodyType` (form/json) \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.\n2. \u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0438 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 \u043F\u043E \u0440\u0430\u0437\u0434\u0435\u043B\u0443 3: \u0435\u0441\u043B\u0438 \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A \u043F\u043E\u043A\u0430\u0437\u0430\u043B `"bodyType": "json"` \u2014 \u043F\u0435\u0440\u0435\u043D\u0435\u0441\u0438 \u0435\u0433\u043E \u0432 \u0437\u0430\u043F\u0438\u0441\u044C.\n3. \u0414\u043E\u0431\u0430\u0432\u044C \u0437\u0430\u043F\u0438\u0441\u044C \u0432 `actions.json` (\u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0435\u0439 \u2014 \u043A\u0430\u0442\u0430\u043B\u043E\u0433 \u044D\u0442\u043E \u0434\u043E\u043F\u0443\u0441\u043A\u0430\u0435\u0442).\n4. \u0415\u0441\u043B\u0438 \u0443\u0434\u043E\u0431\u043D\u043E \u2014 \u043E\u0431\u0435\u0440\u043D\u0438 \u0432 \u0442\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u0432 `src/tools/register.ts` (\u043E\u0431\u0451\u0440\u0442\u043A\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044F\n \u0442\u043E\u043B\u044C\u043A\u043E \u0435\u0441\u043B\u0438 \u0435\u0451 `catalogName` \u0435\u0441\u0442\u044C \u0432 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0435).\n5. **`bun run sync:runtime`** \u2014 \u0434\u043E\u0441\u0442\u0430\u0432\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0436\u0438\u0432\u043E\u043C\u0443 daemon: \u043F\u0435\u0440\u0435\u0441\u043E\u0431\u0440\u0430\u0442\u044C \u0431\u0430\u043D\u0434\u043B, \u0441\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C\n \u0440\u0435\u043F\u043E-`actions.json` \u0432 `~/.bitrix24-mcp-bridge/actions.json` \u0438 \u043F\u043E\u0433\u0430\u0441\u0438\u0442\u044C daemon. \u0411\u0435\u0437 \u044D\u0442\u043E\u0433\u043E \u0430\u0433\u0435\u043D\u0442\n \u043D\u043E\u0432\u044B\u0445 \u0438\u043C\u0451\u043D/\u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u043D\u0435 \u0443\u0432\u0438\u0434\u0438\u0442 (daemon \u0447\u0438\u0442\u0430\u0435\u0442 runtime-\u043F\u0430\u043F\u043A\u0443, \u043D\u0435 \u0440\u0435\u043F\u043E). \u041F\u0440\u043E\u0432\u0435\u0440\u044C \u0447\u0435\u0440\u0435\u0437\n `bitrix_call { name, params }` \u0438\u043B\u0438 \u043D\u043E\u0432\u0443\u044E \u043E\u0431\u0451\u0440\u0442\u043A\u0443.\n\n> `actions.json` / `actions.draft.json` \u2014 \u0434\u0430\u043D\u043D\u044B\u0435 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0433\u043E \u043F\u043E\u0440\u0442\u0430\u043B\u0430 (gitignored). \u042D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B\n> (`api-notes.md`) \u2014 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u043C\u044B\u0435 \u0437\u043D\u0430\u043D\u0438\u044F \u043E \u0441\u0430\u043C\u043E\u043C API; \u0434\u0435\u0440\u0436\u0438 \u0435\u0433\u043E \u0432 \u0430\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u043E\u043C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0438 \u043F\u0440\u0438 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0438\n> \u043D\u043E\u0432\u044B\u0445 \u043C\u0435\u0442\u043E\u0434\u043E\u0432.\n' : load();
|
|
25300
25300
|
|
|
25301
25301
|
// src/tools/register.ts
|
|
25302
25302
|
import { randomUUID as randomUUID2 } from "node:crypto";
|
|
@@ -25353,21 +25353,21 @@ function registerTools(server, deps) {
|
|
|
25353
25353
|
}
|
|
25354
25354
|
);
|
|
25355
25355
|
const TASK_LIST_SELECT = ["ID", "TITLE", "STATUS", "RESPONSIBLE_ID", "CREATED_BY", "DEADLINE", "GROUP_ID", "PRIORITY"];
|
|
25356
|
-
const TASK_GET_SELECT = ["ID", "TITLE", "DESCRIPTION", "STATUS", "RESPONSIBLE_ID", "CREATED_BY", "CREATED_DATE", "DEADLINE", "PRIORITY", "GROUP_ID", "CLOSED_DATE"];
|
|
25356
|
+
const TASK_GET_SELECT = ["ID", "TITLE", "DESCRIPTION", "STATUS", "RESPONSIBLE_ID", "CREATED_BY", "CREATED_DATE", "DEADLINE", "PRIORITY", "GROUP_ID", "CLOSED_DATE", "CHAT_ID"];
|
|
25357
25357
|
const GROUP_LIST_SELECT = ["ID", "NAME", "DESCRIPTION", "NUMBER_OF_MEMBERS", "OWNER_ID", "DATE_CREATE", "PROJECT"];
|
|
25358
25358
|
const GROUP_GET_SELECT = ["ID", "NAME", "DESCRIPTION", "OWNER_DATA", "SUBJECT_DATA", "NUMBER_OF_MEMBERS", "DATE_CREATE"];
|
|
25359
25359
|
const typed = [
|
|
25360
25360
|
{
|
|
25361
25361
|
tool: "bitrix_tasks_list",
|
|
25362
25362
|
catalogName: "tasks.list",
|
|
25363
|
-
description: '\u0421\u043F\u0438\u0441\u043E\u043A \u0437\u0430\u0434\u0430\u0447 \u043F\u043E\u043B\
|
|
25363
|
+
description: '\u0421\u043F\u0438\u0441\u043E\u043A \u0437\u0430\u0434\u0430\u0447 (read-only). params.filter \u2014 \u043F\u043E\u043B\u044F \u043C\u043E\u0436\u043D\u043E \u0441 \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u0430\u043C\u0438: "!" (\u0438\u0441\u043A\u043B\u044E\u0447\u0438\u0442\u044C), "<"/">"/"<="/">=", "%" (\u043F\u043E\u0434\u0441\u0442\u0440\u043E\u043A\u0430). \u041D\u0430\u043F\u0440. {"!REAL_STATUS":5} \u2014 \u043D\u0435\u0437\u0430\u043A\u0440\u044B\u0442\u044B\u0435, {">=DEADLINE":"2026-07-01"}. \u0420\u043E\u043B\u0438 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0430 \u0420\u0410\u0417\u0414\u0415\u041B\u042C\u041D\u042B \u0438 \u0432 \u0444\u0438\u043B\u044C\u0442\u0440\u0435 \u0432 \u0415\u0414. \u0447\u0438\u0441\u043B\u0435: RESPONSIBLE_ID (\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439), ACCOMPLICE (\u0441\u043E\u0438\u0441\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C), AUDITOR (\u043D\u0430\u0431\u043B\u044E\u0434\u0430\u0442\u0435\u043B\u044C), CREATED_BY (\u043F\u043E\u0441\u0442\u0430\u043D\u043E\u0432\u0449\u0438\u043A). \xAB\u0412\u0441\u0435 \u043C\u043E\u0438 \u0437\u0430\u0434\u0430\u0447\u0438\xBB = \u043E\u0431\u044A\u0435\u0434\u0438\u043D\u0438\u0442\u044C \u0432\u044B\u0437\u043E\u0432\u044B \u043F\u043E RESPONSIBLE_ID \u0438 ACCOMPLICE (\u043E\u0434\u043D\u043E\u0433\u043E \u043F\u043E\u043B\u044F \xAB\u043B\u044E\u0431\u0430\u044F \u0440\u043E\u043B\u044C\xBB \u043D\u0435\u0442). \u0415\u0449\u0451 params: select, order (\u043D\u0430\u043F\u0440. {"ID":"desc"}), start (\u0448\u0430\u0433 50).',
|
|
25364
25364
|
inputSchema: { params: external_exports.record(external_exports.unknown()).optional(), portal: external_exports.string().optional() },
|
|
25365
25365
|
toParams: () => ({ select: TASK_LIST_SELECT, order: { ID: "desc" } })
|
|
25366
25366
|
},
|
|
25367
25367
|
{
|
|
25368
25368
|
tool: "bitrix_task_get",
|
|
25369
25369
|
catalogName: "task.get",
|
|
25370
|
-
description: "\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u043F\u043E id (read-only). \
|
|
25370
|
+
description: "\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u043F\u043E id (read-only). \u0412 \u0434\u0435\u0444\u043E\u043B\u0442\u043D\u043E\u043C select \u0435\u0441\u0442\u044C CHAT_ID \u2014 \u044D\u0442\u043E id \u0427\u0410\u0422\u0410-\u041E\u0411\u0421\u0423\u0416\u0414\u0415\u041D\u0418\u042F \u0437\u0430\u0434\u0430\u0447\u0438: \u043F\u0440\u044F\u043C\u043E\u0439 \u043F\u0443\u0442\u044C \u043A \u043D\u0435\u043C\u0443 = bitrix_chat_load { chatId: <CHAT_ID> } (\u043D\u0435 \u043F\u0443\u0442\u0430\u0442\u044C \u0441 \u0447\u0430\u0442\u043E\u043C \u043F\u0440\u043E\u0435\u043A\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 GROUP_ID). \u0414\u0440\u0443\u0433\u0438\u0435 \u043F\u043E\u043B\u044F \u2014 \u0447\u0435\u0440\u0435\u0437 params.select (\u043D\u0430\u043F\u0440. UF_*, TAGS, TIME_ESTIMATE).",
|
|
25371
25371
|
inputSchema: { taskId: external_exports.union([external_exports.number(), external_exports.string()]), params: external_exports.record(external_exports.unknown()).optional(), portal: external_exports.string().optional() },
|
|
25372
25372
|
toParams: (a) => ({ taskId: a.taskId, select: TASK_GET_SELECT })
|
|
25373
25373
|
},
|
|
@@ -25389,7 +25389,7 @@ function registerTools(server, deps) {
|
|
|
25389
25389
|
{
|
|
25390
25390
|
tool: "bitrix_chats_recent",
|
|
25391
25391
|
catalogName: "chats.recent",
|
|
25392
|
-
description: '\u041D\
|
|
25392
|
+
description: '\u041D\u0415\u0414\u0410\u0412\u041D\u0418\u0415 \u0447\u0430\u0442\u044B/\u0434\u0438\u0430\u043B\u043E\u0433\u0438 (read-only) \u2014 \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435 \u0438 \u0411\u0415\u0417 \u0447\u0430\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447. \u0427\u0442\u043E\u0431\u044B \u041D\u0410\u0419\u0422\u0418 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u044B\u0439 \u0447\u0430\u0442 \u043F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E/\u0438\u043C\u0435\u043D\u0438 \u2014 bitrix_entity_search; \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447 \u2014 bitrix_recent_load { section:"tasksTask" }. params \u2014 \u0434\u043E\u043F. \u0444\u0438\u043B\u044C\u0442\u0440\u044B (\u043D\u0430\u043F\u0440. {"UNREAD_ONLY":"Y"}).',
|
|
25393
25393
|
inputSchema: { params: external_exports.record(external_exports.unknown()).optional(), portal: external_exports.string().optional() },
|
|
25394
25394
|
toParams: () => ({})
|
|
25395
25395
|
},
|
|
@@ -25444,7 +25444,7 @@ function registerTools(server, deps) {
|
|
|
25444
25444
|
{
|
|
25445
25445
|
tool: "bitrix_chat_load",
|
|
25446
25446
|
catalogName: "chat.load",
|
|
25447
|
-
description: '\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0447\u0430\u0442 \u0438 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043F\u0435\u0440\u0432\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F. \u0410\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044F: dialogId = ID \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u2192 \u041B\u0418\u0427\u041D\u042B\u0419 \u0447\u0430\u0442 1-\u043D\u0430-1; dialogId = "chat"+CHAT_ID (\u0438\u043B\u0438 chatId = CHAT_ID) \u2192 \u0413\u0420\u0423\u041F\u041F\u041E\u0412\u041E\u0419. \u0427\u0430\u0442 \u043F\u043E \
|
|
25447
|
+
description: '\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0447\u0430\u0442 \u0438 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043F\u0435\u0440\u0432\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F. \u0410\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044F: dialogId = ID \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u2192 \u041B\u0418\u0427\u041D\u042B\u0419 \u0447\u0430\u0442 1-\u043D\u0430-1 \u0441 \u043D\u0438\u043C; dialogId = "chat"+CHAT_ID (\u0438\u043B\u0438 chatId = CHAT_ID) \u2192 \u0413\u0420\u0423\u041F\u041F\u041E\u0412\u041E\u0419. \u0427\u0430\u0442 \u0421 \u0427\u0415\u041B\u041E\u0412\u0415\u041A\u041E\u041C \u043F\u043E \u0438\u043C\u0435\u043D\u0438: \u0441\u043F\u0435\u0440\u0432\u0430 bitrix_entity_search { query } \u2192 \u0432\u0435\u0440\u043D\u0451\u0442 dialogId (=userId). \u0427\u0430\u0442 \u0417\u0410\u0414\u0410\u0427\u0418: bitrix_recent_load { section:"tasksTask" } \u043B\u0438\u0431\u043E bitrix_entity_search. \u0427\u0430\u0442 \u041F\u0420\u041E\u0415\u041A\u0422\u0410: bitrix_task_get \u2192 GROUP_ID \u2192 bitrix_project_get \u2192 CHAT_ID. \u041E\u0442\u0432\u0435\u0442 \u0432\u0435\u0440\u043D\u0451\u0442 \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 chatId \u2014 \u043F\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0439 \u0435\u0433\u043E \u0432 bitrix_chat_history / bitrix_chat_mark_read. messageLimit \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E 25.',
|
|
25448
25448
|
inputSchema: {
|
|
25449
25449
|
chatId: external_exports.union([external_exports.number(), external_exports.string()]).optional(),
|
|
25450
25450
|
dialogId: external_exports.union([external_exports.number(), external_exports.string()]).optional(),
|
|
@@ -25536,7 +25536,7 @@ function registerTools(server, deps) {
|
|
|
25536
25536
|
{
|
|
25537
25537
|
tool: "bitrix_entity_search",
|
|
25538
25538
|
catalogName: "entityselector.search",
|
|
25539
|
-
description: '\u0422\u0415\u041A\u0421\u0422\u041E\u0412\u042B\u0419 \u043F\u043E\u0438\u0441\u043A \
|
|
25539
|
+
description: '\u0422\u0415\u041A\u0421\u0422\u041E\u0412\u042B\u0419 \u043F\u043E\u0438\u0441\u043A \u0447\u0430\u0442\u043E\u0432/\u0434\u0438\u0430\u043B\u043E\u0433\u043E\u0432 \u043F\u043E \u0441\u0442\u0440\u043E\u043A\u0435 (entityselector, JSON API) \u2014 \u0413\u041B\u0410\u0412\u041D\u042B\u0419 \u0441\u043F\u043E\u0441\u043E\u0431 \u043D\u0430\u0439\u0442\u0438 \u0447\u0430\u0442 \u043F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E \u0438\u043B\u0438 \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0430 \u043F\u043E \u0418\u041C\u0415\u041D\u0418. query \u2014 \u0441\u0442\u0440\u043E\u043A\u0430 \u043F\u043E\u0438\u0441\u043A\u0430. \u041F\u043E\u0438\u0441\u043A \u043F\u043E \u0438\u043C\u0435\u043D\u0438 \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0430 \u0432\u0435\u0440\u043D\u0451\u0442 \u041B\u0418\u0427\u041D\u042B\u0419 \u0434\u0438\u0430\u043B\u043E\u0433 \u0441 \u043D\u0438\u043C \u2014 \u0435\u0433\u043E dialogId (= userId); \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0439 bitrix_chat_load { dialogId }. section: "tasksTask" \u2014 \u0441\u0440\u0435\u0434\u0438 \u0447\u0430\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447, "default" (\u0443\u043C\u043E\u043B\u0447.) \u2014 \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0434\u0438\u0430\u043B\u043E\u0433\u043E\u0432. \u0414\u043B\u044F \u0438\u043D\u044B\u0445 \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0435\u0439 \u043F\u0435\u0440\u0435\u0434\u0430\u0439 \u0441\u0432\u043E\u0439 dialog \u0446\u0435\u043B\u0438\u043A\u043E\u043C.',
|
|
25540
25540
|
inputSchema: {
|
|
25541
25541
|
query: external_exports.string(),
|
|
25542
25542
|
section: external_exports.string().optional(),
|
|
@@ -25589,6 +25589,18 @@ function registerTools(server, deps) {
|
|
|
25589
25589
|
description: "\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440\u0430 \u043F\u043E id (\u0438\u043C\u044F, \u0430\u0432\u0430\u0442\u0430\u0440, \u0441\u0442\u0430\u0442\u0443\u0441). userId \u2014 id \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F.",
|
|
25590
25590
|
inputSchema: { userId: external_exports.union([external_exports.number(), external_exports.string()]), params: external_exports.record(external_exports.unknown()).optional(), portal: external_exports.string().optional() },
|
|
25591
25591
|
toParams: (a) => ({ ID: a.userId })
|
|
25592
|
+
},
|
|
25593
|
+
{
|
|
25594
|
+
tool: "bitrix_entity_chat",
|
|
25595
|
+
catalogName: "im.chat.get",
|
|
25596
|
+
description: '\u0420\u0435\u0437\u043E\u043B\u0432 chatId \u0447\u0430\u0442\u0430, \u041F\u0420\u0418\u0412\u042F\u0417\u0410\u041D\u041D\u041E\u0413\u041E \u043A \u043E\u0431\u044A\u0435\u043A\u0442\u0443 (im.chat.get). entityType/entityId \u2014 \u0442\u0438\u043F \u0438 id \u043E\u0431\u044A\u0435\u043A\u0442\u0430: "TASKS_TASK" (\u0447\u0430\u0442-\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438), "SONET_GROUP" (\u0447\u0430\u0442 \u0433\u0440\u0443\u043F\u043F\u044B/\u043F\u0440\u043E\u0435\u043A\u0442\u0430), "CRM", "CALENDAR", "MAIL", "VIDEOCONF", "LINES", "CALL". \u0414\u0430\u0451\u0442 \u043F\u0440\u044F\u043C\u043E\u0439 \xAB\u043E\u0431\u044A\u0435\u043A\u0442 \u2192 chatId\xBB \u0431\u0435\u0437 \u043F\u043E\u0438\u0441\u043A\u0430 \u043F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E. \u0414\u043B\u044F \u0437\u0430\u0434\u0430\u0447\u0438 \u043F\u0440\u043E\u0449\u0435 \u0432\u0441\u0451 \u0436\u0435 CHAT_ID \u0438\u0437 bitrix_task_get; \u044D\u0442\u043E\u0442 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u2014 \u043E\u0431\u0449\u0438\u0439, \u043D\u0430 \u043B\u044E\u0431\u0443\u044E \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u044C. \u041F\u043E\u043B\u0443\u0447\u0435\u043D\u043D\u044B\u0439 chatId \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0439 bitrix_chat_load { chatId }.',
|
|
25597
|
+
inputSchema: {
|
|
25598
|
+
entityType: external_exports.string(),
|
|
25599
|
+
entityId: external_exports.union([external_exports.number(), external_exports.string()]),
|
|
25600
|
+
params: external_exports.record(external_exports.unknown()).optional(),
|
|
25601
|
+
portal: external_exports.string().optional()
|
|
25602
|
+
},
|
|
25603
|
+
toParams: (a) => ({ ENTITY_TYPE: a.entityType, ENTITY_ID: a.entityId })
|
|
25592
25604
|
}
|
|
25593
25605
|
];
|
|
25594
25606
|
const available = new Set(deps.catalog.names());
|
|
@@ -25735,12 +25747,13 @@ function setDefaultPortal(config2, alias) {
|
|
|
25735
25747
|
if (!config2.portals[alias]) throw new Error(`portal "${alias}" does not exist`);
|
|
25736
25748
|
return { ...config2, defaultPortal: alias };
|
|
25737
25749
|
}
|
|
25750
|
+
var EXT_VERSION = true ? "0.3.0" : "0.0.0-dev";
|
|
25738
25751
|
function buildManifest(config2) {
|
|
25739
25752
|
const matches = Object.values(config2.portals).map((p) => `${p.origin}/*`);
|
|
25740
25753
|
return {
|
|
25741
25754
|
manifest_version: 3,
|
|
25742
25755
|
name: "Bitrix24 MCP Bridge",
|
|
25743
|
-
version:
|
|
25756
|
+
version: EXT_VERSION,
|
|
25744
25757
|
description: "\u041E\u0442\u0434\u0430\u0451\u0442 \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0441\u0435\u0441\u0441\u0438\u044E Bitrix24 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u043C\u0443 MCP-\u0441\u0435\u0440\u0432\u0435\u0440\u0443 (\u0447\u0442\u0435\u043D\u0438\u0435 \u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u0432\u044B\u0437\u043E\u0432\u043E\u0432 \u0438\u0437 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430).",
|
|
25745
25758
|
host_permissions: matches,
|
|
25746
25759
|
content_scripts: [
|
package/docs/api-notes.md
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
# Bitrix24 API notes (reverse-engineered)
|
|
2
2
|
|
|
3
|
-
Справочник по
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
Справочник по API Bitrix24, добытый **живым реверсом**. Часть вызовов моста совпадает с
|
|
4
|
+
**публичным REST** (`tasks.task.*`, `im.recent.list`, `im.user.get`, `socialnetwork.api.workgroup.*`) —
|
|
5
|
+
по ним есть официальная документация; часть — **сугубо внутренние ajax-контроллеры**
|
|
6
|
+
(`im.v2.*`, `tasks.v2.*`, `ui.entityselector.*`), публичных доков по которым нет, только реверс.
|
|
7
|
+
Предназначен для любого ИИ-агента или разработчика, который вызывает эти методы через мост
|
|
8
|
+
(`bitrix_call` / типизированные инструменты) или расширяет каталог.
|
|
9
|
+
|
|
10
|
+
> **Официальные REST-доки** — [`apidocs.bitrix24.com`](https://apidocs.bitrix24.com) (исходники:
|
|
11
|
+
> [`github.com/bitrix24/b24restdocs`](https://github.com/bitrix24/b24restdocs); агенту с MCP context7 —
|
|
12
|
+
> библиотека `/bitrix24/b24restdocs`). Для публично-документированных методов доки применимы напрямую;
|
|
13
|
+
> для внутренних `im.v2.*`/`tasks.v2.*` — как **справочный аналог** (конверт/регистр полей могут
|
|
14
|
+
> отличаться, сверяй реверсом). Дальше по тексту такие отсылки помечены **📖**; иди по ним, если нужна
|
|
15
|
+
> деталь, которой здесь нет.
|
|
6
16
|
|
|
7
17
|
Наблюдения сняты на портале `example.bitrix24.ru` (облако, мессенджер **im.v2**, задачи в режиме
|
|
8
18
|
**scrum-борда**). Имена полей и конвенции стандартны для облачного Bitrix24, но при переносе на другой
|
|
@@ -28,7 +38,8 @@
|
|
|
28
38
|
`bitrix_chat_get_dialog_id` (dialogId по externalId), `bitrix_chat_mark_read` (⚠ мутирующий),
|
|
29
39
|
`bitrix_chat_read_all` (⚠ мутирующий).
|
|
30
40
|
- Люди/поиск: `bitrix_user_get` (карточка юзера), `bitrix_entity_selector` (загрузка селектора),
|
|
31
|
-
`bitrix_entity_search` (текстовый поиск чатов/сущностей через `ui.entityselector.doSearch`)
|
|
41
|
+
`bitrix_entity_search` (текстовый поиск чатов/сущностей через `ui.entityselector.doSearch`),
|
|
42
|
+
`bitrix_entity_chat` (chatId чата связанного объекта: задачи/группы/CRM — через `im.chat.get`).
|
|
32
43
|
|
|
33
44
|
Любое имя каталога всегда доступно и напрямую через `bitrix_call { name, params }`.
|
|
34
45
|
- **`bitrix_help`** — этот же гайд, отдаётся через MCP (инструмент + resource `bitrix://api-notes`).
|
|
@@ -83,10 +94,11 @@ JSON-тела несут sessid **только** в заголовке. Отве
|
|
|
83
94
|
| `tasks.v2.Task.View.User.count` | **json** | `{"task": {"id": N}}` | — |
|
|
84
95
|
| `tasks.v2.Task.Relation.Child.list` | **json** | `{"taskId": N, "withIds":true, "navigation":{"size":N}}` | `navigation` |
|
|
85
96
|
| `tasks.v2.Task.Relation.Related.list` | **json** | `{"taskId": N, …}` (как Child) | `navigation` |
|
|
86
|
-
| `socialnetwork.api.workgroup.list` | form | **верхний уровень**: `select[]`, `order{}`, `filter{}` | (
|
|
97
|
+
| `socialnetwork.api.workgroup.list` | form | **верхний уровень**: `select[]`, `order{}`, `filter{}` | `start` (шаг 50; `start=(N-1)*50`, `-1` — ответ без `total`) 📖 |
|
|
87
98
|
| `socialnetwork.api.workgroup.get` | form | **обёрнуто**: `params[groupId]`, `params[select][]` | — |
|
|
88
99
|
| `/rest/im.recent.list.json` | form (rest) | плоско: `LIMIT`, `SKIP_OPENLINES`, `UNREAD_ONLY`, … | `LIMIT` |
|
|
89
100
|
| `/rest/im.user.get.json` | form (rest) | плоско: `ID` | — |
|
|
101
|
+
| `/rest/im.chat.get.json` | form (rest) | плоско: `ENTITY_TYPE`, `ENTITY_ID` | — |
|
|
90
102
|
| `im.v2.Recent.load` | form | плоско: `limit`, `filter[recentSection]`, `filter[unread]`, `filter[parentId]` | `im.v2.Recent.tail` |
|
|
91
103
|
| `im.v2.Recent.tail` | form | плоско: `limit`, `filter[lastMessageDate]` (курсор), `filter[recentSection]` | `filter[lastMessageDate]` |
|
|
92
104
|
| `im.v2.Chat.load` | form | плоско: `dialogId`\|`chatId`, `messageLimit` | — |
|
|
@@ -124,6 +136,7 @@ JSON-тела несут sessid **только** в заголовке. Отве
|
|
|
124
136
|
| `chat.message.read` | `im.v2.Chat.Message.read` | form | `chatId`, `ids[0]`, `actionUuid` |
|
|
125
137
|
| `chat.read.all` | `im.v2.Chat.readAll` | form | — (⚠ мутирующий) |
|
|
126
138
|
| `im.user.get` | `/rest/im.user.get.json` | form | `ID` |
|
|
139
|
+
| `im.chat.get` | `/rest/im.chat.get.json` | form | `ENTITY_TYPE`, `ENTITY_ID` (напр. `TASKS_TASK`+taskId) |
|
|
127
140
|
| `entityselector.load` | `ui.entityselector.load` | json | `dialog` (объект) |
|
|
128
141
|
| `entityselector.search` | `ui.entityselector.doSearch` | json | `dialog`, `searchQuery{query,queryWords}` |
|
|
129
142
|
|
|
@@ -131,12 +144,44 @@ JSON-тела несут sessid **только** в заголовке. Отве
|
|
|
131
144
|
|
|
132
145
|
## 5. Справочник полей
|
|
133
146
|
|
|
134
|
-
**Задача** (`tasks.task.*`): `ID`, `TITLE`, `DESCRIPTION`,
|
|
135
|
-
`
|
|
136
|
-
`
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
147
|
+
**Задача** (`tasks.task.*`) — поля для `select`/`filter` в UPPER_CASE: `ID`, `TITLE`, `DESCRIPTION`,
|
|
148
|
+
`STATUS`, `REAL_STATUS`, `RESPONSIBLE_ID`, `CREATED_BY`, `CREATED_DATE`, `CHANGED_DATE`, `DEADLINE`,
|
|
149
|
+
`CLOSED_DATE`, `PRIORITY`, `GROUP_ID`, `TAGS`, `TIME_ESTIMATE`, **`CHAT_ID`** (id im-чата обсуждения
|
|
150
|
+
задачи — прямой резолвер `taskId → chatId`, см. §6.3), `UF_*`. Ответ ajax также подкладывает объекты
|
|
151
|
+
`group`, `responsible`, `creator`, `action`.
|
|
152
|
+
|
|
153
|
+
📖 офиц. (`tasks.task.get` / `tasks.task.list`) — полный набор полей задачи, среди прочего: `parentId`,
|
|
154
|
+
`stageId`, `sprintId`, `backlogId`, `commentsCount`, `serviceCommentsCount`, `timeEstimate`,
|
|
155
|
+
`timeSpentInLogs`, `favorite`, `flowId`, `mark`, `accomplices[]`, `auditors[]`, `checklist{}`,
|
|
156
|
+
`subStatus`. В официальном REST-ответе поля приходят **camelCase** (`groupId`, `responsibleId`), тогда
|
|
157
|
+
как в `select`/`filter` они всегда **UPPER_CASE**; наш ajax-вариант может отдавать иначе — сверяй
|
|
158
|
+
реверсом. Доп. вычисления включаются флагом `params{WITH_TIMER_INFO, WITH_RESULT_INFO, WITH_PARSED_DESCRIPTION}`.
|
|
159
|
+
|
|
160
|
+
Статусы (`REAL_STATUS` — «настоящее» числовое состояние): `1` Новая · `2` Ждёт выполнения ·
|
|
161
|
+
`3` Выполняется · `4` Ждёт контроля · `5` Завершена · `6` Отложена · `7` Отклонена. Поле `STATUS`
|
|
162
|
+
поверх этого несёт **мета-состояния** отображения (почти просрочена / не просмотрена / просрочена),
|
|
163
|
+
поэтому «работает ли задача сейчас» фильтруй по **`REAL_STATUS`** (напр. `{"REAL_STATUS":3}`), а не
|
|
164
|
+
по `STATUS` (📖 `tasks.task.list`).
|
|
165
|
+
|
|
166
|
+
**Фильтр `tasks.task.list`.** Перед именем поля ставится оператор: `!` (не равно / исключить),
|
|
167
|
+
`<`, `<=`, `>`, `>=`, `%` (LIKE-подстрока). Напр. `{"!REAL_STATUS":5}` — все **незакрытые**,
|
|
168
|
+
`{">=DEADLINE":"2026-07-01"}` — дедлайн не раньше даты, `{"%TITLE":"карта"}` — по подстроке названия.
|
|
169
|
+
Фильтруемые поля: `ID`, `PARENT_ID`, `GROUP_ID`, `CREATED_BY`, `RESPONSIBLE_ID`, `ACCOMPLICE`,
|
|
170
|
+
`AUDITOR`, `REAL_STATUS`, `STATUS`, `PRIORITY`, `TAG`, `STAGE_ID`, `SPRINT_ID`, `BACKLOG_ID`,
|
|
171
|
+
`DEADLINE`, `*_DATE`, `UF_CRM_TASK`.
|
|
172
|
+
|
|
173
|
+
> **«Мои задачи» ≠ только `RESPONSIBLE_ID`.** Роли участника раздельны: ответственный
|
|
174
|
+
> (`RESPONSIBLE_ID`), соисполнитель (`ACCOMPLICE`), наблюдатель (`AUDITOR`), постановщик
|
|
175
|
+
> (`CREATED_BY`). Единого «любая роль» поля в `list` нет — чтобы собрать **все** свои задачи,
|
|
176
|
+
> объедини результаты нескольких вызовов (минимум `RESPONSIBLE_ID` + `ACCOMPLICE`). Тонкость:
|
|
177
|
+
> в **`filter`** роли в **единственном** числе (`ACCOMPLICE`/`AUDITOR`), а в **`select`** — во
|
|
178
|
+
> **множественном** (`ACCOMPLICES`/`AUDITORS`). Не путай.
|
|
179
|
+
|
|
180
|
+
> **Scrum-задачи (спринты).** Поле `SPRINT_ID` на задаче и жёсткий фильтр `filter[SPRINT_ID]`
|
|
181
|
+
> могут расходиться: задача числится за спринтом по своему полю, но не попадает в выборку по фильтру
|
|
182
|
+
> (вероятно, возвращена в бэклог или в иной stage). Если по фильтру «маловато» — перепроверь без него
|
|
183
|
+
> и отфильтруй по `SPRINT_ID`/`STAGE_ID` на стороне агента. Точного API колонок scrum-доски
|
|
184
|
+
> (`STAGE_ID` → имя колонки) в текущем каталоге нет — это кандидат на реверс.
|
|
140
185
|
|
|
141
186
|
**Задача v2** (`tasks.v2.*`): id задачи передаётся вложенно — **`{"task": {"id": N}}`** (у `Task.get` и
|
|
142
187
|
`Task.View.User.count`), а у `Scrum.getTaskInfo` и `Relation.*` — плоско `{"taskId": N}`. Это отдельная
|
|
@@ -144,11 +189,19 @@ JSON-тела несут sessid **только** в заголовке. Отве
|
|
|
144
189
|
|
|
145
190
|
**Группа/проект — список** (`workgroup.list`, camelCase в ответе): `ID`, `NAME`, `DESCRIPTION`,
|
|
146
191
|
`NUMBER_OF_MEMBERS`, `OWNER_ID`, `DATE_CREATE`, `PROJECT` (Y/N), `TYPE`.
|
|
192
|
+
📖 офиц. (`socialnetwork.api.workgroup.list`) — фильтруемые поля: `ID`, `NAME`, `OWNER_ID`, `ACTIVE`,
|
|
193
|
+
`VISIBLE`, `OPENED`, `CLOSED`, `PROJECT` (Y=проект/N=группа), `SUBJECT_ID`, `SITE_ID`, `DATE_CREATE`,
|
|
194
|
+
`DATE_UPDATE`, `DATE_ACTIVITY`; операторы фильтра `>= > <= < % =% %= !% != !`; без `select` вернётся
|
|
195
|
+
только `ID`. Старый публичный аналог — `sonet_group.get` (те же поля/пагинация, ключи `FILTER`/`ORDER`
|
|
196
|
+
капсом).
|
|
147
197
|
**Группа — карточка** (`workgroup.get`): плюс `OWNER_DATA`, `SUBJECT_DATA`, `MEMBERS[]`,
|
|
148
198
|
`MODERATOR_MEMBERS[]`, `CHAT_ID`, `DIALOG_ID`, `IMAGE_ID`, UF-поля.
|
|
149
199
|
|
|
150
|
-
**Недавний чат** (`im.recent.list`): `
|
|
151
|
-
`
|
|
200
|
+
**Недавний чат** (`im.recent.list`): `id` (это dialogId: число = юзер, `"chat"+N` = чат), `chat_id`,
|
|
201
|
+
`type` (`user`/`chat`), `title`, `message{id,text,file,author_id,date,status,uuid}`, `counter` (число
|
|
202
|
+
непрочитанных), `unread` (bool), `last_id`, `pinned`, `date_update`, `date_last_activity`, `user{…}`,
|
|
203
|
+
`chat{… entity_type, entity_id, owner, …}`. Есть ли ещё страницы — флаги `hasMore`/`hasMorePages`
|
|
204
|
+
(📖 `im.recent.list`).
|
|
152
205
|
**Недавние по секции** (`im.v2.Recent.load`): фильтр `filter[recentSection]` — `default` (обычные
|
|
153
206
|
диалоги), **`tasksTask` (чаты задач)**, `collab`/`collabDefault` (коллабы). Листание вглубь —
|
|
154
207
|
`im.v2.Recent.tail` с курсором `filter[lastMessageDate]` (ISO-дата последнего элемента страницы).
|
|
@@ -163,6 +216,11 @@ JSON-тела несут sessid **только** в заголовке. Отве
|
|
|
163
216
|
- `dialogId` = **`"chat"+CHAT_ID`** (напр. `"chat7111"`) → **групповой чат** (проекта/задачи/канала).
|
|
164
217
|
- `chatId` = числовой `CHAT_ID` — то же, что групповой `dialogId`, но без префикса.
|
|
165
218
|
|
|
219
|
+
📖 офиц. формат `DIALOG_ID` (`im.dialog.get`): `XXX` — личный (userId), `chatXXX` — чат, **`sgXXX`** —
|
|
220
|
+
чат соцгруппы/проекта напрямую (напр. `sg15`). В публичном REST это единый параметр; наш внутренний
|
|
221
|
+
`im.v2.Chat.load` надёжно принимает `dialogId`/`chatId`, а форму `sgXXX` для него сверь реверсом —
|
|
222
|
+
гарантированный путь к чату группы это `bitrix_chat_get_dialog_id { externalId:"sg<groupId>" }`.
|
|
223
|
+
|
|
166
224
|
Ответ `chat.load` возвращает числовой `chatId` — используй его дальше для `chat.messages` /
|
|
167
225
|
`chat.messages.tail` (листание вглубь) и `chat.message.read` (эти три работают по `chatId`, не по `dialogId`).
|
|
168
226
|
|
|
@@ -203,10 +261,49 @@ bitrix_chat_history { "chatId": 485, "beforeId": 1861279 }
|
|
|
203
261
|
bitrix_chat_mark_read { "chatId": 40271, "ids": [1884131] }
|
|
204
262
|
```
|
|
205
263
|
|
|
206
|
-
### 6.1.
|
|
264
|
+
### 6.1. Мессенджер (IM): модель адресации и как получить `chatId`
|
|
265
|
+
|
|
266
|
+
**IM** (`im.v2`) — встроенный мессенджер Bitrix24. Всё общение — это **чаты**: личные
|
|
267
|
+
1-на-1, групповые (проектов, каналов) и **чаты-обсуждения задач**. У каждого чата есть числовой
|
|
268
|
+
**`chatId`** — это ключ ко всем операциям с сообщениями (`bitrix_chat_messages`,
|
|
269
|
+
`bitrix_chat_history`, `bitrix_chat_mark_read`). Прежде чем читать сообщения, нужно **получить
|
|
270
|
+
`chatId`** — почти любая ошибка агента здесь именно в этом шаге.
|
|
271
|
+
|
|
272
|
+
**Три идентификатора одного чата** (не путай — годятся для разных операций):
|
|
273
|
+
|
|
274
|
+
| Идентификатор | Что это | Пример | Куда передавать |
|
|
275
|
+
|---|---|---|---|
|
|
276
|
+
| `chatId` | числовой id чата | `485` | сообщения / история / отметка прочитанным |
|
|
277
|
+
| `dialogId` | адрес для ОТКРЫТИЯ: `userId` (личный 1-на-1) **или** `"chat"+chatId` (групповой) | `11`, `"chat485"` | `bitrix_chat_load` |
|
|
278
|
+
| `externalId` | внешний ключ сущности → резолвится в `dialogId` | `"sg15"` (соцгруппа 15) | `bitrix_chat_get_dialog_id` |
|
|
279
|
+
|
|
280
|
+
Ключевое: **личный чат с человеком = его `userId` в роли `dialogId`** (отдельного «id чата» у
|
|
281
|
+
1-на-1 знать не нужно). `bitrix_chat_load` принимает `dialogId` **или** `chatId` и всегда
|
|
282
|
+
**возвращает числовой `chatId`** — дальше оперируешь им.
|
|
283
|
+
|
|
284
|
+
**Как получить `chatId` — по цели (дерево решений):**
|
|
285
|
+
|
|
286
|
+
| Хочу открыть чат… | Шаги |
|
|
287
|
+
|---|---|
|
|
288
|
+
| **с пользователем по ИМЕНИ** | `bitrix_entity_search { query:"дмитрий" }` → вернёт диалог с `dialogId` = его userId → `bitrix_chat_load { dialogId }` |
|
|
289
|
+
| **с пользователем, id известен** | `bitrix_chat_load { dialogId: <userId> }` (userId — из задачи `RESPONSIBLE_ID`/`CREATED_BY`, из `bitrix_chats_recent`, из `bitrix_user_get`) |
|
|
290
|
+
| **обсуждение ЗАДАЧИ** | `bitrix_recent_load { section:"tasksTask" }` **или** `bitrix_entity_search { query:"<название>", section:"tasksTask" }` → `chatId`/`dialogId` → `bitrix_chat_load` (§6.3) |
|
|
291
|
+
| **ПРОЕКТА/группы** | `bitrix_task_get`→`GROUP_ID`→`bitrix_project_get`→`CHAT_ID`; либо `bitrix_chat_get_dialog_id { externalId:"sg<groupId>" }` |
|
|
292
|
+
| **не знаю точно, какой** | `bitrix_chats_recent` (недавние, сопоставь по `title`/`user`) или `bitrix_entity_search { query }` (поиск по названию) |
|
|
293
|
+
|
|
294
|
+
> Почему не «просто список чатов»: `bitrix_chats_recent` (`im.recent.list`) отдаёт лишь недавние и
|
|
295
|
+
> **без чатов задач**. Для поиска конкретного чата — `bitrix_entity_search`; для чатов задач —
|
|
296
|
+
> `bitrix_recent_load { section:"tasksTask" }`.
|
|
297
|
+
|
|
298
|
+
📖 Публичные аналоги чтения сообщений (если нужно глубже разобраться в модели): `im.dialog.messages.get`
|
|
299
|
+
— по умолчанию отдаёт последние (дефолт 20, макс 50), листание `LAST_ID` (старее) / `FIRST_ID` (новее);
|
|
300
|
+
`imbot.v2 chat.getMessageContext` — ответ `messages[]` (oldest→newest) + `users[]` +
|
|
301
|
+
`hasPrevPage`/`hasNextPage`, что **совпадает по форме** с нашими внутренними `im.v2.Chat.Message.*`.
|
|
302
|
+
|
|
303
|
+
### 6.2. Сценарий: чат с конкретным пользователем
|
|
207
304
|
|
|
208
305
|
Личный чат 1-на-1 адресуется `dialogId` = **ID пользователя**. Id берётся из задачи
|
|
209
|
-
(`RESPONSIBLE_ID`/`CREATED_BY`), из `bitrix_chats_recent`, либо резолвится поиском (§6.
|
|
306
|
+
(`RESPONSIBLE_ID`/`CREATED_BY`), из `bitrix_chats_recent`, либо резолвится поиском по имени (§6.4).
|
|
210
307
|
|
|
211
308
|
```jsonc
|
|
212
309
|
// 1) открыть личный чат с пользователем 11 → в ответе будет числовой chatId
|
|
@@ -215,11 +312,33 @@ bitrix_chat_load { "dialogId": 11 }
|
|
|
215
312
|
bitrix_chat_history { "chatId": 485, "beforeId": 1861279 }
|
|
216
313
|
```
|
|
217
314
|
|
|
218
|
-
### 6.
|
|
315
|
+
### 6.3. Сценарий: обсуждение (чат) конкретной задачи
|
|
316
|
+
|
|
317
|
+
У каждой задачи есть свой im-чат-обсуждение. Самый надёжный путь — прямой резолв из карточки задачи;
|
|
318
|
+
поиск по названию — запасной.
|
|
319
|
+
|
|
320
|
+
**А. Прямой — `CHAT_ID` из карточки задачи (предпочтительно).** `bitrix_task_get` возвращает `CHAT_ID`
|
|
321
|
+
чата-обсуждения (он входит в дефолтный `select`). Это прямой `taskId → chatId` **без** поиска по
|
|
322
|
+
названию и без риска промаха по тёзкам-заголовкам:
|
|
323
|
+
|
|
324
|
+
```jsonc
|
|
325
|
+
bitrix_task_get { "taskId": 28373 } // в ответе CHAT_ID = id чата обсуждения
|
|
326
|
+
bitrix_chat_load { "chatId": <CHAT_ID> }
|
|
327
|
+
bitrix_chat_history { "chatId": <CHAT_ID>, "beforeId": <мин id страницы> }
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
📖 офиц.: в `tasks.task.get` поле `CHAT_ID` отдаётся по умолчанию (tasks-new.md). Общий
|
|
331
|
+
резолвер-альтернатива — **`bitrix_entity_chat`** (обёртка над `im.chat.get`): по паре
|
|
332
|
+
`entityType`/`entityId` отдаёт chatId связанного объекта — для задачи `entityType="TASKS_TASK"`,
|
|
333
|
+
`entityId=<taskId>`; так же адресуются чаты `SONET_GROUP` (группа/проект), `CRM`, `CALENDAR`, `MAIL`,
|
|
334
|
+
`VIDEOCONF`, `CALL`:
|
|
219
335
|
|
|
220
|
-
|
|
336
|
+
```jsonc
|
|
337
|
+
bitrix_entity_chat { "entityType": "TASKS_TASK", "entityId": 28373 } // → chatId
|
|
338
|
+
bitrix_chat_load { "chatId": <chatId> }
|
|
339
|
+
```
|
|
221
340
|
|
|
222
|
-
|
|
341
|
+
**Б. Через список чатов задач.** `im.v2.Recent.load` с секцией `tasksTask` отдаёт чаты задач
|
|
223
342
|
(в `bitrix_chats_recent` / `/rest/im.recent.list` их НЕТ). Листать вглубь — `bitrix_recent_tail`.
|
|
224
343
|
|
|
225
344
|
```jsonc
|
|
@@ -230,7 +349,7 @@ bitrix_chat_load { "dialogId": "chat38849" } // или { "chatId": 38
|
|
|
230
349
|
bitrix_chat_history { "chatId": 38849, "beforeId": 1722353 }
|
|
231
350
|
```
|
|
232
351
|
|
|
233
|
-
|
|
352
|
+
**В. Поиском по названию задачи** — `bitrix_entity_search` с секцией `tasksTask` (запасной, матч по тексту):
|
|
234
353
|
|
|
235
354
|
```jsonc
|
|
236
355
|
bitrix_entity_search { "query": "трекер", "section": "tasksTask" }
|
|
@@ -245,10 +364,12 @@ bitrix_chat_load { "dialogId": "chat7111" }
|
|
|
245
364
|
bitrix_chat_get_dialog_id { "externalId": "sg15" } // либо резолв dialogId соцгруппы напрямую
|
|
246
365
|
```
|
|
247
366
|
|
|
248
|
-
### 6.
|
|
367
|
+
### 6.4. Сценарий: поиск чата / пользователя
|
|
249
368
|
|
|
250
369
|
Текстовый поиск — `bitrix_entity_search` (обёртка над `ui.entityselector.doSearch`): сам собирает
|
|
251
|
-
диалог `IM_CHAT_SEARCH` и `searchQuery` из
|
|
370
|
+
диалог `IM_CHAT_SEARCH` и `searchQuery` из строки. `ui.entityselector.*` — **внутренний UI-метод, в
|
|
371
|
+
публичных доках его нет** (форма запроса/ответа — только реверс); публичные аналоги для поиска людей —
|
|
372
|
+
`user.get`/`user.search`, для чатов — `im.recent.list` + фильтрация на стороне агента.
|
|
252
373
|
|
|
253
374
|
```jsonc
|
|
254
375
|
bitrix_entity_search { "query": "дмитрий" } // среди всех чатов/диалогов
|
|
@@ -263,10 +384,10 @@ bitrix_recent_load { "section": "tasksTask" }
|
|
|
263
384
|
bitrix_user_get { "userId": 11 } // резолв authorId → имя
|
|
264
385
|
```
|
|
265
386
|
|
|
266
|
-
### 6.
|
|
387
|
+
### 6.5. Легаси-комментарии задачи (HTML-поддомен — пока НЕ в мосте)
|
|
267
388
|
|
|
268
389
|
У задач два независимых фида обсуждения:
|
|
269
|
-
- **im.v2-чат** — структурный JSON, читается уже сейчас (§6.
|
|
390
|
+
- **im.v2-чат** — структурный JSON, читается уже сейчас (§6.3); обычно этого достаточно.
|
|
270
391
|
- **Форумные легаси-комментарии** — рендерятся как **HTML** в side-slider'е. Это отдельный
|
|
271
392
|
«HTML-поддомен» внутреннего API, который **текущий мост не поддерживает** (блокеры ниже).
|
|
272
393
|
|
|
@@ -306,13 +427,22 @@ headers: bx-ajax: true, x-bitrix-site-id: s1 (плюс обычный X-Bitrix-C
|
|
|
306
427
|
|
|
307
428
|
## 7. Как расширить (новый домен: календарь, диск, CRM, …)
|
|
308
429
|
|
|
430
|
+
> Совет: сперва проверь, задокументирован ли метод в 📖 [`apidocs.bitrix24.com`](https://apidocs.bitrix24.com)
|
|
431
|
+
> (context7: `/bitrix24/b24restdocs`). Для публичных `*.list`/`*.get` там готовые поля, фильтры и
|
|
432
|
+
> пагинация — реверс тогда нужен лишь чтобы подтвердить транспорт (form/json) и конверт ответа. Для
|
|
433
|
+
> внутренних `im.v2.*`/`tasks.v2.*`/UI-методов доков нет — только реверс (`docs/reconnaissance.md`).
|
|
434
|
+
|
|
309
435
|
1. Сними реальные вызовы (`docs/reconnaissance.md` — авто-запись `bun run capture` или HAR →
|
|
310
436
|
`bun run catalog:draft`). Черновик `actions.draft.json` накапливает **все уникальные комбинации
|
|
311
437
|
параметров** на экшен и проставляет `bodyType` (form/json) автоматически.
|
|
312
438
|
2. Определи транспорт по разделу 3: если черновик показал `"bodyType": "json"` — перенеси его в запись.
|
|
313
|
-
3. Добавь запись в `actions.json` (может быть мутирующей — каталог это допускает).
|
|
314
|
-
|
|
315
|
-
|
|
439
|
+
3. Добавь запись в `actions.json` (может быть мутирующей — каталог это допускает).
|
|
440
|
+
4. Если удобно — оберни в типизированный инструмент в `src/tools/register.ts` (обёртка регистрируется
|
|
441
|
+
только если её `catalogName` есть в каталоге).
|
|
442
|
+
5. **`bun run sync:runtime`** — доставь изменения живому daemon: пересобрать бандл, скопировать
|
|
443
|
+
репо-`actions.json` в `~/.bitrix24-mcp-bridge/actions.json` и погасить daemon. Без этого агент
|
|
444
|
+
новых имён/инструментов не увидит (daemon читает runtime-папку, не репо). Проверь через
|
|
445
|
+
`bitrix_call { name, params }` или новую обёртку.
|
|
316
446
|
|
|
317
447
|
> `actions.json` / `actions.draft.json` — данные конкретного портала (gitignored). Этот файл
|
|
318
448
|
> (`api-notes.md`) — переносимые знания о самом API; держи его в актуальном состоянии при добавлении
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "bitrix24-mcp-bridge",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.3.0",
|
|
5
5
|
"description": "MCP bridge server for Bitrix24 — exposes REST API access, tasks, projects and chat to MCP clients like Claude Code.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -29,7 +29,8 @@
|
|
|
29
29
|
"prepare": "node scripts/build-dist.mjs && node scripts/build-ext-static.mjs",
|
|
30
30
|
"capture": "bun run src/capture-server.ts",
|
|
31
31
|
"catalog:draft": "bun run src/catalog/build-catalog.ts captured.har > actions.draft.json",
|
|
32
|
-
"catalog": "bun run src/catalog/build-catalog.ts"
|
|
32
|
+
"catalog": "bun run src/catalog/build-catalog.ts",
|
|
33
|
+
"sync:runtime": "bun run scripts/sync-runtime.ts"
|
|
33
34
|
},
|
|
34
35
|
"dependencies": {
|
|
35
36
|
"@modelcontextprotocol/sdk": "^1.12.0",
|