bitrix24-mcp-bridge 0.4.0 → 0.5.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/actions.example.json +2 -0
- package/dist/cli.js +230 -12
- package/docs/api-notes.md +38 -0
- package/package.json +1 -1
package/actions.example.json
CHANGED
|
@@ -27,6 +27,8 @@
|
|
|
27
27
|
|
|
28
28
|
"task.subtasks": { "action": "tasks.v2.Task.Relation.Child.list", "method": "POST", "bodyType": "json" },
|
|
29
29
|
"task.related": { "action": "tasks.v2.Task.Relation.Related.list", "method": "POST", "bodyType": "json" },
|
|
30
|
+
"task.comments.page": { "endpoint": "/task/comments/{taskId}/", "method": "GET", "params": { "IFRAME": "Y", "IFRAME_TYPE": "SIDE_SLIDER" }, "responseType": "text" },
|
|
31
|
+
"task.comments.navigate": { "endpoint": "/bitrix/services/main/ajax.php?mode=class&c=bitrix%3Aforum.comments&action=navigateComment", "method": "POST", "params": { "AJAX_POST": "Y", "MODE": "LIST", "PAGEN_1": 1, "scope": "web", "IFRAME": "Y", "IFRAME_TYPE": "SIDE_SLIDER" } },
|
|
30
32
|
|
|
31
33
|
"call.detail": { "endpoint": "/call/detail/{callId}", "method": "GET", "params": { "IFRAME": "Y", "IFRAME_TYPE": "SIDE_SLIDER" }, "responseType": "text" }
|
|
32
34
|
}
|
package/dist/cli.js
CHANGED
|
@@ -7234,26 +7234,26 @@ var require_permessage_deflate = __commonJS({
|
|
|
7234
7234
|
value = value[0];
|
|
7235
7235
|
if (key === "client_max_window_bits") {
|
|
7236
7236
|
if (value !== true) {
|
|
7237
|
-
const
|
|
7238
|
-
if (!Number.isInteger(
|
|
7237
|
+
const num3 = +value;
|
|
7238
|
+
if (!Number.isInteger(num3) || num3 < 8 || num3 > 15) {
|
|
7239
7239
|
throw new TypeError(
|
|
7240
7240
|
`Invalid value for parameter "${key}": ${value}`
|
|
7241
7241
|
);
|
|
7242
7242
|
}
|
|
7243
|
-
value =
|
|
7243
|
+
value = num3;
|
|
7244
7244
|
} else if (!this._isServer) {
|
|
7245
7245
|
throw new TypeError(
|
|
7246
7246
|
`Invalid value for parameter "${key}": ${value}`
|
|
7247
7247
|
);
|
|
7248
7248
|
}
|
|
7249
7249
|
} else if (key === "server_max_window_bits") {
|
|
7250
|
-
const
|
|
7251
|
-
if (!Number.isInteger(
|
|
7250
|
+
const num3 = +value;
|
|
7251
|
+
if (!Number.isInteger(num3) || num3 < 8 || num3 > 15) {
|
|
7252
7252
|
throw new TypeError(
|
|
7253
7253
|
`Invalid value for parameter "${key}": ${value}`
|
|
7254
7254
|
);
|
|
7255
7255
|
}
|
|
7256
|
-
value =
|
|
7256
|
+
value = num3;
|
|
7257
7257
|
} else if (key === "client_no_context_takeover" || key === "server_no_context_takeover") {
|
|
7258
7258
|
if (value !== true) {
|
|
7259
7259
|
throw new TypeError(
|
|
@@ -7967,8 +7967,8 @@ var require_receiver = __commonJS({
|
|
|
7967
7967
|
return;
|
|
7968
7968
|
}
|
|
7969
7969
|
const buf = this.consume(8);
|
|
7970
|
-
const
|
|
7971
|
-
if (
|
|
7970
|
+
const num3 = buf.readUInt32BE(0);
|
|
7971
|
+
if (num3 > Math.pow(2, 53 - 32) - 1) {
|
|
7972
7972
|
const error2 = this.createError(
|
|
7973
7973
|
RangeError,
|
|
7974
7974
|
"Unsupported WebSocket frame: payload length > 2^53 - 1",
|
|
@@ -7979,7 +7979,7 @@ var require_receiver = __commonJS({
|
|
|
7979
7979
|
cb(error2);
|
|
7980
7980
|
return;
|
|
7981
7981
|
}
|
|
7982
|
-
this._payloadLength =
|
|
7982
|
+
this._payloadLength = num3 * Math.pow(2, 32) + buf.readUInt32BE(4);
|
|
7983
7983
|
this.haveLength(cb);
|
|
7984
7984
|
}
|
|
7985
7985
|
/**
|
|
@@ -25428,7 +25428,7 @@ import { join as join6 } from "node:path";
|
|
|
25428
25428
|
// src/tools/help.ts
|
|
25429
25429
|
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
25430
25430
|
var API_NOTES = fileURLToPath2(new URL("../../docs/api-notes.md", import.meta.url));
|
|
25431
|
-
var HELP = '# Bitrix24 API notes (reverse-engineered)\n\n\u041A\u0430\u043A \u0430\u0433\u0435\u043D\u0442\u0443 \u0440\u0430\u0431\u043E\u0442\u0430\u0442\u044C \u0441 Bitrix24 \u0447\u0435\u0440\u0435\u0437 \u044D\u0442\u043E\u0442 \u043C\u043E\u0441\u0442: \u0444\u043E\u0440\u043C\u0430\u0442 `params`, \u0438\u043C\u0435\u043D\u0430 \u043F\u043E\u043B\u0435\u0439, \u0433\u043E\u0442\u043E\u0432\u044B\u0435 \u0446\u0435\u043F\u043E\u0447\u043A\u0438 \u0432\u044B\u0437\u043E\u0432\u043E\u0432.\n\n\u0414\u0432\u0435 \u043F\u043E\u0432\u0435\u0440\u0445\u043D\u043E\u0441\u0442\u0438 API. **\u041F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0439 REST** (`tasks.task.*`, `im.recent.list`, `im.user.get`, `im.chat.get`,\n`socialnetwork.api.workgroup.*`) \u2014 \u0435\u0441\u0442\u044C \u043E\u0444\u0438\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0435 \u0434\u043E\u043A\u0438, \u0441\u0441\u044B\u043B\u043A\u0438 \u043D\u0430 \u043D\u0438\u0445 \u043F\u043E\u043C\u0435\u0447\u0435\u043D\u044B **\u{1F4D6}**\n([`apidocs.bitrix24.com`](https://apidocs.bitrix24.com); \u0430\u0433\u0435\u043D\u0442\u0443 \u0441 MCP context7 \u2014 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430\n`/bitrix24/b24restdocs`). **\u0412\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0435 ajax-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u044B** (`im.v2.*`, `tasks.v2.*`, `ui.entityselector.*`)\n\u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0445 \u0434\u043E\u043A\u043E\u0432 \u043D\u0435 \u0438\u043C\u0435\u044E\u0442 \u2014 \u0432\u0441\u0451 \u043D\u0438\u0436\u0435 \u0434\u043E\u0431\u044B\u0442\u043E \u0436\u0438\u0432\u044B\u043C \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C; \u043A\u043E\u043D\u0432\u0435\u0440\u0442 \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043F\u043E\u043B\u0435\u0439 \u0443 \u043D\u0438\u0445 \u043C\u043E\u0433\u0443\u0442\n\u043E\u0442\u043B\u0438\u0447\u0430\u0442\u044C\u0441\u044F \u043E\u0442 \u{1F4D6}-\u0430\u043D\u0430\u043B\u043E\u0433\u043E\u0432. \u0418\u043C\u0435\u043D\u0430 \u043F\u043E\u043B\u0435\u0439 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B \u0434\u043B\u044F \u043E\u0431\u043B\u0430\u0447\u043D\u043E\u0433\u043E Bitrix24; \u043D\u0430 \u0434\u0440\u0443\u0433\u043E\u043C \u043F\u043E\u0440\u0442\u0430\u043B\u0435 \u0441\u0432\u0435\u0440\u044F\u0439\u0441\u044F\n\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- **\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** (`bitrix_tasks_list`, `bitrix_task_get`, `bitrix_chat_load`, \u2026) \u2014\n \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; \u0438\u0445 \u043F\u043E\u043B\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A \u0438 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u044F \u0432\u0438\u0434\u043D\u044B \u0441\u0440\u0435\u0434\u0438 MCP-\u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432. \u0422\u043E\u0447\u043D\u0430\u044F\n \u0432\u044B\u0431\u043E\u0440\u043A\u0430 \u2014 \u043E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u043C `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.\n- **`bitrix_call { name, params }`** \u2014 \u043B\u044E\u0431\u043E\u0435 \u0438\u043C\u044F \u0438\u0437 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 (`actions.json`), `params` \u0432 \u043D\u0430\u0442\u0438\u0432\u043D\u043E\u043C\n \u0444\u043E\u0440\u043C\u0430\u0442\u0435 Bitrix (\xA73). \u041F\u043E\u043B\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A \u0438\u043C\u0451\u043D \u043E\u0442\u0434\u0430\u0451\u0442 \u0441\u0430\u043C `bitrix_call` \u0432 \u0441\u0432\u043E\u0451\u043C \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0438.\n- \u041A\u0430\u0442\u0430\u043B\u043E\u0433 \u043C\u043E\u0436\u0435\u0442 \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C **\u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0435** \u0432\u044B\u0437\u043E\u0432\u044B: \u043D\u0430\u043B\u0438\u0447\u0438\u0435 \u0437\u0430\u043F\u0438\u0441\u0438 = \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u0432\u044B\u0437\u0432\u0430\u0442\u044C. \u042D\u0442\u043E \u043D\u0435 \u0440\u0435\u0436\u0438\u043C\n \xAB\u0442\u043E\u043B\u044C\u043A\u043E \u0447\u0442\u0435\u043D\u0438\u0435\xBB.\n- \u0423 \u043E\u0431\u0451\u0440\u0442\u043E\u043A \u0435\u0441\u0442\u044C \u0434\u0435\u0444\u043E\u043B\u0442\u044B (\u043D\u0430\u043F\u0440. `bitrix_tasks_list` \u0441\u043E\u0440\u0442\u0438\u0440\u0443\u0435\u0442 `{"ID":"desc"}`), \u0443 `bitrix_call` \u0438\u0445 \u043D\u0435\u0442 \u2014\n \u043E\u0434\u0438\u043D \u0438 \u0442\u043E\u0442 \u0436\u0435 \u0444\u0438\u043B\u044C\u0442\u0440 \u0434\u0430\u0441\u0442 \u0440\u0430\u0437\u043D\u044B\u0435 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B. \u0421\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u0435\u0448\u044C \u0432\u044B\u0434\u0430\u0447\u0438 \u2014 \u0437\u0430\u0434\u0430\u0432\u0430\u0439 `order` \u044F\u0432\u043D\u043E.\n- \u041E\u0442\u0432\u0435\u0442 `invalid_csrf` / `invalid_authentication` = \u0441\u0435\u0441\u0441\u0438\u044F \u043F\u043E\u0440\u0442\u0430\u043B\u0430 \u043F\u0440\u043E\u0442\u0443\u0445\u043B\u0430 \u2192 \u043F\u0435\u0440\u0435\u043B\u043E\u0433\u0438\u043D\u044C\u0441\u044F \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435\n \u043D\u0430 \u0432\u043A\u043B\u0430\u0434\u043A\u0435 \u043F\u043E\u0440\u0442\u0430\u043B\u0430.\n\n---\n\n## 2. \u0424\u043E\u0440\u043C\u0430\u0442 \u043E\u0442\u0432\u0435\u0442\u0430\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 = `status:"success"` \u0438/\u0438\u043B\u0438 **\u043F\u0443\u0441\u0442\u043E\u0439** `errors`. \u041D\u0435\u043F\u0443\u0441\u0442\u043E\u0439 `errors` / `status:"error"` / top-level\n`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 \u0435\u0451 \u0432 `ok:false`). REST-\u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u044B (`/rest/*.json`) \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0442\n\u0438\u043D\u0430\u0447\u0435: `{ "result": \u2026, "next", "total", "time" }` \u2014 \u0431\u0435\u0437 `errors`.\n\n---\n\n## 3. \u041A\u0430\u0442\u0430\u043B\u043E\u0433: \u0438\u043C\u044F \u2192 action \u2192 params\n\n\u0424\u043E\u0440\u043C\u0430 `params` \u0440\u0430\u0437\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043F\u043E \u043C\u0435\u0442\u043E\u0434\u0443: \u0433\u0434\u0435-\u0442\u043E \u043F\u043B\u043E\u0441\u043A\u043E, \u0433\u0434\u0435-\u0442\u043E \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E, \u0433\u0434\u0435-\u0442\u043E \u043E\u0431\u0451\u0440\u043D\u0443\u0442\u043E \u0432 `params[\u2026]` \u2014\n\u043A\u043E\u043B\u043E\u043D\u043A\u0430 \xABparams\xBB \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442 \u0442\u043E\u0447\u043D\u0443\u044E \u0444\u043E\u0440\u043C\u0443 (\u043A\u043E\u0434\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0442\u0435\u043B\u0430 \u043C\u043E\u0441\u0442 \u0431\u0435\u0440\u0451\u0442 \u043D\u0430 \u0441\u0435\u0431\u044F).\n\n| \u0418\u043C\u044F (`bitrix_call`) | action / endpoint | params | \u041F\u0430\u0433\u0438\u043D\u0430\u0446\u0438\u044F |\n|---|---|---|---|\n| `tasks.list` | `tasks.task.list` | \u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C: `filter{RESPONSIBLE_ID,REAL_STATUS,GROUP_ID,\u2026}`, `select[]`, `order{}` | **`PAGEN_1`** \u2014 \u043D\u043E\u043C\u0435\u0440 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B (1, 2, 3\u2026), \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 = 20 \u0437\u0430\u0434\u0430\u0447; `start` **\u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442** (\u0432\u0435\u0440\u043D\u0451\u0442 \u0442\u0443 \u0436\u0435 \u043F\u0435\u0440\u0432\u0443\u044E \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443) |\n| `task.get` | `tasks.task.get` | \u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C: `taskId`, `select[]` | \u2014 |\n| `task.v2.get` | `tasks.v2.Task.get` | \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E: `{"task":{"id":N}}` | \u2014 |\n| `task.scrum.info` | `tasks.v2.Scrum.getTaskInfo` | `{"taskId":N}` | \u2014 |\n| `task.files` | `tasks.v2.File.listObjects` | `{"ids":[N,\u2026]}` | \u2014 |\n| `task.views.count` | `tasks.v2.Task.View.User.count` | \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E: `{"task":{"id":N}}` | \u2014 |\n| `task.subtasks` | `tasks.v2.Task.Relation.Child.list` | `{"taskId":N,"withIds":true,"navigation":{"size":N}}` | `navigation` |\n| `task.related` | `tasks.v2.Task.Relation.Related.list` | \u043A\u0430\u043A `task.subtasks` | `navigation` |\n| `projects.list` | `socialnetwork.api.workgroup.list` | \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| `projects.get` | `socialnetwork.api.workgroup.get` | **\u043E\u0431\u0451\u0440\u043D\u0443\u0442\u043E**: `params[groupId]`, `params[select][]` | \u2014 |\n| `chats.recent` | `/rest/im.recent.list.json` | \u043F\u043B\u043E\u0441\u043A\u043E: `LIMIT`, `SKIP_OPENLINES`, `UNREAD_ONLY` | `LIMIT` |\n| `recent.load` | `im.v2.Recent.load` | \u043F\u043B\u043E\u0441\u043A\u043E: `limit`, `filter[recentSection]` (`tasksTask`/`collab`/\u2026), `filter[unread]`, `filter[parentId]` | `recent.tail` |\n| `recent.tail` | `im.v2.Recent.tail` | \u043F\u043B\u043E\u0441\u043A\u043E: `limit`, `filter[lastMessageDate]` (\u043A\u0443\u0440\u0441\u043E\u0440), `filter[recentSection]` | `filter[lastMessageDate]` |\n| `chat.load` | `im.v2.Chat.load` | \u043F\u043B\u043E\u0441\u043A\u043E: `dialogId`\\|`chatId`, `messageLimit` | \u2014 |\n| `chat.dialogId` | `im.v2.Chat.getDialogId` | \u043F\u043B\u043E\u0441\u043A\u043E: `externalId` (\u043D\u0430\u043F\u0440. `"sg"+groupId`) | \u2014 |\n| `chat.messages` | `im.v2.Chat.Message.list` | \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 `chat.messages.tail` |\n| `chat.messages.tail` | `im.v2.Chat.Message.tail` | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `limit`, `filter[lastId]`, `order[id]` | `filter[lastId]` (\xA75.1) |\n| `chat.message.read` | `im.v2.Chat.Message.read` | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `ids[]`, `actionUuid` | \u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439 |\n| `chat.read.all` | `im.v2.Chat.readAll` | \u0431\u0435\u0437 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 | \u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439 |\n| `im.user.get` | `/rest/im.user.get.json` | \u043F\u043B\u043E\u0441\u043A\u043E: `ID` | \u2014 |\n| `im.chat.get` | `/rest/im.chat.get.json` | \u043F\u043B\u043E\u0441\u043A\u043E: `ENTITY_TYPE`, `ENTITY_ID` (\u043D\u0430\u043F\u0440. `TASKS_TASK`+taskId) | \u2014 |\n| `entityselector.load` | `ui.entityselector.load` | `{"dialog":{entities,preselectedItems,\u2026}}` | \u2014 |\n| `entityselector.search` | `ui.entityselector.doSearch` | `{"dialog":{\u2026},"searchQuery":{"query":"\u2026","queryWords":["\u2026"]}}` | \u2014 |\n| `call.detail` | `GET /call/detail/{callId}` | `callId` (\u043F\u043E\u0434\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0432 \u043F\u0443\u0442\u044C), `IFRAME=Y`, `IFRAME_TYPE=SIDE_SLIDER` \u2192 HTML | \u0441\u043C. \xA75.4 |\n\n---\n\n## 4. \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 \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`, \xA75.2), `UF_*`. \u041E\u0442\u0432\u0435\u0442 \u043F\u043E\u0434\u043A\u043B\u0430\u0434\u044B\u0432\u0430\u0435\u0442 \u043E\u0431\u044A\u0435\u043A\u0442\u044B `group`,\n`responsible`, `creator`, `action`.\n\u{1F4D6} (`tasks.task.get`/`list`) \u2014 \u0441\u0432\u0435\u0440\u0445 \u044D\u0442\u043E\u0433\u043E: `parentId`, `stageId`, `sprintId`, `backlogId`,\n`commentsCount`, `timeSpentInLogs`, `favorite`, `flowId`, `mark`, `accomplices[]`, `auditors[]`,\n`checklist{}`, `subStatus`; \u0432 \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**, \u0430 \u0432 `select`/`filter`\n\u043E\u043D\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 **UPPER_CASE**. \u0414\u043E\u043F. \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F \u2014 \u0444\u043B\u0430\u0433\u0430\u043C\u0438 `params{WITH_TIMER_INFO, WITH_RESULT_INFO,\nWITH_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}`) \u{1F4D6}.\n\u0410\u0441\u0438\u043C\u043C\u0435\u0442\u0440\u0438\u044F: \u0432 **`filter`** \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 `REAL_STATUS`, \u0430 \u0432 **`select`** \u0435\u0433\u043E \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u0431\u0435\u0441\u043F\u043E\u043B\u0435\u0437\u043D\u043E \u2014 \u043F\u043E\u043B\u0435 \u043C\u043E\u043B\u0447\u0430\n\u043D\u0435 \u0432\u0435\u0440\u043D\u0451\u0442\u0441\u044F; \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435, \u043F\u0440\u043E\u0441\u0438 `select:["STATUS"]` \u2192 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u043A\u043B\u044E\u0447 `status` \u0441\u043E\n\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435\u043C \u043F\u043E \u0442\u043E\u0439 \u0436\u0435 \u0448\u043A\u0430\u043B\u0435 1..7 (\u0443 \u043E\u0431\u0451\u0440\u0442\u043A\u0438 `bitrix_tasks_list` \u043E\u043D \u0443\u0436\u0435 \u0432 \u0434\u0435\u0444\u043E\u043B\u0442\u043D\u043E\u043C `select`).\n\n**\u0424\u0438\u043B\u044C\u0442\u0440 `tasks.task.list`** \u2014 \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440 \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044F \u043F\u0435\u0440\u0435\u0434 \u0438\u043C\u0435\u043D\u0435\u043C \u043F\u043E\u043B\u044F: `!` (\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"}`, `{"%TITLE":"\u043A\u0430\u0440\u0442\u0430"}`. \u0424\u0438\u043B\u044C\u0442\u0440\u0443\u0435\u043C\u044B\u0435 \u043F\u043E\u043B\u044F: `ID`, `PARENT_ID`, `GROUP_ID`,\n`CREATED_BY`, `RESPONSIBLE_ID`, `ACCOMPLICE`, `AUDITOR`, `REAL_STATUS`, `STATUS`, `PRIORITY`, `TAG`,\n`STAGE_ID`, `SPRINT_ID`, `BACKLOG_ID`, `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`); \u0435\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, \u043E\u0431\u044A\u0435\u0434\u0438\u043D\u0438\n> \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`) \u0438 **\u0434\u0435\u0434\u0443\u043F\u043B\u0438\u0446\u0438\u0440\u0443\u0439 \u043F\u043E `id`** \u2014\n> \u043E\u0434\u043D\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0447\u0430\u0441\u0442\u043E \u043F\u043E\u043F\u0430\u0434\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u0432 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0440\u043E\u043B\u0435\u0439. \u0412 **`filter`** \u0440\u043E\u043B\u0438 \u0432 **\u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u043C** \u0447\u0438\u0441\u043B\u0435\n> (`ACCOMPLICE`/`AUDITOR`), \u0432 **`select`** \u2014 \u0432\u043E **\u043C\u043D\u043E\u0436\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u043C** (`ACCOMPLICES`/`AUDITORS`).\n\n> **Scrum-\u0437\u0430\u0434\u0430\u0447\u0438 (\u0441\u043F\u0440\u0438\u043D\u0442\u044B).** \u041F\u043E\u043B\u0435 `SPRINT_ID` \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0436\u0451\u0441\u0442\u043A\u0438\u0439 `filter[SPRINT_ID]` \u043C\u043E\u0433\u0443\u0442 \u0440\u0430\u0441\u0445\u043E\u0434\u0438\u0442\u044C\u0441\u044F:\n> \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 (\u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u0430 \u0432 \u0431\u044D\u043A\u043B\u043E\u0433\n> \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 \u0438 \u043E\u0442\u0444\u0438\u043B\u044C\u0442\u0440\u0443\u0439 \u043F\u043E\n> `SPRINT_ID`/`STAGE_ID` \u0443 \u0441\u0435\u0431\u044F. \u041C\u0435\u0442\u043E\u0434\u0430 \xAB\u043A\u043E\u043B\u043E\u043D\u043A\u0438 scrum-\u0434\u043E\u0441\u043A\u0438\xBB (`STAGE_ID` \u2192 \u0438\u043C\u044F \u043A\u043E\u043B\u043E\u043D\u043A\u0438) \u0432 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0435 \u043D\u0435\u0442.\n\n**\u0413\u0440\u0443\u043F\u043F\u0430/\u043F\u0440\u043E\u0435\u043A\u0442 \u2014 \u0441\u043F\u0438\u0441\u043E\u043A** (`workgroup.list`): `ID`, `NAME`, `DESCRIPTION`, `NUMBER_OF_MEMBERS`,\n`OWNER_ID`, `DATE_CREATE`, `PROJECT` (Y=\u043F\u0440\u043E\u0435\u043A\u0442/N=\u0433\u0440\u0443\u043F\u043F\u0430), `TYPE`; **\u0431\u0435\u0437 `select` \u0432\u0435\u0440\u043D\u0451\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E `ID`**.\n\u{1F4D6} \u0444\u0438\u043B\u044C\u0442\u0440\u0443\u0435\u043C\u044B\u0435: `ID`, `NAME`, `OWNER_ID`, `ACTIVE`, `VISIBLE`, `OPENED`, `CLOSED`, `PROJECT`,\n`SUBJECT_ID`, `SITE_ID`, `DATE_CREATE`, `DATE_UPDATE`, `DATE_ACTIVITY`; \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u044B \u0444\u0438\u043B\u044C\u0442\u0440\u0430\n`>= > <= < % =% %= !% != !`.\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}`, `counter` (\u043D\u0435\u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u0445),\n`unread`, `last_id`, `pinned`, `date_update`, `date_last_activity`, `user{\u2026}`,\n`chat{\u2026 entity_type, entity_id, owner, \u2026}`; \u0435\u0441\u0442\u044C \u043B\u0438 \u0435\u0449\u0451 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B \u2014 `hasMore`/`hasMorePages` \u{1F4D6}.\n**\u041D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u043F\u043E \u0441\u0435\u043A\u0446\u0438\u0438** (`im.v2.Recent.load`): `filter[recentSection]` \u2014 `default` (\u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0434\u0438\u0430\u043B\u043E\u0433\u0438),\n**`tasksTask` (\u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447)**, `collab`/`collabDefault`. \u0412\u0433\u043B\u0443\u0431\u044C \u2014 `im.v2.Recent.tail` \u0441 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u043C\n`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\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\n**\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435** (`im.v2.Chat.Message.*`): `id`, `chatId`, `authorId`, `date`, `text`, `params`, `viewed`;\n\u043E\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\n---\n\n## 5. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0438\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; v2-\u043F\u043E\u0434\u0441\u0438\u0441\u0442\u0435\u043C\u0430; \u0444\u0430\u0439\u043B\u044B, \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u044B, \u0441\u0432\u044F\u0437\u0438\nbitrix_task_get { "taskId": 4229, "params": { "select": ["ID","TITLE","DESCRIPTION","TAGS"] } }\nbitrix_task_get_v2 { "taskId": 4229 } // \u2192 { "task": { "id": 4229 } }\nbitrix_call { "name": "task.files", "params": { "ids": [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 (\u043E\u0442\u0434\u0430\u0451\u0442 CHAT_ID / DIALOG_ID)\nbitrix_projects_list { "params": { "order": {"DATE_CREATE":"desc"} } }\nbitrix_project_get { "groupId": 15 }\n```\n\n### 5.1. \u041C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 (IM): \u043A\u0430\u043A \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C `chatId`\n\n\u0412\u0441\u0451 \u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u2014 **\u0447\u0430\u0442\u044B**: \u043B\u0438\u0447\u043D\u044B\u0435 1-\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**.\n\u0427\u0438\u0441\u043B\u043E\u0432\u043E\u0439 **`chatId`** \u2014 \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`); \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 \u2014 \u043D\u0430 \u0448\u0430\u0433\u0435 \u0435\u0433\u043E \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F.\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** (\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 1-\u043D\u0430-1\n\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 **\u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\n\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:**\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 \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_task_get` \u2192 `CHAT_ID` (\xA75.2) |\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 }` |\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**\u0427\u0438\u0442\u0430\u0442\u044C \u0438\u0441\u0442\u043E\u0440\u0438\u044E.** `bitrix_chat_messages` \u043E\u0442\u0434\u0430\u0451\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u044E\u044E \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443; \u0432\u0433\u043B\u0443\u0431\u044C \u043B\u0438\u0441\u0442\u0430\u0435\u0442\n`bitrix_chat_history` \u043F\u043E \u043A\u0443\u0440\u0441\u043E\u0440\u0443 `beforeId` = \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 id \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B (\u043F\u043E\u0432\u0442\u043E\u0440\u044F\u0439,\n\u0443\u043C\u0435\u043D\u044C\u0448\u0430\u044F `beforeId`, \u0434\u043E \u043D\u0430\u0447\u0430\u043B\u0430 \u0438\u0441\u0442\u043E\u0440\u0438\u0438).\n\n```jsonc\nbitrix_chat_load { "dialogId": 11 } // \u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 \u044E\u0437\u0435\u0440\u0430 11 \u2192 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 chatId\nbitrix_chat_history { "chatId": 485, "beforeId": 1861279 }\nbitrix_chat_mark_read { "chatId": 40271, "ids": [1884131] } // \u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439; actionUuid \u2014 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u043E\u043C\n```\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: `im.dialog.messages.get` (\u0434\u0435\u0444\u043E\u043B\u0442 20, \u043C\u0430\u043A\u0441 50; \u043B\u0438\u0441\u0442\u0430\u043D\u0438\u0435\n`LAST_ID` \u2014 \u0441\u0442\u0430\u0440\u0435\u0435, `FIRST_ID` \u2014 \u043D\u043E\u0432\u0435\u0435); `imbot.v2 chat.getMessageContext` \u2014 \u043E\u0442\u0432\u0435\u0442 `messages[]`\n(oldest\u2192newest) + `users[]` + `hasPrevPage`/`hasNextPage`, \u043F\u043E \u0444\u043E\u0440\u043C\u0435 **\u0441\u043E\u0432\u043F\u0430\u0434\u0430\u0435\u0442** \u0441 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u043C\u0438\n`im.v2.Chat.Message.*`.\n\n### 5.2. \u041E\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**\u0410. \u041F\u0440\u044F\u043C\u043E\u0439 \u0440\u0435\u0437\u043E\u043B\u0432 \u2014 \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` \u0447\u0430\u0442\u0430-\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u044F (\u0432\u0445\u043E\u0434\u0438\u0442\n\u0432 \u0434\u0435\u0444\u043E\u043B\u0442\u043D\u044B\u0439 `select` \u{1F4D6}) \u2014 \u044D\u0442\u043E `taskId \u2192 chatId` \u0431\u0435\u0437 \u043F\u043E\u0438\u0441\u043A\u0430 \u043F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E \u0438 \u0431\u0435\u0437 \u043F\u0440\u043E\u043C\u0430\u0445\u0430 \u043F\u043E \u0442\u0451\u0437\u043A\u0430\u043C:\n\n```jsonc\nbitrix_task_get { "taskId": 28373 } // \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 CHAT_ID\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\u041E\u0431\u0449\u0430\u044F \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`): chatId \u043B\u044E\u0431\u043E\u0433\u043E \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0433\u043E\n\u043E\u0431\u044A\u0435\u043A\u0442\u0430 \u043F\u043E \u043F\u0430\u0440\u0435 `entityType`/`entityId`; \u043A\u0440\u043E\u043C\u0435 `TASKS_TASK` \u0442\u0430\u043A \u0436\u0435 \u0430\u0434\u0440\u0435\u0441\u0443\u044E\u0442\u0441\u044F `SONET_GROUP`\n(\u0433\u0440\u0443\u043F\u043F\u0430/\u043F\u0440\u043E\u0435\u043A\u0442), `CRM`, `CALENDAR`, `MAIL`, `VIDEOCONF`, `CALL`:\n\n```jsonc\nbitrix_entity_chat { "entityType": "TASKS_TASK", "entityId": 28373 } // \u2192 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** (\u0441\u0435\u043A\u0446\u0438\u044F `tasksTask`; \u0432 `bitrix_chats_recent` \u0438\u0445 \u041D\u0415\u0422):\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" }\nbitrix_chat_load { "dialogId": "chat38849" } // \u0438\u043B\u0438 { "chatId": 38849 }\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** (\u0437\u0430\u043F\u0430\u0441\u043D\u043E\u0439, \u043C\u0430\u0442\u0447 \u043F\u043E \u0442\u0435\u043A\u0441\u0442\u0443):\n`bitrix_entity_search { "query": "\u0442\u0440\u0435\u043A\u0435\u0440", "section": "tasksTask" }`\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_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### 5.3. \u041F\u043E\u0438\u0441\u043A \u0447\u0430\u0442\u0430 / \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\n\n`bitrix_entity_search` (\u043E\u0431\u0451\u0440\u0442\u043A\u0430 \u043D\u0430\u0434 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u043C `ui.entityselector.doSearch`) \u0441\u0430\u043C \u0441\u043E\u0431\u0438\u0440\u0430\u0435\u0442 \u0434\u0438\u0430\u043B\u043E\u0433\n`IM_CHAT_SEARCH` \u0438 `searchQuery` \u0438\u0437 \u0441\u0442\u0440\u043E\u043A\u0438. \u041F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0435 \u0430\u043D\u0430\u043B\u043E\u0433\u0438: \u043B\u044E\u0434\u0438 \u2014 `user.get`/`user.search`, \u0447\u0430\u0442\u044B \u2014\n`im.recent.list` + \u0444\u0438\u043B\u044C\u0442\u0440\u0430\u0446\u0438\u044F \u0443 \u0441\u0435\u0431\u044F.\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\nbitrix_user_get { "userId": 11 } // \u0440\u0435\u0437\u043E\u043B\u0432 authorId \u2192 \u0438\u043C\u044F\n```\n\n### 5.4. \u0421\u043E\u0437\u0432\u043E\u043D: \u0440\u0435\u0437\u044E\u043C\u0435, \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430, \u0437\u0430\u043F\u0438\u0441\u044C\n\nAI-\u0430\u043D\u0430\u043B\u0438\u0437 \u0437\u0432\u043E\u043D\u043A\u0430 (BitrixGPT Follow-Up) \u0436\u0438\u0432\u0451\u0442 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043D\u043E \u043E\u0442\u0440\u0435\u043D\u0434\u0435\u0440\u0435\u043D\u043D\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435 `/call/detail/<callId>`\n\u2014 JSON-\u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u0430 \u043F\u043E\u0434 \u043D\u0435\u0439 \u043D\u0435\u0442, \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u043E\u0433\u043E REST \u0434\u043B\u044F \u0432\u0438\u0434\u0435\u043E\u0432\u0441\u0442\u0440\u0435\u0447 \u0442\u043E\u0436\u0435 (\u{1F4D6} \u0442\u043E\u043B\u044C\u043A\u043E \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0438\u044F `voximplant.*`\n\u0438 `crm.activity.call.getTranscript`). \u041C\u043E\u0441\u0442 \u0447\u0438\u0442\u0430\u0435\u0442 \u044D\u0442\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 \u0435\u0451 \u0432 \u043D\u043E\u0440\u043C\u0430\u043B\u0438\u0437\u043E\u0432\u0430\u043D\u043D\u044B\u0439 JSON.\n\n**1) \u041D\u0430\u0439\u0442\u0438 \u0437\u0432\u043E\u043D\u043A\u0438.** \u0421\u0435\u0440\u0432\u0435\u0440\u043D\u043E\u0433\u043E \u043F\u043E\u0438\u0441\u043A\u0430 \u0437\u0432\u043E\u043D\u043A\u043E\u0432 \u043F\u043E \u043F\u043E\u0440\u0442\u0430\u043B\u0443 \u043D\u0435\u0442 \u2014 \u0438\u0449\u0435\u043C \u0432 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u043C \u0447\u0430\u0442\u0435: \u0437\u0432\u043E\u043D\u043E\u043A\n\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0441 `params.COMPONENT_PARAMS = { messageType: "START", callId }`.\n\n```jsonc\nbitrix_chat_calls { "chatId": 9876 } // \u0447\u0430\u0442 \u043F\u0440\u043E\u0435\u043A\u0442\u0430: bitrix_project_get \u2192 CHAT_ID\nbitrix_chat_calls { "chatId": 9876, "maxPages": 20, "beforeId": 5001 } // \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C \u0432\u0433\u043B\u0443\u0431\u044C\n```\n\n\u041E\u0442\u0432\u0435\u0442: `calls[] { callId, startedAt, startedBy, startMessageId, events[], summaryMessageId }` \u043F\u043B\u044E\u0441\n`scannedPages` / `oldestScannedMessageId` / **`reachedHistoryStart`** \u2014 \u0435\u0441\u043B\u0438 \u043E\u043D `false`, \u0438\u0441\u0442\u043E\u0440\u0438\u044F\n\u0434\u043E\u0447\u0438\u0442\u0430\u043D\u0430 \u041D\u0415 \u0434\u043E \u043A\u043E\u043D\u0446\u0430, \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u0439 \u0441 `beforeId: <oldestScannedMessageId>`.\n\n**2) \u0412\u0437\u044F\u0442\u044C \u0432\u0441\u0451 \u043F\u043E \u0437\u0432\u043E\u043D\u043A\u0443.**\n\n```jsonc\nbitrix_call_detail { "callId": 4242 } // \u0432\u0441\u0451; \u0434\u043B\u0438\u043D\u043D\u0430\u044F \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430 \u0443\u0435\u0434\u0435\u0442 \u0432 \u0444\u0430\u0439\u043B\nbitrix_call_detail { "callId": 4242, "transcript": "inline" } // \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430 \u043F\u0440\u044F\u043C\u043E \u0432 \u043E\u0442\u0432\u0435\u0442\u0435\nbitrix_call_detail { "callId": 4242, "transcript": "none" } // \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430 \u043D\u0435 \u043D\u0443\u0436\u043D\u0430 \u0432\u043E\u0432\u0441\u0435\nbitrix_call_detail { "callId": 4242, "transcript": "file" } // \u0432\u0441\u0435\u0433\u0434\u0430 \u0432 \u0444\u0430\u0439\u043B, \u0434\u0430\u0436\u0435 \u043A\u043E\u0440\u043E\u0442\u043A\u0430\u044F\n```\n\n| \u041F\u043E\u043B\u0435 \u043E\u0442\u0432\u0435\u0442\u0430 | \u0427\u0442\u043E \u0432\u043D\u0443\u0442\u0440\u0438 |\n|---|---|\n| `title`, `agenda`, `meetingType` | \u0442\u0435\u043C\u0430, \u0432\u0441\u0442\u0443\u043F\u043B\u0435\u043D\u0438\u0435, \u0442\u0438\u043F \u0432\u0441\u0442\u0440\u0435\u0447\u0438 (\xAB\u0421\u0442\u0430\u0442\u0443\u0441-\u0432\u0441\u0442\u0440\u0435\u0447\u0430\xBB) |\n| `date`, `interval`, `duration` | \xAB23 \u0438\u044E\u043B\u044F, 15:46\xBB, \xAB15:46 - 16:51\xBB, \xAB1 \u0447 4 \u043C\u0438\u043D\xBB |\n| `efficiency`, `qualityChecklist[]` | \u043E\u0446\u0435\u043D\u043A\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u0438 \u0432 % \u0438 \u043A\u0440\u0438\u0442\u0435\u0440\u0438\u0438 `{ ok, text }` |\n| `participants[]` | `{ id, name, talkTimePercent, talkTime, efficiency, metrics[], insight }` |\n| `overview`, `chapters[]` | \u043E\u0431\u0449\u0435\u0435 \u0440\u0435\u0437\u044E\u043C\u0435 \u0438 \u0433\u043B\u0430\u0432\u044B `{ from, to, title, text }` \u0441 \u0442\u0430\u0439\u043C\u043A\u043E\u0434\u0430\u043C\u0438 |\n| `decisions[]`, `tasks[]` | \xAB\u0447\u0442\u043E \u0440\u0435\u0448\u0438\u043B\u0438\xBB \u0438 \u0437\u0430\u0434\u0430\u0447\u0438 `{ assigneeId, assignee, text }` |\n| `transcript[]`, `transcriptCount` | \u0440\u0435\u043F\u043B\u0438\u043A\u0438 `{ from, to, speakerId, speaker, text }` |\n| `recording` | `{ path, url, trackId }` \u2014 \u0430\u0443\u0434\u0438\u043E\u0437\u0430\u043F\u0438\u0441\u044C, \u043A\u0430\u0447\u0430\u0435\u0442\u0441\u044F `bitrix_call_recording` (\xA75.5) |\n\n**\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430 \u0434\u043B\u0438\u043D\u043D\u043E\u0433\u043E \u0437\u0432\u043E\u043D\u043A\u0430 \u043D\u0435 \u043F\u0440\u0438\u0445\u043E\u0434\u0438\u0442 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435.** \u0423 \u0447\u0430\u0441\u043E\u0432\u043E\u0439 \u0432\u0441\u0442\u0440\u0435\u0447\u0438 \u043E\u043D\u0430 \u0434\u0430\u0451\u0442 ~70 \u041A\u0411 \u0438\u0437 80 \u041A\u0411, \u043F\u043E\u044D\u0442\u043E\u043C\u0443\n\u0441\u0432\u044B\u0448\u0435 ~20 \u041A\u0411 (\u0440\u0435\u0436\u0438\u043C `"auto"` = \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u0435) \u043F\u0438\u0448\u0435\u0442\u0441\u044F \u043D\u0430 \u0434\u0438\u0441\u043A, \u0430 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 \u043E\u0441\u0442\u0430\u044E\u0442\u0441\u044F `transcript: []`,\n`transcriptCount` \u0438 **`files`**: `files.transcript` \u2014 `call-<id>-transcript.txt`, \u0433\u0434\u0435 \u0441\u0442\u0440\u043E\u043A\u0430 = \u0440\u0435\u043F\u043B\u0438\u043A\u0430\n(`[11:10\u201411:24] \u0413\u0435\u043D\u0440\u0438\u0445 \u0411\u043E\u0433\u0430\u0446\u043A\u0438\u0439: \u2026`), \u0435\u0451 \u0443\u0434\u043E\u0431\u043D\u043E **\u0433\u0440\u0435\u043F\u0430\u0442\u044C** (\u043D\u0430\u0439\u0434\u0435\u043D\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 \u0441\u0430\u043C\u0430 \u043D\u0435\u0441\u0451\u0442 \u0442\u0430\u0439\u043C\u043A\u043E\u0434 \u0438\n\u0441\u043F\u0438\u043A\u0435\u0440\u0430); `files.json` \u2014 \u043F\u043E\u043B\u043D\u044B\u0439 \u043E\u0442\u0432\u0435\u0442 \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u043E\u0439. \u041E\u0431\u0430 \u0444\u0430\u0439\u043B\u0430 \u2014 \u043A\u0435\u0448 \u0437\u0432\u043E\u043D\u043A\u0430, \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u044B\u0432\u0430\u044E\u0442\u0441\u044F.\n\n\u0422\u043E\u043D\u043A\u043E\u0441\u0442\u0438:\n- **`speakerId`** \u0440\u0435\u0437\u043E\u043B\u0432\u0438\u0442\u0441\u044F \u043F\u043E \u0438\u043C\u0435\u043D\u0438 \u0438\u0437 \u0442\u0430\u0431\u043B\u0438\u0446\u044B \u0430\u043D\u0430\u043B\u0438\u0437\u0430; \u043A\u0442\u043E \u0433\u043E\u0432\u043E\u0440\u0438\u043B \u043C\u0430\u043B\u043E \u0438 \u0432 \u043D\u0435\u0451 \u043D\u0435 \u043F\u043E\u043F\u0430\u043B \u2014 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\n `speakerId: null`, \u043D\u043E \u043E\u0441\u0442\u0430\u043D\u0435\u0442\u0441\u044F \u0432 `participants` \u0441 `id: null`.\n- **`assigneeId` \u0437\u0430\u0434\u0430\u0447\u0438** \u2014 \u0443\u043F\u043E\u043C\u044F\u043D\u0443\u0442\u044B\u0439 \u0432 \u0442\u0435\u043A\u0441\u0442\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C, \u0430 \u041D\u0415 id \u0441\u043C\u043E\u0442\u0440\u044F\u0449\u0435\u0433\u043E.\n- \u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043A \u0437\u0432\u043E\u043D\u043A\u0443 / \u043F\u0440\u043E\u0442\u0443\u0445\u043B\u0430 \u0441\u0435\u0441\u0441\u0438\u044F \u2192 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u0432\u0435\u0440\u043D\u0451\u0442 \u0432\u043D\u044F\u0442\u043D\u0443\u044E \u043E\u0448\u0438\u0431\u043A\u0443 (\u043F\u043E\u0440\u0442\u0430\u043B \u043E\u0442\u0434\u0430\u0451\u0442 HTML \u043B\u043E\u0433\u0438\u043D\u0430).\n\n### 5.5. \u0421\u043A\u0430\u0447\u0430\u0442\u044C \u0444\u0430\u0439\u043B (\u0432\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0447\u0430\u0442\u0430, \u0444\u0430\u0439\u043B \u0437\u0430\u0434\u0430\u0447\u0438, \u0437\u0430\u043F\u0438\u0441\u044C \u0437\u0432\u043E\u043D\u043A\u0430)\n\n\u0421\u0441\u044B\u043B\u043A\u0438 \u043F\u043E\u0440\u0442\u0430\u043B \u043C\u0438\u043D\u0442\u0438\u0442 \u0438 \u043F\u043E\u0434\u043F\u0438\u0441\u044B\u0432\u0430\u0435\u0442 \u0441\u0430\u043C, \u043D\u043E \u043F\u043E\u0434\u043F\u0438\u0441\u044C \u041D\u0415 \u0437\u0430\u043C\u0435\u043D\u044F\u0435\u0442 \u0430\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u044E \u2014 \u043A\u0430\u0447\u0430\u0435\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435 \u0432\n\u0441\u0435\u0441\u0441\u0438\u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F.\n\n```jsonc\n// \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0447\u0430\u0442\u0430: \u0441\u0441\u044B\u043B\u043A\u0443 \u0431\u0435\u0440\u0451\u043C \u0438\u0437 files[].urlDownload \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 bitrix_chat_load\nbitrix_file_download { "url": "https://<\u043F\u043E\u0440\u0442\u0430\u043B>/bitrix/services/main/ajax.php?action=disk.api.file.download&\u2026" }\nbitrix_call_recording { "callId": 4242 } // \u0430\u0443\u0434\u0438\u043E\u0437\u0430\u043F\u0438\u0441\u044C \u0441\u043E\u0437\u0432\u043E\u043D\u0430 (\u0441\u0441\u044B\u043B\u043A\u0443 \u043D\u0430\u0439\u0434\u0451\u0442 \u0441\u0430\u043C)\nbitrix_file_download { "url": "\u2026", "savePath": "/tmp/photo.png", "overwrite": true }\n```\n\n\u041E\u0442\u0432\u0435\u0442 \u2014 **\u043F\u0443\u0442\u044C, \u0430 \u043D\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435**: `{ path, bytes, contentType, fileName }` (\u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442\u044B \u043D\u0435 \u043F\u043E\u043F\u0430\u0434\u0430\u044E\u0442 \u0432\n\u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442). \u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0444\u0430\u0439\u043B \u043B\u043E\u0436\u0438\u0442\u0441\u044F \u0432 `~/.bitrix24-mcp-bridge/downloads/`; `savePath` \u0431\u0435\u0437 \u0432\u0435\u0434\u0443\u0449\u0435\u0433\u043E `/`\n\u0442\u0440\u0430\u043A\u0442\u0443\u0435\u0442\u0441\u044F \u043A\u0430\u043A \u0438\u043C\u044F \u0432\u043D\u0443\u0442\u0440\u0438 \u044D\u0442\u043E\u0439 \u043F\u0430\u043F\u043A\u0438. \u041F\u043E\u0442\u043E\u043B\u043E\u043A \u2014 512 \u041C\u0411.\n\n\u0422\u043E\u043D\u043A\u043E\u0441\u0442\u0438:\n- **\u0413\u0440\u0430\u043D\u0438\u0446\u0430 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 \u2014 origin**: \u0441\u043A\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0441 origin \u0441\u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0433\u043E \u043F\u043E\u0440\u0442\u0430\u043B\u0430.\n- **\u0418\u043C\u044F \u0434\u0430\u0451\u0442 \u043F\u043E\u0440\u0442\u0430\u043B** (`Content-Disposition`), \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u0431\u0435\u0437 `savePath` \u0443\u0433\u0430\u0434\u044B\u0432\u0430\u0442\u044C \u0435\u0433\u043E \u043D\u0435 \u043D\u0443\u0436\u043D\u043E.\n- **\u041F\u043E\u0432\u0442\u043E\u0440\u043D\u043E\u0435 \u0441\u043A\u0430\u0447\u0438\u0432\u0430\u043D\u0438\u0435** \u0442\u043E\u0433\u043E \u0436\u0435 \u0444\u0430\u0439\u043B\u0430 \u043F\u0430\u0434\u0430\u0435\u0442 \u0441 `already exists` \u2014 \u043F\u0435\u0440\u0435\u0434\u0430\u0439 `overwrite: true`.\n\n---\n\n\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u043D\u043E\u0432\u044B\u043C\u0438 \u043C\u0435\u0442\u043E\u0434\u0430\u043C\u0438, \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 (`bodyType`, `responseType`, path-\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B) \u0438\n\u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0430 \u043F\u0440\u0430\u0432\u043E\u043A \u0432 \u0436\u0438\u0432\u043E\u0439 daemon \u2014 `docs/reconnaissance.md`.\n' ? '# Bitrix24 API notes (reverse-engineered)\n\n\u041A\u0430\u043A \u0430\u0433\u0435\u043D\u0442\u0443 \u0440\u0430\u0431\u043E\u0442\u0430\u0442\u044C \u0441 Bitrix24 \u0447\u0435\u0440\u0435\u0437 \u044D\u0442\u043E\u0442 \u043C\u043E\u0441\u0442: \u0444\u043E\u0440\u043C\u0430\u0442 `params`, \u0438\u043C\u0435\u043D\u0430 \u043F\u043E\u043B\u0435\u0439, \u0433\u043E\u0442\u043E\u0432\u044B\u0435 \u0446\u0435\u043F\u043E\u0447\u043A\u0438 \u0432\u044B\u0437\u043E\u0432\u043E\u0432.\n\n\u0414\u0432\u0435 \u043F\u043E\u0432\u0435\u0440\u0445\u043D\u043E\u0441\u0442\u0438 API. **\u041F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0439 REST** (`tasks.task.*`, `im.recent.list`, `im.user.get`, `im.chat.get`,\n`socialnetwork.api.workgroup.*`) \u2014 \u0435\u0441\u0442\u044C \u043E\u0444\u0438\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0435 \u0434\u043E\u043A\u0438, \u0441\u0441\u044B\u043B\u043A\u0438 \u043D\u0430 \u043D\u0438\u0445 \u043F\u043E\u043C\u0435\u0447\u0435\u043D\u044B **\u{1F4D6}**\n([`apidocs.bitrix24.com`](https://apidocs.bitrix24.com); \u0430\u0433\u0435\u043D\u0442\u0443 \u0441 MCP context7 \u2014 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430\n`/bitrix24/b24restdocs`). **\u0412\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0435 ajax-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u044B** (`im.v2.*`, `tasks.v2.*`, `ui.entityselector.*`)\n\u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0445 \u0434\u043E\u043A\u043E\u0432 \u043D\u0435 \u0438\u043C\u0435\u044E\u0442 \u2014 \u0432\u0441\u0451 \u043D\u0438\u0436\u0435 \u0434\u043E\u0431\u044B\u0442\u043E \u0436\u0438\u0432\u044B\u043C \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C; \u043A\u043E\u043D\u0432\u0435\u0440\u0442 \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043F\u043E\u043B\u0435\u0439 \u0443 \u043D\u0438\u0445 \u043C\u043E\u0433\u0443\u0442\n\u043E\u0442\u043B\u0438\u0447\u0430\u0442\u044C\u0441\u044F \u043E\u0442 \u{1F4D6}-\u0430\u043D\u0430\u043B\u043E\u0433\u043E\u0432. \u0418\u043C\u0435\u043D\u0430 \u043F\u043E\u043B\u0435\u0439 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B \u0434\u043B\u044F \u043E\u0431\u043B\u0430\u0447\u043D\u043E\u0433\u043E Bitrix24; \u043D\u0430 \u0434\u0440\u0443\u0433\u043E\u043C \u043F\u043E\u0440\u0442\u0430\u043B\u0435 \u0441\u0432\u0435\u0440\u044F\u0439\u0441\u044F\n\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- **\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** (`bitrix_tasks_list`, `bitrix_task_get`, `bitrix_chat_load`, \u2026) \u2014\n \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; \u0438\u0445 \u043F\u043E\u043B\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A \u0438 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u044F \u0432\u0438\u0434\u043D\u044B \u0441\u0440\u0435\u0434\u0438 MCP-\u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432. \u0422\u043E\u0447\u043D\u0430\u044F\n \u0432\u044B\u0431\u043E\u0440\u043A\u0430 \u2014 \u043E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u043C `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.\n- **`bitrix_call { name, params }`** \u2014 \u043B\u044E\u0431\u043E\u0435 \u0438\u043C\u044F \u0438\u0437 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 (`actions.json`), `params` \u0432 \u043D\u0430\u0442\u0438\u0432\u043D\u043E\u043C\n \u0444\u043E\u0440\u043C\u0430\u0442\u0435 Bitrix (\xA73). \u041F\u043E\u043B\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A \u0438\u043C\u0451\u043D \u043E\u0442\u0434\u0430\u0451\u0442 \u0441\u0430\u043C `bitrix_call` \u0432 \u0441\u0432\u043E\u0451\u043C \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0438.\n- \u041A\u0430\u0442\u0430\u043B\u043E\u0433 \u043C\u043E\u0436\u0435\u0442 \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C **\u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0435** \u0432\u044B\u0437\u043E\u0432\u044B: \u043D\u0430\u043B\u0438\u0447\u0438\u0435 \u0437\u0430\u043F\u0438\u0441\u0438 = \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u0432\u044B\u0437\u0432\u0430\u0442\u044C. \u042D\u0442\u043E \u043D\u0435 \u0440\u0435\u0436\u0438\u043C\n \xAB\u0442\u043E\u043B\u044C\u043A\u043E \u0447\u0442\u0435\u043D\u0438\u0435\xBB.\n- \u0423 \u043E\u0431\u0451\u0440\u0442\u043E\u043A \u0435\u0441\u0442\u044C \u0434\u0435\u0444\u043E\u043B\u0442\u044B (\u043D\u0430\u043F\u0440. `bitrix_tasks_list` \u0441\u043E\u0440\u0442\u0438\u0440\u0443\u0435\u0442 `{"ID":"desc"}`), \u0443 `bitrix_call` \u0438\u0445 \u043D\u0435\u0442 \u2014\n \u043E\u0434\u0438\u043D \u0438 \u0442\u043E\u0442 \u0436\u0435 \u0444\u0438\u043B\u044C\u0442\u0440 \u0434\u0430\u0441\u0442 \u0440\u0430\u0437\u043D\u044B\u0435 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B. \u0421\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u0435\u0448\u044C \u0432\u044B\u0434\u0430\u0447\u0438 \u2014 \u0437\u0430\u0434\u0430\u0432\u0430\u0439 `order` \u044F\u0432\u043D\u043E.\n- \u041E\u0442\u0432\u0435\u0442 `invalid_csrf` / `invalid_authentication` = \u0441\u0435\u0441\u0441\u0438\u044F \u043F\u043E\u0440\u0442\u0430\u043B\u0430 \u043F\u0440\u043E\u0442\u0443\u0445\u043B\u0430 \u2192 \u043F\u0435\u0440\u0435\u043B\u043E\u0433\u0438\u043D\u044C\u0441\u044F \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435\n \u043D\u0430 \u0432\u043A\u043B\u0430\u0434\u043A\u0435 \u043F\u043E\u0440\u0442\u0430\u043B\u0430.\n\n---\n\n## 2. \u0424\u043E\u0440\u043C\u0430\u0442 \u043E\u0442\u0432\u0435\u0442\u0430\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 = `status:"success"` \u0438/\u0438\u043B\u0438 **\u043F\u0443\u0441\u0442\u043E\u0439** `errors`. \u041D\u0435\u043F\u0443\u0441\u0442\u043E\u0439 `errors` / `status:"error"` / top-level\n`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 \u0435\u0451 \u0432 `ok:false`). REST-\u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u044B (`/rest/*.json`) \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0442\n\u0438\u043D\u0430\u0447\u0435: `{ "result": \u2026, "next", "total", "time" }` \u2014 \u0431\u0435\u0437 `errors`.\n\n---\n\n## 3. \u041A\u0430\u0442\u0430\u043B\u043E\u0433: \u0438\u043C\u044F \u2192 action \u2192 params\n\n\u0424\u043E\u0440\u043C\u0430 `params` \u0440\u0430\u0437\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043F\u043E \u043C\u0435\u0442\u043E\u0434\u0443: \u0433\u0434\u0435-\u0442\u043E \u043F\u043B\u043E\u0441\u043A\u043E, \u0433\u0434\u0435-\u0442\u043E \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E, \u0433\u0434\u0435-\u0442\u043E \u043E\u0431\u0451\u0440\u043D\u0443\u0442\u043E \u0432 `params[\u2026]` \u2014\n\u043A\u043E\u043B\u043E\u043D\u043A\u0430 \xABparams\xBB \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442 \u0442\u043E\u0447\u043D\u0443\u044E \u0444\u043E\u0440\u043C\u0443 (\u043A\u043E\u0434\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0442\u0435\u043B\u0430 \u043C\u043E\u0441\u0442 \u0431\u0435\u0440\u0451\u0442 \u043D\u0430 \u0441\u0435\u0431\u044F).\n\n| \u0418\u043C\u044F (`bitrix_call`) | action / endpoint | params | \u041F\u0430\u0433\u0438\u043D\u0430\u0446\u0438\u044F |\n|---|---|---|---|\n| `tasks.list` | `tasks.task.list` | \u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C: `filter{RESPONSIBLE_ID,REAL_STATUS,GROUP_ID,\u2026}`, `select[]`, `order{}` | **`PAGEN_1`** \u2014 \u043D\u043E\u043C\u0435\u0440 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B (1, 2, 3\u2026), \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 = 20 \u0437\u0430\u0434\u0430\u0447; `start` **\u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442** (\u0432\u0435\u0440\u043D\u0451\u0442 \u0442\u0443 \u0436\u0435 \u043F\u0435\u0440\u0432\u0443\u044E \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443) |\n| `task.get` | `tasks.task.get` | \u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C: `taskId`, `select[]` | \u2014 |\n| `task.v2.get` | `tasks.v2.Task.get` | \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E: `{"task":{"id":N}}` | \u2014 |\n| `task.scrum.info` | `tasks.v2.Scrum.getTaskInfo` | `{"taskId":N}` | \u2014 |\n| `task.files` | `tasks.v2.File.listObjects` | `{"ids":[N,\u2026]}` | \u2014 |\n| `task.views.count` | `tasks.v2.Task.View.User.count` | \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E: `{"task":{"id":N}}` | \u2014 |\n| `task.subtasks` | `tasks.v2.Task.Relation.Child.list` | `{"taskId":N,"withIds":true,"navigation":{"size":N}}` | `navigation` |\n| `task.related` | `tasks.v2.Task.Relation.Related.list` | \u043A\u0430\u043A `task.subtasks` | `navigation` |\n| `projects.list` | `socialnetwork.api.workgroup.list` | \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| `projects.get` | `socialnetwork.api.workgroup.get` | **\u043E\u0431\u0451\u0440\u043D\u0443\u0442\u043E**: `params[groupId]`, `params[select][]` | \u2014 |\n| `chats.recent` | `/rest/im.recent.list.json` | \u043F\u043B\u043E\u0441\u043A\u043E: `LIMIT`, `SKIP_OPENLINES`, `UNREAD_ONLY` | `LIMIT` |\n| `recent.load` | `im.v2.Recent.load` | \u043F\u043B\u043E\u0441\u043A\u043E: `limit`, `filter[recentSection]` (`tasksTask`/`collab`/\u2026), `filter[unread]`, `filter[parentId]` | `recent.tail` |\n| `recent.tail` | `im.v2.Recent.tail` | \u043F\u043B\u043E\u0441\u043A\u043E: `limit`, `filter[lastMessageDate]` (\u043A\u0443\u0440\u0441\u043E\u0440), `filter[recentSection]` | `filter[lastMessageDate]` |\n| `chat.load` | `im.v2.Chat.load` | \u043F\u043B\u043E\u0441\u043A\u043E: `dialogId`\\|`chatId`, `messageLimit` | \u2014 |\n| `chat.dialogId` | `im.v2.Chat.getDialogId` | \u043F\u043B\u043E\u0441\u043A\u043E: `externalId` (\u043D\u0430\u043F\u0440. `"sg"+groupId`) | \u2014 |\n| `chat.messages` | `im.v2.Chat.Message.list` | \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 `chat.messages.tail` |\n| `chat.messages.tail` | `im.v2.Chat.Message.tail` | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `limit`, `filter[lastId]`, `order[id]` | `filter[lastId]` (\xA75.1) |\n| `chat.message.read` | `im.v2.Chat.Message.read` | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `ids[]`, `actionUuid` | \u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439 |\n| `chat.read.all` | `im.v2.Chat.readAll` | \u0431\u0435\u0437 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 | \u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439 |\n| `im.user.get` | `/rest/im.user.get.json` | \u043F\u043B\u043E\u0441\u043A\u043E: `ID` | \u2014 |\n| `im.chat.get` | `/rest/im.chat.get.json` | \u043F\u043B\u043E\u0441\u043A\u043E: `ENTITY_TYPE`, `ENTITY_ID` (\u043D\u0430\u043F\u0440. `TASKS_TASK`+taskId) | \u2014 |\n| `entityselector.load` | `ui.entityselector.load` | `{"dialog":{entities,preselectedItems,\u2026}}` | \u2014 |\n| `entityselector.search` | `ui.entityselector.doSearch` | `{"dialog":{\u2026},"searchQuery":{"query":"\u2026","queryWords":["\u2026"]}}` | \u2014 |\n| `call.detail` | `GET /call/detail/{callId}` | `callId` (\u043F\u043E\u0434\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0432 \u043F\u0443\u0442\u044C), `IFRAME=Y`, `IFRAME_TYPE=SIDE_SLIDER` \u2192 HTML | \u0441\u043C. \xA75.4 |\n\n---\n\n## 4. \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 \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`, \xA75.2), `UF_*`. \u041E\u0442\u0432\u0435\u0442 \u043F\u043E\u0434\u043A\u043B\u0430\u0434\u044B\u0432\u0430\u0435\u0442 \u043E\u0431\u044A\u0435\u043A\u0442\u044B `group`,\n`responsible`, `creator`, `action`.\n\u{1F4D6} (`tasks.task.get`/`list`) \u2014 \u0441\u0432\u0435\u0440\u0445 \u044D\u0442\u043E\u0433\u043E: `parentId`, `stageId`, `sprintId`, `backlogId`,\n`commentsCount`, `timeSpentInLogs`, `favorite`, `flowId`, `mark`, `accomplices[]`, `auditors[]`,\n`checklist{}`, `subStatus`; \u0432 \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**, \u0430 \u0432 `select`/`filter`\n\u043E\u043D\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 **UPPER_CASE**. \u0414\u043E\u043F. \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F \u2014 \u0444\u043B\u0430\u0433\u0430\u043C\u0438 `params{WITH_TIMER_INFO, WITH_RESULT_INFO,\nWITH_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}`) \u{1F4D6}.\n\u0410\u0441\u0438\u043C\u043C\u0435\u0442\u0440\u0438\u044F: \u0432 **`filter`** \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 `REAL_STATUS`, \u0430 \u0432 **`select`** \u0435\u0433\u043E \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u0431\u0435\u0441\u043F\u043E\u043B\u0435\u0437\u043D\u043E \u2014 \u043F\u043E\u043B\u0435 \u043C\u043E\u043B\u0447\u0430\n\u043D\u0435 \u0432\u0435\u0440\u043D\u0451\u0442\u0441\u044F; \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435, \u043F\u0440\u043E\u0441\u0438 `select:["STATUS"]` \u2192 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u043A\u043B\u044E\u0447 `status` \u0441\u043E\n\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435\u043C \u043F\u043E \u0442\u043E\u0439 \u0436\u0435 \u0448\u043A\u0430\u043B\u0435 1..7 (\u0443 \u043E\u0431\u0451\u0440\u0442\u043A\u0438 `bitrix_tasks_list` \u043E\u043D \u0443\u0436\u0435 \u0432 \u0434\u0435\u0444\u043E\u043B\u0442\u043D\u043E\u043C `select`).\n\n**\u0424\u0438\u043B\u044C\u0442\u0440 `tasks.task.list`** \u2014 \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440 \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044F \u043F\u0435\u0440\u0435\u0434 \u0438\u043C\u0435\u043D\u0435\u043C \u043F\u043E\u043B\u044F: `!` (\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"}`, `{"%TITLE":"\u043A\u0430\u0440\u0442\u0430"}`. \u0424\u0438\u043B\u044C\u0442\u0440\u0443\u0435\u043C\u044B\u0435 \u043F\u043E\u043B\u044F: `ID`, `PARENT_ID`, `GROUP_ID`,\n`CREATED_BY`, `RESPONSIBLE_ID`, `ACCOMPLICE`, `AUDITOR`, `REAL_STATUS`, `STATUS`, `PRIORITY`, `TAG`,\n`STAGE_ID`, `SPRINT_ID`, `BACKLOG_ID`, `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`); \u0435\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, \u043E\u0431\u044A\u0435\u0434\u0438\u043D\u0438\n> \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`) \u0438 **\u0434\u0435\u0434\u0443\u043F\u043B\u0438\u0446\u0438\u0440\u0443\u0439 \u043F\u043E `id`** \u2014\n> \u043E\u0434\u043D\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0447\u0430\u0441\u0442\u043E \u043F\u043E\u043F\u0430\u0434\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u0432 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0440\u043E\u043B\u0435\u0439. \u0412 **`filter`** \u0440\u043E\u043B\u0438 \u0432 **\u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u043C** \u0447\u0438\u0441\u043B\u0435\n> (`ACCOMPLICE`/`AUDITOR`), \u0432 **`select`** \u2014 \u0432\u043E **\u043C\u043D\u043E\u0436\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u043C** (`ACCOMPLICES`/`AUDITORS`).\n\n> **Scrum-\u0437\u0430\u0434\u0430\u0447\u0438 (\u0441\u043F\u0440\u0438\u043D\u0442\u044B).** \u041F\u043E\u043B\u0435 `SPRINT_ID` \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0436\u0451\u0441\u0442\u043A\u0438\u0439 `filter[SPRINT_ID]` \u043C\u043E\u0433\u0443\u0442 \u0440\u0430\u0441\u0445\u043E\u0434\u0438\u0442\u044C\u0441\u044F:\n> \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 (\u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u0430 \u0432 \u0431\u044D\u043A\u043B\u043E\u0433\n> \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 \u0438 \u043E\u0442\u0444\u0438\u043B\u044C\u0442\u0440\u0443\u0439 \u043F\u043E\n> `SPRINT_ID`/`STAGE_ID` \u0443 \u0441\u0435\u0431\u044F. \u041C\u0435\u0442\u043E\u0434\u0430 \xAB\u043A\u043E\u043B\u043E\u043D\u043A\u0438 scrum-\u0434\u043E\u0441\u043A\u0438\xBB (`STAGE_ID` \u2192 \u0438\u043C\u044F \u043A\u043E\u043B\u043E\u043D\u043A\u0438) \u0432 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0435 \u043D\u0435\u0442.\n\n**\u0413\u0440\u0443\u043F\u043F\u0430/\u043F\u0440\u043E\u0435\u043A\u0442 \u2014 \u0441\u043F\u0438\u0441\u043E\u043A** (`workgroup.list`): `ID`, `NAME`, `DESCRIPTION`, `NUMBER_OF_MEMBERS`,\n`OWNER_ID`, `DATE_CREATE`, `PROJECT` (Y=\u043F\u0440\u043E\u0435\u043A\u0442/N=\u0433\u0440\u0443\u043F\u043F\u0430), `TYPE`; **\u0431\u0435\u0437 `select` \u0432\u0435\u0440\u043D\u0451\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E `ID`**.\n\u{1F4D6} \u0444\u0438\u043B\u044C\u0442\u0440\u0443\u0435\u043C\u044B\u0435: `ID`, `NAME`, `OWNER_ID`, `ACTIVE`, `VISIBLE`, `OPENED`, `CLOSED`, `PROJECT`,\n`SUBJECT_ID`, `SITE_ID`, `DATE_CREATE`, `DATE_UPDATE`, `DATE_ACTIVITY`; \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u044B \u0444\u0438\u043B\u044C\u0442\u0440\u0430\n`>= > <= < % =% %= !% != !`.\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}`, `counter` (\u043D\u0435\u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u0445),\n`unread`, `last_id`, `pinned`, `date_update`, `date_last_activity`, `user{\u2026}`,\n`chat{\u2026 entity_type, entity_id, owner, \u2026}`; \u0435\u0441\u0442\u044C \u043B\u0438 \u0435\u0449\u0451 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B \u2014 `hasMore`/`hasMorePages` \u{1F4D6}.\n**\u041D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u043F\u043E \u0441\u0435\u043A\u0446\u0438\u0438** (`im.v2.Recent.load`): `filter[recentSection]` \u2014 `default` (\u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0434\u0438\u0430\u043B\u043E\u0433\u0438),\n**`tasksTask` (\u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447)**, `collab`/`collabDefault`. \u0412\u0433\u043B\u0443\u0431\u044C \u2014 `im.v2.Recent.tail` \u0441 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u043C\n`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\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\n**\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435** (`im.v2.Chat.Message.*`): `id`, `chatId`, `authorId`, `date`, `text`, `params`, `viewed`;\n\u043E\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\n---\n\n## 5. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0438\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; v2-\u043F\u043E\u0434\u0441\u0438\u0441\u0442\u0435\u043C\u0430; \u0444\u0430\u0439\u043B\u044B, \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u044B, \u0441\u0432\u044F\u0437\u0438\nbitrix_task_get { "taskId": 4229, "params": { "select": ["ID","TITLE","DESCRIPTION","TAGS"] } }\nbitrix_task_get_v2 { "taskId": 4229 } // \u2192 { "task": { "id": 4229 } }\nbitrix_call { "name": "task.files", "params": { "ids": [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 (\u043E\u0442\u0434\u0430\u0451\u0442 CHAT_ID / DIALOG_ID)\nbitrix_projects_list { "params": { "order": {"DATE_CREATE":"desc"} } }\nbitrix_project_get { "groupId": 15 }\n```\n\n### 5.1. \u041C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 (IM): \u043A\u0430\u043A \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C `chatId`\n\n\u0412\u0441\u0451 \u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u2014 **\u0447\u0430\u0442\u044B**: \u043B\u0438\u0447\u043D\u044B\u0435 1-\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**.\n\u0427\u0438\u0441\u043B\u043E\u0432\u043E\u0439 **`chatId`** \u2014 \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`); \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 \u2014 \u043D\u0430 \u0448\u0430\u0433\u0435 \u0435\u0433\u043E \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F.\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** (\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 1-\u043D\u0430-1\n\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 **\u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\n\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:**\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 \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_task_get` \u2192 `CHAT_ID` (\xA75.2) |\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 }` |\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**\u0427\u0438\u0442\u0430\u0442\u044C \u0438\u0441\u0442\u043E\u0440\u0438\u044E.** `bitrix_chat_messages` \u043E\u0442\u0434\u0430\u0451\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u044E\u044E \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443; \u0432\u0433\u043B\u0443\u0431\u044C \u043B\u0438\u0441\u0442\u0430\u0435\u0442\n`bitrix_chat_history` \u043F\u043E \u043A\u0443\u0440\u0441\u043E\u0440\u0443 `beforeId` = \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 id \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B (\u043F\u043E\u0432\u0442\u043E\u0440\u044F\u0439,\n\u0443\u043C\u0435\u043D\u044C\u0448\u0430\u044F `beforeId`, \u0434\u043E \u043D\u0430\u0447\u0430\u043B\u0430 \u0438\u0441\u0442\u043E\u0440\u0438\u0438).\n\n```jsonc\nbitrix_chat_load { "dialogId": 11 } // \u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 \u044E\u0437\u0435\u0440\u0430 11 \u2192 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 chatId\nbitrix_chat_history { "chatId": 485, "beforeId": 1861279 }\nbitrix_chat_mark_read { "chatId": 40271, "ids": [1884131] } // \u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439; actionUuid \u2014 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u043E\u043C\n```\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: `im.dialog.messages.get` (\u0434\u0435\u0444\u043E\u043B\u0442 20, \u043C\u0430\u043A\u0441 50; \u043B\u0438\u0441\u0442\u0430\u043D\u0438\u0435\n`LAST_ID` \u2014 \u0441\u0442\u0430\u0440\u0435\u0435, `FIRST_ID` \u2014 \u043D\u043E\u0432\u0435\u0435); `imbot.v2 chat.getMessageContext` \u2014 \u043E\u0442\u0432\u0435\u0442 `messages[]`\n(oldest\u2192newest) + `users[]` + `hasPrevPage`/`hasNextPage`, \u043F\u043E \u0444\u043E\u0440\u043C\u0435 **\u0441\u043E\u0432\u043F\u0430\u0434\u0430\u0435\u0442** \u0441 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u043C\u0438\n`im.v2.Chat.Message.*`.\n\n### 5.2. \u041E\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**\u0410. \u041F\u0440\u044F\u043C\u043E\u0439 \u0440\u0435\u0437\u043E\u043B\u0432 \u2014 \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` \u0447\u0430\u0442\u0430-\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u044F (\u0432\u0445\u043E\u0434\u0438\u0442\n\u0432 \u0434\u0435\u0444\u043E\u043B\u0442\u043D\u044B\u0439 `select` \u{1F4D6}) \u2014 \u044D\u0442\u043E `taskId \u2192 chatId` \u0431\u0435\u0437 \u043F\u043E\u0438\u0441\u043A\u0430 \u043F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E \u0438 \u0431\u0435\u0437 \u043F\u0440\u043E\u043C\u0430\u0445\u0430 \u043F\u043E \u0442\u0451\u0437\u043A\u0430\u043C:\n\n```jsonc\nbitrix_task_get { "taskId": 28373 } // \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 CHAT_ID\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\u041E\u0431\u0449\u0430\u044F \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`): chatId \u043B\u044E\u0431\u043E\u0433\u043E \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0433\u043E\n\u043E\u0431\u044A\u0435\u043A\u0442\u0430 \u043F\u043E \u043F\u0430\u0440\u0435 `entityType`/`entityId`; \u043A\u0440\u043E\u043C\u0435 `TASKS_TASK` \u0442\u0430\u043A \u0436\u0435 \u0430\u0434\u0440\u0435\u0441\u0443\u044E\u0442\u0441\u044F `SONET_GROUP`\n(\u0433\u0440\u0443\u043F\u043F\u0430/\u043F\u0440\u043E\u0435\u043A\u0442), `CRM`, `CALENDAR`, `MAIL`, `VIDEOCONF`, `CALL`:\n\n```jsonc\nbitrix_entity_chat { "entityType": "TASKS_TASK", "entityId": 28373 } // \u2192 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** (\u0441\u0435\u043A\u0446\u0438\u044F `tasksTask`; \u0432 `bitrix_chats_recent` \u0438\u0445 \u041D\u0415\u0422):\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" }\nbitrix_chat_load { "dialogId": "chat38849" } // \u0438\u043B\u0438 { "chatId": 38849 }\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** (\u0437\u0430\u043F\u0430\u0441\u043D\u043E\u0439, \u043C\u0430\u0442\u0447 \u043F\u043E \u0442\u0435\u043A\u0441\u0442\u0443):\n`bitrix_entity_search { "query": "\u0442\u0440\u0435\u043A\u0435\u0440", "section": "tasksTask" }`\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_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### 5.3. \u041F\u043E\u0438\u0441\u043A \u0447\u0430\u0442\u0430 / \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\n\n`bitrix_entity_search` (\u043E\u0431\u0451\u0440\u0442\u043A\u0430 \u043D\u0430\u0434 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u043C `ui.entityselector.doSearch`) \u0441\u0430\u043C \u0441\u043E\u0431\u0438\u0440\u0430\u0435\u0442 \u0434\u0438\u0430\u043B\u043E\u0433\n`IM_CHAT_SEARCH` \u0438 `searchQuery` \u0438\u0437 \u0441\u0442\u0440\u043E\u043A\u0438. \u041F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0435 \u0430\u043D\u0430\u043B\u043E\u0433\u0438: \u043B\u044E\u0434\u0438 \u2014 `user.get`/`user.search`, \u0447\u0430\u0442\u044B \u2014\n`im.recent.list` + \u0444\u0438\u043B\u044C\u0442\u0440\u0430\u0446\u0438\u044F \u0443 \u0441\u0435\u0431\u044F.\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\nbitrix_user_get { "userId": 11 } // \u0440\u0435\u0437\u043E\u043B\u0432 authorId \u2192 \u0438\u043C\u044F\n```\n\n### 5.4. \u0421\u043E\u0437\u0432\u043E\u043D: \u0440\u0435\u0437\u044E\u043C\u0435, \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430, \u0437\u0430\u043F\u0438\u0441\u044C\n\nAI-\u0430\u043D\u0430\u043B\u0438\u0437 \u0437\u0432\u043E\u043D\u043A\u0430 (BitrixGPT Follow-Up) \u0436\u0438\u0432\u0451\u0442 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043D\u043E \u043E\u0442\u0440\u0435\u043D\u0434\u0435\u0440\u0435\u043D\u043D\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435 `/call/detail/<callId>`\n\u2014 JSON-\u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u0430 \u043F\u043E\u0434 \u043D\u0435\u0439 \u043D\u0435\u0442, \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u043E\u0433\u043E REST \u0434\u043B\u044F \u0432\u0438\u0434\u0435\u043E\u0432\u0441\u0442\u0440\u0435\u0447 \u0442\u043E\u0436\u0435 (\u{1F4D6} \u0442\u043E\u043B\u044C\u043A\u043E \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0438\u044F `voximplant.*`\n\u0438 `crm.activity.call.getTranscript`). \u041C\u043E\u0441\u0442 \u0447\u0438\u0442\u0430\u0435\u0442 \u044D\u0442\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 \u0435\u0451 \u0432 \u043D\u043E\u0440\u043C\u0430\u043B\u0438\u0437\u043E\u0432\u0430\u043D\u043D\u044B\u0439 JSON.\n\n**1) \u041D\u0430\u0439\u0442\u0438 \u0437\u0432\u043E\u043D\u043A\u0438.** \u0421\u0435\u0440\u0432\u0435\u0440\u043D\u043E\u0433\u043E \u043F\u043E\u0438\u0441\u043A\u0430 \u0437\u0432\u043E\u043D\u043A\u043E\u0432 \u043F\u043E \u043F\u043E\u0440\u0442\u0430\u043B\u0443 \u043D\u0435\u0442 \u2014 \u0438\u0449\u0435\u043C \u0432 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u043C \u0447\u0430\u0442\u0435: \u0437\u0432\u043E\u043D\u043E\u043A\n\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0441 `params.COMPONENT_PARAMS = { messageType: "START", callId }`.\n\n```jsonc\nbitrix_chat_calls { "chatId": 9876 } // \u0447\u0430\u0442 \u043F\u0440\u043E\u0435\u043A\u0442\u0430: bitrix_project_get \u2192 CHAT_ID\nbitrix_chat_calls { "chatId": 9876, "maxPages": 20, "beforeId": 5001 } // \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C \u0432\u0433\u043B\u0443\u0431\u044C\n```\n\n\u041E\u0442\u0432\u0435\u0442: `calls[] { callId, startedAt, startedBy, startMessageId, events[], summaryMessageId }` \u043F\u043B\u044E\u0441\n`scannedPages` / `oldestScannedMessageId` / **`reachedHistoryStart`** \u2014 \u0435\u0441\u043B\u0438 \u043E\u043D `false`, \u0438\u0441\u0442\u043E\u0440\u0438\u044F\n\u0434\u043E\u0447\u0438\u0442\u0430\u043D\u0430 \u041D\u0415 \u0434\u043E \u043A\u043E\u043D\u0446\u0430, \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u0439 \u0441 `beforeId: <oldestScannedMessageId>`.\n\n**2) \u0412\u0437\u044F\u0442\u044C \u0432\u0441\u0451 \u043F\u043E \u0437\u0432\u043E\u043D\u043A\u0443.**\n\n```jsonc\nbitrix_call_detail { "callId": 4242 } // \u0432\u0441\u0451; \u0434\u043B\u0438\u043D\u043D\u0430\u044F \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430 \u0443\u0435\u0434\u0435\u0442 \u0432 \u0444\u0430\u0439\u043B\nbitrix_call_detail { "callId": 4242, "transcript": "inline" } // \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430 \u043F\u0440\u044F\u043C\u043E \u0432 \u043E\u0442\u0432\u0435\u0442\u0435\nbitrix_call_detail { "callId": 4242, "transcript": "none" } // \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430 \u043D\u0435 \u043D\u0443\u0436\u043D\u0430 \u0432\u043E\u0432\u0441\u0435\nbitrix_call_detail { "callId": 4242, "transcript": "file" } // \u0432\u0441\u0435\u0433\u0434\u0430 \u0432 \u0444\u0430\u0439\u043B, \u0434\u0430\u0436\u0435 \u043A\u043E\u0440\u043E\u0442\u043A\u0430\u044F\n```\n\n| \u041F\u043E\u043B\u0435 \u043E\u0442\u0432\u0435\u0442\u0430 | \u0427\u0442\u043E \u0432\u043D\u0443\u0442\u0440\u0438 |\n|---|---|\n| `title`, `agenda`, `meetingType` | \u0442\u0435\u043C\u0430, \u0432\u0441\u0442\u0443\u043F\u043B\u0435\u043D\u0438\u0435, \u0442\u0438\u043F \u0432\u0441\u0442\u0440\u0435\u0447\u0438 (\xAB\u0421\u0442\u0430\u0442\u0443\u0441-\u0432\u0441\u0442\u0440\u0435\u0447\u0430\xBB) |\n| `date`, `interval`, `duration` | \xAB23 \u0438\u044E\u043B\u044F, 15:46\xBB, \xAB15:46 - 16:51\xBB, \xAB1 \u0447 4 \u043C\u0438\u043D\xBB |\n| `efficiency`, `qualityChecklist[]` | \u043E\u0446\u0435\u043D\u043A\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u0438 \u0432 % \u0438 \u043A\u0440\u0438\u0442\u0435\u0440\u0438\u0438 `{ ok, text }` |\n| `participants[]` | `{ id, name, talkTimePercent, talkTime, efficiency, metrics[], insight }` |\n| `overview`, `chapters[]` | \u043E\u0431\u0449\u0435\u0435 \u0440\u0435\u0437\u044E\u043C\u0435 \u0438 \u0433\u043B\u0430\u0432\u044B `{ from, to, title, text }` \u0441 \u0442\u0430\u0439\u043C\u043A\u043E\u0434\u0430\u043C\u0438 |\n| `decisions[]`, `tasks[]` | \xAB\u0447\u0442\u043E \u0440\u0435\u0448\u0438\u043B\u0438\xBB \u0438 \u0437\u0430\u0434\u0430\u0447\u0438 `{ assigneeId, assignee, text }` |\n| `transcript[]`, `transcriptCount` | \u0440\u0435\u043F\u043B\u0438\u043A\u0438 `{ from, to, speakerId, speaker, text }` |\n| `recording` | `{ path, url, trackId }` \u2014 \u0430\u0443\u0434\u0438\u043E\u0437\u0430\u043F\u0438\u0441\u044C, \u043A\u0430\u0447\u0430\u0435\u0442\u0441\u044F `bitrix_call_recording` (\xA75.5) |\n\n**\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430 \u0434\u043B\u0438\u043D\u043D\u043E\u0433\u043E \u0437\u0432\u043E\u043D\u043A\u0430 \u043D\u0435 \u043F\u0440\u0438\u0445\u043E\u0434\u0438\u0442 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435.** \u0423 \u0447\u0430\u0441\u043E\u0432\u043E\u0439 \u0432\u0441\u0442\u0440\u0435\u0447\u0438 \u043E\u043D\u0430 \u0434\u0430\u0451\u0442 ~70 \u041A\u0411 \u0438\u0437 80 \u041A\u0411, \u043F\u043E\u044D\u0442\u043E\u043C\u0443\n\u0441\u0432\u044B\u0448\u0435 ~20 \u041A\u0411 (\u0440\u0435\u0436\u0438\u043C `"auto"` = \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u0435) \u043F\u0438\u0448\u0435\u0442\u0441\u044F \u043D\u0430 \u0434\u0438\u0441\u043A, \u0430 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 \u043E\u0441\u0442\u0430\u044E\u0442\u0441\u044F `transcript: []`,\n`transcriptCount` \u0438 **`files`**: `files.transcript` \u2014 `call-<id>-transcript.txt`, \u0433\u0434\u0435 \u0441\u0442\u0440\u043E\u043A\u0430 = \u0440\u0435\u043F\u043B\u0438\u043A\u0430\n(`[11:10\u201411:24] \u0413\u0435\u043D\u0440\u0438\u0445 \u0411\u043E\u0433\u0430\u0446\u043A\u0438\u0439: \u2026`), \u0435\u0451 \u0443\u0434\u043E\u0431\u043D\u043E **\u0433\u0440\u0435\u043F\u0430\u0442\u044C** (\u043D\u0430\u0439\u0434\u0435\u043D\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 \u0441\u0430\u043C\u0430 \u043D\u0435\u0441\u0451\u0442 \u0442\u0430\u0439\u043C\u043A\u043E\u0434 \u0438\n\u0441\u043F\u0438\u043A\u0435\u0440\u0430); `files.json` \u2014 \u043F\u043E\u043B\u043D\u044B\u0439 \u043E\u0442\u0432\u0435\u0442 \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u043E\u0439. \u041E\u0431\u0430 \u0444\u0430\u0439\u043B\u0430 \u2014 \u043A\u0435\u0448 \u0437\u0432\u043E\u043D\u043A\u0430, \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u044B\u0432\u0430\u044E\u0442\u0441\u044F.\n\n\u0422\u043E\u043D\u043A\u043E\u0441\u0442\u0438:\n- **`speakerId`** \u0440\u0435\u0437\u043E\u043B\u0432\u0438\u0442\u0441\u044F \u043F\u043E \u0438\u043C\u0435\u043D\u0438 \u0438\u0437 \u0442\u0430\u0431\u043B\u0438\u0446\u044B \u0430\u043D\u0430\u043B\u0438\u0437\u0430; \u043A\u0442\u043E \u0433\u043E\u0432\u043E\u0440\u0438\u043B \u043C\u0430\u043B\u043E \u0438 \u0432 \u043D\u0435\u0451 \u043D\u0435 \u043F\u043E\u043F\u0430\u043B \u2014 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\n `speakerId: null`, \u043D\u043E \u043E\u0441\u0442\u0430\u043D\u0435\u0442\u0441\u044F \u0432 `participants` \u0441 `id: null`.\n- **`assigneeId` \u0437\u0430\u0434\u0430\u0447\u0438** \u2014 \u0443\u043F\u043E\u043C\u044F\u043D\u0443\u0442\u044B\u0439 \u0432 \u0442\u0435\u043A\u0441\u0442\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C, \u0430 \u041D\u0415 id \u0441\u043C\u043E\u0442\u0440\u044F\u0449\u0435\u0433\u043E.\n- \u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043A \u0437\u0432\u043E\u043D\u043A\u0443 / \u043F\u0440\u043E\u0442\u0443\u0445\u043B\u0430 \u0441\u0435\u0441\u0441\u0438\u044F \u2192 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u0432\u0435\u0440\u043D\u0451\u0442 \u0432\u043D\u044F\u0442\u043D\u0443\u044E \u043E\u0448\u0438\u0431\u043A\u0443 (\u043F\u043E\u0440\u0442\u0430\u043B \u043E\u0442\u0434\u0430\u0451\u0442 HTML \u043B\u043E\u0433\u0438\u043D\u0430).\n\n### 5.5. \u0421\u043A\u0430\u0447\u0430\u0442\u044C \u0444\u0430\u0439\u043B (\u0432\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0447\u0430\u0442\u0430, \u0444\u0430\u0439\u043B \u0437\u0430\u0434\u0430\u0447\u0438, \u0437\u0430\u043F\u0438\u0441\u044C \u0437\u0432\u043E\u043D\u043A\u0430)\n\n\u0421\u0441\u044B\u043B\u043A\u0438 \u043F\u043E\u0440\u0442\u0430\u043B \u043C\u0438\u043D\u0442\u0438\u0442 \u0438 \u043F\u043E\u0434\u043F\u0438\u0441\u044B\u0432\u0430\u0435\u0442 \u0441\u0430\u043C, \u043D\u043E \u043F\u043E\u0434\u043F\u0438\u0441\u044C \u041D\u0415 \u0437\u0430\u043C\u0435\u043D\u044F\u0435\u0442 \u0430\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u044E \u2014 \u043A\u0430\u0447\u0430\u0435\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435 \u0432\n\u0441\u0435\u0441\u0441\u0438\u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F.\n\n```jsonc\n// \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0447\u0430\u0442\u0430: \u0441\u0441\u044B\u043B\u043A\u0443 \u0431\u0435\u0440\u0451\u043C \u0438\u0437 files[].urlDownload \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 bitrix_chat_load\nbitrix_file_download { "url": "https://<\u043F\u043E\u0440\u0442\u0430\u043B>/bitrix/services/main/ajax.php?action=disk.api.file.download&\u2026" }\nbitrix_call_recording { "callId": 4242 } // \u0430\u0443\u0434\u0438\u043E\u0437\u0430\u043F\u0438\u0441\u044C \u0441\u043E\u0437\u0432\u043E\u043D\u0430 (\u0441\u0441\u044B\u043B\u043A\u0443 \u043D\u0430\u0439\u0434\u0451\u0442 \u0441\u0430\u043C)\nbitrix_file_download { "url": "\u2026", "savePath": "/tmp/photo.png", "overwrite": true }\n```\n\n\u041E\u0442\u0432\u0435\u0442 \u2014 **\u043F\u0443\u0442\u044C, \u0430 \u043D\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435**: `{ path, bytes, contentType, fileName }` (\u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442\u044B \u043D\u0435 \u043F\u043E\u043F\u0430\u0434\u0430\u044E\u0442 \u0432\n\u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442). \u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0444\u0430\u0439\u043B \u043B\u043E\u0436\u0438\u0442\u0441\u044F \u0432 `~/.bitrix24-mcp-bridge/downloads/`; `savePath` \u0431\u0435\u0437 \u0432\u0435\u0434\u0443\u0449\u0435\u0433\u043E `/`\n\u0442\u0440\u0430\u043A\u0442\u0443\u0435\u0442\u0441\u044F \u043A\u0430\u043A \u0438\u043C\u044F \u0432\u043D\u0443\u0442\u0440\u0438 \u044D\u0442\u043E\u0439 \u043F\u0430\u043F\u043A\u0438. \u041F\u043E\u0442\u043E\u043B\u043E\u043A \u2014 512 \u041C\u0411.\n\n\u0422\u043E\u043D\u043A\u043E\u0441\u0442\u0438:\n- **\u0413\u0440\u0430\u043D\u0438\u0446\u0430 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 \u2014 origin**: \u0441\u043A\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0441 origin \u0441\u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0433\u043E \u043F\u043E\u0440\u0442\u0430\u043B\u0430.\n- **\u0418\u043C\u044F \u0434\u0430\u0451\u0442 \u043F\u043E\u0440\u0442\u0430\u043B** (`Content-Disposition`), \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u0431\u0435\u0437 `savePath` \u0443\u0433\u0430\u0434\u044B\u0432\u0430\u0442\u044C \u0435\u0433\u043E \u043D\u0435 \u043D\u0443\u0436\u043D\u043E.\n- **\u041F\u043E\u0432\u0442\u043E\u0440\u043D\u043E\u0435 \u0441\u043A\u0430\u0447\u0438\u0432\u0430\u043D\u0438\u0435** \u0442\u043E\u0433\u043E \u0436\u0435 \u0444\u0430\u0439\u043B\u0430 \u043F\u0430\u0434\u0430\u0435\u0442 \u0441 `already exists` \u2014 \u043F\u0435\u0440\u0435\u0434\u0430\u0439 `overwrite: true`.\n\n---\n\n\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u043D\u043E\u0432\u044B\u043C\u0438 \u043C\u0435\u0442\u043E\u0434\u0430\u043C\u0438, \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 (`bodyType`, `responseType`, path-\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B) \u0438\n\u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0430 \u043F\u0440\u0430\u0432\u043E\u043A \u0432 \u0436\u0438\u0432\u043E\u0439 daemon \u2014 `docs/reconnaissance.md`.\n' : load();
|
|
25431
|
+
var HELP = '# Bitrix24 API notes (reverse-engineered)\n\n\u041A\u0430\u043A \u0430\u0433\u0435\u043D\u0442\u0443 \u0440\u0430\u0431\u043E\u0442\u0430\u0442\u044C \u0441 Bitrix24 \u0447\u0435\u0440\u0435\u0437 \u044D\u0442\u043E\u0442 \u043C\u043E\u0441\u0442: \u0444\u043E\u0440\u043C\u0430\u0442 `params`, \u0438\u043C\u0435\u043D\u0430 \u043F\u043E\u043B\u0435\u0439, \u0433\u043E\u0442\u043E\u0432\u044B\u0435 \u0446\u0435\u043F\u043E\u0447\u043A\u0438 \u0432\u044B\u0437\u043E\u0432\u043E\u0432.\n\n\u0414\u0432\u0435 \u043F\u043E\u0432\u0435\u0440\u0445\u043D\u043E\u0441\u0442\u0438 API. **\u041F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0439 REST** (`tasks.task.*`, `im.recent.list`, `im.user.get`, `im.chat.get`,\n`socialnetwork.api.workgroup.*`) \u2014 \u0435\u0441\u0442\u044C \u043E\u0444\u0438\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0435 \u0434\u043E\u043A\u0438, \u0441\u0441\u044B\u043B\u043A\u0438 \u043D\u0430 \u043D\u0438\u0445 \u043F\u043E\u043C\u0435\u0447\u0435\u043D\u044B **\u{1F4D6}**\n([`apidocs.bitrix24.com`](https://apidocs.bitrix24.com); \u0430\u0433\u0435\u043D\u0442\u0443 \u0441 MCP context7 \u2014 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430\n`/bitrix24/b24restdocs`). **\u0412\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0435 ajax-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u044B** (`im.v2.*`, `tasks.v2.*`, `ui.entityselector.*`)\n\u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0445 \u0434\u043E\u043A\u043E\u0432 \u043D\u0435 \u0438\u043C\u0435\u044E\u0442 \u2014 \u0432\u0441\u0451 \u043D\u0438\u0436\u0435 \u0434\u043E\u0431\u044B\u0442\u043E \u0436\u0438\u0432\u044B\u043C \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C; \u043A\u043E\u043D\u0432\u0435\u0440\u0442 \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043F\u043E\u043B\u0435\u0439 \u0443 \u043D\u0438\u0445 \u043C\u043E\u0433\u0443\u0442\n\u043E\u0442\u043B\u0438\u0447\u0430\u0442\u044C\u0441\u044F \u043E\u0442 \u{1F4D6}-\u0430\u043D\u0430\u043B\u043E\u0433\u043E\u0432. \u0418\u043C\u0435\u043D\u0430 \u043F\u043E\u043B\u0435\u0439 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B \u0434\u043B\u044F \u043E\u0431\u043B\u0430\u0447\u043D\u043E\u0433\u043E Bitrix24; \u043D\u0430 \u0434\u0440\u0443\u0433\u043E\u043C \u043F\u043E\u0440\u0442\u0430\u043B\u0435 \u0441\u0432\u0435\u0440\u044F\u0439\u0441\u044F\n\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- **\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** (`bitrix_tasks_list`, `bitrix_task_get`, `bitrix_chat_load`, \u2026) \u2014\n \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; \u0438\u0445 \u043F\u043E\u043B\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A \u0438 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u044F \u0432\u0438\u0434\u043D\u044B \u0441\u0440\u0435\u0434\u0438 MCP-\u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432. \u0422\u043E\u0447\u043D\u0430\u044F\n \u0432\u044B\u0431\u043E\u0440\u043A\u0430 \u2014 \u043E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u043C `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.\n- **`bitrix_call { name, params }`** \u2014 \u043B\u044E\u0431\u043E\u0435 \u0438\u043C\u044F \u0438\u0437 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 (`actions.json`), `params` \u0432 \u043D\u0430\u0442\u0438\u0432\u043D\u043E\u043C\n \u0444\u043E\u0440\u043C\u0430\u0442\u0435 Bitrix (\xA73). \u041F\u043E\u043B\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A \u0438\u043C\u0451\u043D \u043E\u0442\u0434\u0430\u0451\u0442 \u0441\u0430\u043C `bitrix_call` \u0432 \u0441\u0432\u043E\u0451\u043C \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0438.\n- \u041A\u0430\u0442\u0430\u043B\u043E\u0433 \u043C\u043E\u0436\u0435\u0442 \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C **\u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0435** \u0432\u044B\u0437\u043E\u0432\u044B: \u043D\u0430\u043B\u0438\u0447\u0438\u0435 \u0437\u0430\u043F\u0438\u0441\u0438 = \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u0432\u044B\u0437\u0432\u0430\u0442\u044C. \u042D\u0442\u043E \u043D\u0435 \u0440\u0435\u0436\u0438\u043C\n \xAB\u0442\u043E\u043B\u044C\u043A\u043E \u0447\u0442\u0435\u043D\u0438\u0435\xBB.\n- \u0423 \u043E\u0431\u0451\u0440\u0442\u043E\u043A \u0435\u0441\u0442\u044C \u0434\u0435\u0444\u043E\u043B\u0442\u044B (\u043D\u0430\u043F\u0440. `bitrix_tasks_list` \u0441\u043E\u0440\u0442\u0438\u0440\u0443\u0435\u0442 `{"ID":"desc"}`), \u0443 `bitrix_call` \u0438\u0445 \u043D\u0435\u0442 \u2014\n \u043E\u0434\u0438\u043D \u0438 \u0442\u043E\u0442 \u0436\u0435 \u0444\u0438\u043B\u044C\u0442\u0440 \u0434\u0430\u0441\u0442 \u0440\u0430\u0437\u043D\u044B\u0435 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B. \u0421\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u0435\u0448\u044C \u0432\u044B\u0434\u0430\u0447\u0438 \u2014 \u0437\u0430\u0434\u0430\u0432\u0430\u0439 `order` \u044F\u0432\u043D\u043E.\n- \u041E\u0442\u0432\u0435\u0442 `invalid_csrf` / `invalid_authentication` = \u0441\u0435\u0441\u0441\u0438\u044F \u043F\u043E\u0440\u0442\u0430\u043B\u0430 \u043F\u0440\u043E\u0442\u0443\u0445\u043B\u0430 \u2192 \u043F\u0435\u0440\u0435\u043B\u043E\u0433\u0438\u043D\u044C\u0441\u044F \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435\n \u043D\u0430 \u0432\u043A\u043B\u0430\u0434\u043A\u0435 \u043F\u043E\u0440\u0442\u0430\u043B\u0430.\n\n---\n\n## 2. \u0424\u043E\u0440\u043C\u0430\u0442 \u043E\u0442\u0432\u0435\u0442\u0430\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 = `status:"success"` \u0438/\u0438\u043B\u0438 **\u043F\u0443\u0441\u0442\u043E\u0439** `errors`. \u041D\u0435\u043F\u0443\u0441\u0442\u043E\u0439 `errors` / `status:"error"` / top-level\n`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 \u0435\u0451 \u0432 `ok:false`). REST-\u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u044B (`/rest/*.json`) \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0442\n\u0438\u043D\u0430\u0447\u0435: `{ "result": \u2026, "next", "total", "time" }` \u2014 \u0431\u0435\u0437 `errors`.\n\n---\n\n## 3. \u041A\u0430\u0442\u0430\u043B\u043E\u0433: \u0438\u043C\u044F \u2192 action \u2192 params\n\n\u0424\u043E\u0440\u043C\u0430 `params` \u0440\u0430\u0437\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043F\u043E \u043C\u0435\u0442\u043E\u0434\u0443: \u0433\u0434\u0435-\u0442\u043E \u043F\u043B\u043E\u0441\u043A\u043E, \u0433\u0434\u0435-\u0442\u043E \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E, \u0433\u0434\u0435-\u0442\u043E \u043E\u0431\u0451\u0440\u043D\u0443\u0442\u043E \u0432 `params[\u2026]` \u2014\n\u043A\u043E\u043B\u043E\u043D\u043A\u0430 \xABparams\xBB \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442 \u0442\u043E\u0447\u043D\u0443\u044E \u0444\u043E\u0440\u043C\u0443 (\u043A\u043E\u0434\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0442\u0435\u043B\u0430 \u043C\u043E\u0441\u0442 \u0431\u0435\u0440\u0451\u0442 \u043D\u0430 \u0441\u0435\u0431\u044F).\n\n| \u0418\u043C\u044F (`bitrix_call`) | action / endpoint | params | \u041F\u0430\u0433\u0438\u043D\u0430\u0446\u0438\u044F |\n|---|---|---|---|\n| `tasks.list` | `tasks.task.list` | \u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C: `filter{RESPONSIBLE_ID,REAL_STATUS,GROUP_ID,\u2026}`, `select[]`, `order{}` | **`PAGEN_1`** \u2014 \u043D\u043E\u043C\u0435\u0440 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B (1, 2, 3\u2026), \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 = 20 \u0437\u0430\u0434\u0430\u0447; `start` **\u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442** (\u0432\u0435\u0440\u043D\u0451\u0442 \u0442\u0443 \u0436\u0435 \u043F\u0435\u0440\u0432\u0443\u044E \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443) |\n| `task.get` | `tasks.task.get` | \u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C: `taskId`, `select[]` | \u2014 |\n| `task.v2.get` | `tasks.v2.Task.get` | \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E: `{"task":{"id":N}}` | \u2014 |\n| `task.scrum.info` | `tasks.v2.Scrum.getTaskInfo` | `{"taskId":N}` | \u2014 |\n| `task.files` | `tasks.v2.File.listObjects` | `{"ids":[N,\u2026]}` | \u2014 |\n| `task.views.count` | `tasks.v2.Task.View.User.count` | \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E: `{"task":{"id":N}}` | \u2014 |\n| `task.subtasks` | `tasks.v2.Task.Relation.Child.list` | `{"taskId":N,"withIds":true,"navigation":{"size":N}}` | `navigation` |\n| `task.related` | `tasks.v2.Task.Relation.Related.list` | \u043A\u0430\u043A `task.subtasks` | `navigation` |\n| `projects.list` | `socialnetwork.api.workgroup.list` | \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| `projects.get` | `socialnetwork.api.workgroup.get` | **\u043E\u0431\u0451\u0440\u043D\u0443\u0442\u043E**: `params[groupId]`, `params[select][]` | \u2014 |\n| `chats.recent` | `/rest/im.recent.list.json` | \u043F\u043B\u043E\u0441\u043A\u043E: `LIMIT`, `SKIP_OPENLINES`, `UNREAD_ONLY` | `LIMIT` |\n| `recent.load` | `im.v2.Recent.load` | \u043F\u043B\u043E\u0441\u043A\u043E: `limit`, `filter[recentSection]` (`tasksTask`/`collab`/\u2026), `filter[unread]`, `filter[parentId]` | `recent.tail` |\n| `recent.tail` | `im.v2.Recent.tail` | \u043F\u043B\u043E\u0441\u043A\u043E: `limit`, `filter[lastMessageDate]` (\u043A\u0443\u0440\u0441\u043E\u0440), `filter[recentSection]` | `filter[lastMessageDate]` |\n| `chat.load` | `im.v2.Chat.load` | \u043F\u043B\u043E\u0441\u043A\u043E: `dialogId`\\|`chatId`, `messageLimit` | \u2014 |\n| `chat.dialogId` | `im.v2.Chat.getDialogId` | \u043F\u043B\u043E\u0441\u043A\u043E: `externalId` (\u043D\u0430\u043F\u0440. `"sg"+groupId`) | \u2014 |\n| `chat.messages` | `im.v2.Chat.Message.list` | \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 `chat.messages.tail` |\n| `chat.messages.tail` | `im.v2.Chat.Message.tail` | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `limit`, `filter[lastId]`, `order[id]` | `filter[lastId]` (\xA75.1) |\n| `chat.message.read` | `im.v2.Chat.Message.read` | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `ids[]`, `actionUuid` | \u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439 |\n| `chat.read.all` | `im.v2.Chat.readAll` | \u0431\u0435\u0437 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 | \u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439 |\n| `im.user.get` | `/rest/im.user.get.json` | \u043F\u043B\u043E\u0441\u043A\u043E: `ID` | \u2014 |\n| `im.chat.get` | `/rest/im.chat.get.json` | \u043F\u043B\u043E\u0441\u043A\u043E: `ENTITY_TYPE`, `ENTITY_ID` (\u043D\u0430\u043F\u0440. `TASKS_TASK`+taskId) | \u2014 |\n| `entityselector.load` | `ui.entityselector.load` | `{"dialog":{entities,preselectedItems,\u2026}}` | \u2014 |\n| `entityselector.search` | `ui.entityselector.doSearch` | `{"dialog":{\u2026},"searchQuery":{"query":"\u2026","queryWords":["\u2026"]}}` | \u2014 |\n| `call.detail` | `GET /call/detail/{callId}` | `callId` (\u043F\u043E\u0434\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0432 \u043F\u0443\u0442\u044C), `IFRAME=Y`, `IFRAME_TYPE=SIDE_SLIDER` \u2192 HTML | \u0441\u043C. \xA75.4 |\n| `task.comments.page` | `GET /task/comments/{taskId}/` | `taskId` (\u0432 \u043F\u0443\u0442\u044C), `IFRAME=Y`, `IFRAME_TYPE=SIDE_SLIDER` \u2192 HTML \u0441\u0442\u0430\u0440\u044B\u0445 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0435\u0432 | \u0441\u043C. \xA75.6 |\n| `task.comments.navigate` | `bitrix:forum.comments` \u2192 `navigateComment` | \u0444\u043E\u0440\u043C\u0430: `ENTITY_XML_ID=TASK_<id>`, `EXEMPLAR_ID`, `signedParameters` (\u043E\u0431\u0430 \u2014 \u0438\u0437 HTML \u043F\u0435\u0440\u0432\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B), `FILTER[<ID]` | `FILTER[<ID]` \u2014 \u043A\u0443\u0440\u0441\u043E\u0440; \u043F\u0440\u043E\u0449\u0435 `bitrix_task_comments` (\xA75.6) |\n\n---\n\n## 4. \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 \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`, \xA75.2), `UF_*`. \u041E\u0442\u0432\u0435\u0442 \u043F\u043E\u0434\u043A\u043B\u0430\u0434\u044B\u0432\u0430\u0435\u0442 \u043E\u0431\u044A\u0435\u043A\u0442\u044B `group`,\n`responsible`, `creator`, `action`.\n\u{1F4D6} (`tasks.task.get`/`list`) \u2014 \u0441\u0432\u0435\u0440\u0445 \u044D\u0442\u043E\u0433\u043E: `parentId`, `stageId`, `sprintId`, `backlogId`,\n`commentsCount`, `timeSpentInLogs`, `favorite`, `flowId`, `mark`, `accomplices[]`, `auditors[]`,\n`checklist{}`, `subStatus`; \u0432 \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**, \u0430 \u0432 `select`/`filter`\n\u043E\u043D\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 **UPPER_CASE**. \u0414\u043E\u043F. \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F \u2014 \u0444\u043B\u0430\u0433\u0430\u043C\u0438 `params{WITH_TIMER_INFO, WITH_RESULT_INFO,\nWITH_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}`) \u{1F4D6}.\n\u0410\u0441\u0438\u043C\u043C\u0435\u0442\u0440\u0438\u044F: \u0432 **`filter`** \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 `REAL_STATUS`, \u0430 \u0432 **`select`** \u0435\u0433\u043E \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u0431\u0435\u0441\u043F\u043E\u043B\u0435\u0437\u043D\u043E \u2014 \u043F\u043E\u043B\u0435 \u043C\u043E\u043B\u0447\u0430\n\u043D\u0435 \u0432\u0435\u0440\u043D\u0451\u0442\u0441\u044F; \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435, \u043F\u0440\u043E\u0441\u0438 `select:["STATUS"]` \u2192 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u043A\u043B\u044E\u0447 `status` \u0441\u043E\n\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435\u043C \u043F\u043E \u0442\u043E\u0439 \u0436\u0435 \u0448\u043A\u0430\u043B\u0435 1..7 (\u0443 \u043E\u0431\u0451\u0440\u0442\u043A\u0438 `bitrix_tasks_list` \u043E\u043D \u0443\u0436\u0435 \u0432 \u0434\u0435\u0444\u043E\u043B\u0442\u043D\u043E\u043C `select`).\n\n**\u0424\u0438\u043B\u044C\u0442\u0440 `tasks.task.list`** \u2014 \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440 \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044F \u043F\u0435\u0440\u0435\u0434 \u0438\u043C\u0435\u043D\u0435\u043C \u043F\u043E\u043B\u044F: `!` (\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"}`, `{"%TITLE":"\u043A\u0430\u0440\u0442\u0430"}`. \u0424\u0438\u043B\u044C\u0442\u0440\u0443\u0435\u043C\u044B\u0435 \u043F\u043E\u043B\u044F: `ID`, `PARENT_ID`, `GROUP_ID`,\n`CREATED_BY`, `RESPONSIBLE_ID`, `ACCOMPLICE`, `AUDITOR`, `REAL_STATUS`, `STATUS`, `PRIORITY`, `TAG`,\n`STAGE_ID`, `SPRINT_ID`, `BACKLOG_ID`, `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`); \u0435\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, \u043E\u0431\u044A\u0435\u0434\u0438\u043D\u0438\n> \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`) \u0438 **\u0434\u0435\u0434\u0443\u043F\u043B\u0438\u0446\u0438\u0440\u0443\u0439 \u043F\u043E `id`** \u2014\n> \u043E\u0434\u043D\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0447\u0430\u0441\u0442\u043E \u043F\u043E\u043F\u0430\u0434\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u0432 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0440\u043E\u043B\u0435\u0439. \u0412 **`filter`** \u0440\u043E\u043B\u0438 \u0432 **\u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u043C** \u0447\u0438\u0441\u043B\u0435\n> (`ACCOMPLICE`/`AUDITOR`), \u0432 **`select`** \u2014 \u0432\u043E **\u043C\u043D\u043E\u0436\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u043C** (`ACCOMPLICES`/`AUDITORS`).\n\n> **Scrum-\u0437\u0430\u0434\u0430\u0447\u0438 (\u0441\u043F\u0440\u0438\u043D\u0442\u044B).** \u041F\u043E\u043B\u0435 `SPRINT_ID` \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0436\u0451\u0441\u0442\u043A\u0438\u0439 `filter[SPRINT_ID]` \u043C\u043E\u0433\u0443\u0442 \u0440\u0430\u0441\u0445\u043E\u0434\u0438\u0442\u044C\u0441\u044F:\n> \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 (\u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u0430 \u0432 \u0431\u044D\u043A\u043B\u043E\u0433\n> \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 \u0438 \u043E\u0442\u0444\u0438\u043B\u044C\u0442\u0440\u0443\u0439 \u043F\u043E\n> `SPRINT_ID`/`STAGE_ID` \u0443 \u0441\u0435\u0431\u044F. \u041C\u0435\u0442\u043E\u0434\u0430 \xAB\u043A\u043E\u043B\u043E\u043D\u043A\u0438 scrum-\u0434\u043E\u0441\u043A\u0438\xBB (`STAGE_ID` \u2192 \u0438\u043C\u044F \u043A\u043E\u043B\u043E\u043D\u043A\u0438) \u0432 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0435 \u043D\u0435\u0442.\n\n**\u0413\u0440\u0443\u043F\u043F\u0430/\u043F\u0440\u043E\u0435\u043A\u0442 \u2014 \u0441\u043F\u0438\u0441\u043E\u043A** (`workgroup.list`): `ID`, `NAME`, `DESCRIPTION`, `NUMBER_OF_MEMBERS`,\n`OWNER_ID`, `DATE_CREATE`, `PROJECT` (Y=\u043F\u0440\u043E\u0435\u043A\u0442/N=\u0433\u0440\u0443\u043F\u043F\u0430), `TYPE`; **\u0431\u0435\u0437 `select` \u0432\u0435\u0440\u043D\u0451\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E `ID`**.\n\u{1F4D6} \u0444\u0438\u043B\u044C\u0442\u0440\u0443\u0435\u043C\u044B\u0435: `ID`, `NAME`, `OWNER_ID`, `ACTIVE`, `VISIBLE`, `OPENED`, `CLOSED`, `PROJECT`,\n`SUBJECT_ID`, `SITE_ID`, `DATE_CREATE`, `DATE_UPDATE`, `DATE_ACTIVITY`; \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u044B \u0444\u0438\u043B\u044C\u0442\u0440\u0430\n`>= > <= < % =% %= !% != !`.\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}`, `counter` (\u043D\u0435\u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u0445),\n`unread`, `last_id`, `pinned`, `date_update`, `date_last_activity`, `user{\u2026}`,\n`chat{\u2026 entity_type, entity_id, owner, \u2026}`; \u0435\u0441\u0442\u044C \u043B\u0438 \u0435\u0449\u0451 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B \u2014 `hasMore`/`hasMorePages` \u{1F4D6}.\n**\u041D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u043F\u043E \u0441\u0435\u043A\u0446\u0438\u0438** (`im.v2.Recent.load`): `filter[recentSection]` \u2014 `default` (\u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0434\u0438\u0430\u043B\u043E\u0433\u0438),\n**`tasksTask` (\u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447)**, `collab`/`collabDefault`. \u0412\u0433\u043B\u0443\u0431\u044C \u2014 `im.v2.Recent.tail` \u0441 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u043C\n`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\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\n**\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435** (`im.v2.Chat.Message.*`): `id`, `chatId`, `authorId`, `date`, `text`, `params`, `viewed`;\n\u043E\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\n---\n\n## 5. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0438\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; v2-\u043F\u043E\u0434\u0441\u0438\u0441\u0442\u0435\u043C\u0430; \u0444\u0430\u0439\u043B\u044B, \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u044B, \u0441\u0432\u044F\u0437\u0438\nbitrix_task_get { "taskId": 4229, "params": { "select": ["ID","TITLE","DESCRIPTION","TAGS"] } }\nbitrix_task_get_v2 { "taskId": 4229 } // \u2192 { "task": { "id": 4229 } }\nbitrix_call { "name": "task.files", "params": { "ids": [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 (\u043E\u0442\u0434\u0430\u0451\u0442 CHAT_ID / DIALOG_ID)\nbitrix_projects_list { "params": { "order": {"DATE_CREATE":"desc"} } }\nbitrix_project_get { "groupId": 15 }\n```\n\n### 5.1. \u041C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 (IM): \u043A\u0430\u043A \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C `chatId`\n\n\u0412\u0441\u0451 \u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u2014 **\u0447\u0430\u0442\u044B**: \u043B\u0438\u0447\u043D\u044B\u0435 1-\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**.\n\u0427\u0438\u0441\u043B\u043E\u0432\u043E\u0439 **`chatId`** \u2014 \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`); \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 \u2014 \u043D\u0430 \u0448\u0430\u0433\u0435 \u0435\u0433\u043E \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F.\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** (\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 1-\u043D\u0430-1\n\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 **\u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\n\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:**\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 \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_task_get` \u2192 `CHAT_ID` (\xA75.2) |\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 }` |\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**\u0427\u0438\u0442\u0430\u0442\u044C \u0438\u0441\u0442\u043E\u0440\u0438\u044E.** `bitrix_chat_messages` \u043E\u0442\u0434\u0430\u0451\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u044E\u044E \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443; \u0432\u0433\u043B\u0443\u0431\u044C \u043B\u0438\u0441\u0442\u0430\u0435\u0442\n`bitrix_chat_history` \u043F\u043E \u043A\u0443\u0440\u0441\u043E\u0440\u0443 `beforeId` = \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 id \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B (\u043F\u043E\u0432\u0442\u043E\u0440\u044F\u0439,\n\u0443\u043C\u0435\u043D\u044C\u0448\u0430\u044F `beforeId`, \u0434\u043E \u043D\u0430\u0447\u0430\u043B\u0430 \u0438\u0441\u0442\u043E\u0440\u0438\u0438).\n\n```jsonc\nbitrix_chat_load { "dialogId": 11 } // \u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 \u044E\u0437\u0435\u0440\u0430 11 \u2192 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 chatId\nbitrix_chat_history { "chatId": 485, "beforeId": 1861279 }\nbitrix_chat_mark_read { "chatId": 40271, "ids": [1884131] } // \u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439; actionUuid \u2014 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u043E\u043C\n```\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: `im.dialog.messages.get` (\u0434\u0435\u0444\u043E\u043B\u0442 20, \u043C\u0430\u043A\u0441 50; \u043B\u0438\u0441\u0442\u0430\u043D\u0438\u0435\n`LAST_ID` \u2014 \u0441\u0442\u0430\u0440\u0435\u0435, `FIRST_ID` \u2014 \u043D\u043E\u0432\u0435\u0435); `imbot.v2 chat.getMessageContext` \u2014 \u043E\u0442\u0432\u0435\u0442 `messages[]`\n(oldest\u2192newest) + `users[]` + `hasPrevPage`/`hasNextPage`, \u043F\u043E \u0444\u043E\u0440\u043C\u0435 **\u0441\u043E\u0432\u043F\u0430\u0434\u0430\u0435\u0442** \u0441 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u043C\u0438\n`im.v2.Chat.Message.*`.\n\n### 5.2. \u041E\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**\u0410. \u041F\u0440\u044F\u043C\u043E\u0439 \u0440\u0435\u0437\u043E\u043B\u0432 \u2014 \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` \u0447\u0430\u0442\u0430-\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u044F (\u0432\u0445\u043E\u0434\u0438\u0442\n\u0432 \u0434\u0435\u0444\u043E\u043B\u0442\u043D\u044B\u0439 `select` \u{1F4D6}) \u2014 \u044D\u0442\u043E `taskId \u2192 chatId` \u0431\u0435\u0437 \u043F\u043E\u0438\u0441\u043A\u0430 \u043F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E \u0438 \u0431\u0435\u0437 \u043F\u0440\u043E\u043C\u0430\u0445\u0430 \u043F\u043E \u0442\u0451\u0437\u043A\u0430\u043C:\n\n```jsonc\nbitrix_task_get { "taskId": 28373 } // \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 CHAT_ID\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\u041E\u0431\u0449\u0430\u044F \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`): chatId \u043B\u044E\u0431\u043E\u0433\u043E \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0433\u043E\n\u043E\u0431\u044A\u0435\u043A\u0442\u0430 \u043F\u043E \u043F\u0430\u0440\u0435 `entityType`/`entityId`; \u043A\u0440\u043E\u043C\u0435 `TASKS_TASK` \u0442\u0430\u043A \u0436\u0435 \u0430\u0434\u0440\u0435\u0441\u0443\u044E\u0442\u0441\u044F `SONET_GROUP`\n(\u0433\u0440\u0443\u043F\u043F\u0430/\u043F\u0440\u043E\u0435\u043A\u0442), `CRM`, `CALENDAR`, `MAIL`, `VIDEOCONF`, `CALL`:\n\n```jsonc\nbitrix_entity_chat { "entityType": "TASKS_TASK", "entityId": 28373 } // \u2192 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** (\u0441\u0435\u043A\u0446\u0438\u044F `tasksTask`; \u0432 `bitrix_chats_recent` \u0438\u0445 \u041D\u0415\u0422):\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" }\nbitrix_chat_load { "dialogId": "chat38849" } // \u0438\u043B\u0438 { "chatId": 38849 }\n```\n\n**\u0427\u0430\u0442 \u043F\u0443\u0441\u0442, \u0430 `COMMENTS_COUNT > 0`** \u2014 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0442\u0430\u0440\u0448\u0435 \u0447\u0430\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447: \u0432 \u0447\u0430\u0442\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435\n\xAB\u0427\u0442\u043E\u0431\u044B \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0440\u0430\u043D\u0435\u0435 \u043E\u0441\u0442\u0430\u0432\u0438\u043B\u0438 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0438 \u0437\u0430\u0434\u0430\u0447\u0438\u2026\xBB, \u0430 \u0441\u0430\u043C\u043E \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u043B\u0435\u0436\u0438\u0442 \u0432\n\u0444\u043E\u0440\u0443\u043C\u0435 \u2192 `bitrix_task_comments` (\xA75.6).\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** (\u0437\u0430\u043F\u0430\u0441\u043D\u043E\u0439, \u043C\u0430\u0442\u0447 \u043F\u043E \u0442\u0435\u043A\u0441\u0442\u0443):\n`bitrix_entity_search { "query": "\u0442\u0440\u0435\u043A\u0435\u0440", "section": "tasksTask" }`\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_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### 5.3. \u041F\u043E\u0438\u0441\u043A \u0447\u0430\u0442\u0430 / \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\n\n`bitrix_entity_search` (\u043E\u0431\u0451\u0440\u0442\u043A\u0430 \u043D\u0430\u0434 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u043C `ui.entityselector.doSearch`) \u0441\u0430\u043C \u0441\u043E\u0431\u0438\u0440\u0430\u0435\u0442 \u0434\u0438\u0430\u043B\u043E\u0433\n`IM_CHAT_SEARCH` \u0438 `searchQuery` \u0438\u0437 \u0441\u0442\u0440\u043E\u043A\u0438. \u041F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0435 \u0430\u043D\u0430\u043B\u043E\u0433\u0438: \u043B\u044E\u0434\u0438 \u2014 `user.get`/`user.search`, \u0447\u0430\u0442\u044B \u2014\n`im.recent.list` + \u0444\u0438\u043B\u044C\u0442\u0440\u0430\u0446\u0438\u044F \u0443 \u0441\u0435\u0431\u044F.\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\nbitrix_user_get { "userId": 11 } // \u0440\u0435\u0437\u043E\u043B\u0432 authorId \u2192 \u0438\u043C\u044F\n```\n\n### 5.4. \u0421\u043E\u0437\u0432\u043E\u043D: \u0440\u0435\u0437\u044E\u043C\u0435, \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430, \u0437\u0430\u043F\u0438\u0441\u044C\n\nAI-\u0430\u043D\u0430\u043B\u0438\u0437 \u0437\u0432\u043E\u043D\u043A\u0430 (BitrixGPT Follow-Up) \u0436\u0438\u0432\u0451\u0442 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043D\u043E \u043E\u0442\u0440\u0435\u043D\u0434\u0435\u0440\u0435\u043D\u043D\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435 `/call/detail/<callId>`\n\u2014 JSON-\u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u0430 \u043F\u043E\u0434 \u043D\u0435\u0439 \u043D\u0435\u0442, \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u043E\u0433\u043E REST \u0434\u043B\u044F \u0432\u0438\u0434\u0435\u043E\u0432\u0441\u0442\u0440\u0435\u0447 \u0442\u043E\u0436\u0435 (\u{1F4D6} \u0442\u043E\u043B\u044C\u043A\u043E \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0438\u044F `voximplant.*`\n\u0438 `crm.activity.call.getTranscript`). \u041C\u043E\u0441\u0442 \u0447\u0438\u0442\u0430\u0435\u0442 \u044D\u0442\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 \u0435\u0451 \u0432 \u043D\u043E\u0440\u043C\u0430\u043B\u0438\u0437\u043E\u0432\u0430\u043D\u043D\u044B\u0439 JSON.\n\n**1) \u041D\u0430\u0439\u0442\u0438 \u0437\u0432\u043E\u043D\u043A\u0438.** \u0421\u0435\u0440\u0432\u0435\u0440\u043D\u043E\u0433\u043E \u043F\u043E\u0438\u0441\u043A\u0430 \u0437\u0432\u043E\u043D\u043A\u043E\u0432 \u043F\u043E \u043F\u043E\u0440\u0442\u0430\u043B\u0443 \u043D\u0435\u0442 \u2014 \u0438\u0449\u0435\u043C \u0432 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u043C \u0447\u0430\u0442\u0435: \u0437\u0432\u043E\u043D\u043E\u043A\n\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0441 `params.COMPONENT_PARAMS = { messageType: "START", callId }`.\n\n```jsonc\nbitrix_chat_calls { "chatId": 9876 } // \u0447\u0430\u0442 \u043F\u0440\u043E\u0435\u043A\u0442\u0430: bitrix_project_get \u2192 CHAT_ID\nbitrix_chat_calls { "chatId": 9876, "maxPages": 20, "beforeId": 5001 } // \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C \u0432\u0433\u043B\u0443\u0431\u044C\n```\n\n\u041E\u0442\u0432\u0435\u0442: `calls[] { callId, startedAt, startedBy, startMessageId, events[], summaryMessageId }` \u043F\u043B\u044E\u0441\n`scannedPages` / `oldestScannedMessageId` / **`reachedHistoryStart`** \u2014 \u0435\u0441\u043B\u0438 \u043E\u043D `false`, \u0438\u0441\u0442\u043E\u0440\u0438\u044F\n\u0434\u043E\u0447\u0438\u0442\u0430\u043D\u0430 \u041D\u0415 \u0434\u043E \u043A\u043E\u043D\u0446\u0430, \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u0439 \u0441 `beforeId: <oldestScannedMessageId>`.\n\n**2) \u0412\u0437\u044F\u0442\u044C \u0432\u0441\u0451 \u043F\u043E \u0437\u0432\u043E\u043D\u043A\u0443.**\n\n```jsonc\nbitrix_call_detail { "callId": 4242 } // \u0432\u0441\u0451; \u0434\u043B\u0438\u043D\u043D\u0430\u044F \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430 \u0443\u0435\u0434\u0435\u0442 \u0432 \u0444\u0430\u0439\u043B\nbitrix_call_detail { "callId": 4242, "transcript": "inline" } // \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430 \u043F\u0440\u044F\u043C\u043E \u0432 \u043E\u0442\u0432\u0435\u0442\u0435\nbitrix_call_detail { "callId": 4242, "transcript": "none" } // \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430 \u043D\u0435 \u043D\u0443\u0436\u043D\u0430 \u0432\u043E\u0432\u0441\u0435\nbitrix_call_detail { "callId": 4242, "transcript": "file" } // \u0432\u0441\u0435\u0433\u0434\u0430 \u0432 \u0444\u0430\u0439\u043B, \u0434\u0430\u0436\u0435 \u043A\u043E\u0440\u043E\u0442\u043A\u0430\u044F\n```\n\n| \u041F\u043E\u043B\u0435 \u043E\u0442\u0432\u0435\u0442\u0430 | \u0427\u0442\u043E \u0432\u043D\u0443\u0442\u0440\u0438 |\n|---|---|\n| `title`, `agenda`, `meetingType` | \u0442\u0435\u043C\u0430, \u0432\u0441\u0442\u0443\u043F\u043B\u0435\u043D\u0438\u0435, \u0442\u0438\u043F \u0432\u0441\u0442\u0440\u0435\u0447\u0438 (\xAB\u0421\u0442\u0430\u0442\u0443\u0441-\u0432\u0441\u0442\u0440\u0435\u0447\u0430\xBB) |\n| `date`, `interval`, `duration` | \xAB23 \u0438\u044E\u043B\u044F, 15:46\xBB, \xAB15:46 - 16:51\xBB, \xAB1 \u0447 4 \u043C\u0438\u043D\xBB |\n| `efficiency`, `qualityChecklist[]` | \u043E\u0446\u0435\u043D\u043A\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u0438 \u0432 % \u0438 \u043A\u0440\u0438\u0442\u0435\u0440\u0438\u0438 `{ ok, text }` |\n| `participants[]` | `{ id, name, talkTimePercent, talkTime, efficiency, metrics[], insight }` |\n| `overview`, `chapters[]` | \u043E\u0431\u0449\u0435\u0435 \u0440\u0435\u0437\u044E\u043C\u0435 \u0438 \u0433\u043B\u0430\u0432\u044B `{ from, to, title, text }` \u0441 \u0442\u0430\u0439\u043C\u043A\u043E\u0434\u0430\u043C\u0438 |\n| `decisions[]`, `tasks[]` | \xAB\u0447\u0442\u043E \u0440\u0435\u0448\u0438\u043B\u0438\xBB \u0438 \u0437\u0430\u0434\u0430\u0447\u0438 `{ assigneeId, assignee, text }` |\n| `transcript[]`, `transcriptCount` | \u0440\u0435\u043F\u043B\u0438\u043A\u0438 `{ from, to, speakerId, speaker, text }` |\n| `recording` | `{ path, url, trackId }` \u2014 \u0430\u0443\u0434\u0438\u043E\u0437\u0430\u043F\u0438\u0441\u044C, \u043A\u0430\u0447\u0430\u0435\u0442\u0441\u044F `bitrix_call_recording` (\xA75.5) |\n\n**\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430 \u0434\u043B\u0438\u043D\u043D\u043E\u0433\u043E \u0437\u0432\u043E\u043D\u043A\u0430 \u043D\u0435 \u043F\u0440\u0438\u0445\u043E\u0434\u0438\u0442 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435.** \u0423 \u0447\u0430\u0441\u043E\u0432\u043E\u0439 \u0432\u0441\u0442\u0440\u0435\u0447\u0438 \u043E\u043D\u0430 \u0434\u0430\u0451\u0442 ~70 \u041A\u0411 \u0438\u0437 80 \u041A\u0411, \u043F\u043E\u044D\u0442\u043E\u043C\u0443\n\u0441\u0432\u044B\u0448\u0435 ~20 \u041A\u0411 (\u0440\u0435\u0436\u0438\u043C `"auto"` = \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u0435) \u043F\u0438\u0448\u0435\u0442\u0441\u044F \u043D\u0430 \u0434\u0438\u0441\u043A, \u0430 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 \u043E\u0441\u0442\u0430\u044E\u0442\u0441\u044F `transcript: []`,\n`transcriptCount` \u0438 **`files`**: `files.transcript` \u2014 `call-<id>-transcript.txt`, \u0433\u0434\u0435 \u0441\u0442\u0440\u043E\u043A\u0430 = \u0440\u0435\u043F\u043B\u0438\u043A\u0430\n(`[11:10\u201411:24] \u0413\u0435\u043D\u0440\u0438\u0445 \u0411\u043E\u0433\u0430\u0446\u043A\u0438\u0439: \u2026`), \u0435\u0451 \u0443\u0434\u043E\u0431\u043D\u043E **\u0433\u0440\u0435\u043F\u0430\u0442\u044C** (\u043D\u0430\u0439\u0434\u0435\u043D\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 \u0441\u0430\u043C\u0430 \u043D\u0435\u0441\u0451\u0442 \u0442\u0430\u0439\u043C\u043A\u043E\u0434 \u0438\n\u0441\u043F\u0438\u043A\u0435\u0440\u0430); `files.json` \u2014 \u043F\u043E\u043B\u043D\u044B\u0439 \u043E\u0442\u0432\u0435\u0442 \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u043E\u0439. \u041E\u0431\u0430 \u0444\u0430\u0439\u043B\u0430 \u2014 \u043A\u0435\u0448 \u0437\u0432\u043E\u043D\u043A\u0430, \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u044B\u0432\u0430\u044E\u0442\u0441\u044F.\n\n\u0422\u043E\u043D\u043A\u043E\u0441\u0442\u0438:\n- **`speakerId`** \u0440\u0435\u0437\u043E\u043B\u0432\u0438\u0442\u0441\u044F \u043F\u043E \u0438\u043C\u0435\u043D\u0438 \u0438\u0437 \u0442\u0430\u0431\u043B\u0438\u0446\u044B \u0430\u043D\u0430\u043B\u0438\u0437\u0430; \u043A\u0442\u043E \u0433\u043E\u0432\u043E\u0440\u0438\u043B \u043C\u0430\u043B\u043E \u0438 \u0432 \u043D\u0435\u0451 \u043D\u0435 \u043F\u043E\u043F\u0430\u043B \u2014 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\n `speakerId: null`, \u043D\u043E \u043E\u0441\u0442\u0430\u043D\u0435\u0442\u0441\u044F \u0432 `participants` \u0441 `id: null`.\n- **`assigneeId` \u0437\u0430\u0434\u0430\u0447\u0438** \u2014 \u0443\u043F\u043E\u043C\u044F\u043D\u0443\u0442\u044B\u0439 \u0432 \u0442\u0435\u043A\u0441\u0442\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C, \u0430 \u041D\u0415 id \u0441\u043C\u043E\u0442\u0440\u044F\u0449\u0435\u0433\u043E.\n- \u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043A \u0437\u0432\u043E\u043D\u043A\u0443 / \u043F\u0440\u043E\u0442\u0443\u0445\u043B\u0430 \u0441\u0435\u0441\u0441\u0438\u044F \u2192 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u0432\u0435\u0440\u043D\u0451\u0442 \u0432\u043D\u044F\u0442\u043D\u0443\u044E \u043E\u0448\u0438\u0431\u043A\u0443 (\u043F\u043E\u0440\u0442\u0430\u043B \u043E\u0442\u0434\u0430\u0451\u0442 HTML \u043B\u043E\u0433\u0438\u043D\u0430).\n\n### 5.5. \u0421\u043A\u0430\u0447\u0430\u0442\u044C \u0444\u0430\u0439\u043B (\u0432\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0447\u0430\u0442\u0430, \u0444\u0430\u0439\u043B \u0437\u0430\u0434\u0430\u0447\u0438, \u0437\u0430\u043F\u0438\u0441\u044C \u0437\u0432\u043E\u043D\u043A\u0430)\n\n\u0421\u0441\u044B\u043B\u043A\u0438 \u043F\u043E\u0440\u0442\u0430\u043B \u043C\u0438\u043D\u0442\u0438\u0442 \u0438 \u043F\u043E\u0434\u043F\u0438\u0441\u044B\u0432\u0430\u0435\u0442 \u0441\u0430\u043C, \u043D\u043E \u043F\u043E\u0434\u043F\u0438\u0441\u044C \u041D\u0415 \u0437\u0430\u043C\u0435\u043D\u044F\u0435\u0442 \u0430\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u044E \u2014 \u043A\u0430\u0447\u0430\u0435\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435 \u0432\n\u0441\u0435\u0441\u0441\u0438\u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F.\n\n```jsonc\n// \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0447\u0430\u0442\u0430: \u0441\u0441\u044B\u043B\u043A\u0443 \u0431\u0435\u0440\u0451\u043C \u0438\u0437 files[].urlDownload \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 bitrix_chat_load\nbitrix_file_download { "url": "https://<\u043F\u043E\u0440\u0442\u0430\u043B>/bitrix/services/main/ajax.php?action=disk.api.file.download&\u2026" }\nbitrix_call_recording { "callId": 4242 } // \u0430\u0443\u0434\u0438\u043E\u0437\u0430\u043F\u0438\u0441\u044C \u0441\u043E\u0437\u0432\u043E\u043D\u0430 (\u0441\u0441\u044B\u043B\u043A\u0443 \u043D\u0430\u0439\u0434\u0451\u0442 \u0441\u0430\u043C)\nbitrix_file_download { "url": "\u2026", "savePath": "/tmp/photo.png", "overwrite": true }\n```\n\n\u041E\u0442\u0432\u0435\u0442 \u2014 **\u043F\u0443\u0442\u044C, \u0430 \u043D\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435**: `{ path, bytes, contentType, fileName }` (\u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442\u044B \u043D\u0435 \u043F\u043E\u043F\u0430\u0434\u0430\u044E\u0442 \u0432\n\u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442). \u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0444\u0430\u0439\u043B \u043B\u043E\u0436\u0438\u0442\u0441\u044F \u0432 `~/.bitrix24-mcp-bridge/downloads/`; `savePath` \u0431\u0435\u0437 \u0432\u0435\u0434\u0443\u0449\u0435\u0433\u043E `/`\n\u0442\u0440\u0430\u043A\u0442\u0443\u0435\u0442\u0441\u044F \u043A\u0430\u043A \u0438\u043C\u044F \u0432\u043D\u0443\u0442\u0440\u0438 \u044D\u0442\u043E\u0439 \u043F\u0430\u043F\u043A\u0438. \u041F\u043E\u0442\u043E\u043B\u043E\u043A \u2014 512 \u041C\u0411.\n\n\u0422\u043E\u043D\u043A\u043E\u0441\u0442\u0438:\n- **\u0413\u0440\u0430\u043D\u0438\u0446\u0430 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 \u2014 origin**: \u0441\u043A\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0441 origin \u0441\u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0433\u043E \u043F\u043E\u0440\u0442\u0430\u043B\u0430.\n- **\u0418\u043C\u044F \u0434\u0430\u0451\u0442 \u043F\u043E\u0440\u0442\u0430\u043B** (`Content-Disposition`), \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u0431\u0435\u0437 `savePath` \u0443\u0433\u0430\u0434\u044B\u0432\u0430\u0442\u044C \u0435\u0433\u043E \u043D\u0435 \u043D\u0443\u0436\u043D\u043E.\n- **\u041F\u043E\u0432\u0442\u043E\u0440\u043D\u043E\u0435 \u0441\u043A\u0430\u0447\u0438\u0432\u0430\u043D\u0438\u0435** \u0442\u043E\u0433\u043E \u0436\u0435 \u0444\u0430\u0439\u043B\u0430 \u043F\u0430\u0434\u0430\u0435\u0442 \u0441 `already exists` \u2014 \u043F\u0435\u0440\u0435\u0434\u0430\u0439 `overwrite: true`.\n\n### 5.6. \u0421\u0442\u0430\u0440\u044B\u0435 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 (\u0444\u043E\u0440\u0443\u043C)\n\n\u0414\u043E \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430 \u043D\u0430 \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u0436\u0438\u043B\u043E \u0432 \u0444\u043E\u0440\u0443\u043C\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0438 \u0443 \u0441\u0442\u0430\u0440\u044B\u0445 \u0437\u0430\u0434\u0430\u0447 \u043E\u043D\u043E \u0442\u0430\u043C \u0438 \u043E\u0441\u0442\u0430\u043B\u043E\u0441\u044C: \u0432\n\u0447\u0430\u0442\u0435 (`CHAT_ID`) \u0442\u043E\u043B\u044C\u043A\u043E \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u0430\u044F \u0437\u0430\u0433\u043B\u0443\u0448\u043A\u0430 \u0441\u043E \u0441\u0441\u044B\u043B\u043A\u043E\u0439 `/task/comments/<id>/`. \u041F\u0440\u0438\u0437\u043D\u0430\u043A \u2014 \u0432\n`bitrix_task_get` \u043F\u043E\u043B\u0435 `COMMENTS_COUNT > 0` (\u0447\u0435\u0440\u0435\u0437 `params.select`; `FORUM_TOPIC_ID` \u0442\u043E\u0436\u0435 \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D),\n\u0430 \u0447\u0430\u0442 \u043F\u0443\u0441\u0442. JSON-\u043C\u0435\u0442\u043E\u0434\u0430 \u0447\u0442\u0435\u043D\u0438\u044F \u043D\u0435\u0442 \u2014 \u043C\u043E\u0441\u0442 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 HTML-\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0435\u0432.\n\n```jsonc\nbitrix_task_comments { "taskId": 1234 } // \u0432\u0441\u0451 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435; \u0434\u043B\u0438\u043D\u043D\u043E\u0435 \u0443\u0435\u0434\u0435\u0442 \u0432 \u0444\u0430\u0439\u043B\nbitrix_task_comments { "taskId": 1234, "limit": 10 } // \u0442\u043E\u043B\u044C\u043A\u043E 10 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0445\nbitrix_task_comments { "taskId": 1234, "output": "inline" } // \u0432\u0441\u0435\u0433\u0434\u0430 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435\nbitrix_task_comments { "taskId": 1234, "beforeId": 5678 } // \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C \u0432\u0433\u043B\u0443\u0431\u044C \u043E\u0442 id\n```\n\n\u041E\u0442\u0432\u0435\u0442: `comments[]` \u043F\u043E \u043F\u043E\u0440\u044F\u0434\u043A\u0443 (\u0441\u0442\u0430\u0440\u044B\u0435 \u2192 \u043D\u043E\u0432\u044B\u0435) \u2014 `{ id, authorId, author, date, dateIso, text, isNew,\nsystem, files[] }`, \u043F\u043B\u044E\u0441 `total`, `oldestId`, `scannedPages` \u0438 **`reachedHistoryStart`**: \u0435\u0441\u043B\u0438 \u043E\u043D\n`false` (\u0443\u043F\u0451\u0440\u043B\u0438\u0441\u044C \u0432 `maxPages`, \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u0435 10, \u0438\u043B\u0438 \u0432 `limit`), \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u0439 \u0441 `beforeId: <oldestId>`.\n\n- **`system: true`** \u2014 \u0441\u043B\u0443\u0436\u0435\u0431\u043D\u044B\u0435 \u0437\u0430\u043F\u0438\u0441\u0438 (\xAB\u0432\u044B \u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u044B \u0438\u0441\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u0435\u043C\xBB, \u0441\u043C\u0435\u043D\u0430 \u0441\u0440\u043E\u043A\u0430, \u043F\u0438\u043D\u0433\u0438), \u043D\u0435 \u0441\u043B\u043E\u0432\u0430 \u043B\u044E\u0434\u0435\u0439.\n- **`date`** \u2014 \u043A\u0430\u043A \u043D\u0430 \u043F\u043E\u0440\u0442\u0430\u043B\u0435 (\xAB9 \u043C\u0430\u0440\u0442\u0430 2024 08:15\xBB), **`dateIso`** \u2014 \u0442\u043E \u0436\u0435 \u0432 `2024-03-09T08:15`\n (\u043C\u0435\u0441\u0442\u043D\u043E\u0435 \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0440\u0442\u0430\u043B\u0430; \u0434\u043B\u044F \xAB\u0432\u0447\u0435\u0440\u0430, 12:00\xBB \u0438 \u0434\u0430\u0442 \u0431\u0435\u0437 \u0433\u043E\u0434\u0430 \u2014 `null`).\n- **`files[]`** \u2014 `{ attachedId, name, size, url }`; `url` \u0441\u043A\u0430\u0440\u043C\u043B\u0438\u0432\u0430\u0439 `bitrix_file_download` (\xA75.5).\n- **`text`** \u2014 \u0431\u0435\u0437 \u0440\u0430\u0437\u043C\u0435\u0442\u043A\u0438; \u0443 \u0441\u0441\u044B\u043B\u043A\u0438 \u0441 \u043F\u043E\u0434\u043F\u0438\u0441\u044C\u044E \u0430\u0434\u0440\u0435\u0441 \u0434\u043E\u043F\u0438\u0441\u0430\u043D \u0432 \u0441\u043A\u043E\u0431\u043A\u0430\u0445: \xAB\u043C\u0430\u043A\u0435\u0442 (https://\u2026)\xBB.\n- **\u0414\u043B\u0438\u043D\u043D\u043E\u0435 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u043D\u0435 \u043F\u0440\u0438\u0445\u043E\u0434\u0438\u0442 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435** (\u043A\u0430\u043A \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430 \u0437\u0432\u043E\u043D\u043A\u0430, \xA75.4): \u0441\u0432\u044B\u0448\u0435 ~20 \u041A\u0411 (`output:\n "auto"` = \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u0435) \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 `comments: []` \u0438 `files`: `files.text` \u2014 `task-<id>-comments.txt`,\n \u0441\u0442\u0440\u043E\u043A\u0430 = \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 (`#5678 [2024-03-09T08:15] \u0418\u043C\u044F (id 101): \u0442\u0435\u043A\u0441\u0442`, \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u044B \u2014 ` \u23CE `), \u0435\u0451 \u0443\u0434\u043E\u0431\u043D\u043E\n \u0433\u0440\u0435\u043F\u0430\u0442\u044C; `files.json` \u2014 \u043F\u043E\u043B\u043D\u044B\u0439 \u043E\u0442\u0432\u0435\u0442. `output: "file"` \u2014 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432 \u0444\u0430\u0439\u043B.\n- **\u041F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u043C \u043D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043F\u043E\u043C\u0435\u0447\u0430\u0435\u0442\u0441\u044F.** \u041F\u043E\u0440\u0442\u0430\u043B \u043E\u0442\u043C\u0435\u0447\u0430\u0435\u0442 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u043C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043C\n `readComment`, \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u0448\u043B\u0451\u0442 JS \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B \u043F\u0440\u0438 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0435; \u043C\u043E\u0441\u0442 JS \u043D\u0435 \u0438\u0441\u043F\u043E\u043B\u043D\u044F\u0435\u0442. \u041F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u043E:\n `viewedDate` \u0437\u0430\u0434\u0430\u0447\u0438 \u043F\u043E\u0441\u043B\u0435 \u0447\u0442\u0435\u043D\u0438\u044F \u043D\u0435 \u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F. `isNew: true` \u2014 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u043D\u0435 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C.\n- \u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043A \u0437\u0430\u0434\u0430\u0447\u0435 / \u043F\u0440\u043E\u0442\u0443\u0445\u043B\u0430 \u0441\u0435\u0441\u0441\u0438\u044F \u2192 \u0432\u043D\u044F\u0442\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430 (\u043F\u043E\u0440\u0442\u0430\u043B \u043E\u0442\u0434\u0430\u0451\u0442 HTML \u043B\u043E\u0433\u0438\u043D\u0430).\n\n---\n\n\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u043D\u043E\u0432\u044B\u043C\u0438 \u043C\u0435\u0442\u043E\u0434\u0430\u043C\u0438, \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 (`bodyType`, `responseType`, path-\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B) \u0438\n\u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0430 \u043F\u0440\u0430\u0432\u043E\u043A \u0432 \u0436\u0438\u0432\u043E\u0439 daemon \u2014 `docs/reconnaissance.md`.\n' ? '# Bitrix24 API notes (reverse-engineered)\n\n\u041A\u0430\u043A \u0430\u0433\u0435\u043D\u0442\u0443 \u0440\u0430\u0431\u043E\u0442\u0430\u0442\u044C \u0441 Bitrix24 \u0447\u0435\u0440\u0435\u0437 \u044D\u0442\u043E\u0442 \u043C\u043E\u0441\u0442: \u0444\u043E\u0440\u043C\u0430\u0442 `params`, \u0438\u043C\u0435\u043D\u0430 \u043F\u043E\u043B\u0435\u0439, \u0433\u043E\u0442\u043E\u0432\u044B\u0435 \u0446\u0435\u043F\u043E\u0447\u043A\u0438 \u0432\u044B\u0437\u043E\u0432\u043E\u0432.\n\n\u0414\u0432\u0435 \u043F\u043E\u0432\u0435\u0440\u0445\u043D\u043E\u0441\u0442\u0438 API. **\u041F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0439 REST** (`tasks.task.*`, `im.recent.list`, `im.user.get`, `im.chat.get`,\n`socialnetwork.api.workgroup.*`) \u2014 \u0435\u0441\u0442\u044C \u043E\u0444\u0438\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0435 \u0434\u043E\u043A\u0438, \u0441\u0441\u044B\u043B\u043A\u0438 \u043D\u0430 \u043D\u0438\u0445 \u043F\u043E\u043C\u0435\u0447\u0435\u043D\u044B **\u{1F4D6}**\n([`apidocs.bitrix24.com`](https://apidocs.bitrix24.com); \u0430\u0433\u0435\u043D\u0442\u0443 \u0441 MCP context7 \u2014 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430\n`/bitrix24/b24restdocs`). **\u0412\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0435 ajax-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u044B** (`im.v2.*`, `tasks.v2.*`, `ui.entityselector.*`)\n\u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0445 \u0434\u043E\u043A\u043E\u0432 \u043D\u0435 \u0438\u043C\u0435\u044E\u0442 \u2014 \u0432\u0441\u0451 \u043D\u0438\u0436\u0435 \u0434\u043E\u0431\u044B\u0442\u043E \u0436\u0438\u0432\u044B\u043C \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C; \u043A\u043E\u043D\u0432\u0435\u0440\u0442 \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043F\u043E\u043B\u0435\u0439 \u0443 \u043D\u0438\u0445 \u043C\u043E\u0433\u0443\u0442\n\u043E\u0442\u043B\u0438\u0447\u0430\u0442\u044C\u0441\u044F \u043E\u0442 \u{1F4D6}-\u0430\u043D\u0430\u043B\u043E\u0433\u043E\u0432. \u0418\u043C\u0435\u043D\u0430 \u043F\u043E\u043B\u0435\u0439 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B \u0434\u043B\u044F \u043E\u0431\u043B\u0430\u0447\u043D\u043E\u0433\u043E Bitrix24; \u043D\u0430 \u0434\u0440\u0443\u0433\u043E\u043C \u043F\u043E\u0440\u0442\u0430\u043B\u0435 \u0441\u0432\u0435\u0440\u044F\u0439\u0441\u044F\n\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- **\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** (`bitrix_tasks_list`, `bitrix_task_get`, `bitrix_chat_load`, \u2026) \u2014\n \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; \u0438\u0445 \u043F\u043E\u043B\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A \u0438 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u044F \u0432\u0438\u0434\u043D\u044B \u0441\u0440\u0435\u0434\u0438 MCP-\u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432. \u0422\u043E\u0447\u043D\u0430\u044F\n \u0432\u044B\u0431\u043E\u0440\u043A\u0430 \u2014 \u043E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u043C `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.\n- **`bitrix_call { name, params }`** \u2014 \u043B\u044E\u0431\u043E\u0435 \u0438\u043C\u044F \u0438\u0437 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 (`actions.json`), `params` \u0432 \u043D\u0430\u0442\u0438\u0432\u043D\u043E\u043C\n \u0444\u043E\u0440\u043C\u0430\u0442\u0435 Bitrix (\xA73). \u041F\u043E\u043B\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A \u0438\u043C\u0451\u043D \u043E\u0442\u0434\u0430\u0451\u0442 \u0441\u0430\u043C `bitrix_call` \u0432 \u0441\u0432\u043E\u0451\u043C \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0438.\n- \u041A\u0430\u0442\u0430\u043B\u043E\u0433 \u043C\u043E\u0436\u0435\u0442 \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C **\u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0435** \u0432\u044B\u0437\u043E\u0432\u044B: \u043D\u0430\u043B\u0438\u0447\u0438\u0435 \u0437\u0430\u043F\u0438\u0441\u0438 = \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u0432\u044B\u0437\u0432\u0430\u0442\u044C. \u042D\u0442\u043E \u043D\u0435 \u0440\u0435\u0436\u0438\u043C\n \xAB\u0442\u043E\u043B\u044C\u043A\u043E \u0447\u0442\u0435\u043D\u0438\u0435\xBB.\n- \u0423 \u043E\u0431\u0451\u0440\u0442\u043E\u043A \u0435\u0441\u0442\u044C \u0434\u0435\u0444\u043E\u043B\u0442\u044B (\u043D\u0430\u043F\u0440. `bitrix_tasks_list` \u0441\u043E\u0440\u0442\u0438\u0440\u0443\u0435\u0442 `{"ID":"desc"}`), \u0443 `bitrix_call` \u0438\u0445 \u043D\u0435\u0442 \u2014\n \u043E\u0434\u0438\u043D \u0438 \u0442\u043E\u0442 \u0436\u0435 \u0444\u0438\u043B\u044C\u0442\u0440 \u0434\u0430\u0441\u0442 \u0440\u0430\u0437\u043D\u044B\u0435 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B. \u0421\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u0435\u0448\u044C \u0432\u044B\u0434\u0430\u0447\u0438 \u2014 \u0437\u0430\u0434\u0430\u0432\u0430\u0439 `order` \u044F\u0432\u043D\u043E.\n- \u041E\u0442\u0432\u0435\u0442 `invalid_csrf` / `invalid_authentication` = \u0441\u0435\u0441\u0441\u0438\u044F \u043F\u043E\u0440\u0442\u0430\u043B\u0430 \u043F\u0440\u043E\u0442\u0443\u0445\u043B\u0430 \u2192 \u043F\u0435\u0440\u0435\u043B\u043E\u0433\u0438\u043D\u044C\u0441\u044F \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435\n \u043D\u0430 \u0432\u043A\u043B\u0430\u0434\u043A\u0435 \u043F\u043E\u0440\u0442\u0430\u043B\u0430.\n\n---\n\n## 2. \u0424\u043E\u0440\u043C\u0430\u0442 \u043E\u0442\u0432\u0435\u0442\u0430\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 = `status:"success"` \u0438/\u0438\u043B\u0438 **\u043F\u0443\u0441\u0442\u043E\u0439** `errors`. \u041D\u0435\u043F\u0443\u0441\u0442\u043E\u0439 `errors` / `status:"error"` / top-level\n`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 \u0435\u0451 \u0432 `ok:false`). REST-\u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u044B (`/rest/*.json`) \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0442\n\u0438\u043D\u0430\u0447\u0435: `{ "result": \u2026, "next", "total", "time" }` \u2014 \u0431\u0435\u0437 `errors`.\n\n---\n\n## 3. \u041A\u0430\u0442\u0430\u043B\u043E\u0433: \u0438\u043C\u044F \u2192 action \u2192 params\n\n\u0424\u043E\u0440\u043C\u0430 `params` \u0440\u0430\u0437\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043F\u043E \u043C\u0435\u0442\u043E\u0434\u0443: \u0433\u0434\u0435-\u0442\u043E \u043F\u043B\u043E\u0441\u043A\u043E, \u0433\u0434\u0435-\u0442\u043E \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E, \u0433\u0434\u0435-\u0442\u043E \u043E\u0431\u0451\u0440\u043D\u0443\u0442\u043E \u0432 `params[\u2026]` \u2014\n\u043A\u043E\u043B\u043E\u043D\u043A\u0430 \xABparams\xBB \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442 \u0442\u043E\u0447\u043D\u0443\u044E \u0444\u043E\u0440\u043C\u0443 (\u043A\u043E\u0434\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0442\u0435\u043B\u0430 \u043C\u043E\u0441\u0442 \u0431\u0435\u0440\u0451\u0442 \u043D\u0430 \u0441\u0435\u0431\u044F).\n\n| \u0418\u043C\u044F (`bitrix_call`) | action / endpoint | params | \u041F\u0430\u0433\u0438\u043D\u0430\u0446\u0438\u044F |\n|---|---|---|---|\n| `tasks.list` | `tasks.task.list` | \u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C: `filter{RESPONSIBLE_ID,REAL_STATUS,GROUP_ID,\u2026}`, `select[]`, `order{}` | **`PAGEN_1`** \u2014 \u043D\u043E\u043C\u0435\u0440 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B (1, 2, 3\u2026), \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 = 20 \u0437\u0430\u0434\u0430\u0447; `start` **\u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442** (\u0432\u0435\u0440\u043D\u0451\u0442 \u0442\u0443 \u0436\u0435 \u043F\u0435\u0440\u0432\u0443\u044E \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443) |\n| `task.get` | `tasks.task.get` | \u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C: `taskId`, `select[]` | \u2014 |\n| `task.v2.get` | `tasks.v2.Task.get` | \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E: `{"task":{"id":N}}` | \u2014 |\n| `task.scrum.info` | `tasks.v2.Scrum.getTaskInfo` | `{"taskId":N}` | \u2014 |\n| `task.files` | `tasks.v2.File.listObjects` | `{"ids":[N,\u2026]}` | \u2014 |\n| `task.views.count` | `tasks.v2.Task.View.User.count` | \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E: `{"task":{"id":N}}` | \u2014 |\n| `task.subtasks` | `tasks.v2.Task.Relation.Child.list` | `{"taskId":N,"withIds":true,"navigation":{"size":N}}` | `navigation` |\n| `task.related` | `tasks.v2.Task.Relation.Related.list` | \u043A\u0430\u043A `task.subtasks` | `navigation` |\n| `projects.list` | `socialnetwork.api.workgroup.list` | \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| `projects.get` | `socialnetwork.api.workgroup.get` | **\u043E\u0431\u0451\u0440\u043D\u0443\u0442\u043E**: `params[groupId]`, `params[select][]` | \u2014 |\n| `chats.recent` | `/rest/im.recent.list.json` | \u043F\u043B\u043E\u0441\u043A\u043E: `LIMIT`, `SKIP_OPENLINES`, `UNREAD_ONLY` | `LIMIT` |\n| `recent.load` | `im.v2.Recent.load` | \u043F\u043B\u043E\u0441\u043A\u043E: `limit`, `filter[recentSection]` (`tasksTask`/`collab`/\u2026), `filter[unread]`, `filter[parentId]` | `recent.tail` |\n| `recent.tail` | `im.v2.Recent.tail` | \u043F\u043B\u043E\u0441\u043A\u043E: `limit`, `filter[lastMessageDate]` (\u043A\u0443\u0440\u0441\u043E\u0440), `filter[recentSection]` | `filter[lastMessageDate]` |\n| `chat.load` | `im.v2.Chat.load` | \u043F\u043B\u043E\u0441\u043A\u043E: `dialogId`\\|`chatId`, `messageLimit` | \u2014 |\n| `chat.dialogId` | `im.v2.Chat.getDialogId` | \u043F\u043B\u043E\u0441\u043A\u043E: `externalId` (\u043D\u0430\u043F\u0440. `"sg"+groupId`) | \u2014 |\n| `chat.messages` | `im.v2.Chat.Message.list` | \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 `chat.messages.tail` |\n| `chat.messages.tail` | `im.v2.Chat.Message.tail` | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `limit`, `filter[lastId]`, `order[id]` | `filter[lastId]` (\xA75.1) |\n| `chat.message.read` | `im.v2.Chat.Message.read` | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `ids[]`, `actionUuid` | \u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439 |\n| `chat.read.all` | `im.v2.Chat.readAll` | \u0431\u0435\u0437 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 | \u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439 |\n| `im.user.get` | `/rest/im.user.get.json` | \u043F\u043B\u043E\u0441\u043A\u043E: `ID` | \u2014 |\n| `im.chat.get` | `/rest/im.chat.get.json` | \u043F\u043B\u043E\u0441\u043A\u043E: `ENTITY_TYPE`, `ENTITY_ID` (\u043D\u0430\u043F\u0440. `TASKS_TASK`+taskId) | \u2014 |\n| `entityselector.load` | `ui.entityselector.load` | `{"dialog":{entities,preselectedItems,\u2026}}` | \u2014 |\n| `entityselector.search` | `ui.entityselector.doSearch` | `{"dialog":{\u2026},"searchQuery":{"query":"\u2026","queryWords":["\u2026"]}}` | \u2014 |\n| `call.detail` | `GET /call/detail/{callId}` | `callId` (\u043F\u043E\u0434\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0432 \u043F\u0443\u0442\u044C), `IFRAME=Y`, `IFRAME_TYPE=SIDE_SLIDER` \u2192 HTML | \u0441\u043C. \xA75.4 |\n| `task.comments.page` | `GET /task/comments/{taskId}/` | `taskId` (\u0432 \u043F\u0443\u0442\u044C), `IFRAME=Y`, `IFRAME_TYPE=SIDE_SLIDER` \u2192 HTML \u0441\u0442\u0430\u0440\u044B\u0445 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0435\u0432 | \u0441\u043C. \xA75.6 |\n| `task.comments.navigate` | `bitrix:forum.comments` \u2192 `navigateComment` | \u0444\u043E\u0440\u043C\u0430: `ENTITY_XML_ID=TASK_<id>`, `EXEMPLAR_ID`, `signedParameters` (\u043E\u0431\u0430 \u2014 \u0438\u0437 HTML \u043F\u0435\u0440\u0432\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B), `FILTER[<ID]` | `FILTER[<ID]` \u2014 \u043A\u0443\u0440\u0441\u043E\u0440; \u043F\u0440\u043E\u0449\u0435 `bitrix_task_comments` (\xA75.6) |\n\n---\n\n## 4. \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 \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`, \xA75.2), `UF_*`. \u041E\u0442\u0432\u0435\u0442 \u043F\u043E\u0434\u043A\u043B\u0430\u0434\u044B\u0432\u0430\u0435\u0442 \u043E\u0431\u044A\u0435\u043A\u0442\u044B `group`,\n`responsible`, `creator`, `action`.\n\u{1F4D6} (`tasks.task.get`/`list`) \u2014 \u0441\u0432\u0435\u0440\u0445 \u044D\u0442\u043E\u0433\u043E: `parentId`, `stageId`, `sprintId`, `backlogId`,\n`commentsCount`, `timeSpentInLogs`, `favorite`, `flowId`, `mark`, `accomplices[]`, `auditors[]`,\n`checklist{}`, `subStatus`; \u0432 \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**, \u0430 \u0432 `select`/`filter`\n\u043E\u043D\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 **UPPER_CASE**. \u0414\u043E\u043F. \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F \u2014 \u0444\u043B\u0430\u0433\u0430\u043C\u0438 `params{WITH_TIMER_INFO, WITH_RESULT_INFO,\nWITH_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}`) \u{1F4D6}.\n\u0410\u0441\u0438\u043C\u043C\u0435\u0442\u0440\u0438\u044F: \u0432 **`filter`** \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 `REAL_STATUS`, \u0430 \u0432 **`select`** \u0435\u0433\u043E \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u0431\u0435\u0441\u043F\u043E\u043B\u0435\u0437\u043D\u043E \u2014 \u043F\u043E\u043B\u0435 \u043C\u043E\u043B\u0447\u0430\n\u043D\u0435 \u0432\u0435\u0440\u043D\u0451\u0442\u0441\u044F; \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435, \u043F\u0440\u043E\u0441\u0438 `select:["STATUS"]` \u2192 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u043A\u043B\u044E\u0447 `status` \u0441\u043E\n\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435\u043C \u043F\u043E \u0442\u043E\u0439 \u0436\u0435 \u0448\u043A\u0430\u043B\u0435 1..7 (\u0443 \u043E\u0431\u0451\u0440\u0442\u043A\u0438 `bitrix_tasks_list` \u043E\u043D \u0443\u0436\u0435 \u0432 \u0434\u0435\u0444\u043E\u043B\u0442\u043D\u043E\u043C `select`).\n\n**\u0424\u0438\u043B\u044C\u0442\u0440 `tasks.task.list`** \u2014 \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440 \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044F \u043F\u0435\u0440\u0435\u0434 \u0438\u043C\u0435\u043D\u0435\u043C \u043F\u043E\u043B\u044F: `!` (\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"}`, `{"%TITLE":"\u043A\u0430\u0440\u0442\u0430"}`. \u0424\u0438\u043B\u044C\u0442\u0440\u0443\u0435\u043C\u044B\u0435 \u043F\u043E\u043B\u044F: `ID`, `PARENT_ID`, `GROUP_ID`,\n`CREATED_BY`, `RESPONSIBLE_ID`, `ACCOMPLICE`, `AUDITOR`, `REAL_STATUS`, `STATUS`, `PRIORITY`, `TAG`,\n`STAGE_ID`, `SPRINT_ID`, `BACKLOG_ID`, `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`); \u0435\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, \u043E\u0431\u044A\u0435\u0434\u0438\u043D\u0438\n> \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`) \u0438 **\u0434\u0435\u0434\u0443\u043F\u043B\u0438\u0446\u0438\u0440\u0443\u0439 \u043F\u043E `id`** \u2014\n> \u043E\u0434\u043D\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0447\u0430\u0441\u0442\u043E \u043F\u043E\u043F\u0430\u0434\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u0432 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0440\u043E\u043B\u0435\u0439. \u0412 **`filter`** \u0440\u043E\u043B\u0438 \u0432 **\u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u043C** \u0447\u0438\u0441\u043B\u0435\n> (`ACCOMPLICE`/`AUDITOR`), \u0432 **`select`** \u2014 \u0432\u043E **\u043C\u043D\u043E\u0436\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u043C** (`ACCOMPLICES`/`AUDITORS`).\n\n> **Scrum-\u0437\u0430\u0434\u0430\u0447\u0438 (\u0441\u043F\u0440\u0438\u043D\u0442\u044B).** \u041F\u043E\u043B\u0435 `SPRINT_ID` \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0436\u0451\u0441\u0442\u043A\u0438\u0439 `filter[SPRINT_ID]` \u043C\u043E\u0433\u0443\u0442 \u0440\u0430\u0441\u0445\u043E\u0434\u0438\u0442\u044C\u0441\u044F:\n> \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 (\u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u0430 \u0432 \u0431\u044D\u043A\u043B\u043E\u0433\n> \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 \u0438 \u043E\u0442\u0444\u0438\u043B\u044C\u0442\u0440\u0443\u0439 \u043F\u043E\n> `SPRINT_ID`/`STAGE_ID` \u0443 \u0441\u0435\u0431\u044F. \u041C\u0435\u0442\u043E\u0434\u0430 \xAB\u043A\u043E\u043B\u043E\u043D\u043A\u0438 scrum-\u0434\u043E\u0441\u043A\u0438\xBB (`STAGE_ID` \u2192 \u0438\u043C\u044F \u043A\u043E\u043B\u043E\u043D\u043A\u0438) \u0432 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0435 \u043D\u0435\u0442.\n\n**\u0413\u0440\u0443\u043F\u043F\u0430/\u043F\u0440\u043E\u0435\u043A\u0442 \u2014 \u0441\u043F\u0438\u0441\u043E\u043A** (`workgroup.list`): `ID`, `NAME`, `DESCRIPTION`, `NUMBER_OF_MEMBERS`,\n`OWNER_ID`, `DATE_CREATE`, `PROJECT` (Y=\u043F\u0440\u043E\u0435\u043A\u0442/N=\u0433\u0440\u0443\u043F\u043F\u0430), `TYPE`; **\u0431\u0435\u0437 `select` \u0432\u0435\u0440\u043D\u0451\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E `ID`**.\n\u{1F4D6} \u0444\u0438\u043B\u044C\u0442\u0440\u0443\u0435\u043C\u044B\u0435: `ID`, `NAME`, `OWNER_ID`, `ACTIVE`, `VISIBLE`, `OPENED`, `CLOSED`, `PROJECT`,\n`SUBJECT_ID`, `SITE_ID`, `DATE_CREATE`, `DATE_UPDATE`, `DATE_ACTIVITY`; \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u044B \u0444\u0438\u043B\u044C\u0442\u0440\u0430\n`>= > <= < % =% %= !% != !`.\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}`, `counter` (\u043D\u0435\u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u0445),\n`unread`, `last_id`, `pinned`, `date_update`, `date_last_activity`, `user{\u2026}`,\n`chat{\u2026 entity_type, entity_id, owner, \u2026}`; \u0435\u0441\u0442\u044C \u043B\u0438 \u0435\u0449\u0451 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B \u2014 `hasMore`/`hasMorePages` \u{1F4D6}.\n**\u041D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u043F\u043E \u0441\u0435\u043A\u0446\u0438\u0438** (`im.v2.Recent.load`): `filter[recentSection]` \u2014 `default` (\u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0434\u0438\u0430\u043B\u043E\u0433\u0438),\n**`tasksTask` (\u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447)**, `collab`/`collabDefault`. \u0412\u0433\u043B\u0443\u0431\u044C \u2014 `im.v2.Recent.tail` \u0441 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u043C\n`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\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\n**\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435** (`im.v2.Chat.Message.*`): `id`, `chatId`, `authorId`, `date`, `text`, `params`, `viewed`;\n\u043E\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\n---\n\n## 5. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0438\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; v2-\u043F\u043E\u0434\u0441\u0438\u0441\u0442\u0435\u043C\u0430; \u0444\u0430\u0439\u043B\u044B, \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u044B, \u0441\u0432\u044F\u0437\u0438\nbitrix_task_get { "taskId": 4229, "params": { "select": ["ID","TITLE","DESCRIPTION","TAGS"] } }\nbitrix_task_get_v2 { "taskId": 4229 } // \u2192 { "task": { "id": 4229 } }\nbitrix_call { "name": "task.files", "params": { "ids": [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 (\u043E\u0442\u0434\u0430\u0451\u0442 CHAT_ID / DIALOG_ID)\nbitrix_projects_list { "params": { "order": {"DATE_CREATE":"desc"} } }\nbitrix_project_get { "groupId": 15 }\n```\n\n### 5.1. \u041C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 (IM): \u043A\u0430\u043A \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C `chatId`\n\n\u0412\u0441\u0451 \u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u2014 **\u0447\u0430\u0442\u044B**: \u043B\u0438\u0447\u043D\u044B\u0435 1-\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**.\n\u0427\u0438\u0441\u043B\u043E\u0432\u043E\u0439 **`chatId`** \u2014 \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`); \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 \u2014 \u043D\u0430 \u0448\u0430\u0433\u0435 \u0435\u0433\u043E \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F.\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** (\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 1-\u043D\u0430-1\n\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 **\u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\n\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:**\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 \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_task_get` \u2192 `CHAT_ID` (\xA75.2) |\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 }` |\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**\u0427\u0438\u0442\u0430\u0442\u044C \u0438\u0441\u0442\u043E\u0440\u0438\u044E.** `bitrix_chat_messages` \u043E\u0442\u0434\u0430\u0451\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u044E\u044E \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443; \u0432\u0433\u043B\u0443\u0431\u044C \u043B\u0438\u0441\u0442\u0430\u0435\u0442\n`bitrix_chat_history` \u043F\u043E \u043A\u0443\u0440\u0441\u043E\u0440\u0443 `beforeId` = \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 id \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B (\u043F\u043E\u0432\u0442\u043E\u0440\u044F\u0439,\n\u0443\u043C\u0435\u043D\u044C\u0448\u0430\u044F `beforeId`, \u0434\u043E \u043D\u0430\u0447\u0430\u043B\u0430 \u0438\u0441\u0442\u043E\u0440\u0438\u0438).\n\n```jsonc\nbitrix_chat_load { "dialogId": 11 } // \u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 \u044E\u0437\u0435\u0440\u0430 11 \u2192 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 chatId\nbitrix_chat_history { "chatId": 485, "beforeId": 1861279 }\nbitrix_chat_mark_read { "chatId": 40271, "ids": [1884131] } // \u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439; actionUuid \u2014 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u043E\u043C\n```\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: `im.dialog.messages.get` (\u0434\u0435\u0444\u043E\u043B\u0442 20, \u043C\u0430\u043A\u0441 50; \u043B\u0438\u0441\u0442\u0430\u043D\u0438\u0435\n`LAST_ID` \u2014 \u0441\u0442\u0430\u0440\u0435\u0435, `FIRST_ID` \u2014 \u043D\u043E\u0432\u0435\u0435); `imbot.v2 chat.getMessageContext` \u2014 \u043E\u0442\u0432\u0435\u0442 `messages[]`\n(oldest\u2192newest) + `users[]` + `hasPrevPage`/`hasNextPage`, \u043F\u043E \u0444\u043E\u0440\u043C\u0435 **\u0441\u043E\u0432\u043F\u0430\u0434\u0430\u0435\u0442** \u0441 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u043C\u0438\n`im.v2.Chat.Message.*`.\n\n### 5.2. \u041E\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**\u0410. \u041F\u0440\u044F\u043C\u043E\u0439 \u0440\u0435\u0437\u043E\u043B\u0432 \u2014 \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` \u0447\u0430\u0442\u0430-\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u044F (\u0432\u0445\u043E\u0434\u0438\u0442\n\u0432 \u0434\u0435\u0444\u043E\u043B\u0442\u043D\u044B\u0439 `select` \u{1F4D6}) \u2014 \u044D\u0442\u043E `taskId \u2192 chatId` \u0431\u0435\u0437 \u043F\u043E\u0438\u0441\u043A\u0430 \u043F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E \u0438 \u0431\u0435\u0437 \u043F\u0440\u043E\u043C\u0430\u0445\u0430 \u043F\u043E \u0442\u0451\u0437\u043A\u0430\u043C:\n\n```jsonc\nbitrix_task_get { "taskId": 28373 } // \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 CHAT_ID\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\u041E\u0431\u0449\u0430\u044F \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`): chatId \u043B\u044E\u0431\u043E\u0433\u043E \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0433\u043E\n\u043E\u0431\u044A\u0435\u043A\u0442\u0430 \u043F\u043E \u043F\u0430\u0440\u0435 `entityType`/`entityId`; \u043A\u0440\u043E\u043C\u0435 `TASKS_TASK` \u0442\u0430\u043A \u0436\u0435 \u0430\u0434\u0440\u0435\u0441\u0443\u044E\u0442\u0441\u044F `SONET_GROUP`\n(\u0433\u0440\u0443\u043F\u043F\u0430/\u043F\u0440\u043E\u0435\u043A\u0442), `CRM`, `CALENDAR`, `MAIL`, `VIDEOCONF`, `CALL`:\n\n```jsonc\nbitrix_entity_chat { "entityType": "TASKS_TASK", "entityId": 28373 } // \u2192 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** (\u0441\u0435\u043A\u0446\u0438\u044F `tasksTask`; \u0432 `bitrix_chats_recent` \u0438\u0445 \u041D\u0415\u0422):\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" }\nbitrix_chat_load { "dialogId": "chat38849" } // \u0438\u043B\u0438 { "chatId": 38849 }\n```\n\n**\u0427\u0430\u0442 \u043F\u0443\u0441\u0442, \u0430 `COMMENTS_COUNT > 0`** \u2014 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0442\u0430\u0440\u0448\u0435 \u0447\u0430\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447: \u0432 \u0447\u0430\u0442\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435\n\xAB\u0427\u0442\u043E\u0431\u044B \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0440\u0430\u043D\u0435\u0435 \u043E\u0441\u0442\u0430\u0432\u0438\u043B\u0438 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0438 \u0437\u0430\u0434\u0430\u0447\u0438\u2026\xBB, \u0430 \u0441\u0430\u043C\u043E \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u043B\u0435\u0436\u0438\u0442 \u0432\n\u0444\u043E\u0440\u0443\u043C\u0435 \u2192 `bitrix_task_comments` (\xA75.6).\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** (\u0437\u0430\u043F\u0430\u0441\u043D\u043E\u0439, \u043C\u0430\u0442\u0447 \u043F\u043E \u0442\u0435\u043A\u0441\u0442\u0443):\n`bitrix_entity_search { "query": "\u0442\u0440\u0435\u043A\u0435\u0440", "section": "tasksTask" }`\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_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### 5.3. \u041F\u043E\u0438\u0441\u043A \u0447\u0430\u0442\u0430 / \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\n\n`bitrix_entity_search` (\u043E\u0431\u0451\u0440\u0442\u043A\u0430 \u043D\u0430\u0434 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u043C `ui.entityselector.doSearch`) \u0441\u0430\u043C \u0441\u043E\u0431\u0438\u0440\u0430\u0435\u0442 \u0434\u0438\u0430\u043B\u043E\u0433\n`IM_CHAT_SEARCH` \u0438 `searchQuery` \u0438\u0437 \u0441\u0442\u0440\u043E\u043A\u0438. \u041F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0435 \u0430\u043D\u0430\u043B\u043E\u0433\u0438: \u043B\u044E\u0434\u0438 \u2014 `user.get`/`user.search`, \u0447\u0430\u0442\u044B \u2014\n`im.recent.list` + \u0444\u0438\u043B\u044C\u0442\u0440\u0430\u0446\u0438\u044F \u0443 \u0441\u0435\u0431\u044F.\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\nbitrix_user_get { "userId": 11 } // \u0440\u0435\u0437\u043E\u043B\u0432 authorId \u2192 \u0438\u043C\u044F\n```\n\n### 5.4. \u0421\u043E\u0437\u0432\u043E\u043D: \u0440\u0435\u0437\u044E\u043C\u0435, \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430, \u0437\u0430\u043F\u0438\u0441\u044C\n\nAI-\u0430\u043D\u0430\u043B\u0438\u0437 \u0437\u0432\u043E\u043D\u043A\u0430 (BitrixGPT Follow-Up) \u0436\u0438\u0432\u0451\u0442 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043D\u043E \u043E\u0442\u0440\u0435\u043D\u0434\u0435\u0440\u0435\u043D\u043D\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435 `/call/detail/<callId>`\n\u2014 JSON-\u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u0430 \u043F\u043E\u0434 \u043D\u0435\u0439 \u043D\u0435\u0442, \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u043E\u0433\u043E REST \u0434\u043B\u044F \u0432\u0438\u0434\u0435\u043E\u0432\u0441\u0442\u0440\u0435\u0447 \u0442\u043E\u0436\u0435 (\u{1F4D6} \u0442\u043E\u043B\u044C\u043A\u043E \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0438\u044F `voximplant.*`\n\u0438 `crm.activity.call.getTranscript`). \u041C\u043E\u0441\u0442 \u0447\u0438\u0442\u0430\u0435\u0442 \u044D\u0442\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 \u0435\u0451 \u0432 \u043D\u043E\u0440\u043C\u0430\u043B\u0438\u0437\u043E\u0432\u0430\u043D\u043D\u044B\u0439 JSON.\n\n**1) \u041D\u0430\u0439\u0442\u0438 \u0437\u0432\u043E\u043D\u043A\u0438.** \u0421\u0435\u0440\u0432\u0435\u0440\u043D\u043E\u0433\u043E \u043F\u043E\u0438\u0441\u043A\u0430 \u0437\u0432\u043E\u043D\u043A\u043E\u0432 \u043F\u043E \u043F\u043E\u0440\u0442\u0430\u043B\u0443 \u043D\u0435\u0442 \u2014 \u0438\u0449\u0435\u043C \u0432 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u043C \u0447\u0430\u0442\u0435: \u0437\u0432\u043E\u043D\u043E\u043A\n\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0441 `params.COMPONENT_PARAMS = { messageType: "START", callId }`.\n\n```jsonc\nbitrix_chat_calls { "chatId": 9876 } // \u0447\u0430\u0442 \u043F\u0440\u043E\u0435\u043A\u0442\u0430: bitrix_project_get \u2192 CHAT_ID\nbitrix_chat_calls { "chatId": 9876, "maxPages": 20, "beforeId": 5001 } // \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C \u0432\u0433\u043B\u0443\u0431\u044C\n```\n\n\u041E\u0442\u0432\u0435\u0442: `calls[] { callId, startedAt, startedBy, startMessageId, events[], summaryMessageId }` \u043F\u043B\u044E\u0441\n`scannedPages` / `oldestScannedMessageId` / **`reachedHistoryStart`** \u2014 \u0435\u0441\u043B\u0438 \u043E\u043D `false`, \u0438\u0441\u0442\u043E\u0440\u0438\u044F\n\u0434\u043E\u0447\u0438\u0442\u0430\u043D\u0430 \u041D\u0415 \u0434\u043E \u043A\u043E\u043D\u0446\u0430, \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u0439 \u0441 `beforeId: <oldestScannedMessageId>`.\n\n**2) \u0412\u0437\u044F\u0442\u044C \u0432\u0441\u0451 \u043F\u043E \u0437\u0432\u043E\u043D\u043A\u0443.**\n\n```jsonc\nbitrix_call_detail { "callId": 4242 } // \u0432\u0441\u0451; \u0434\u043B\u0438\u043D\u043D\u0430\u044F \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430 \u0443\u0435\u0434\u0435\u0442 \u0432 \u0444\u0430\u0439\u043B\nbitrix_call_detail { "callId": 4242, "transcript": "inline" } // \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430 \u043F\u0440\u044F\u043C\u043E \u0432 \u043E\u0442\u0432\u0435\u0442\u0435\nbitrix_call_detail { "callId": 4242, "transcript": "none" } // \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430 \u043D\u0435 \u043D\u0443\u0436\u043D\u0430 \u0432\u043E\u0432\u0441\u0435\nbitrix_call_detail { "callId": 4242, "transcript": "file" } // \u0432\u0441\u0435\u0433\u0434\u0430 \u0432 \u0444\u0430\u0439\u043B, \u0434\u0430\u0436\u0435 \u043A\u043E\u0440\u043E\u0442\u043A\u0430\u044F\n```\n\n| \u041F\u043E\u043B\u0435 \u043E\u0442\u0432\u0435\u0442\u0430 | \u0427\u0442\u043E \u0432\u043D\u0443\u0442\u0440\u0438 |\n|---|---|\n| `title`, `agenda`, `meetingType` | \u0442\u0435\u043C\u0430, \u0432\u0441\u0442\u0443\u043F\u043B\u0435\u043D\u0438\u0435, \u0442\u0438\u043F \u0432\u0441\u0442\u0440\u0435\u0447\u0438 (\xAB\u0421\u0442\u0430\u0442\u0443\u0441-\u0432\u0441\u0442\u0440\u0435\u0447\u0430\xBB) |\n| `date`, `interval`, `duration` | \xAB23 \u0438\u044E\u043B\u044F, 15:46\xBB, \xAB15:46 - 16:51\xBB, \xAB1 \u0447 4 \u043C\u0438\u043D\xBB |\n| `efficiency`, `qualityChecklist[]` | \u043E\u0446\u0435\u043D\u043A\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u0438 \u0432 % \u0438 \u043A\u0440\u0438\u0442\u0435\u0440\u0438\u0438 `{ ok, text }` |\n| `participants[]` | `{ id, name, talkTimePercent, talkTime, efficiency, metrics[], insight }` |\n| `overview`, `chapters[]` | \u043E\u0431\u0449\u0435\u0435 \u0440\u0435\u0437\u044E\u043C\u0435 \u0438 \u0433\u043B\u0430\u0432\u044B `{ from, to, title, text }` \u0441 \u0442\u0430\u0439\u043C\u043A\u043E\u0434\u0430\u043C\u0438 |\n| `decisions[]`, `tasks[]` | \xAB\u0447\u0442\u043E \u0440\u0435\u0448\u0438\u043B\u0438\xBB \u0438 \u0437\u0430\u0434\u0430\u0447\u0438 `{ assigneeId, assignee, text }` |\n| `transcript[]`, `transcriptCount` | \u0440\u0435\u043F\u043B\u0438\u043A\u0438 `{ from, to, speakerId, speaker, text }` |\n| `recording` | `{ path, url, trackId }` \u2014 \u0430\u0443\u0434\u0438\u043E\u0437\u0430\u043F\u0438\u0441\u044C, \u043A\u0430\u0447\u0430\u0435\u0442\u0441\u044F `bitrix_call_recording` (\xA75.5) |\n\n**\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430 \u0434\u043B\u0438\u043D\u043D\u043E\u0433\u043E \u0437\u0432\u043E\u043D\u043A\u0430 \u043D\u0435 \u043F\u0440\u0438\u0445\u043E\u0434\u0438\u0442 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435.** \u0423 \u0447\u0430\u0441\u043E\u0432\u043E\u0439 \u0432\u0441\u0442\u0440\u0435\u0447\u0438 \u043E\u043D\u0430 \u0434\u0430\u0451\u0442 ~70 \u041A\u0411 \u0438\u0437 80 \u041A\u0411, \u043F\u043E\u044D\u0442\u043E\u043C\u0443\n\u0441\u0432\u044B\u0448\u0435 ~20 \u041A\u0411 (\u0440\u0435\u0436\u0438\u043C `"auto"` = \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u0435) \u043F\u0438\u0448\u0435\u0442\u0441\u044F \u043D\u0430 \u0434\u0438\u0441\u043A, \u0430 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 \u043E\u0441\u0442\u0430\u044E\u0442\u0441\u044F `transcript: []`,\n`transcriptCount` \u0438 **`files`**: `files.transcript` \u2014 `call-<id>-transcript.txt`, \u0433\u0434\u0435 \u0441\u0442\u0440\u043E\u043A\u0430 = \u0440\u0435\u043F\u043B\u0438\u043A\u0430\n(`[11:10\u201411:24] \u0413\u0435\u043D\u0440\u0438\u0445 \u0411\u043E\u0433\u0430\u0446\u043A\u0438\u0439: \u2026`), \u0435\u0451 \u0443\u0434\u043E\u0431\u043D\u043E **\u0433\u0440\u0435\u043F\u0430\u0442\u044C** (\u043D\u0430\u0439\u0434\u0435\u043D\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 \u0441\u0430\u043C\u0430 \u043D\u0435\u0441\u0451\u0442 \u0442\u0430\u0439\u043C\u043A\u043E\u0434 \u0438\n\u0441\u043F\u0438\u043A\u0435\u0440\u0430); `files.json` \u2014 \u043F\u043E\u043B\u043D\u044B\u0439 \u043E\u0442\u0432\u0435\u0442 \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u043E\u0439. \u041E\u0431\u0430 \u0444\u0430\u0439\u043B\u0430 \u2014 \u043A\u0435\u0448 \u0437\u0432\u043E\u043D\u043A\u0430, \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u044B\u0432\u0430\u044E\u0442\u0441\u044F.\n\n\u0422\u043E\u043D\u043A\u043E\u0441\u0442\u0438:\n- **`speakerId`** \u0440\u0435\u0437\u043E\u043B\u0432\u0438\u0442\u0441\u044F \u043F\u043E \u0438\u043C\u0435\u043D\u0438 \u0438\u0437 \u0442\u0430\u0431\u043B\u0438\u0446\u044B \u0430\u043D\u0430\u043B\u0438\u0437\u0430; \u043A\u0442\u043E \u0433\u043E\u0432\u043E\u0440\u0438\u043B \u043C\u0430\u043B\u043E \u0438 \u0432 \u043D\u0435\u0451 \u043D\u0435 \u043F\u043E\u043F\u0430\u043B \u2014 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\n `speakerId: null`, \u043D\u043E \u043E\u0441\u0442\u0430\u043D\u0435\u0442\u0441\u044F \u0432 `participants` \u0441 `id: null`.\n- **`assigneeId` \u0437\u0430\u0434\u0430\u0447\u0438** \u2014 \u0443\u043F\u043E\u043C\u044F\u043D\u0443\u0442\u044B\u0439 \u0432 \u0442\u0435\u043A\u0441\u0442\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C, \u0430 \u041D\u0415 id \u0441\u043C\u043E\u0442\u0440\u044F\u0449\u0435\u0433\u043E.\n- \u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043A \u0437\u0432\u043E\u043D\u043A\u0443 / \u043F\u0440\u043E\u0442\u0443\u0445\u043B\u0430 \u0441\u0435\u0441\u0441\u0438\u044F \u2192 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u0432\u0435\u0440\u043D\u0451\u0442 \u0432\u043D\u044F\u0442\u043D\u0443\u044E \u043E\u0448\u0438\u0431\u043A\u0443 (\u043F\u043E\u0440\u0442\u0430\u043B \u043E\u0442\u0434\u0430\u0451\u0442 HTML \u043B\u043E\u0433\u0438\u043D\u0430).\n\n### 5.5. \u0421\u043A\u0430\u0447\u0430\u0442\u044C \u0444\u0430\u0439\u043B (\u0432\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0447\u0430\u0442\u0430, \u0444\u0430\u0439\u043B \u0437\u0430\u0434\u0430\u0447\u0438, \u0437\u0430\u043F\u0438\u0441\u044C \u0437\u0432\u043E\u043D\u043A\u0430)\n\n\u0421\u0441\u044B\u043B\u043A\u0438 \u043F\u043E\u0440\u0442\u0430\u043B \u043C\u0438\u043D\u0442\u0438\u0442 \u0438 \u043F\u043E\u0434\u043F\u0438\u0441\u044B\u0432\u0430\u0435\u0442 \u0441\u0430\u043C, \u043D\u043E \u043F\u043E\u0434\u043F\u0438\u0441\u044C \u041D\u0415 \u0437\u0430\u043C\u0435\u043D\u044F\u0435\u0442 \u0430\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u044E \u2014 \u043A\u0430\u0447\u0430\u0435\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435 \u0432\n\u0441\u0435\u0441\u0441\u0438\u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F.\n\n```jsonc\n// \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0447\u0430\u0442\u0430: \u0441\u0441\u044B\u043B\u043A\u0443 \u0431\u0435\u0440\u0451\u043C \u0438\u0437 files[].urlDownload \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 bitrix_chat_load\nbitrix_file_download { "url": "https://<\u043F\u043E\u0440\u0442\u0430\u043B>/bitrix/services/main/ajax.php?action=disk.api.file.download&\u2026" }\nbitrix_call_recording { "callId": 4242 } // \u0430\u0443\u0434\u0438\u043E\u0437\u0430\u043F\u0438\u0441\u044C \u0441\u043E\u0437\u0432\u043E\u043D\u0430 (\u0441\u0441\u044B\u043B\u043A\u0443 \u043D\u0430\u0439\u0434\u0451\u0442 \u0441\u0430\u043C)\nbitrix_file_download { "url": "\u2026", "savePath": "/tmp/photo.png", "overwrite": true }\n```\n\n\u041E\u0442\u0432\u0435\u0442 \u2014 **\u043F\u0443\u0442\u044C, \u0430 \u043D\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435**: `{ path, bytes, contentType, fileName }` (\u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442\u044B \u043D\u0435 \u043F\u043E\u043F\u0430\u0434\u0430\u044E\u0442 \u0432\n\u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442). \u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0444\u0430\u0439\u043B \u043B\u043E\u0436\u0438\u0442\u0441\u044F \u0432 `~/.bitrix24-mcp-bridge/downloads/`; `savePath` \u0431\u0435\u0437 \u0432\u0435\u0434\u0443\u0449\u0435\u0433\u043E `/`\n\u0442\u0440\u0430\u043A\u0442\u0443\u0435\u0442\u0441\u044F \u043A\u0430\u043A \u0438\u043C\u044F \u0432\u043D\u0443\u0442\u0440\u0438 \u044D\u0442\u043E\u0439 \u043F\u0430\u043F\u043A\u0438. \u041F\u043E\u0442\u043E\u043B\u043E\u043A \u2014 512 \u041C\u0411.\n\n\u0422\u043E\u043D\u043A\u043E\u0441\u0442\u0438:\n- **\u0413\u0440\u0430\u043D\u0438\u0446\u0430 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 \u2014 origin**: \u0441\u043A\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0441 origin \u0441\u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0433\u043E \u043F\u043E\u0440\u0442\u0430\u043B\u0430.\n- **\u0418\u043C\u044F \u0434\u0430\u0451\u0442 \u043F\u043E\u0440\u0442\u0430\u043B** (`Content-Disposition`), \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u0431\u0435\u0437 `savePath` \u0443\u0433\u0430\u0434\u044B\u0432\u0430\u0442\u044C \u0435\u0433\u043E \u043D\u0435 \u043D\u0443\u0436\u043D\u043E.\n- **\u041F\u043E\u0432\u0442\u043E\u0440\u043D\u043E\u0435 \u0441\u043A\u0430\u0447\u0438\u0432\u0430\u043D\u0438\u0435** \u0442\u043E\u0433\u043E \u0436\u0435 \u0444\u0430\u0439\u043B\u0430 \u043F\u0430\u0434\u0430\u0435\u0442 \u0441 `already exists` \u2014 \u043F\u0435\u0440\u0435\u0434\u0430\u0439 `overwrite: true`.\n\n### 5.6. \u0421\u0442\u0430\u0440\u044B\u0435 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 (\u0444\u043E\u0440\u0443\u043C)\n\n\u0414\u043E \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430 \u043D\u0430 \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u0436\u0438\u043B\u043E \u0432 \u0444\u043E\u0440\u0443\u043C\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0438 \u0443 \u0441\u0442\u0430\u0440\u044B\u0445 \u0437\u0430\u0434\u0430\u0447 \u043E\u043D\u043E \u0442\u0430\u043C \u0438 \u043E\u0441\u0442\u0430\u043B\u043E\u0441\u044C: \u0432\n\u0447\u0430\u0442\u0435 (`CHAT_ID`) \u0442\u043E\u043B\u044C\u043A\u043E \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u0430\u044F \u0437\u0430\u0433\u043B\u0443\u0448\u043A\u0430 \u0441\u043E \u0441\u0441\u044B\u043B\u043A\u043E\u0439 `/task/comments/<id>/`. \u041F\u0440\u0438\u0437\u043D\u0430\u043A \u2014 \u0432\n`bitrix_task_get` \u043F\u043E\u043B\u0435 `COMMENTS_COUNT > 0` (\u0447\u0435\u0440\u0435\u0437 `params.select`; `FORUM_TOPIC_ID` \u0442\u043E\u0436\u0435 \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D),\n\u0430 \u0447\u0430\u0442 \u043F\u0443\u0441\u0442. JSON-\u043C\u0435\u0442\u043E\u0434\u0430 \u0447\u0442\u0435\u043D\u0438\u044F \u043D\u0435\u0442 \u2014 \u043C\u043E\u0441\u0442 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 HTML-\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0435\u0432.\n\n```jsonc\nbitrix_task_comments { "taskId": 1234 } // \u0432\u0441\u0451 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435; \u0434\u043B\u0438\u043D\u043D\u043E\u0435 \u0443\u0435\u0434\u0435\u0442 \u0432 \u0444\u0430\u0439\u043B\nbitrix_task_comments { "taskId": 1234, "limit": 10 } // \u0442\u043E\u043B\u044C\u043A\u043E 10 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0445\nbitrix_task_comments { "taskId": 1234, "output": "inline" } // \u0432\u0441\u0435\u0433\u0434\u0430 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435\nbitrix_task_comments { "taskId": 1234, "beforeId": 5678 } // \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C \u0432\u0433\u043B\u0443\u0431\u044C \u043E\u0442 id\n```\n\n\u041E\u0442\u0432\u0435\u0442: `comments[]` \u043F\u043E \u043F\u043E\u0440\u044F\u0434\u043A\u0443 (\u0441\u0442\u0430\u0440\u044B\u0435 \u2192 \u043D\u043E\u0432\u044B\u0435) \u2014 `{ id, authorId, author, date, dateIso, text, isNew,\nsystem, files[] }`, \u043F\u043B\u044E\u0441 `total`, `oldestId`, `scannedPages` \u0438 **`reachedHistoryStart`**: \u0435\u0441\u043B\u0438 \u043E\u043D\n`false` (\u0443\u043F\u0451\u0440\u043B\u0438\u0441\u044C \u0432 `maxPages`, \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u0435 10, \u0438\u043B\u0438 \u0432 `limit`), \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u0439 \u0441 `beforeId: <oldestId>`.\n\n- **`system: true`** \u2014 \u0441\u043B\u0443\u0436\u0435\u0431\u043D\u044B\u0435 \u0437\u0430\u043F\u0438\u0441\u0438 (\xAB\u0432\u044B \u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u044B \u0438\u0441\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u0435\u043C\xBB, \u0441\u043C\u0435\u043D\u0430 \u0441\u0440\u043E\u043A\u0430, \u043F\u0438\u043D\u0433\u0438), \u043D\u0435 \u0441\u043B\u043E\u0432\u0430 \u043B\u044E\u0434\u0435\u0439.\n- **`date`** \u2014 \u043A\u0430\u043A \u043D\u0430 \u043F\u043E\u0440\u0442\u0430\u043B\u0435 (\xAB9 \u043C\u0430\u0440\u0442\u0430 2024 08:15\xBB), **`dateIso`** \u2014 \u0442\u043E \u0436\u0435 \u0432 `2024-03-09T08:15`\n (\u043C\u0435\u0441\u0442\u043D\u043E\u0435 \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0440\u0442\u0430\u043B\u0430; \u0434\u043B\u044F \xAB\u0432\u0447\u0435\u0440\u0430, 12:00\xBB \u0438 \u0434\u0430\u0442 \u0431\u0435\u0437 \u0433\u043E\u0434\u0430 \u2014 `null`).\n- **`files[]`** \u2014 `{ attachedId, name, size, url }`; `url` \u0441\u043A\u0430\u0440\u043C\u043B\u0438\u0432\u0430\u0439 `bitrix_file_download` (\xA75.5).\n- **`text`** \u2014 \u0431\u0435\u0437 \u0440\u0430\u0437\u043C\u0435\u0442\u043A\u0438; \u0443 \u0441\u0441\u044B\u043B\u043A\u0438 \u0441 \u043F\u043E\u0434\u043F\u0438\u0441\u044C\u044E \u0430\u0434\u0440\u0435\u0441 \u0434\u043E\u043F\u0438\u0441\u0430\u043D \u0432 \u0441\u043A\u043E\u0431\u043A\u0430\u0445: \xAB\u043C\u0430\u043A\u0435\u0442 (https://\u2026)\xBB.\n- **\u0414\u043B\u0438\u043D\u043D\u043E\u0435 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u043D\u0435 \u043F\u0440\u0438\u0445\u043E\u0434\u0438\u0442 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435** (\u043A\u0430\u043A \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0430 \u0437\u0432\u043E\u043D\u043A\u0430, \xA75.4): \u0441\u0432\u044B\u0448\u0435 ~20 \u041A\u0411 (`output:\n "auto"` = \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u0435) \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 `comments: []` \u0438 `files`: `files.text` \u2014 `task-<id>-comments.txt`,\n \u0441\u0442\u0440\u043E\u043A\u0430 = \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 (`#5678 [2024-03-09T08:15] \u0418\u043C\u044F (id 101): \u0442\u0435\u043A\u0441\u0442`, \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u044B \u2014 ` \u23CE `), \u0435\u0451 \u0443\u0434\u043E\u0431\u043D\u043E\n \u0433\u0440\u0435\u043F\u0430\u0442\u044C; `files.json` \u2014 \u043F\u043E\u043B\u043D\u044B\u0439 \u043E\u0442\u0432\u0435\u0442. `output: "file"` \u2014 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432 \u0444\u0430\u0439\u043B.\n- **\u041F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u043C \u043D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043F\u043E\u043C\u0435\u0447\u0430\u0435\u0442\u0441\u044F.** \u041F\u043E\u0440\u0442\u0430\u043B \u043E\u0442\u043C\u0435\u0447\u0430\u0435\u0442 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u043C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043C\n `readComment`, \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u0448\u043B\u0451\u0442 JS \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B \u043F\u0440\u0438 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0435; \u043C\u043E\u0441\u0442 JS \u043D\u0435 \u0438\u0441\u043F\u043E\u043B\u043D\u044F\u0435\u0442. \u041F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u043E:\n `viewedDate` \u0437\u0430\u0434\u0430\u0447\u0438 \u043F\u043E\u0441\u043B\u0435 \u0447\u0442\u0435\u043D\u0438\u044F \u043D\u0435 \u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F. `isNew: true` \u2014 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u043D\u0435 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C.\n- \u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043A \u0437\u0430\u0434\u0430\u0447\u0435 / \u043F\u0440\u043E\u0442\u0443\u0445\u043B\u0430 \u0441\u0435\u0441\u0441\u0438\u044F \u2192 \u0432\u043D\u044F\u0442\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430 (\u043F\u043E\u0440\u0442\u0430\u043B \u043E\u0442\u0434\u0430\u0451\u0442 HTML \u043B\u043E\u0433\u0438\u043D\u0430).\n\n---\n\n\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u043D\u043E\u0432\u044B\u043C\u0438 \u043C\u0435\u0442\u043E\u0434\u0430\u043C\u0438, \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 (`bodyType`, `responseType`, path-\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B) \u0438\n\u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0430 \u043F\u0440\u0430\u0432\u043E\u043A \u0432 \u0436\u0438\u0432\u043E\u0439 daemon \u2014 `docs/reconnaissance.md`.\n' : load();
|
|
25432
25432
|
|
|
25433
25433
|
// src/tools/register.ts
|
|
25434
25434
|
import { randomUUID as randomUUID3 } from "node:crypto";
|
|
@@ -29731,6 +29731,133 @@ function sortCalls(acc) {
|
|
|
29731
29731
|
return [...acc.values()].sort((a, b) => b.callId - a.callId);
|
|
29732
29732
|
}
|
|
29733
29733
|
|
|
29734
|
+
// src/tools/taskComments.ts
|
|
29735
|
+
var MONTHS = {
|
|
29736
|
+
\u044F\u043D\u0432\u0430\u0440\u044F: 1,
|
|
29737
|
+
\u0444\u0435\u0432\u0440\u0430\u043B\u044F: 2,
|
|
29738
|
+
\u043C\u0430\u0440\u0442\u0430: 3,
|
|
29739
|
+
\u0430\u043F\u0440\u0435\u043B\u044F: 4,
|
|
29740
|
+
\u043C\u0430\u044F: 5,
|
|
29741
|
+
\u0438\u044E\u043D\u044F: 6,
|
|
29742
|
+
\u0438\u044E\u043B\u044F: 7,
|
|
29743
|
+
\u0430\u0432\u0433\u0443\u0441\u0442\u0430: 8,
|
|
29744
|
+
\u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044F: 9,
|
|
29745
|
+
\u043E\u043A\u0442\u044F\u0431\u0440\u044F: 10,
|
|
29746
|
+
\u043D\u043E\u044F\u0431\u0440\u044F: 11,
|
|
29747
|
+
\u0434\u0435\u043A\u0430\u0431\u0440\u044F: 12
|
|
29748
|
+
};
|
|
29749
|
+
function toIsoDate(raw) {
|
|
29750
|
+
const m = new RegExp("^(\\d{1,2})\\s+(\\p{L}+)\\s+(\\d{4})(?:,)?\\s+(\\d{1,2}):(\\d{2})$", "u").exec(raw.trim());
|
|
29751
|
+
const month = m ? MONTHS[m[2].toLowerCase()] : void 0;
|
|
29752
|
+
if (!m || !month) return null;
|
|
29753
|
+
const pad = (n) => String(n).padStart(2, "0");
|
|
29754
|
+
return `${m[3]}-${pad(month)}-${pad(m[1])}T${pad(m[4])}:${m[5]}`;
|
|
29755
|
+
}
|
|
29756
|
+
function clean2(el) {
|
|
29757
|
+
if (!el) return "";
|
|
29758
|
+
return el.text.replace(/[^\S\n]+/g, " ").replace(/ *\n+ */g, "\n").trim();
|
|
29759
|
+
}
|
|
29760
|
+
function num2(value) {
|
|
29761
|
+
if (value === null || value === void 0 || value === "") return null;
|
|
29762
|
+
const n = Number(value);
|
|
29763
|
+
return Number.isFinite(n) ? n : null;
|
|
29764
|
+
}
|
|
29765
|
+
function escapeHtml(value) {
|
|
29766
|
+
return value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
29767
|
+
}
|
|
29768
|
+
function absolute(path, origin) {
|
|
29769
|
+
return origin && path.startsWith("/") ? `${origin}${path}` : path;
|
|
29770
|
+
}
|
|
29771
|
+
function parseText(body) {
|
|
29772
|
+
if (!body) return "";
|
|
29773
|
+
for (const a of body.querySelectorAll("a[href]")) {
|
|
29774
|
+
const href = a.getAttribute("href") ?? "";
|
|
29775
|
+
const label = clean2(a);
|
|
29776
|
+
if (/^https?:\/\//i.test(href) && label !== href) a.replaceWith(escapeHtml(`${label} (${href})`));
|
|
29777
|
+
}
|
|
29778
|
+
return clean2(body);
|
|
29779
|
+
}
|
|
29780
|
+
function parseFiles(cover, origin) {
|
|
29781
|
+
const files = /* @__PURE__ */ new Map();
|
|
29782
|
+
for (const el of cover.querySelectorAll("[data-attached-object-id]")) {
|
|
29783
|
+
const attachedId = num2(el.getAttribute("data-attached-object-id"));
|
|
29784
|
+
const src = el.getAttribute("data-src");
|
|
29785
|
+
if (attachedId === null || !src || files.has(attachedId)) continue;
|
|
29786
|
+
files.set(attachedId, {
|
|
29787
|
+
attachedId,
|
|
29788
|
+
name: el.getAttribute("data-title") ?? null,
|
|
29789
|
+
size: el.getAttribute("data-bx-size") ?? null,
|
|
29790
|
+
url: absolute(src, origin)
|
|
29791
|
+
});
|
|
29792
|
+
}
|
|
29793
|
+
for (const a of cover.querySelectorAll('a[href*="attachedId="]')) {
|
|
29794
|
+
const href = a.getAttribute("href") ?? "";
|
|
29795
|
+
const attachedId = num2(/attachedId=(\d+)/.exec(href)?.[1]);
|
|
29796
|
+
if (attachedId === null || files.has(attachedId) || !/action=download/.test(href)) continue;
|
|
29797
|
+
files.set(attachedId, {
|
|
29798
|
+
attachedId,
|
|
29799
|
+
name: a.getAttribute("data-title") ?? a.getAttribute("title") ?? (clean2(a) || null),
|
|
29800
|
+
size: a.getAttribute("data-bx-size") ?? null,
|
|
29801
|
+
url: absolute(href, origin)
|
|
29802
|
+
});
|
|
29803
|
+
}
|
|
29804
|
+
return [...files.values()];
|
|
29805
|
+
}
|
|
29806
|
+
function parseComment(cover, origin) {
|
|
29807
|
+
const id = num2(cover.getAttribute("bx-mpl-entity-id"));
|
|
29808
|
+
if (id === null) return null;
|
|
29809
|
+
const block = cover.querySelector(".feed-com-block");
|
|
29810
|
+
const authorLink = cover.querySelector(".feed-com-user-box [bx-tooltip-user-id]");
|
|
29811
|
+
const authorId = num2(authorLink?.getAttribute("bx-tooltip-user-id")) ?? num2(/blog-comment-user-(\d+)/.exec(block?.getAttribute("class") ?? "")?.[1]);
|
|
29812
|
+
const date3 = clean2(cover.querySelector(".feed-com-time")) || null;
|
|
29813
|
+
return {
|
|
29814
|
+
id,
|
|
29815
|
+
authorId,
|
|
29816
|
+
author: clean2(authorLink ?? cover.querySelector(".feed-com-name")) || null,
|
|
29817
|
+
date: date3,
|
|
29818
|
+
dateIso: date3 ? toIsoDate(date3) : null,
|
|
29819
|
+
text: parseText(cover.querySelector(".feed-com-text-inner-inner")),
|
|
29820
|
+
isNew: cover.getAttribute("bx-mpl-read-status") === "new",
|
|
29821
|
+
system: block?.classList.contains("mpl-comment-aux") ?? false,
|
|
29822
|
+
files: parseFiles(cover, origin)
|
|
29823
|
+
};
|
|
29824
|
+
}
|
|
29825
|
+
function parseComments(html, origin) {
|
|
29826
|
+
const root = parse3(html);
|
|
29827
|
+
const comments = root.querySelectorAll(".feed-com-block-cover[bx-mpl-entity-id]").map((cover) => parseComment(cover, origin)).filter((c) => c !== null);
|
|
29828
|
+
return comments.sort((a, b) => a.id - b.id);
|
|
29829
|
+
}
|
|
29830
|
+
function parseFirstPage(html, origin) {
|
|
29831
|
+
const exemplarId = /EXEMPLAR_ID\s*:\s*'([^']+)'/.exec(html)?.[1];
|
|
29832
|
+
const signedParameters = /"componentName":"bitrix:forum\.comments"[^}]*?"params":"([^"]+)"/.exec(html)?.[1];
|
|
29833
|
+
if (!exemplarId || !signedParameters) {
|
|
29834
|
+
throw new Error(
|
|
29835
|
+
"response is not a task comments page (no comment list) \u2014 the portal likely answered with a login page or the task is not accessible to this user"
|
|
29836
|
+
);
|
|
29837
|
+
}
|
|
29838
|
+
return {
|
|
29839
|
+
exemplarId,
|
|
29840
|
+
signedParameters,
|
|
29841
|
+
// The "Предыдущие комментарии (N)" link is rendered only when older comments exist.
|
|
29842
|
+
hasOlder: parse3(html).querySelector('[id$="_page_nav"]') !== null,
|
|
29843
|
+
comments: parseComments(html, origin)
|
|
29844
|
+
};
|
|
29845
|
+
}
|
|
29846
|
+
function formatComments(taskId, comments, reachedHistoryStart) {
|
|
29847
|
+
const header = [
|
|
29848
|
+
`# \u0417\u0430\u0434\u0430\u0447\u0430 ${taskId} \u2014 \u0441\u0442\u0430\u0440\u044B\u0435 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 (\u0444\u043E\u0440\u0443\u043C): ${comments.length}`,
|
|
29849
|
+
`# \u0414\u043E\u0447\u0438\u0442\u0430\u043D\u043E \u0434\u043E \u043D\u0430\u0447\u0430\u043B\u0430: ${reachedHistoryStart ? "\u0434\u0430" : "\u043D\u0435\u0442"}`,
|
|
29850
|
+
""
|
|
29851
|
+
];
|
|
29852
|
+
const lines = comments.flatMap((c) => {
|
|
29853
|
+
const who = `${c.author ?? "?"}${c.authorId !== null ? ` (id ${c.authorId})` : ""}`;
|
|
29854
|
+
const tag = c.system ? " [\u0441\u0438\u0441\u0442\u0435\u043C\u043D\u044B\u0439]" : "";
|
|
29855
|
+
const head = `#${c.id} [${c.dateIso ?? c.date ?? "?"}] ${who}${tag}: ${c.text.replace(/\n+/g, " \u23CE ")}`;
|
|
29856
|
+
return [head, ...c.files.map((f) => ` \u0444\u0430\u0439\u043B: ${f.name ?? f.attachedId}${f.size ? ` (${f.size})` : ""} ${f.url}`)];
|
|
29857
|
+
});
|
|
29858
|
+
return [...header, ...lines].join("\n") + "\n";
|
|
29859
|
+
}
|
|
29860
|
+
|
|
29734
29861
|
// src/tools/download.ts
|
|
29735
29862
|
import { basename, isAbsolute as isAbsolute2, join as join2 } from "node:path";
|
|
29736
29863
|
import { existsSync as existsSync3, renameSync, rmSync as rmSync2 } from "node:fs";
|
|
@@ -29789,7 +29916,7 @@ function resolveDestination(req) {
|
|
|
29789
29916
|
|
|
29790
29917
|
// src/version.ts
|
|
29791
29918
|
var DEV_VERSION = "0.0.0-dev";
|
|
29792
|
-
var PACKAGE_VERSION = true ? "0.
|
|
29919
|
+
var PACKAGE_VERSION = true ? "0.5.0" : DEV_VERSION;
|
|
29793
29920
|
var isReleaseBuild = PACKAGE_VERSION !== DEV_VERSION;
|
|
29794
29921
|
|
|
29795
29922
|
// src/tools/register.ts
|
|
@@ -29802,6 +29929,10 @@ function shouldSpill(mode, call, canWrite) {
|
|
|
29802
29929
|
if (mode === "file") return true;
|
|
29803
29930
|
return JSON.stringify(call.transcript).length > TRANSCRIPT_INLINE_LIMIT;
|
|
29804
29931
|
}
|
|
29932
|
+
var COMMENTS_INLINE_LIMIT = 2e4;
|
|
29933
|
+
var COMMENTS_OUTPUT_MODES = ["auto", "inline", "file"];
|
|
29934
|
+
var navigateResponse = external_exports.object({ messageList: external_exports.string(), navigation: external_exports.string().optional() });
|
|
29935
|
+
var positiveId = external_exports.union([external_exports.number().int().positive(), external_exports.string().regex(/^\d+$/)]).transform(Number);
|
|
29805
29936
|
var downloadResult = external_exports.object({
|
|
29806
29937
|
path: external_exports.string(),
|
|
29807
29938
|
bytes: external_exports.number(),
|
|
@@ -29884,7 +30015,7 @@ function registerTools(server, deps) {
|
|
|
29884
30015
|
{
|
|
29885
30016
|
tool: "bitrix_task_get",
|
|
29886
30017
|
catalogName: "task.get",
|
|
29887
|
-
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).",
|
|
30018
|
+
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). \u0423 \u0441\u0442\u0430\u0440\u044B\u0445 \u0437\u0430\u0434\u0430\u0447 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u041D\u0415 \u0432 \u0447\u0430\u0442\u0435, \u0430 \u0432 \u0444\u043E\u0440\u0443\u043C\u0435: COMMENTS_COUNT > 0 \u043F\u0440\u0438 \u043F\u0443\u0441\u0442\u043E\u043C \u0447\u0430\u0442\u0435 \u2192 bitrix_task_comments { taskId }.",
|
|
29888
30019
|
inputSchema: { taskId: external_exports.union([external_exports.number(), external_exports.string()]), params: external_exports.record(external_exports.unknown()).optional(), portal: external_exports.string().optional() },
|
|
29889
30020
|
toParams: (a) => ({ taskId: a.taskId, select: TASK_GET_SELECT })
|
|
29890
30021
|
},
|
|
@@ -30175,6 +30306,93 @@ function registerTools(server, deps) {
|
|
|
30175
30306
|
}
|
|
30176
30307
|
);
|
|
30177
30308
|
}
|
|
30309
|
+
if (available.has("task.comments.page") && available.has("task.comments.navigate")) {
|
|
30310
|
+
server.registerTool(
|
|
30311
|
+
"bitrix_task_comments",
|
|
30312
|
+
{
|
|
30313
|
+
description: '\u0421\u0422\u0410\u0420\u042B\u0415 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 (\u0444\u043E\u0440\u0443\u043C) \u2014 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435, \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u0431\u044B\u043B\u043E \u0443 \u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u043E \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430 \u043D\u0430 \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447. \u041F\u0440\u0438\u0437\u043D\u0430\u043A: \u0443 \u0437\u0430\u0434\u0430\u0447\u0438 COMMENTS_COUNT > 0 (bitrix_task_get \u0441 params.select), \u0430 \u0432 \u0447\u0430\u0442\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 (CHAT_ID \u2192 bitrix_chat_load) \u0442\u043E\u043B\u044C\u043A\u043E \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \xAB\u0427\u0442\u043E\u0431\u044B \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0440\u0430\u043D\u0435\u0435 \u043E\u0441\u0442\u0430\u0432\u0438\u043B\u0438\u2026\xBB. \u041E\u0442\u0434\u0430\u0451\u0442 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u043F\u043E \u043F\u043E\u0440\u044F\u0434\u043A\u0443 (\u0441\u0442\u0430\u0440\u044B\u0435 \u2192 \u043D\u043E\u0432\u044B\u0435): { id, authorId, author, date, dateIso, text, isNew, system, files[] }; system: true \u2014 \u0441\u043B\u0443\u0436\u0435\u0431\u043D\u044B\u0435 (\u0441\u043C\u0435\u043D\u0430 \u0441\u0440\u043E\u043A\u0430, \xAB\u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u044B \u0438\u0441\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u0435\u043C\xBB, \u043F\u0438\u043D\u0433\u0438); files[].url \u2014 \u0441\u0441\u044B\u043B\u043A\u0430 \u0434\u043B\u044F bitrix_file_download. \u041D\u0418\u0427\u0415\u0413\u041E \u043D\u0435 \u043F\u043E\u043C\u0435\u0447\u0430\u0435\u0442 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u043C. \u0421\u0430\u043C \u043B\u0438\u0441\u0442\u0430\u0435\u0442 \u0434\u043E \u043D\u0430\u0447\u0430\u043B\u0430 \u0438\u0441\u0442\u043E\u0440\u0438\u0438 (maxPages, \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E 10); \u0435\u0441\u043B\u0438 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 reachedHistoryStart:false \u2014 \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438 \u0441 beforeId: <oldestId>. limit \u2014 \u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0442\u043E\u043B\u044C\u043A\u043E N \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0445. \u0414\u041B\u0418\u041D\u041D\u041E\u0415 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0435\u0442\u0441\u044F \u043D\u0430 \u0434\u0438\u0441\u043A: \u0442\u043E\u0433\u0434\u0430 comments \u043F\u0443\u0441\u0442, \u0430 \u043F\u0443\u0442\u0438 \u0432 files \u2014 files.text (\u0441\u0442\u0440\u043E\u043A\u0430 = \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u0441 id, \u0434\u0430\u0442\u043E\u0439 \u0438 \u0430\u0432\u0442\u043E\u0440\u043E\u043C \u2014 \u0443\u0434\u043E\u0431\u043D\u043E \u0433\u0440\u0435\u043F\u0430\u0442\u044C) \u0438 files.json. output: "inline" \u2014 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435, "file" \u2014 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432 \u0444\u0430\u0439\u043B, "auto" (\u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u0435) \u2014 \u043F\u043E \u0440\u0430\u0437\u043C\u0435\u0440\u0443.',
|
|
30314
|
+
inputSchema: {
|
|
30315
|
+
taskId: external_exports.union([external_exports.number(), external_exports.string()]),
|
|
30316
|
+
limit: external_exports.number().int().positive().optional(),
|
|
30317
|
+
maxPages: external_exports.number().int().positive().optional(),
|
|
30318
|
+
beforeId: external_exports.union([external_exports.number(), external_exports.string()]).optional(),
|
|
30319
|
+
output: external_exports.enum(COMMENTS_OUTPUT_MODES).optional(),
|
|
30320
|
+
portal: external_exports.string().optional()
|
|
30321
|
+
}
|
|
30322
|
+
},
|
|
30323
|
+
async (args) => {
|
|
30324
|
+
const { limit, maxPages, output, portal } = args;
|
|
30325
|
+
const taskIdArg = positiveId.safeParse(args.taskId);
|
|
30326
|
+
const beforeIdArg = positiveId.optional().safeParse(args.beforeId);
|
|
30327
|
+
if (!taskIdArg.success) return fail(`taskId must be a positive integer, got ${JSON.stringify(args.taskId)}`);
|
|
30328
|
+
if (!beforeIdArg.success) return fail(`beforeId must be a positive integer, got ${JSON.stringify(args.beforeId)}`);
|
|
30329
|
+
const taskId = taskIdArg.data;
|
|
30330
|
+
const beforeId = beforeIdArg.data;
|
|
30331
|
+
try {
|
|
30332
|
+
const alias = portal ?? deps.defaultPortal;
|
|
30333
|
+
const origin = deps.origins?.[alias];
|
|
30334
|
+
const pageEntry = deps.catalog.resolve("task.comments.page");
|
|
30335
|
+
const raw = await deps.sink.call(alias, { ...pageEntry, params: { ...pageEntry.params, taskId } });
|
|
30336
|
+
const page = textResponse.safeParse(raw);
|
|
30337
|
+
if (!page.success) return fail('task.comments.page did not return text \u2014 is responseType "text" set in the catalog?');
|
|
30338
|
+
const first = parseFirstPage(page.data.text, origin);
|
|
30339
|
+
const byId = /* @__PURE__ */ new Map();
|
|
30340
|
+
const before = beforeId ?? null;
|
|
30341
|
+
if (before === null) for (const c of first.comments) byId.set(c.id, c);
|
|
30342
|
+
let cursor = before ?? (first.comments[0]?.id ?? null);
|
|
30343
|
+
let reachedHistoryStart = before === null && !first.hasOlder;
|
|
30344
|
+
let scannedPages = 0;
|
|
30345
|
+
const navEntry = deps.catalog.resolve("task.comments.navigate");
|
|
30346
|
+
while (!reachedHistoryStart && cursor !== null && scannedPages < (maxPages ?? 10)) {
|
|
30347
|
+
if (limit !== void 0 && byId.size >= limit) break;
|
|
30348
|
+
const rawNav = await deps.sink.call(alias, {
|
|
30349
|
+
...navEntry,
|
|
30350
|
+
params: {
|
|
30351
|
+
...navEntry.params,
|
|
30352
|
+
ENTITY_XML_ID: `TASK_${taskId}`,
|
|
30353
|
+
EXEMPLAR_ID: first.exemplarId,
|
|
30354
|
+
"FILTER[<ID]": cursor,
|
|
30355
|
+
taskId,
|
|
30356
|
+
signedParameters: first.signedParameters
|
|
30357
|
+
}
|
|
30358
|
+
});
|
|
30359
|
+
const nav = navigateResponse.safeParse(rawNav);
|
|
30360
|
+
if (!nav.success) return fail("task.comments.navigate returned an unexpected shape (no messageList)");
|
|
30361
|
+
scannedPages += 1;
|
|
30362
|
+
const older = parseComments(nav.data.messageList, origin).filter((c) => !byId.has(c.id));
|
|
30363
|
+
for (const c of older) byId.set(c.id, c);
|
|
30364
|
+
if (older.length > 0) cursor = older[0].id;
|
|
30365
|
+
if (older.length === 0 || !nav.data.navigation?.trim()) reachedHistoryStart = true;
|
|
30366
|
+
}
|
|
30367
|
+
const loaded = [...byId.values()].sort((a, b) => a.id - b.id);
|
|
30368
|
+
const comments = limit !== void 0 ? loaded.slice(-limit) : loaded;
|
|
30369
|
+
if (comments.length < loaded.length) reachedHistoryStart = false;
|
|
30370
|
+
const result = {
|
|
30371
|
+
taskId,
|
|
30372
|
+
total: comments.length,
|
|
30373
|
+
reachedHistoryStart,
|
|
30374
|
+
oldestId: comments[0]?.id ?? null,
|
|
30375
|
+
scannedPages,
|
|
30376
|
+
comments
|
|
30377
|
+
};
|
|
30378
|
+
const mode = output ?? "auto";
|
|
30379
|
+
const spill = deps.downloadsDir !== void 0 && (mode === "file" || mode === "auto" && JSON.stringify(comments).length > COMMENTS_INLINE_LIMIT);
|
|
30380
|
+
if (!spill) return ok(result);
|
|
30381
|
+
const dir = deps.downloadsDir;
|
|
30382
|
+
mkdirSync3(dir, { recursive: true });
|
|
30383
|
+
const files = {
|
|
30384
|
+
text: join3(dir, `task-${taskId}-comments.txt`),
|
|
30385
|
+
json: join3(dir, `task-${taskId}-comments.json`)
|
|
30386
|
+
};
|
|
30387
|
+
writeFileSync2(files.text, formatComments(taskId, comments, reachedHistoryStart), "utf8");
|
|
30388
|
+
writeFileSync2(files.json, JSON.stringify(result, null, 1), "utf8");
|
|
30389
|
+
return ok({ ...result, comments: [], files });
|
|
30390
|
+
} catch (e) {
|
|
30391
|
+
return fail(e instanceof Error ? e.message : String(e));
|
|
30392
|
+
}
|
|
30393
|
+
}
|
|
30394
|
+
);
|
|
30395
|
+
}
|
|
30178
30396
|
if (deps.downloadsDir) {
|
|
30179
30397
|
const downloadsDir = deps.downloadsDir;
|
|
30180
30398
|
const fetchToDisk = async (args) => {
|
package/docs/api-notes.md
CHANGED
|
@@ -75,6 +75,8 @@ Ajax-контроллеры (`/bitrix/services/main/ajax.php`) отвечают
|
|
|
75
75
|
| `entityselector.load` | `ui.entityselector.load` | `{"dialog":{entities,preselectedItems,…}}` | — |
|
|
76
76
|
| `entityselector.search` | `ui.entityselector.doSearch` | `{"dialog":{…},"searchQuery":{"query":"…","queryWords":["…"]}}` | — |
|
|
77
77
|
| `call.detail` | `GET /call/detail/{callId}` | `callId` (подставляется в путь), `IFRAME=Y`, `IFRAME_TYPE=SIDE_SLIDER` → HTML | см. §5.4 |
|
|
78
|
+
| `task.comments.page` | `GET /task/comments/{taskId}/` | `taskId` (в путь), `IFRAME=Y`, `IFRAME_TYPE=SIDE_SLIDER` → HTML старых комментариев | см. §5.6 |
|
|
79
|
+
| `task.comments.navigate` | `bitrix:forum.comments` → `navigateComment` | форма: `ENTITY_XML_ID=TASK_<id>`, `EXEMPLAR_ID`, `signedParameters` (оба — из HTML первой страницы), `FILTER[<ID]` | `FILTER[<ID]` — курсор; проще `bitrix_task_comments` (§5.6) |
|
|
78
80
|
|
|
79
81
|
---
|
|
80
82
|
|
|
@@ -234,6 +236,10 @@ bitrix_recent_tail { "section": "tasksTask", "lastMessageDate": "2026-06-29T17:2
|
|
|
234
236
|
bitrix_chat_load { "dialogId": "chat38849" } // или { "chatId": 38849 }
|
|
235
237
|
```
|
|
236
238
|
|
|
239
|
+
**Чат пуст, а `COMMENTS_COUNT > 0`** — задача старше чатов задач: в чате только системное сообщение
|
|
240
|
+
«Чтобы прочитать комментарии, которые ранее оставили участники задачи…», а само обсуждение лежит в
|
|
241
|
+
форуме → `bitrix_task_comments` (§5.6).
|
|
242
|
+
|
|
237
243
|
**В. Поиском по названию задачи** (запасной, матч по тексту):
|
|
238
244
|
`bitrix_entity_search { "query": "трекер", "section": "tasksTask" }`
|
|
239
245
|
|
|
@@ -328,6 +334,38 @@ bitrix_file_download { "url": "…", "savePath": "/tmp/photo.png", "overwrite":
|
|
|
328
334
|
- **Имя даёт портал** (`Content-Disposition`), поэтому без `savePath` угадывать его не нужно.
|
|
329
335
|
- **Повторное скачивание** того же файла падает с `already exists` — передай `overwrite: true`.
|
|
330
336
|
|
|
337
|
+
### 5.6. Старые комментарии задачи (форум)
|
|
338
|
+
|
|
339
|
+
До перехода на чаты задач обсуждение жило в форуме задачи, и у старых задач оно там и осталось: в
|
|
340
|
+
чате (`CHAT_ID`) только системная заглушка со ссылкой `/task/comments/<id>/`. Признак — в
|
|
341
|
+
`bitrix_task_get` поле `COMMENTS_COUNT > 0` (через `params.select`; `FORUM_TOPIC_ID` тоже заполнен),
|
|
342
|
+
а чат пуст. JSON-метода чтения нет — мост разбирает HTML-страницу комментариев.
|
|
343
|
+
|
|
344
|
+
```jsonc
|
|
345
|
+
bitrix_task_comments { "taskId": 1234 } // всё обсуждение; длинное уедет в файл
|
|
346
|
+
bitrix_task_comments { "taskId": 1234, "limit": 10 } // только 10 последних
|
|
347
|
+
bitrix_task_comments { "taskId": 1234, "output": "inline" } // всегда в ответе
|
|
348
|
+
bitrix_task_comments { "taskId": 1234, "beforeId": 5678 } // продолжить вглубь от id
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
Ответ: `comments[]` по порядку (старые → новые) — `{ id, authorId, author, date, dateIso, text, isNew,
|
|
352
|
+
system, files[] }`, плюс `total`, `oldestId`, `scannedPages` и **`reachedHistoryStart`**: если он
|
|
353
|
+
`false` (упёрлись в `maxPages`, умолчание 10, или в `limit`), продолжай с `beforeId: <oldestId>`.
|
|
354
|
+
|
|
355
|
+
- **`system: true`** — служебные записи («вы назначены исполнителем», смена срока, пинги), не слова людей.
|
|
356
|
+
- **`date`** — как на портале («9 марта 2024 08:15»), **`dateIso`** — то же в `2024-03-09T08:15`
|
|
357
|
+
(местное время портала; для «вчера, 12:00» и дат без года — `null`).
|
|
358
|
+
- **`files[]`** — `{ attachedId, name, size, url }`; `url` скармливай `bitrix_file_download` (§5.5).
|
|
359
|
+
- **`text`** — без разметки; у ссылки с подписью адрес дописан в скобках: «макет (https://…)».
|
|
360
|
+
- **Длинное обсуждение не приходит в ответе** (как расшифровка звонка, §5.4): свыше ~20 КБ (`output:
|
|
361
|
+
"auto"` = умолчание) в ответе `comments: []` и `files`: `files.text` — `task-<id>-comments.txt`,
|
|
362
|
+
строка = комментарий (`#5678 [2024-03-09T08:15] Имя (id 101): текст`, переносы — ` ⏎ `), её удобно
|
|
363
|
+
грепать; `files.json` — полный ответ. `output: "file"` — всегда в файл.
|
|
364
|
+
- **Прочитанным ничего не помечается.** Портал отмечает комментарии отдельным действием
|
|
365
|
+
`readComment`, которое шлёт JS страницы при прокрутке; мост JS не исполняет. Проверено:
|
|
366
|
+
`viewedDate` задачи после чтения не меняется. `isNew: true` — комментарий не прочитан пользователем.
|
|
367
|
+
- Нет доступа к задаче / протухла сессия → внятная ошибка (портал отдаёт HTML логина).
|
|
368
|
+
|
|
331
369
|
---
|
|
332
370
|
|
|
333
371
|
Расширение каталога новыми методами, транспорт (`bodyType`, `responseType`, path-параметры) и
|
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.5.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": {
|