bitrix24-mcp-bridge 0.1.1 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -13
- package/actions.example.json +27 -31
- package/dist/cli.js +190 -45
- package/docs/api-notes.md +234 -45
- package/extension/dist/connector.js +8 -4
- package/extension/dist/connector.js.map +2 -2
- package/package.json +7 -2
package/dist/cli.js
CHANGED
|
@@ -25096,7 +25096,7 @@ var Daemon = class {
|
|
|
25096
25096
|
reply({ type: "result", id: msg.id, ok: false, error: `unknown portal "${msg.portal}"` });
|
|
25097
25097
|
continue;
|
|
25098
25098
|
}
|
|
25099
|
-
this.bridge.call(origin, { endpoint: msg.endpoint, action: msg.action, method: msg.method, params: msg.params }).then((data) => reply({ type: "result", id: msg.id, ok: true, data })).catch((e) => reply({ type: "result", id: msg.id, ok: false, error: e instanceof Error ? e.message : String(e) }));
|
|
25099
|
+
this.bridge.call(origin, { endpoint: msg.endpoint, action: msg.action, method: msg.method, params: msg.params, bodyType: msg.bodyType }).then((data) => reply({ type: "result", id: msg.id, ok: true, data })).catch((e) => reply({ type: "result", id: msg.id, ok: false, error: e instanceof Error ? e.message : String(e) }));
|
|
25100
25100
|
}
|
|
25101
25101
|
} catch (e) {
|
|
25102
25102
|
console.error(`[daemon] dropping malformed UDS data: ${e instanceof Error ? e.message : String(e)}`);
|
|
@@ -25274,46 +25274,12 @@ var entrySchema = external_exports.object({
|
|
|
25274
25274
|
endpoint: external_exports.string().min(1).default("/bitrix/services/main/ajax.php"),
|
|
25275
25275
|
action: external_exports.string().nullable().default(null),
|
|
25276
25276
|
method: external_exports.enum(["GET", "POST"]).default("POST"),
|
|
25277
|
-
params: external_exports.record(external_exports.unknown()).default({})
|
|
25277
|
+
params: external_exports.record(external_exports.unknown()).default({}),
|
|
25278
|
+
bodyType: external_exports.enum(["json", "form"]).default("form")
|
|
25278
25279
|
});
|
|
25279
25280
|
var fileSchema = external_exports.record(entrySchema);
|
|
25280
|
-
var MUTATING_VERBS = /* @__PURE__ */ new Set([
|
|
25281
|
-
"add",
|
|
25282
|
-
"update",
|
|
25283
|
-
"delete",
|
|
25284
|
-
"set",
|
|
25285
|
-
"complete",
|
|
25286
|
-
"remove",
|
|
25287
|
-
"create",
|
|
25288
|
-
"save",
|
|
25289
|
-
"send",
|
|
25290
|
-
"rename",
|
|
25291
|
-
"move",
|
|
25292
|
-
"import",
|
|
25293
|
-
"attach",
|
|
25294
|
-
"bind",
|
|
25295
|
-
"unbind"
|
|
25296
|
-
]);
|
|
25297
|
-
function tokenize(s) {
|
|
25298
|
-
return s.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean);
|
|
25299
|
-
}
|
|
25300
|
-
function assertReadOnly(name, entry) {
|
|
25301
|
-
for (const field of [entry.action, entry.endpoint]) {
|
|
25302
|
-
if (!field) continue;
|
|
25303
|
-
for (const token of tokenize(field)) {
|
|
25304
|
-
if (MUTATING_VERBS.has(token)) {
|
|
25305
|
-
throw new Error(
|
|
25306
|
-
`catalog entry "${name}" looks mutating ("${token}") \u2014 this bridge is read-only`
|
|
25307
|
-
);
|
|
25308
|
-
}
|
|
25309
|
-
}
|
|
25310
|
-
}
|
|
25311
|
-
}
|
|
25312
25281
|
function loadCatalog(path) {
|
|
25313
25282
|
const raw = fileSchema.parse(JSON.parse(readFileSync2(path, "utf8")));
|
|
25314
|
-
for (const [name, entry] of Object.entries(raw)) {
|
|
25315
|
-
assertReadOnly(name, entry);
|
|
25316
|
-
}
|
|
25317
25283
|
return {
|
|
25318
25284
|
resolve(name) {
|
|
25319
25285
|
if (!Object.prototype.hasOwnProperty.call(raw, name)) {
|
|
@@ -25330,9 +25296,10 @@ function loadCatalog(path) {
|
|
|
25330
25296
|
// src/tools/help.ts
|
|
25331
25297
|
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
25332
25298
|
var API_NOTES = fileURLToPath2(new URL("../../docs/api-notes.md", import.meta.url));
|
|
25333
|
-
var HELP = '# Bitrix24 API notes (reverse-engineered)\n\n\u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A \u043F\u043E \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u043C\u0443 API Bitrix24, \u0434\u043E\u0431\u044B\u0442\u044B\u0439 **\u0436\u0438\u0432\u044B\u043C \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C** (\u0443 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 ajax-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u043E\u0432\n\u043D\u0435\u0442 \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u043E\u0439 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0438). \u041F\u0440\u0435\u0434\u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D \u0434\u043B\u044F \u043B\u044E\u0431\u043E\u0433\u043E \u0418\u0418-\u0430\u0433\u0435\u043D\u0442\u0430 \u0438\u043B\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0432\u044B\u0437\u044B\u0432\u0430\u0435\u0442\n\u044D\u0442\u0438 \u043C\u0435\u0442\u043E\u0434\u044B \u0447\u0435\u0440\u0435\u0437 \u043C\u043E\u0441\u0442 (`bitrix_call` / \u0442\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B) \u0438\u043B\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044F\u0435\u0442 \u043A\u0430\u0442\u0430\u043B\u043E\u0433.\n\n\u041D\u0430\u0431\u043B\u044E\u0434\u0435\u043D\u0438\u044F \u0441\u043D\u044F\u0442\u044B \u043D\u0430 \u043F\u043E\u0440\u0442\u0430\u043B\u0435 `example.bitrix24.ru` (\u043E\u0431\u043B\u0430\u043A\u043E, \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 **im.v2**, \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435\n**scrum-\u0431\u043E\u0440\u0434\u0430**). \u0418\u043C\u0435\u043D\u0430 \u043F\u043E\u043B\u0435\u0439 \u0438 \u043A\u043E\u043D\u0432\u0435\u043D\u0446\u0438\u0438 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B \u0434\u043B\u044F \u043E\u0431\u043B\u0430\u0447\u043D\u043E\u0433\u043E Bitrix24, \u043D\u043E \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0435 \u043D\u0430 \u0434\u0440\u0443\u0433\u043E\u0439\n\u043F\u043E\u0440\u0442\u0430\u043B \u0441\u0432\u0435\u0440\u044F\u0439\u0441\u044F \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C (`docs/reconnaissance.md`).\n\n---\n\n## 1. \u041A\u0430\u043A \u0432\u044B\u0437\u044B\u0432\u0430\u0442\u044C\n\n- **\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_projects_list`,\n `bitrix_project_get`, `bitrix_chats_recent`, `bitrix_chat_messages`) \u2014 \u0441 \u0440\u0430\u0437\u0443\u043C\u043D\u044B\u043C\u0438 \u0434\u0435\u0444\u043E\u043B\u0442\u0430\u043C\u0438.\n \u0422\u043E\u0447\u043D\u0430\u044F \u0432\u044B\u0431\u043E\u0440\u043A\u0430 \u2014 \u0447\u0435\u0440\u0435\u0437 \u043E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0439 \u0430\u0440\u0433\u0443\u043C\u0435\u043D\u0442 **`params`** (\u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 Bitrix), \u043E\u043D \u043C\u0435\u0440\u0436\u0438\u0442\u0441\u044F\n **\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. \u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438 \u043F\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430\u043C \u0435\u0441\u0442\u044C \u0432 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0438 \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0430.\n- **`bitrix_call { name, params }`** \u2014 \u0443\u043D\u0438\u0432\u0435\u0440\u0441\u0430\u043B\u044C\u043D\u044B\u0439 \u0432\u044B\u0437\u043E\u0432 \u043B\u044E\u0431\u043E\u0433\u043E \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043D\u043D\u043E\u0433\u043E \u0438\u043C\u0435\u043D\u0438 \u0438\u0437 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430\n (`actions.json`). \u0422\u043E\u0442 \u0436\u0435 `params`-\u043C\u0435\u0445\u0430\u043D\u0438\u0437\u043C.\n- **`bitrix_help`** \u2014 \u044D\u0442\u043E\u0442 \u0436\u0435 \u0433\u0430\u0439\u0434, \u043E\u0442\u0434\u0430\u0451\u0442\u0441\u044F \u0447\u0435\u0440\u0435\u0437 MCP (\u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 + resource `bitrix://api-notes`),\n \u0447\u0442\u043E\u0431\u044B \u043B\u044E\u0431\u043E\u0439 \u0430\u0433\u0435\u043D\u0442 \u0440\u0430\u0437\u043E\u0431\u0440\u0430\u043B\u0441\u044F \u0431\u0435\u0437 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043A \u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u044E. \u0418\u0441\u0442\u043E\u0447\u043D\u0438\u043A \u2014 **\u044D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B** (`docs/api-notes.md`).\n- \u0412\u0441\u0451 **read-only**: \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0435 \u0432\u044B\u0437\u043E\u0432\u044B (`\u2026add/update/delete/set/complete/\u2026`) \u043E\u0442\u0432\u0435\u0440\u0433\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430.\n\n---\n\n## 2. \u0424\u043E\u0440\u043C\u0430\u0442 \u043E\u0442\u0432\u0435\u0442\u0430 (\u0432\u0430\u0436\u043D\u043E!)\n\nAjax-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u044B (`/bitrix/services/main/ajax.php`) \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0442 HTTP 200 \u0441 \u043A\u043E\u043D\u0432\u0435\u0440\u0442\u043E\u043C:\n\n```jsonc\n{ "status": "success" | "error",\n "data": { ... },\n "errors": [] } // \u041F\u0423\u0421\u0422\u041E\u0419 \u043C\u0430\u0441\u0441\u0438\u0432 \u043F\u0440\u0438 \u0443\u0441\u043F\u0435\u0445\u0435! (\u0432 JS [] \u2014 truthy)\n```\n\n- \u0423\u0441\u043F\u0435\u0445 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442\u0441\u044F `status:"success"` \u0438/\u0438\u043B\u0438 **\u043F\u0443\u0441\u0442\u044B\u043C** `errors`. \u041D\u0435\u043F\u0443\u0441\u0442\u043E\u0439 `errors` / `status:"error"` /\n top-level `error` \u2014 \u0440\u0435\u0430\u043B\u044C\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430.\n- REST-\u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u044B (`/rest/*.json`) \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0442 \u0438\u043D\u0430\u0447\u0435: `{ "result": \u2026, "next", "total", "time" }` \u2014 \u0431\u0435\u0437 `errors`.\n\n---\n\n## 3. \u0422\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 \u0438 \u043A\u043E\u043D\u0432\u0435\u043D\u0446\u0438\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 (\u0440\u0430\u0437\u043B\u0438\u0447\u0430\u044E\u0442\u0441\u044F \u043F\u043E \u043C\u0435\u0442\u043E\u0434\u0443!)\n\n\u041C\u043E\u0441\u0442 \u0448\u043B\u0451\u0442 `application/x-www-form-urlencoded` \u0441\u043E **\u0441\u0432\u0435\u0436\u0438\u043C `sessid`** \u0432 \u0442\u0435\u043B\u0435; \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E\u0441\u0442\u044C \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044F\nPHP-\u0441\u0442\u0438\u043B\u0435\u043C (`filter[STATUS]=2`, `select[0]=ID`). \u041E\u0431\u044A\u0435\u043A\u0442 \u0432 `params` \u0440\u0435\u043A\u0443\u0440\u0441\u0438\u0432\u043D\u043E \u0440\u0430\u0437\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0432 \u0442\u0430\u043A\u0438\u0435 \u043A\u043B\u044E\u0447\u0438.\n\n| \u041C\u0435\u0442\u043E\u0434 (action / endpoint) | \u0422\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 | \u0413\u0434\u0435 `select`/`filter`/`order` | \u041F\u0430\u0433\u0438\u043D\u0430\u0446\u0438\u044F |\n|---|---|---|---|\n| `tasks.task.list` | ajax, \u0444\u043E\u0440\u043C\u0430 | **\u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C**: `select[]`, `filter{}`, `order{}` | `start` (\u0441\u0434\u0432\u0438\u0433, \u0448\u0430\u0433 50) |\n| `tasks.task.get` | ajax, \u0444\u043E\u0440\u043C\u0430 | \u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C: `taskId`, `select[]` | \u2014 |\n| `socialnetwork.api.workgroup.list` | ajax, \u0444\u043E\u0440\u043C\u0430 | **\u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C**: `select[]`, `order{}`, `filter{}` | (nav \u2014 \u043D\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u043E) |\n| `socialnetwork.api.workgroup.get` | ajax, \u0444\u043E\u0440\u043C\u0430 | **\u043E\u0431\u0451\u0440\u043D\u0443\u0442\u043E**: `params[groupId]`, `params[select][]` | \u2014 |\n| `im.v2.Chat.Message.list` | ajax, \u0444\u043E\u0440\u043C\u0430 | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `limit`, `filter[lastId]` | `filter[lastId]` + `limit` |\n| `im.recent.list` (`/rest/im.recent.list.json`) | rest, \u0444\u043E\u0440\u043C\u0430 | \u043F\u043B\u043E\u0441\u043A\u043E: `LIMIT`, `SKIP_OPENLINES`, `UNREAD_ONLY`, \u2026 | `LIMIT` |\n\n\u26A0\uFE0F **`tasks.v2.*` (\u043D\u0430\u043F\u0440. `tasks.v2.Task.get`) \u0448\u043B\u0451\u0442 JSON-\u0442\u0435\u043B\u043E** (`{"task":{"id":N}}`), \u0430 \u043C\u043E\u0441\u0442 \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442\n\u0444\u043E\u0440\u043C\u0443 \u2014 **\u043D\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 `tasks.v2.*`**, \u0431\u0435\u0440\u0438 \u043A\u043B\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043A\u0438\u0435 `tasks.task.*`. \u041C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 `im.v2.*` \u043F\u0440\u0438 \u044D\u0442\u043E\u043C\n\u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442 \u043E\u0431\u044B\u0447\u043D\u0443\u044E \u0444\u043E\u0440\u043C\u0443 (\u044D\u0442\u043E \u0440\u0430\u0437\u043D\u044B\u0435 \u043F\u043E\u0434\u0441\u0438\u0441\u0442\u0435\u043C\u044B, \u043D\u0435\u0441\u043C\u043E\u0442\u0440\u044F \u043D\u0430 \u043E\u0431\u0449\u0438\u0439 \u043F\u0440\u0435\u0444\u0438\u043A\u0441 \xABv2\xBB).\n\nCSRF: \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u044B \u0442\u0440\u0435\u0431\u0443\u044E\u0442 `sessid` \u0432 \u0442\u0435\u043B\u0435 \u2014 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435 \u043F\u043E\u0434\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0432\u0435\u0436\u0438\u0439 `BX.bitrix_sessid()`\n\u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438. \u041E\u0442\u0432\u0435\u0442 `invalid_csrf`/`invalid_authentication` = \u0441\u0435\u0441\u0441\u0438\u044F \u043F\u0440\u043E\u0442\u0443\u0445\u043B\u0430 (\u043F\u0435\u0440\u0435\u043B\u043E\u0433\u0438\u043D\u044C\u0441\u044F \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435).\n\n---\n\n## 4. \u0422\u0440\u0438\u0430\u0434\u0430: \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u2192 action \u2192 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B\n\n| \u0418\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 | \u041A\u0430\u0442\u0430\u043B\u043E\u0433 (`actions.json`) | action / endpoint | \u041A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 params |\n|---|---|---|---|\n| `bitrix_tasks_list` | `tasks.list` | `tasks.task.list` | `filter{RESPONSIBLE_ID,REAL_STATUS,GROUP_ID,\u2026}`, `select[]`, `order{}`, `start` |\n| `bitrix_task_get` | `task.get` | `tasks.task.get` | `taskId`, `select[]` |\n| `bitrix_projects_list` | `projects.list` | `socialnetwork.api.workgroup.list` | `select[]`, `order{}`, `filter{}` |\n| `bitrix_project_get` | `projects.get` | `socialnetwork.api.workgroup.get` | `params[groupId]`, `params[select][]` |\n| `bitrix_chats_recent` | `chats.recent` | `/rest/im.recent.list.json` | `LIMIT`, `UNREAD_ONLY`, `SKIP_OPENLINES` |\n| `bitrix_chat_messages` | `chat.messages` | `im.v2.Chat.Message.list` | `chatId`, `limit`, `filter[lastId]` |\n\n---\n\n## 5. \u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A \u043F\u043E\u043B\u0435\u0439\n\n**\u0417\u0430\u0434\u0430\u0447\u0430** (`tasks.task.*`): `ID`, `TITLE`, `DESCRIPTION`, `STATUS`, `REAL_STATUS`, `RESPONSIBLE_ID`,\n`CREATED_BY`, `CREATED_DATE`, `CHANGED_DATE`, `DEADLINE`, `CLOSED_DATE`, `PRIORITY`, `GROUP_ID`,\n`TAGS`, `TIME_ESTIMATE`, `UF_*`. \u041E\u0442\u0432\u0435\u0442 \u0442\u0430\u043A\u0436\u0435 \u043F\u043E\u0434\u043A\u043B\u0430\u0434\u044B\u0432\u0430\u0435\u0442 \u043E\u0431\u044A\u0435\u043A\u0442\u044B `group`, `responsible`, `creator`, `action`.\n\n\u0421\u0442\u0430\u0442\u0443\u0441\u044B \u0437\u0430\u0434\u0430\u0447\u0438 (`STATUS`): `1` \u041D\u043E\u0432\u0430\u044F \xB7 `2` \u0416\u0434\u0451\u0442 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \xB7 `3` \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \xB7 `4` \u0416\u0434\u0451\u0442 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044F \xB7\n`5` \u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430 \xB7 `6` \u041E\u0442\u043B\u043E\u0436\u0435\u043D\u0430 \xB7 `7` \u041E\u0442\u043A\u043B\u043E\u043D\u0435\u043D\u0430.\n\n**\u0413\u0440\u0443\u043F\u043F\u0430/\u043F\u0440\u043E\u0435\u043A\u0442 \u2014 \u0441\u043F\u0438\u0441\u043E\u043A** (`workgroup.list`, camelCase \u0432 \u043E\u0442\u0432\u0435\u0442\u0435): `ID`, `NAME`, `DESCRIPTION`,\n`NUMBER_OF_MEMBERS`, `OWNER_ID`, `DATE_CREATE`, `PROJECT` (Y/N), `TYPE`.\n**\u0413\u0440\u0443\u043F\u043F\u0430 \u2014 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430** (`workgroup.get`): \u043F\u043B\u044E\u0441 `OWNER_DATA`, `SUBJECT_DATA`, `MEMBERS[]`,\n`MODERATOR_MEMBERS[]`, `CHAT_ID`, `DIALOG_ID`, `IMAGE_ID`, UF-\u043F\u043E\u043B\u044F.\n\n**\u041D\u0435\u0434\u0430\u0432\u043D\u0438\u0439 \u0447\u0430\u0442** (`im.recent.list`): `chat_id`, `title`, `type`, `message{id,text,date,author_id}`,\n`last_id`, `unread`, `pinned`, `user{\u2026}`, `chat{\u2026}`.\n**\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435** (`im.v2.Chat.Message.list`): `id`, `chatId`, `authorId`, `date`, `text`, `params`, `viewed`.\n\u041E\u0442\u0432\u0435\u0442 \u0442\u0430\u043A\u0436\u0435 \u043D\u0435\u0441\u0451\u0442 `users[]` (\u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0438), `additionalMessages[]`, `hasPrevPage`/`hasNextPage`.\n\n---\n\n## 6. \u041F\u0440\u0438\u043C\u0435\u0440\u044B \u0442\u043E\u0447\u043D\u044B\u0445 \u0432\u044B\u0431\u043E\u0440\u043E\u043A\n\n```jsonc\n// \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0433\u043E 55, \u043F\u043E \u0434\u0435\u0434\u043B\u0430\u0439\u043D\u0443, \u0432\u0442\u043E\u0440\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430\nbitrix_tasks_list { "params": { "filter": {"RESPONSIBLE_ID":55,"REAL_STATUS":2},\n "order": {"DEADLINE":"asc"}, "start": 50 } }\n\n// \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u043D\u044B\u043C \u043D\u0430\u0431\u043E\u0440\u043E\u043C \u043F\u043E\u043B\u0435\u0439\nbitrix_task_get { "taskId": 4229, "params": { "select": ["ID","TITLE","DESCRIPTION","TAGS","TIME_ESTIMATE"] } }\n\n// \u043F\u0440\u043E\u0435\u043A\u0442\u044B, \u043E\u0442\u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u043F\u043E \u0434\u0430\u0442\u0435 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F\nbitrix_projects_list { "params": { "order": {"DATE_CREATE":"desc"} } }\n\n// \u043F\u043E\u043B\u043D\u0430\u044F \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0433\u0440\u0443\u043F\u043F\u044B\nbitrix_project_get { "groupId": 15 }\n\n// \u0433\u043B\u0443\u0431\u0436\u0435 \u0432 \u0438\u0441\u0442\u043E\u0440\u0438\u044E \u0447\u0430\u0442\u0430\nbitrix_chat_messages { "chatId": 485, "limit": 50, "beforeId": 1936695 }\n```\n\n---\n\n## 7. \u041A\u0430\u043A \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044C (\u043D\u043E\u0432\u044B\u0439 \u0434\u043E\u043C\u0435\u043D: \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C, \u0434\u0438\u0441\u043A, CRM, \u2026)\n\n1. \u0421\u043D\u0438\u043C\u0438 \u0440\u0435\u0430\u043B\u044C\u043D\u044B\u0435 \u0432\u044B\u0437\u043E\u0432\u044B (`docs/reconnaissance.md` \u2014 \u0430\u0432\u0442\u043E-\u0437\u0430\u043F\u0438\u0441\u044C `bun run capture` \u0438\u043B\u0438 HAR).\n2. \u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0438 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 \u0438 \u0444\u043E\u0440\u043C\u0443 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u043F\u043E \u0440\u0430\u0437\u0434\u0435\u043B\u0443 3 (\u0441\u0432\u0435\u0440\u044C\u0441\u044F \u0441 `sampleParams` \u0438\u0437 \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A\u0430).\n3. \u0414\u043E\u0431\u0430\u0432\u044C \u0437\u0430\u043F\u0438\u0441\u044C \u0432 `actions.json` (\u0442\u043E\u043B\u044C\u043A\u043E read-only). \u041F\u0440\u043E\u0432\u0435\u0440\u044C \u0447\u0435\u0440\u0435\u0437 `bitrix_call { name, params }`.\n4. \u0415\u0441\u043B\u0438 \u0443\u0434\u043E\u0431\u043D\u043E \u2014 \u043E\u0431\u0435\u0440\u043D\u0438 \u0432 \u0442\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u0432 `src/tools/register.ts` (\u0441 \u0434\u0435\u0444\u043E\u043B\u0442\u043D\u044B\u043C `select`).\n\n> `actions.json` \u2014 \u0434\u0430\u043D\u043D\u044B\u0435 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0433\u043E \u043F\u043E\u0440\u0442\u0430\u043B\u0430 (gitignored). \u042D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B (`api-notes.md`) \u2014 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u043C\u044B\u0435\n> \u0437\u043D\u0430\u043D\u0438\u044F \u043E \u0441\u0430\u043C\u043E\u043C API; \u0434\u0435\u0440\u0436\u0438 \u0435\u0433\u043E \u0432 \u0430\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u043E\u043C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0438 \u043F\u0440\u0438 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0438 \u043D\u043E\u0432\u044B\u0445 \u043C\u0435\u0442\u043E\u0434\u043E\u0432.\n' ? '# Bitrix24 API notes (reverse-engineered)\n\n\u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A \u043F\u043E \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u043C\u0443 API Bitrix24, \u0434\u043E\u0431\u044B\u0442\u044B\u0439 **\u0436\u0438\u0432\u044B\u043C \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C** (\u0443 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 ajax-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u043E\u0432\n\u043D\u0435\u0442 \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u043E\u0439 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0438). \u041F\u0440\u0435\u0434\u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D \u0434\u043B\u044F \u043B\u044E\u0431\u043E\u0433\u043E \u0418\u0418-\u0430\u0433\u0435\u043D\u0442\u0430 \u0438\u043B\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0432\u044B\u0437\u044B\u0432\u0430\u0435\u0442\n\u044D\u0442\u0438 \u043C\u0435\u0442\u043E\u0434\u044B \u0447\u0435\u0440\u0435\u0437 \u043C\u043E\u0441\u0442 (`bitrix_call` / \u0442\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B) \u0438\u043B\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044F\u0435\u0442 \u043A\u0430\u0442\u0430\u043B\u043E\u0433.\n\n\u041D\u0430\u0431\u043B\u044E\u0434\u0435\u043D\u0438\u044F \u0441\u043D\u044F\u0442\u044B \u043D\u0430 \u043F\u043E\u0440\u0442\u0430\u043B\u0435 `example.bitrix24.ru` (\u043E\u0431\u043B\u0430\u043A\u043E, \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 **im.v2**, \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435\n**scrum-\u0431\u043E\u0440\u0434\u0430**). \u0418\u043C\u0435\u043D\u0430 \u043F\u043E\u043B\u0435\u0439 \u0438 \u043A\u043E\u043D\u0432\u0435\u043D\u0446\u0438\u0438 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B \u0434\u043B\u044F \u043E\u0431\u043B\u0430\u0447\u043D\u043E\u0433\u043E Bitrix24, \u043D\u043E \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0435 \u043D\u0430 \u0434\u0440\u0443\u0433\u043E\u0439\n\u043F\u043E\u0440\u0442\u0430\u043B \u0441\u0432\u0435\u0440\u044F\u0439\u0441\u044F \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C (`docs/reconnaissance.md`).\n\n---\n\n## 1. \u041A\u0430\u043A \u0432\u044B\u0437\u044B\u0432\u0430\u0442\u044C\n\n- **\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_projects_list`,\n `bitrix_project_get`, `bitrix_chats_recent`, `bitrix_chat_messages`) \u2014 \u0441 \u0440\u0430\u0437\u0443\u043C\u043D\u044B\u043C\u0438 \u0434\u0435\u0444\u043E\u043B\u0442\u0430\u043C\u0438.\n \u0422\u043E\u0447\u043D\u0430\u044F \u0432\u044B\u0431\u043E\u0440\u043A\u0430 \u2014 \u0447\u0435\u0440\u0435\u0437 \u043E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0439 \u0430\u0440\u0433\u0443\u043C\u0435\u043D\u0442 **`params`** (\u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 Bitrix), \u043E\u043D \u043C\u0435\u0440\u0436\u0438\u0442\u0441\u044F\n **\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. \u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438 \u043F\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430\u043C \u0435\u0441\u0442\u044C \u0432 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0438 \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0430.\n- **`bitrix_call { name, params }`** \u2014 \u0443\u043D\u0438\u0432\u0435\u0440\u0441\u0430\u043B\u044C\u043D\u044B\u0439 \u0432\u044B\u0437\u043E\u0432 \u043B\u044E\u0431\u043E\u0433\u043E \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043D\u043D\u043E\u0433\u043E \u0438\u043C\u0435\u043D\u0438 \u0438\u0437 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430\n (`actions.json`). \u0422\u043E\u0442 \u0436\u0435 `params`-\u043C\u0435\u0445\u0430\u043D\u0438\u0437\u043C.\n- **`bitrix_help`** \u2014 \u044D\u0442\u043E\u0442 \u0436\u0435 \u0433\u0430\u0439\u0434, \u043E\u0442\u0434\u0430\u0451\u0442\u0441\u044F \u0447\u0435\u0440\u0435\u0437 MCP (\u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 + resource `bitrix://api-notes`),\n \u0447\u0442\u043E\u0431\u044B \u043B\u044E\u0431\u043E\u0439 \u0430\u0433\u0435\u043D\u0442 \u0440\u0430\u0437\u043E\u0431\u0440\u0430\u043B\u0441\u044F \u0431\u0435\u0437 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043A \u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u044E. \u0418\u0441\u0442\u043E\u0447\u043D\u0438\u043A \u2014 **\u044D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B** (`docs/api-notes.md`).\n- \u0412\u0441\u0451 **read-only**: \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0435 \u0432\u044B\u0437\u043E\u0432\u044B (`\u2026add/update/delete/set/complete/\u2026`) \u043E\u0442\u0432\u0435\u0440\u0433\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430.\n\n---\n\n## 2. \u0424\u043E\u0440\u043C\u0430\u0442 \u043E\u0442\u0432\u0435\u0442\u0430 (\u0432\u0430\u0436\u043D\u043E!)\n\nAjax-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u044B (`/bitrix/services/main/ajax.php`) \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0442 HTTP 200 \u0441 \u043A\u043E\u043D\u0432\u0435\u0440\u0442\u043E\u043C:\n\n```jsonc\n{ "status": "success" | "error",\n "data": { ... },\n "errors": [] } // \u041F\u0423\u0421\u0422\u041E\u0419 \u043C\u0430\u0441\u0441\u0438\u0432 \u043F\u0440\u0438 \u0443\u0441\u043F\u0435\u0445\u0435! (\u0432 JS [] \u2014 truthy)\n```\n\n- \u0423\u0441\u043F\u0435\u0445 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442\u0441\u044F `status:"success"` \u0438/\u0438\u043B\u0438 **\u043F\u0443\u0441\u0442\u044B\u043C** `errors`. \u041D\u0435\u043F\u0443\u0441\u0442\u043E\u0439 `errors` / `status:"error"` /\n top-level `error` \u2014 \u0440\u0435\u0430\u043B\u044C\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430.\n- REST-\u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u044B (`/rest/*.json`) \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0442 \u0438\u043D\u0430\u0447\u0435: `{ "result": \u2026, "next", "total", "time" }` \u2014 \u0431\u0435\u0437 `errors`.\n\n---\n\n## 3. \u0422\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 \u0438 \u043A\u043E\u043D\u0432\u0435\u043D\u0446\u0438\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 (\u0440\u0430\u0437\u043B\u0438\u0447\u0430\u044E\u0442\u0441\u044F \u043F\u043E \u043C\u0435\u0442\u043E\u0434\u0443!)\n\n\u041C\u043E\u0441\u0442 \u0448\u043B\u0451\u0442 `application/x-www-form-urlencoded` \u0441\u043E **\u0441\u0432\u0435\u0436\u0438\u043C `sessid`** \u0432 \u0442\u0435\u043B\u0435; \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E\u0441\u0442\u044C \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044F\nPHP-\u0441\u0442\u0438\u043B\u0435\u043C (`filter[STATUS]=2`, `select[0]=ID`). \u041E\u0431\u044A\u0435\u043A\u0442 \u0432 `params` \u0440\u0435\u043A\u0443\u0440\u0441\u0438\u0432\u043D\u043E \u0440\u0430\u0437\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0432 \u0442\u0430\u043A\u0438\u0435 \u043A\u043B\u044E\u0447\u0438.\n\n| \u041C\u0435\u0442\u043E\u0434 (action / endpoint) | \u0422\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 | \u0413\u0434\u0435 `select`/`filter`/`order` | \u041F\u0430\u0433\u0438\u043D\u0430\u0446\u0438\u044F |\n|---|---|---|---|\n| `tasks.task.list` | ajax, \u0444\u043E\u0440\u043C\u0430 | **\u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C**: `select[]`, `filter{}`, `order{}` | `start` (\u0441\u0434\u0432\u0438\u0433, \u0448\u0430\u0433 50) |\n| `tasks.task.get` | ajax, \u0444\u043E\u0440\u043C\u0430 | \u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C: `taskId`, `select[]` | \u2014 |\n| `socialnetwork.api.workgroup.list` | ajax, \u0444\u043E\u0440\u043C\u0430 | **\u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C**: `select[]`, `order{}`, `filter{}` | (nav \u2014 \u043D\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u043E) |\n| `socialnetwork.api.workgroup.get` | ajax, \u0444\u043E\u0440\u043C\u0430 | **\u043E\u0431\u0451\u0440\u043D\u0443\u0442\u043E**: `params[groupId]`, `params[select][]` | \u2014 |\n| `im.v2.Chat.Message.list` | ajax, \u0444\u043E\u0440\u043C\u0430 | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `limit`, `filter[lastId]` | `filter[lastId]` + `limit` |\n| `im.recent.list` (`/rest/im.recent.list.json`) | rest, \u0444\u043E\u0440\u043C\u0430 | \u043F\u043B\u043E\u0441\u043A\u043E: `LIMIT`, `SKIP_OPENLINES`, `UNREAD_ONLY`, \u2026 | `LIMIT` |\n\n\u26A0\uFE0F **`tasks.v2.*` (\u043D\u0430\u043F\u0440. `tasks.v2.Task.get`) \u0448\u043B\u0451\u0442 JSON-\u0442\u0435\u043B\u043E** (`{"task":{"id":N}}`), \u0430 \u043C\u043E\u0441\u0442 \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442\n\u0444\u043E\u0440\u043C\u0443 \u2014 **\u043D\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 `tasks.v2.*`**, \u0431\u0435\u0440\u0438 \u043A\u043B\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043A\u0438\u0435 `tasks.task.*`. \u041C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 `im.v2.*` \u043F\u0440\u0438 \u044D\u0442\u043E\u043C\n\u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442 \u043E\u0431\u044B\u0447\u043D\u0443\u044E \u0444\u043E\u0440\u043C\u0443 (\u044D\u0442\u043E \u0440\u0430\u0437\u043D\u044B\u0435 \u043F\u043E\u0434\u0441\u0438\u0441\u0442\u0435\u043C\u044B, \u043D\u0435\u0441\u043C\u043E\u0442\u0440\u044F \u043D\u0430 \u043E\u0431\u0449\u0438\u0439 \u043F\u0440\u0435\u0444\u0438\u043A\u0441 \xABv2\xBB).\n\nCSRF: \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u044B \u0442\u0440\u0435\u0431\u0443\u044E\u0442 `sessid` \u0432 \u0442\u0435\u043B\u0435 \u2014 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435 \u043F\u043E\u0434\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0432\u0435\u0436\u0438\u0439 `BX.bitrix_sessid()`\n\u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438. \u041E\u0442\u0432\u0435\u0442 `invalid_csrf`/`invalid_authentication` = \u0441\u0435\u0441\u0441\u0438\u044F \u043F\u0440\u043E\u0442\u0443\u0445\u043B\u0430 (\u043F\u0435\u0440\u0435\u043B\u043E\u0433\u0438\u043D\u044C\u0441\u044F \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435).\n\n---\n\n## 4. \u0422\u0440\u0438\u0430\u0434\u0430: \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u2192 action \u2192 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B\n\n| \u0418\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 | \u041A\u0430\u0442\u0430\u043B\u043E\u0433 (`actions.json`) | action / endpoint | \u041A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 params |\n|---|---|---|---|\n| `bitrix_tasks_list` | `tasks.list` | `tasks.task.list` | `filter{RESPONSIBLE_ID,REAL_STATUS,GROUP_ID,\u2026}`, `select[]`, `order{}`, `start` |\n| `bitrix_task_get` | `task.get` | `tasks.task.get` | `taskId`, `select[]` |\n| `bitrix_projects_list` | `projects.list` | `socialnetwork.api.workgroup.list` | `select[]`, `order{}`, `filter{}` |\n| `bitrix_project_get` | `projects.get` | `socialnetwork.api.workgroup.get` | `params[groupId]`, `params[select][]` |\n| `bitrix_chats_recent` | `chats.recent` | `/rest/im.recent.list.json` | `LIMIT`, `UNREAD_ONLY`, `SKIP_OPENLINES` |\n| `bitrix_chat_messages` | `chat.messages` | `im.v2.Chat.Message.list` | `chatId`, `limit`, `filter[lastId]` |\n\n---\n\n## 5. \u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A \u043F\u043E\u043B\u0435\u0439\n\n**\u0417\u0430\u0434\u0430\u0447\u0430** (`tasks.task.*`): `ID`, `TITLE`, `DESCRIPTION`, `STATUS`, `REAL_STATUS`, `RESPONSIBLE_ID`,\n`CREATED_BY`, `CREATED_DATE`, `CHANGED_DATE`, `DEADLINE`, `CLOSED_DATE`, `PRIORITY`, `GROUP_ID`,\n`TAGS`, `TIME_ESTIMATE`, `UF_*`. \u041E\u0442\u0432\u0435\u0442 \u0442\u0430\u043A\u0436\u0435 \u043F\u043E\u0434\u043A\u043B\u0430\u0434\u044B\u0432\u0430\u0435\u0442 \u043E\u0431\u044A\u0435\u043A\u0442\u044B `group`, `responsible`, `creator`, `action`.\n\n\u0421\u0442\u0430\u0442\u0443\u0441\u044B \u0437\u0430\u0434\u0430\u0447\u0438 (`STATUS`): `1` \u041D\u043E\u0432\u0430\u044F \xB7 `2` \u0416\u0434\u0451\u0442 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \xB7 `3` \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \xB7 `4` \u0416\u0434\u0451\u0442 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044F \xB7\n`5` \u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430 \xB7 `6` \u041E\u0442\u043B\u043E\u0436\u0435\u043D\u0430 \xB7 `7` \u041E\u0442\u043A\u043B\u043E\u043D\u0435\u043D\u0430.\n\n**\u0413\u0440\u0443\u043F\u043F\u0430/\u043F\u0440\u043E\u0435\u043A\u0442 \u2014 \u0441\u043F\u0438\u0441\u043E\u043A** (`workgroup.list`, camelCase \u0432 \u043E\u0442\u0432\u0435\u0442\u0435): `ID`, `NAME`, `DESCRIPTION`,\n`NUMBER_OF_MEMBERS`, `OWNER_ID`, `DATE_CREATE`, `PROJECT` (Y/N), `TYPE`.\n**\u0413\u0440\u0443\u043F\u043F\u0430 \u2014 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430** (`workgroup.get`): \u043F\u043B\u044E\u0441 `OWNER_DATA`, `SUBJECT_DATA`, `MEMBERS[]`,\n`MODERATOR_MEMBERS[]`, `CHAT_ID`, `DIALOG_ID`, `IMAGE_ID`, UF-\u043F\u043E\u043B\u044F.\n\n**\u041D\u0435\u0434\u0430\u0432\u043D\u0438\u0439 \u0447\u0430\u0442** (`im.recent.list`): `chat_id`, `title`, `type`, `message{id,text,date,author_id}`,\n`last_id`, `unread`, `pinned`, `user{\u2026}`, `chat{\u2026}`.\n**\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435** (`im.v2.Chat.Message.list`): `id`, `chatId`, `authorId`, `date`, `text`, `params`, `viewed`.\n\u041E\u0442\u0432\u0435\u0442 \u0442\u0430\u043A\u0436\u0435 \u043D\u0435\u0441\u0451\u0442 `users[]` (\u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0438), `additionalMessages[]`, `hasPrevPage`/`hasNextPage`.\n\n---\n\n## 6. \u041F\u0440\u0438\u043C\u0435\u0440\u044B \u0442\u043E\u0447\u043D\u044B\u0445 \u0432\u044B\u0431\u043E\u0440\u043E\u043A\n\n```jsonc\n// \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0433\u043E 55, \u043F\u043E \u0434\u0435\u0434\u043B\u0430\u0439\u043D\u0443, \u0432\u0442\u043E\u0440\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430\nbitrix_tasks_list { "params": { "filter": {"RESPONSIBLE_ID":55,"REAL_STATUS":2},\n "order": {"DEADLINE":"asc"}, "start": 50 } }\n\n// \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u043D\u044B\u043C \u043D\u0430\u0431\u043E\u0440\u043E\u043C \u043F\u043E\u043B\u0435\u0439\nbitrix_task_get { "taskId": 4229, "params": { "select": ["ID","TITLE","DESCRIPTION","TAGS","TIME_ESTIMATE"] } }\n\n// \u043F\u0440\u043E\u0435\u043A\u0442\u044B, \u043E\u0442\u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u043F\u043E \u0434\u0430\u0442\u0435 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F\nbitrix_projects_list { "params": { "order": {"DATE_CREATE":"desc"} } }\n\n// \u043F\u043E\u043B\u043D\u0430\u044F \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0433\u0440\u0443\u043F\u043F\u044B\nbitrix_project_get { "groupId": 15 }\n\n// \u0433\u043B\u0443\u0431\u0436\u0435 \u0432 \u0438\u0441\u0442\u043E\u0440\u0438\u044E \u0447\u0430\u0442\u0430\nbitrix_chat_messages { "chatId": 485, "limit": 50, "beforeId": 1936695 }\n```\n\n---\n\n## 7. \u041A\u0430\u043A \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044C (\u043D\u043E\u0432\u044B\u0439 \u0434\u043E\u043C\u0435\u043D: \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C, \u0434\u0438\u0441\u043A, CRM, \u2026)\n\n1. \u0421\u043D\u0438\u043C\u0438 \u0440\u0435\u0430\u043B\u044C\u043D\u044B\u0435 \u0432\u044B\u0437\u043E\u0432\u044B (`docs/reconnaissance.md` \u2014 \u0430\u0432\u0442\u043E-\u0437\u0430\u043F\u0438\u0441\u044C `bun run capture` \u0438\u043B\u0438 HAR).\n2. \u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0438 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 \u0438 \u0444\u043E\u0440\u043C\u0443 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u043F\u043E \u0440\u0430\u0437\u0434\u0435\u043B\u0443 3 (\u0441\u0432\u0435\u0440\u044C\u0441\u044F \u0441 `sampleParams` \u0438\u0437 \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A\u0430).\n3. \u0414\u043E\u0431\u0430\u0432\u044C \u0437\u0430\u043F\u0438\u0441\u044C \u0432 `actions.json` (\u0442\u043E\u043B\u044C\u043A\u043E read-only). \u041F\u0440\u043E\u0432\u0435\u0440\u044C \u0447\u0435\u0440\u0435\u0437 `bitrix_call { name, params }`.\n4. \u0415\u0441\u043B\u0438 \u0443\u0434\u043E\u0431\u043D\u043E \u2014 \u043E\u0431\u0435\u0440\u043D\u0438 \u0432 \u0442\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u0432 `src/tools/register.ts` (\u0441 \u0434\u0435\u0444\u043E\u043B\u0442\u043D\u044B\u043C `select`).\n\n> `actions.json` \u2014 \u0434\u0430\u043D\u043D\u044B\u0435 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0433\u043E \u043F\u043E\u0440\u0442\u0430\u043B\u0430 (gitignored). \u042D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B (`api-notes.md`) \u2014 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u043C\u044B\u0435\n> \u0437\u043D\u0430\u043D\u0438\u044F \u043E \u0441\u0430\u043C\u043E\u043C API; \u0434\u0435\u0440\u0436\u0438 \u0435\u0433\u043E \u0432 \u0430\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u043E\u043C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0438 \u043F\u0440\u0438 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0438 \u043D\u043E\u0432\u044B\u0445 \u043C\u0435\u0442\u043E\u0434\u043E\u0432.\n' : load();
|
|
25299
|
+
var HELP = '# Bitrix24 API notes (reverse-engineered)\n\n\u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A \u043F\u043E \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u043C\u0443 API Bitrix24, \u0434\u043E\u0431\u044B\u0442\u044B\u0439 **\u0436\u0438\u0432\u044B\u043C \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C** (\u0443 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 ajax-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u043E\u0432\n\u043D\u0435\u0442 \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u043E\u0439 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0438). \u041F\u0440\u0435\u0434\u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D \u0434\u043B\u044F \u043B\u044E\u0431\u043E\u0433\u043E \u0418\u0418-\u0430\u0433\u0435\u043D\u0442\u0430 \u0438\u043B\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0432\u044B\u0437\u044B\u0432\u0430\u0435\u0442\n\u044D\u0442\u0438 \u043C\u0435\u0442\u043E\u0434\u044B \u0447\u0435\u0440\u0435\u0437 \u043C\u043E\u0441\u0442 (`bitrix_call` / \u0442\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B) \u0438\u043B\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044F\u0435\u0442 \u043A\u0430\u0442\u0430\u043B\u043E\u0433.\n\n\u041D\u0430\u0431\u043B\u044E\u0434\u0435\u043D\u0438\u044F \u0441\u043D\u044F\u0442\u044B \u043D\u0430 \u043F\u043E\u0440\u0442\u0430\u043B\u0435 `example.bitrix24.ru` (\u043E\u0431\u043B\u0430\u043A\u043E, \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 **im.v2**, \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435\n**scrum-\u0431\u043E\u0440\u0434\u0430**). \u0418\u043C\u0435\u043D\u0430 \u043F\u043E\u043B\u0435\u0439 \u0438 \u043A\u043E\u043D\u0432\u0435\u043D\u0446\u0438\u0438 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B \u0434\u043B\u044F \u043E\u0431\u043B\u0430\u0447\u043D\u043E\u0433\u043E Bitrix24, \u043D\u043E \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0435 \u043D\u0430 \u0434\u0440\u0443\u0433\u043E\u0439\n\u043F\u043E\u0440\u0442\u0430\u043B \u0441\u0432\u0435\u0440\u044F\u0439\u0441\u044F \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C (`docs/reconnaissance.md`).\n\n---\n\n## 1. \u041A\u0430\u043A \u0432\u044B\u0437\u044B\u0432\u0430\u0442\u044C\n\n- **`bitrix_call { name, params }`** \u2014 \u0443\u043D\u0438\u0432\u0435\u0440\u0441\u0430\u043B\u044C\u043D\u044B\u0439 \u0432\u044B\u0437\u043E\u0432 \u043B\u044E\u0431\u043E\u0433\u043E \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043D\u043D\u043E\u0433\u043E \u0438\u043C\u0435\u043D\u0438 \u0438\u0437 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430\n (`actions.json`). `params` \u2014 \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 Bitrix (\u0441\u043C. \u0440\u0430\u0437\u0434\u0435\u043B 3). \u041A\u0430\u0442\u0430\u043B\u043E\u0433 \u043C\u043E\u0436\u0435\u0442 \u0432\u043A\u043B\u044E\u0447\u0430\u0442\u044C\n \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0435 \u0432\u044B\u0437\u043E\u0432\u044B; allowlist (`actions.json`) \u2014 \u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\u043D\u043D\u0430\u044F \u0433\u0440\u0430\u043D\u0438\u0446\u0430, \u043D\u0435 \u0440\u0435\u0436\u0438\u043C \u0447\u0442\u0435\u043D\u0438\u044F.\n- **\u0422\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B** \u2014 \u043E\u0431\u0451\u0440\u0442\u043A\u0438 \u0441 \u0440\u0430\u0437\u0443\u043C\u043D\u044B\u043C\u0438 \u0434\u0435\u0444\u043E\u043B\u0442\u0430\u043C\u0438 \u043D\u0430\u0434 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u043E\u043C. \u0422\u043E\u0447\u043D\u0430\u044F \u0432\u044B\u0431\u043E\u0440\u043A\u0430 \u2014 \u0447\u0435\u0440\u0435\u0437\n \u043E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0439 `params`, \u043E\u043D \u043C\u0435\u0440\u0436\u0438\u0442\u0441\u044F **\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u043C** \u0438 \u043F\u0435\u0440\u0435\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u0434\u0435\u0444\u043E\u043B\u0442\u044B. \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044E\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0442\u0435,\n \u0447\u044C\u0451 \u0438\u043C\u044F \u0435\u0441\u0442\u044C \u0432 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0435 (`actions.json`); \u0438\u043D\u0430\u0447\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u0435\u0442\u0441\u044F. \u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u043D\u0430\u0431\u043E\u0440:\n - \u0417\u0430\u0434\u0430\u0447\u0438: `bitrix_tasks_list`, `bitrix_task_get`, `bitrix_task_get_v2` (v2/JSON),\n `bitrix_task_scrum_info`, `bitrix_task_files`, `bitrix_task_views_count`,\n `bitrix_task_subtasks` (\u043F\u043E\u0434\u0437\u0430\u0434\u0430\u0447\u0438), `bitrix_task_related` (\u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435).\n - \u041F\u0440\u043E\u0435\u043A\u0442\u044B: `bitrix_projects_list`, `bitrix_project_get`.\n - \u0427\u0430\u0442\u044B: `bitrix_chats_recent`, `bitrix_recent_load` (\u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u043F\u043E \u0441\u0435\u043A\u0446\u0438\u0438 \u2014 \u0432 \u0442.\u0447. `tasksTask` =\n \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447), `bitrix_recent_tail` (\u043B\u0438\u0441\u0442\u0430\u0442\u044C \u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u0432\u0433\u043B\u0443\u0431\u044C), `bitrix_chat_load` (\u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043F\u043E\n `dialogId`/`chatId`), `bitrix_chat_messages`, `bitrix_chat_history` (\u043B\u0438\u0441\u0442\u0430\u0442\u044C \u0432\u0433\u043B\u0443\u0431\u044C \u043F\u043E `beforeId`),\n `bitrix_chat_get_dialog_id` (dialogId \u043F\u043E externalId), `bitrix_chat_mark_read` (\u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439),\n `bitrix_chat_read_all` (\u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439).\n - \u041B\u044E\u0434\u0438/\u043F\u043E\u0438\u0441\u043A: `bitrix_user_get` (\u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u044E\u0437\u0435\u0440\u0430), `bitrix_entity_selector` (\u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0441\u0435\u043B\u0435\u043A\u0442\u043E\u0440\u0430),\n `bitrix_entity_search` (\u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u043F\u043E\u0438\u0441\u043A \u0447\u0430\u0442\u043E\u0432/\u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 `ui.entityselector.doSearch`).\n\n \u041B\u044E\u0431\u043E\u0435 \u0438\u043C\u044F \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u0438 \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E \u0447\u0435\u0440\u0435\u0437 `bitrix_call { name, params }`.\n- **`bitrix_help`** \u2014 \u044D\u0442\u043E\u0442 \u0436\u0435 \u0433\u0430\u0439\u0434, \u043E\u0442\u0434\u0430\u0451\u0442\u0441\u044F \u0447\u0435\u0440\u0435\u0437 MCP (\u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 + resource `bitrix://api-notes`).\n \u0418\u0441\u0442\u043E\u0447\u043D\u0438\u043A \u2014 **\u044D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B** (`docs/api-notes.md`).\n\n\u041F\u043E\u043B\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A \u0438\u043C\u0451\u043D \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u043E\u0442\u0434\u0430\u0451\u0442 `bitrix_call` \u0432 \u0441\u0432\u043E\u0451\u043C \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0438 (`deps.catalog.names()`).\n\n---\n\n## 2. \u0424\u043E\u0440\u043C\u0430\u0442 \u043E\u0442\u0432\u0435\u0442\u0430 (\u0432\u0430\u0436\u043D\u043E!)\n\nAjax-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u044B (`/bitrix/services/main/ajax.php`) \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0442 HTTP 200 \u0441 \u043A\u043E\u043D\u0432\u0435\u0440\u0442\u043E\u043C:\n\n```jsonc\n{ "status": "success" | "error",\n "data": { ... },\n "errors": [] } // \u041F\u0423\u0421\u0422\u041E\u0419 \u043C\u0430\u0441\u0441\u0438\u0432 \u043F\u0440\u0438 \u0443\u0441\u043F\u0435\u0445\u0435! (\u0432 JS [] \u2014 truthy)\n```\n\n- \u0423\u0441\u043F\u0435\u0445 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442\u0441\u044F `status:"success"` \u0438/\u0438\u043B\u0438 **\u043F\u0443\u0441\u0442\u044B\u043C** `errors`. \u041D\u0435\u043F\u0443\u0441\u0442\u043E\u0439 `errors` / `status:"error"` /\n top-level `error` \u2014 \u0440\u0435\u0430\u043B\u044C\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430 (\u043C\u043E\u0441\u0442 \u043C\u0430\u043F\u043F\u0438\u0442 \u044D\u0442\u043E \u0432 `ok:false`).\n- REST-\u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u044B (`/rest/*.json`) \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0442 \u0438\u043D\u0430\u0447\u0435: `{ "result": \u2026, "next", "total", "time" }` \u2014 \u0431\u0435\u0437 `errors`.\n\n---\n\n## 3. \u0422\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442: form vs json (\u0440\u0430\u0437\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043F\u043E \u043C\u0435\u0442\u043E\u0434\u0443!)\n\n\u0423 \u043A\u0430\u0436\u0434\u043E\u0439 \u0437\u0430\u043F\u0438\u0441\u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0435\u0441\u0442\u044C **`bodyType`** \u2014 \u043A\u0430\u043A \u043C\u043E\u0441\u0442 \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u043B\u043E:\n\n- **`bodyType: "form"`** (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E) \u2014 `application/x-www-form-urlencoded`; \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E\u0441\u0442\u044C \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044F\n PHP-\u0441\u0442\u0438\u043B\u0435\u043C (`filter[STATUS]=2`, `select[0]=ID`). \u041E\u0431\u044A\u0435\u043A\u0442 \u0432 `params` \u0440\u0435\u043A\u0443\u0440\u0441\u0438\u0432\u043D\u043E \u0440\u0430\u0437\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0432 \u0442\u0430\u043A\u0438\u0435\n \u043A\u043B\u044E\u0447\u0438. \u041A\u043B\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043A\u0438\u0435 `tasks.task.*`, \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 `im.v2.*`, REST \u2014 \u0432\u0441\u0451 \u044D\u0442\u043E \u0444\u043E\u0440\u043C\u0430.\n- **`bodyType: "json"`** \u2014 \u0442\u0435\u043B\u043E \u0443\u0445\u043E\u0434\u0438\u0442 \u043A\u0430\u043A `JSON.stringify(params)` \u0441 `Content-Type: application/json`.\n \u0422\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 **`tasks.v2.*`** (\u043D\u0430\u043F\u0440. `tasks.v2.Task.get` \u0436\u0434\u0451\u0442 `{"task":{"id":N}}`) \u0438 `ui.entityselector.*`.\n `params` \u043F\u0440\u0438 \u044D\u0442\u043E\u043C \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0435\u0442 \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u0443\u044E \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0443 \u043A\u0430\u043A \u0435\u0441\u0442\u044C (\u043D\u0435 \u0440\u0430\u0437\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0432 bracket-\u043A\u043B\u044E\u0447\u0438).\n\n> \u0418\u0441\u0442\u043E\u0440\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u0437\u0430\u043C\u0435\u0442\u043A\u0430: \u0440\u0430\u043D\u044C\u0448\u0435 \u043C\u043E\u0441\u0442 \u0443\u043C\u0435\u043B \u0442\u043E\u043B\u044C\u043A\u043E \u0444\u043E\u0440\u043C\u0443, \u0438 `tasks.v2.*` \u0431\u044B\u043B\u0438 \u043D\u0435\u043F\u0440\u0438\u0433\u043E\u0434\u043D\u044B. \u0422\u0435\u043F\u0435\u0440\u044C\n> \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0430\u043D\u044B \u2014 \u0432 \u0437\u0430\u043F\u0438\u0441\u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0441\u0442\u0430\u0432\u044C `"bodyType": "json"`, \u0438 \u043C\u043E\u0441\u0442 \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442 \u0438\u0445 \u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u043E.\n\n**CSRF / sessid:** \u043C\u043E\u0441\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0448\u043B\u0451\u0442 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A **`X-Bitrix-Csrf-Token: <sessid>`** (\u0441\u0432\u0435\u0436\u0438\u0439\n`BX.bitrix_sessid()`). Form-\u0442\u0435\u043B\u0430 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043D\u0435\u0441\u0443\u0442 `sessid` \u043F\u043E\u043B\u0435\u043C \u0432 \u0442\u0435\u043B\u0435 (legacy REST \u044D\u0442\u043E \u0442\u0440\u0435\u0431\u0443\u0435\u0442);\nJSON-\u0442\u0435\u043B\u0430 \u043D\u0435\u0441\u0443\u0442 sessid **\u0442\u043E\u043B\u044C\u043A\u043E** \u0432 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0435. \u041E\u0442\u0432\u0435\u0442 `invalid_csrf`/`invalid_authentication` = \u0441\u0435\u0441\u0441\u0438\u044F\n\u043F\u0440\u043E\u0442\u0443\u0445\u043B\u0430 (\u043F\u0435\u0440\u0435\u043B\u043E\u0433\u0438\u043D\u044C\u0441\u044F \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435).\n\n| \u041C\u0435\u0442\u043E\u0434 (action / endpoint) | bodyType | \u0413\u0434\u0435 `select`/`filter`/`order` | \u041F\u0430\u0433\u0438\u043D\u0430\u0446\u0438\u044F |\n|---|---|---|---|\n| `tasks.task.list` | form | **\u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C**: `select[]`, `filter{}`, `order{}` | `start` (\u0441\u0434\u0432\u0438\u0433, \u0448\u0430\u0433 50) |\n| `tasks.task.get` | form | \u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C: `taskId`, `select[]` | \u2014 |\n| `tasks.v2.Task.get` | **json** | `{"task": {"id": N}}` | \u2014 |\n| `tasks.v2.Scrum.getTaskInfo` | **json** | `{"taskId": N}` | \u2014 |\n| `tasks.v2.File.listObjects` | **json** | `{"ids": [N,\u2026]}` | \u2014 |\n| `tasks.v2.Task.View.User.count` | **json** | `{"task": {"id": N}}` | \u2014 |\n| `tasks.v2.Task.Relation.Child.list` | **json** | `{"taskId": N, "withIds":true, "navigation":{"size":N}}` | `navigation` |\n| `tasks.v2.Task.Relation.Related.list` | **json** | `{"taskId": N, \u2026}` (\u043A\u0430\u043A Child) | `navigation` |\n| `socialnetwork.api.workgroup.list` | form | **\u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C**: `select[]`, `order{}`, `filter{}` | (nav \u2014 \u043D\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u043E) |\n| `socialnetwork.api.workgroup.get` | form | **\u043E\u0431\u0451\u0440\u043D\u0443\u0442\u043E**: `params[groupId]`, `params[select][]` | \u2014 |\n| `/rest/im.recent.list.json` | form (rest) | \u043F\u043B\u043E\u0441\u043A\u043E: `LIMIT`, `SKIP_OPENLINES`, `UNREAD_ONLY`, \u2026 | `LIMIT` |\n| `/rest/im.user.get.json` | form (rest) | \u043F\u043B\u043E\u0441\u043A\u043E: `ID` | \u2014 |\n| `im.v2.Recent.load` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `limit`, `filter[recentSection]`, `filter[unread]`, `filter[parentId]` | `im.v2.Recent.tail` |\n| `im.v2.Recent.tail` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `limit`, `filter[lastMessageDate]` (\u043A\u0443\u0440\u0441\u043E\u0440), `filter[recentSection]` | `filter[lastMessageDate]` |\n| `im.v2.Chat.load` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `dialogId`\\|`chatId`, `messageLimit` | \u2014 |\n| `im.v2.Chat.getDialogId` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `externalId` | \u2014 |\n| `im.v2.Chat.Message.list` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `limit` | \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u044F\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u2014 \u043D\u0430\u0437\u0430\u0434 **\u043D\u0435 \u043B\u0438\u0441\u0442\u0430\u0435\u0442**, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 `.tail` |\n| `im.v2.Chat.Message.tail` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `limit`, `filter[lastId]`, `order[id]` | **\u0441\u043C. \u0440\u0430\u0437\u0434\u0435\u043B 6** |\n| `im.v2.Chat.Message.read` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `ids[]`, `actionUuid` | \u2014 (\u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439) |\n| `im.v2.Chat.readAll` | form | \u0431\u0435\u0437 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 | \u2014 (\u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439) |\n| `ui.entityselector.load` | **json** | `{"dialog": {entities,preselectedItems,\u2026}}` | \u2014 |\n| `ui.entityselector.doSearch` | **json** | `{"dialog": {\u2026}, "searchQuery": {"query": "...", "queryWords": ["..."]}}` | \u2014 |\n\n---\n\n## 4. \u041A\u0430\u0442\u0430\u043B\u043E\u0433: \u0438\u043C\u044F \u2192 action \u2192 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B\n\n| \u0418\u043C\u044F (`actions.json`) | action / endpoint | bodyType | \u041A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 params |\n|---|---|---|---|\n| `tasks.list` | `tasks.task.list` | form | `filter{RESPONSIBLE_ID,REAL_STATUS,GROUP_ID,\u2026}`, `select[]`, `order{}`, `start` |\n| `task.get` | `tasks.task.get` | form | `taskId`, `select[]` |\n| `task.v2.get` | `tasks.v2.Task.get` | json | `task.id` (id \u0437\u0430\u0434\u0430\u0447\u0438) |\n| `task.scrum.info` | `tasks.v2.Scrum.getTaskInfo` | json | `taskId` |\n| `task.files` | `tasks.v2.File.listObjects` | json | `ids` (\u043C\u0430\u0441\u0441\u0438\u0432 id) |\n| `task.views.count` | `tasks.v2.Task.View.User.count` | json | `task.id` (id \u0437\u0430\u0434\u0430\u0447\u0438) |\n| `task.subtasks` | `tasks.v2.Task.Relation.Child.list` | json | `taskId`, `navigation{size}` |\n| `task.related` | `tasks.v2.Task.Relation.Related.list` | json | `taskId`, `navigation{size}` |\n| `projects.list` | `socialnetwork.api.workgroup.list` | form | `select[]`, `order{}`, `filter{}` |\n| `projects.get` | `socialnetwork.api.workgroup.get` | form | `params[groupId]`, `params[select][]` |\n| `chats.recent` | `/rest/im.recent.list.json` | form | `LIMIT`, `UNREAD_ONLY`, `SKIP_OPENLINES` |\n| `recent.load` | `im.v2.Recent.load` | form | `filter[recentSection]` (`tasksTask`/`collab`/\u2026), `limit`, `filter[unread]` |\n| `recent.tail` | `im.v2.Recent.tail` | form | `filter[lastMessageDate]`, `filter[recentSection]`, `limit` |\n| `chat.load` | `im.v2.Chat.load` | form | `dialogId`\\|`chatId`, `messageLimit` |\n| `chat.dialogId` | `im.v2.Chat.getDialogId` | form | `externalId` (\u043D\u0430\u043F\u0440. `"sg"+groupId`) |\n| `chat.messages` | `im.v2.Chat.Message.list` | form | `chatId`, `limit` (\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435; \u0432\u0433\u043B\u0443\u0431\u044C \u2014 `chat.messages.tail`) |\n| `chat.messages.tail` | `im.v2.Chat.Message.tail` | form | `chatId`, `filter[lastId]`, `order[id]`, `limit` |\n| `chat.message.read` | `im.v2.Chat.Message.read` | form | `chatId`, `ids[0]`, `actionUuid` |\n| `chat.read.all` | `im.v2.Chat.readAll` | form | \u2014 (\u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439) |\n| `im.user.get` | `/rest/im.user.get.json` | form | `ID` |\n| `entityselector.load` | `ui.entityselector.load` | json | `dialog` (\u043E\u0431\u044A\u0435\u043A\u0442) |\n| `entityselector.search` | `ui.entityselector.doSearch` | json | `dialog`, `searchQuery{query,queryWords}` |\n\n---\n\n## 5. \u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A \u043F\u043E\u043B\u0435\u0439\n\n**\u0417\u0430\u0434\u0430\u0447\u0430** (`tasks.task.*`): `ID`, `TITLE`, `DESCRIPTION`, `STATUS`, `REAL_STATUS`, `RESPONSIBLE_ID`,\n`CREATED_BY`, `CREATED_DATE`, `CHANGED_DATE`, `DEADLINE`, `CLOSED_DATE`, `PRIORITY`, `GROUP_ID`,\n`TAGS`, `TIME_ESTIMATE`, `UF_*`. \u041E\u0442\u0432\u0435\u0442 \u0442\u0430\u043A\u0436\u0435 \u043F\u043E\u0434\u043A\u043B\u0430\u0434\u044B\u0432\u0430\u0435\u0442 \u043E\u0431\u044A\u0435\u043A\u0442\u044B `group`, `responsible`, `creator`, `action`.\n\n\u0421\u0442\u0430\u0442\u0443\u0441\u044B \u0437\u0430\u0434\u0430\u0447\u0438 (`STATUS`): `1` \u041D\u043E\u0432\u0430\u044F \xB7 `2` \u0416\u0434\u0451\u0442 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \xB7 `3` \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \xB7 `4` \u0416\u0434\u0451\u0442 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044F \xB7\n`5` \u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430 \xB7 `6` \u041E\u0442\u043B\u043E\u0436\u0435\u043D\u0430 \xB7 `7` \u041E\u0442\u043A\u043B\u043E\u043D\u0435\u043D\u0430.\n\n**\u0417\u0430\u0434\u0430\u0447\u0430 v2** (`tasks.v2.*`): id \u0437\u0430\u0434\u0430\u0447\u0438 \u043F\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044F \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E \u2014 **`{"task": {"id": N}}`** (\u0443 `Task.get` \u0438\n`Task.View.User.count`), \u0430 \u0443 `Scrum.getTaskInfo` \u0438 `Relation.*` \u2014 \u043F\u043B\u043E\u0441\u043A\u043E `{"taskId": N}`. \u042D\u0442\u043E \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u0430\u044F\n\u043F\u043E\u0434\u0441\u0438\u0441\u0442\u0435\u043C\u0430 scrum-\u0431\u043E\u0440\u0434\u0430; \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0443 \u043E\u0442\u0432\u0435\u0442\u0430 \u0441\u0432\u0435\u0440\u044C \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C \u2014 \u0432 \u0437\u0430\u0445\u0432\u0430\u0442\u0435 \u0432\u0438\u0434\u043D\u044B \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0437\u0430\u043F\u0440\u043E\u0441\u0430.\n\n**\u0413\u0440\u0443\u043F\u043F\u0430/\u043F\u0440\u043E\u0435\u043A\u0442 \u2014 \u0441\u043F\u0438\u0441\u043E\u043A** (`workgroup.list`, camelCase \u0432 \u043E\u0442\u0432\u0435\u0442\u0435): `ID`, `NAME`, `DESCRIPTION`,\n`NUMBER_OF_MEMBERS`, `OWNER_ID`, `DATE_CREATE`, `PROJECT` (Y/N), `TYPE`.\n**\u0413\u0440\u0443\u043F\u043F\u0430 \u2014 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430** (`workgroup.get`): \u043F\u043B\u044E\u0441 `OWNER_DATA`, `SUBJECT_DATA`, `MEMBERS[]`,\n`MODERATOR_MEMBERS[]`, `CHAT_ID`, `DIALOG_ID`, `IMAGE_ID`, UF-\u043F\u043E\u043B\u044F.\n\n**\u041D\u0435\u0434\u0430\u0432\u043D\u0438\u0439 \u0447\u0430\u0442** (`im.recent.list`): `chat_id`, `title`, `type`, `message{id,text,date,author_id}`,\n`last_id`, `unread`, `pinned`, `user{\u2026}`, `chat{\u2026}`.\n**\u041D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u043F\u043E \u0441\u0435\u043A\u0446\u0438\u0438** (`im.v2.Recent.load`): \u0444\u0438\u043B\u044C\u0442\u0440 `filter[recentSection]` \u2014 `default` (\u043E\u0431\u044B\u0447\u043D\u044B\u0435\n\u0434\u0438\u0430\u043B\u043E\u0433\u0438), **`tasksTask` (\u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447)**, `collab`/`collabDefault` (\u043A\u043E\u043B\u043B\u0430\u0431\u044B). \u041B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u0432\u0433\u043B\u0443\u0431\u044C \u2014\n`im.v2.Recent.tail` \u0441 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u043C `filter[lastMessageDate]` (ISO-\u0434\u0430\u0442\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B).\n**\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u044E\u0437\u0435\u0440\u0430** (`im.user.get`): `id`, `name`, `first_name`, `last_name`, `avatar`, `work_position`,\n`gender`, `status`, `online` \u2014 \u0440\u0435\u0437\u043E\u043B\u0432 \u0430\u0432\u0442\u043E\u0440\u0430 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F (`authorId`) \u0432 \u0438\u043C\u044F.\n**\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435** (`im.v2.Chat.Message.*`): `id`, `chatId`, `authorId`, `date`, `text`, `params`, `viewed`.\n\u041E\u0442\u0432\u0435\u0442 \u0442\u0430\u043A\u0436\u0435 \u043D\u0435\u0441\u0451\u0442 `users[]` (\u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0438), `additionalMessages[]`, `hasPrevPage`/`hasNextPage`.\n`chatId` \u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 `im.recent.list` (`chat_id`) \u0438\u043B\u0438 \u0438\u0437 `workgroup.get` (`CHAT_ID`/`DIALOG_ID`).\n\n**\u0410\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044F \u0447\u0430\u0442\u0430 (`chat.load`): `dialogId` vs `chatId`.** `chat.load` \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442 \u043B\u044E\u0431\u043E\u0439 \u0438\u0437 \u0434\u0432\u0443\u0445:\n- `dialogId` = **ID \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F** (\u0447\u0438\u0441\u043B\u043E, \u043D\u0430\u043F\u0440. `11`) \u2192 **\u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 1-\u043D\u0430-1** \u0441 \u044D\u0442\u0438\u043C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C.\n- `dialogId` = **`"chat"+CHAT_ID`** (\u043D\u0430\u043F\u0440. `"chat7111"`) \u2192 **\u0433\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439 \u0447\u0430\u0442** (\u043F\u0440\u043E\u0435\u043A\u0442\u0430/\u0437\u0430\u0434\u0430\u0447\u0438/\u043A\u0430\u043D\u0430\u043B\u0430).\n- `chatId` = \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 `CHAT_ID` \u2014 \u0442\u043E \u0436\u0435, \u0447\u0442\u043E \u0433\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439 `dialogId`, \u043D\u043E \u0431\u0435\u0437 \u043F\u0440\u0435\u0444\u0438\u043A\u0441\u0430.\n\n\u041E\u0442\u0432\u0435\u0442 `chat.load` \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 `chatId` \u2014 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 \u0435\u0433\u043E \u0434\u0430\u043B\u044C\u0448\u0435 \u0434\u043B\u044F `chat.messages` /\n`chat.messages.tail` (\u043B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u0432\u0433\u043B\u0443\u0431\u044C) \u0438 `chat.message.read` (\u044D\u0442\u0438 \u0442\u0440\u0438 \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 \u043F\u043E `chatId`, \u043D\u0435 \u043F\u043E `dialogId`).\n\n---\n\n## 6. \u041F\u0440\u0438\u043C\u0435\u0440\u044B \u0432\u044B\u0437\u043E\u0432\u043E\u0432\n\n```jsonc\n// \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0433\u043E 55, \u043F\u043E \u0434\u0435\u0434\u043B\u0430\u0439\u043D\u0443, \u0432\u0442\u043E\u0440\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430\nbitrix_tasks_list { "params": { "filter": {"RESPONSIBLE_ID":55,"REAL_STATUS":2},\n "order": {"DEADLINE":"asc"}, "start": 50 } }\n\n// \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u043D\u044B\u043C \u043D\u0430\u0431\u043E\u0440\u043E\u043C \u043F\u043E\u043B\u0435\u0439\nbitrix_task_get { "taskId": 4229, "params": { "select": ["ID","TITLE","DESCRIPTION","TAGS","TIME_ESTIMATE"] } }\n\n// \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 v2-\u043F\u043E\u0434\u0441\u0438\u0441\u0442\u0435\u043C\u0443 (JSON-\u0442\u0435\u043B\u043E; id \u0432\u043B\u043E\u0436\u0435\u043D \u0432 task)\nbitrix_task_get_v2 { "taskId": 4229 } // \u2192 { "task": { "id": 4229 } }\nbitrix_call { "name": "task.v2.get", "params": { "task": { "id": 4229 } } }\n\n// \u0444\u0430\u0439\u043B\u044B \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043A \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u043E\u0432 (v2, JSON-\u0442\u0435\u043B\u043E); \u043F\u043E\u0434\u0437\u0430\u0434\u0430\u0447\u0438/\u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435\nbitrix_call { "name": "task.files", "params": { "ids": [4229] } }\nbitrix_call { "name": "task.views.count", "params": { "task": { "id": 4229 } } }\nbitrix_task_subtasks { "taskId": 4229 }\nbitrix_task_related { "taskId": 4229 }\n\n// \u043F\u0440\u043E\u0435\u043A\u0442\u044B \u043F\u043E \u0434\u0430\u0442\u0435 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F; \u043F\u043E\u043B\u043D\u0430\u044F \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0433\u0440\u0443\u043F\u043F\u044B\nbitrix_projects_list { "params": { "order": {"DATE_CREATE":"desc"} } }\nbitrix_project_get { "groupId": 15 }\n\n// \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0447\u0430\u0442 (\u043F\u0435\u0440\u0432\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F)\nbitrix_chat_load { "chatId": 485, "messageLimit": 50 }\n\n// \u041B\u0418\u0421\u0422\u0410\u041D\u0418\u0415 \u0418\u0421\u0422\u041E\u0420\u0418\u0418 \u0412\u0413\u041B\u0423\u0411\u042C (\u0441\u0442\u0430\u0440\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F): beforeId = \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 id \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\n// \u0438\u0437 \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B. \u041F\u043E\u0432\u0442\u043E\u0440\u044F\u0439, \u0443\u043C\u0435\u043D\u044C\u0448\u0430\u044F beforeId, \u0434\u043E \u043D\u0430\u0447\u0430\u043B\u0430 \u0438\u0441\u0442\u043E\u0440\u0438\u0438 (order DESC \u2014 \u0434\u0435\u0444\u043E\u043B\u0442).\nbitrix_chat_history { "chatId": 485, "beforeId": 1861279 }\n\n// \u043F\u043E\u043C\u0435\u0442\u0438\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u043C\u0438 (\u041C\u0423\u0422\u0418\u0420\u0423\u042E\u0429\u0418\u0419). actionUuid \u0433\u0435\u043D\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.\nbitrix_chat_mark_read { "chatId": 40271, "ids": [1884131] }\n```\n\n### 6.1. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0439: \u0447\u0430\u0442 \u0441 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u044B\u043C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C\n\n\u041B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 1-\u043D\u0430-1 \u0430\u0434\u0440\u0435\u0441\u0443\u0435\u0442\u0441\u044F `dialogId` = **ID \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F**. Id \u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 \u0437\u0430\u0434\u0430\u0447\u0438\n(`RESPONSIBLE_ID`/`CREATED_BY`), \u0438\u0437 `bitrix_chats_recent`, \u043B\u0438\u0431\u043E \u0440\u0435\u0437\u043E\u043B\u0432\u0438\u0442\u0441\u044F \u043F\u043E\u0438\u0441\u043A\u043E\u043C (\xA76.3).\n\n```jsonc\n// 1) \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 \u0441 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C 11 \u2192 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 chatId\nbitrix_chat_load { "dialogId": 11 }\n// 2) \u043B\u0438\u0441\u0442\u0430\u0442\u044C \u0435\u0433\u043E \u0438\u0441\u0442\u043E\u0440\u0438\u044E \u0432\u0433\u043B\u0443\u0431\u044C \u043F\u043E chatId \u0438\u0437 \u043E\u0442\u0432\u0435\u0442\u0430 \u0448\u0430\u0433\u0430 1\nbitrix_chat_history { "chatId": 485, "beforeId": 1861279 }\n```\n\n### 6.2. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0439: \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 (\u0447\u0430\u0442) \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438\n\n\u0423 \u043A\u0430\u0436\u0434\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0435\u0441\u0442\u044C \u0441\u0432\u043E\u0439 im-\u0447\u0430\u0442-\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435. \u0414\u0432\u0430 \u043F\u0443\u0442\u0438 \u043D\u0430\u0439\u0442\u0438 \u0435\u0433\u043E `chatId`:\n\n**\u0410. \u0427\u0435\u0440\u0435\u0437 \u0441\u043F\u0438\u0441\u043E\u043A \u0447\u0430\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447 (\u043F\u0440\u044F\u043C\u043E\u0439).** `im.v2.Recent.load` \u0441 \u0441\u0435\u043A\u0446\u0438\u0435\u0439 `tasksTask` \u043E\u0442\u0434\u0430\u0451\u0442 \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447\n(\u0432 `bitrix_chats_recent` / `/rest/im.recent.list` \u0438\u0445 \u041D\u0415\u0422). \u041B\u0438\u0441\u0442\u0430\u0442\u044C \u0432\u0433\u043B\u0443\u0431\u044C \u2014 `bitrix_recent_tail`.\n\n```jsonc\nbitrix_recent_load { "section": "tasksTask" } // \u2192 \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447 \u0441 chatId/dialogId\nbitrix_recent_tail { "section": "tasksTask", "lastMessageDate": "2026-06-29T17:25:38+03:00" }\n// \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u044B\u0439 \u0447\u0430\u0442 \u0438 \u043B\u0438\u0441\u0442\u0430\u0442\u044C \u0438\u0441\u0442\u043E\u0440\u0438\u044E\nbitrix_chat_load { "dialogId": "chat38849" } // \u0438\u043B\u0438 { "chatId": 38849 }\nbitrix_chat_history { "chatId": 38849, "beforeId": 1722353 }\n```\n\n**\u0411. \u041F\u043E\u0438\u0441\u043A\u043E\u043C \u043F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E \u0437\u0430\u0434\u0430\u0447\u0438** \u2014 `bitrix_entity_search` \u0441 \u0441\u0435\u043A\u0446\u0438\u0435\u0439 `tasksTask`:\n\n```jsonc\nbitrix_entity_search { "query": "\u0442\u0440\u0435\u043A\u0435\u0440", "section": "tasksTask" }\n```\n\n**\u0427\u0430\u0442 \u041F\u0420\u041E\u0415\u041A\u0422\u0410 \u0437\u0430\u0434\u0430\u0447\u0438** (\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B, \u043D\u0435 \u0441\u0430\u043C\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438) \u2014 \u0447\u0435\u0440\u0435\u0437 `GROUP_ID`:\n\n```jsonc\nbitrix_task_get { "taskId": 4229, "params": { "select": ["ID","GROUP_ID"] } }\nbitrix_project_get { "groupId": 15 } // \u043E\u0442\u0434\u0430\u0451\u0442 CHAT_ID / DIALOG_ID\nbitrix_chat_load { "dialogId": "chat7111" }\nbitrix_chat_get_dialog_id { "externalId": "sg15" } // \u043B\u0438\u0431\u043E \u0440\u0435\u0437\u043E\u043B\u0432 dialogId \u0441\u043E\u0446\u0433\u0440\u0443\u043F\u043F\u044B \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E\n```\n\n### 6.3. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0439: \u043F\u043E\u0438\u0441\u043A \u0447\u0430\u0442\u0430 / \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\n\n\u0422\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u043F\u043E\u0438\u0441\u043A \u2014 `bitrix_entity_search` (\u043E\u0431\u0451\u0440\u0442\u043A\u0430 \u043D\u0430\u0434 `ui.entityselector.doSearch`): \u0441\u0430\u043C \u0441\u043E\u0431\u0438\u0440\u0430\u0435\u0442\n\u0434\u0438\u0430\u043B\u043E\u0433 `IM_CHAT_SEARCH` \u0438 `searchQuery` \u0438\u0437 \u0441\u0442\u0440\u043E\u043A\u0438:\n\n```jsonc\nbitrix_entity_search { "query": "\u0434\u043C\u0438\u0442\u0440\u0438\u0439" } // \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0447\u0430\u0442\u043E\u0432/\u0434\u0438\u0430\u043B\u043E\u0433\u043E\u0432\nbitrix_entity_search { "query": "\u0442\u0440\u0435\u043A\u0435\u0440", "section": "tasksTask" } // \u0441\u0440\u0435\u0434\u0438 \u0447\u0430\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447\n```\n\n\u0411\u044B\u0441\u0442\u0440\u044B\u0439 \u043F\u0443\u0442\u044C \u0431\u0435\u0437 \u043F\u043E\u0438\u0441\u043A\u0430 \u2014 \u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u0447\u0430\u0442\u044B \u0438 \u0444\u0438\u043B\u044C\u0442\u0440\u0430\u0446\u0438\u044F \u043D\u0430 \u0441\u0442\u043E\u0440\u043E\u043D\u0435 \u0430\u0433\u0435\u043D\u0442\u0430; \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0430\u0432\u0442\u043E\u0440\u0430 \u043F\u043E id:\n\n```jsonc\nbitrix_chats_recent { } // \u0441\u043E\u043F\u043E\u0441\u0442\u0430\u0432\u044C \u043F\u043E title / user\nbitrix_recent_load { "section": "tasksTask" }\nbitrix_user_get { "userId": 11 } // \u0440\u0435\u0437\u043E\u043B\u0432 authorId \u2192 \u0438\u043C\u044F\n```\n\n### 6.4. \u041B\u0435\u0433\u0430\u0441\u0438-\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 (HTML-\u043F\u043E\u0434\u0434\u043E\u043C\u0435\u043D \u2014 \u043F\u043E\u043A\u0430 \u041D\u0415 \u0432 \u043C\u043E\u0441\u0442\u0435)\n\n\u0423 \u0437\u0430\u0434\u0430\u0447 \u0434\u0432\u0430 \u043D\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043C\u044B\u0445 \u0444\u0438\u0434\u0430 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u044F:\n- **im.v2-\u0447\u0430\u0442** \u2014 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u043D\u044B\u0439 JSON, \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044F \u0443\u0436\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 (\xA76.2); \u043E\u0431\u044B\u0447\u043D\u043E \u044D\u0442\u043E\u0433\u043E \u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E.\n- **\u0424\u043E\u0440\u0443\u043C\u043D\u044B\u0435 \u043B\u0435\u0433\u0430\u0441\u0438-\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438** \u2014 \u0440\u0435\u043D\u0434\u0435\u0440\u044F\u0442\u0441\u044F \u043A\u0430\u043A **HTML** \u0432 side-slider\'\u0435. \u042D\u0442\u043E \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0439\n \xABHTML-\u043F\u043E\u0434\u0434\u043E\u043C\u0435\u043D\xBB \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u0433\u043E API, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 **\u0442\u0435\u043A\u0443\u0449\u0438\u0439 \u043C\u043E\u0441\u0442 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442** (\u0431\u043B\u043E\u043A\u0435\u0440\u044B \u043D\u0438\u0436\u0435).\n\n**\u041A\u0430\u043A \u0433\u0440\u0443\u0437\u044F\u0442\u0441\u044F (\u0440\u0435\u0432\u0435\u0440\u0441).** \u041F\u0435\u0440\u0432\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u2014 GET HTML-\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B iframe (\u0441\u0435\u0440\u0432\u0435\u0440 \u0442\u0443\u0442 \u0436\u0435 \u043C\u0438\u043D\u0442\u0438\u0442 \u043F\u043E\u0434\u043F\u0438\u0441\u044C):\n\n```\nGET /task/comments/<taskId>/?IFRAME=Y&IFRAME_TYPE=SIDE_SLIDER \u2192 HTML (\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 + signedParameters)\n```\n\n\u041B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u2014 POST \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043D\u043E\u0433\u043E ajax (\u0444\u043E\u0440\u043C\u0430, \u043E\u0442\u0434\u0430\u0451\u0442 HTML-\u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442):\n\n```\nPOST /bitrix/services/main/ajax.php?mode=class&c=bitrix:forum.comments&action=navigateComment\nform: AJAX_POST=Y, ENTITY_XML_ID=TASK_<taskId>, taskId=<taskId>, MODE=LIST,\n FILTER[<ID]=<\u043A\u0443\u0440\u0441\u043E\u0440: id, \u0414\u041E \u043A\u043E\u0442\u043E\u0440\u043E\u0433\u043E \u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0441\u0442\u0430\u0440\u044B\u0435>, PAGEN_1=1,\n signedParameters=<\u043F\u043E\u0434\u043F\u0438\u0441\u0430\u043D\u043D\u044B\u0439 blob>, IFRAME=Y, IFRAME_TYPE=SIDE_SLIDER\nheaders: bx-ajax: true, x-bitrix-site-id: s1 (\u043F\u043B\u044E\u0441 \u043E\u0431\u044B\u0447\u043D\u044B\u0439 X-Bitrix-Csrf-Token)\n```\n\n`signedParameters` \u2014 base64 PHP-\u043C\u0430\u0441\u0441\u0438\u0432\u0430 + HMAC-\u043F\u043E\u0434\u043F\u0438\u0441\u044C \u0441\u0435\u0440\u0432\u0435\u0440\u0430; \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442\n`FORUM_ID, ENTITY_TYPE=TK, ENTITY_ID=<taskId>, ENTITY_XML_ID=TASK_<taskId>, \u2026`. **\u041F\u043E\u0434\u0434\u0435\u043B\u0430\u0442\u044C \u043D\u0435\u043B\u044C\u0437\u044F** \u2014\n\u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 HTML \u043F\u0435\u0440\u0432\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B.\n\n**\u041F\u043E\u0447\u0435\u043C\u0443 \u043F\u043E\u043A\u0430 \u043D\u0435 \u0432 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0435 (3 \u0431\u043B\u043E\u043A\u0435\u0440\u0430):**\n1. \u041C\u043E\u0441\u0442 \u043F\u0430\u0440\u0441\u0438\u0442 \u043E\u0442\u0432\u0435\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u0430\u043A JSON (`extension/src/connector.ts` \u2192 `resp.json()`) \u2014 HTML \u0431\u0440\u043E\u0441\u0438\u0442 \u0438\u0441\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435.\n2. Path-\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432 URL (`/task/comments/<taskId>/`) \u2014 \u0437\u0430\u043F\u0438\u0441\u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u043D\u044B, \u0448\u0430\u0431\u043B\u043E\u043D\u043E\u0432 \u043F\u0443\u0442\u0438 \u043D\u0435\u0442.\n3. `signedParameters` + \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0438 `bx-ajax`/`x-bitrix-site-id` \u2014 \u043D\u0443\u0436\u0435\u043D \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 GET HTML-\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B.\n\n**\u0427\u0442\u043E\u0431\u044B \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C** (\u0431\u0443\u0434\u0443\u0449\u0430\u044F \u0440\u0430\u0431\u043E\u0442\u0430): \u043D\u0430\u0443\u0447\u0438\u0442\u044C \u043C\u043E\u0441\u0442 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044C text/HTML \u043F\u0440\u0438 \u043D\u0435-JSON \u043E\u0442\u0432\u0435\u0442\u0435 \u0438\n\u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044C path-\u0448\u0430\u0431\u043B\u043E\u043D \u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u0430; \u0437\u0430\u0442\u0435\u043C \u043E\u0431\u0451\u0440\u0442\u043A\u0430 `bitrix_task_comments { taskId }` (GET \u043F\u0435\u0440\u0432\u043E\u0439\n\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B), \u0430 \u043B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u2014 \u0447\u0435\u0440\u0435\u0437 `navigateComment` \u0441 \u0432\u044B\u043F\u0430\u0440\u0441\u0435\u043D\u043D\u044B\u043C `signedParameters`.\n\n> \u0422\u043E\u0442 \u0436\u0435 HTML-\u043F\u043E\u0434\u0434\u043E\u043C\u0435\u043D: **\u0434\u0435\u0442\u0430\u043B\u0438 \u0437\u0432\u043E\u043D\u043A\u0430** \u2014 `GET /call/detail/<callId>?IFRAME=Y&IFRAME_TYPE=SIDE_SLIDER`\n> (\u043E\u0442\u0434\u0430\u0451\u0442 HTML). \u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438\u044F \u0438\u0434\u0435\u043D\u0442\u0438\u0447\u043D\u044B.\n\n---\n\n## 7. \u041A\u0430\u043A \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044C (\u043D\u043E\u0432\u044B\u0439 \u0434\u043E\u043C\u0435\u043D: \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C, \u0434\u0438\u0441\u043A, CRM, \u2026)\n\n1. \u0421\u043D\u0438\u043C\u0438 \u0440\u0435\u0430\u043B\u044C\u043D\u044B\u0435 \u0432\u044B\u0437\u043E\u0432\u044B (`docs/reconnaissance.md` \u2014 \u0430\u0432\u0442\u043E-\u0437\u0430\u043F\u0438\u0441\u044C `bun run capture` \u0438\u043B\u0438 HAR \u2192\n `bun run catalog:draft`). \u0427\u0435\u0440\u043D\u043E\u0432\u0438\u043A `actions.draft.json` \u043D\u0430\u043A\u0430\u043F\u043B\u0438\u0432\u0430\u0435\u0442 **\u0432\u0441\u0435 \u0443\u043D\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u043A\u043E\u043C\u0431\u0438\u043D\u0430\u0446\u0438\u0438\n \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432** \u043D\u0430 \u044D\u043A\u0448\u0435\u043D \u0438 \u043F\u0440\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 `bodyType` (form/json) \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.\n2. \u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0438 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 \u043F\u043E \u0440\u0430\u0437\u0434\u0435\u043B\u0443 3: \u0435\u0441\u043B\u0438 \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A \u043F\u043E\u043A\u0430\u0437\u0430\u043B `"bodyType": "json"` \u2014 \u043F\u0435\u0440\u0435\u043D\u0435\u0441\u0438 \u0435\u0433\u043E \u0432 \u0437\u0430\u043F\u0438\u0441\u044C.\n3. \u0414\u043E\u0431\u0430\u0432\u044C \u0437\u0430\u043F\u0438\u0441\u044C \u0432 `actions.json` (\u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0435\u0439 \u2014 \u043A\u0430\u0442\u0430\u043B\u043E\u0433 \u044D\u0442\u043E \u0434\u043E\u043F\u0443\u0441\u043A\u0430\u0435\u0442). \u041F\u0440\u043E\u0432\u0435\u0440\u044C \u0447\u0435\u0440\u0435\u0437\n `bitrix_call { name, params }`.\n4. \u0415\u0441\u043B\u0438 \u0443\u0434\u043E\u0431\u043D\u043E \u2014 \u043E\u0431\u0435\u0440\u043D\u0438 \u0432 \u0442\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u0432 `src/tools/register.ts` (\u0441 \u0434\u0435\u0444\u043E\u043B\u0442\u043D\u044B\u043C `select`).\n\n> `actions.json` / `actions.draft.json` \u2014 \u0434\u0430\u043D\u043D\u044B\u0435 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0433\u043E \u043F\u043E\u0440\u0442\u0430\u043B\u0430 (gitignored). \u042D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B\n> (`api-notes.md`) \u2014 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u043C\u044B\u0435 \u0437\u043D\u0430\u043D\u0438\u044F \u043E \u0441\u0430\u043C\u043E\u043C API; \u0434\u0435\u0440\u0436\u0438 \u0435\u0433\u043E \u0432 \u0430\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u043E\u043C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0438 \u043F\u0440\u0438 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0438\n> \u043D\u043E\u0432\u044B\u0445 \u043C\u0435\u0442\u043E\u0434\u043E\u0432.\n' ? '# Bitrix24 API notes (reverse-engineered)\n\n\u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A \u043F\u043E \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u043C\u0443 API Bitrix24, \u0434\u043E\u0431\u044B\u0442\u044B\u0439 **\u0436\u0438\u0432\u044B\u043C \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C** (\u0443 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 ajax-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u043E\u0432\n\u043D\u0435\u0442 \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u043E\u0439 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0438). \u041F\u0440\u0435\u0434\u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D \u0434\u043B\u044F \u043B\u044E\u0431\u043E\u0433\u043E \u0418\u0418-\u0430\u0433\u0435\u043D\u0442\u0430 \u0438\u043B\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0432\u044B\u0437\u044B\u0432\u0430\u0435\u0442\n\u044D\u0442\u0438 \u043C\u0435\u0442\u043E\u0434\u044B \u0447\u0435\u0440\u0435\u0437 \u043C\u043E\u0441\u0442 (`bitrix_call` / \u0442\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B) \u0438\u043B\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044F\u0435\u0442 \u043A\u0430\u0442\u0430\u043B\u043E\u0433.\n\n\u041D\u0430\u0431\u043B\u044E\u0434\u0435\u043D\u0438\u044F \u0441\u043D\u044F\u0442\u044B \u043D\u0430 \u043F\u043E\u0440\u0442\u0430\u043B\u0435 `example.bitrix24.ru` (\u043E\u0431\u043B\u0430\u043A\u043E, \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 **im.v2**, \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435\n**scrum-\u0431\u043E\u0440\u0434\u0430**). \u0418\u043C\u0435\u043D\u0430 \u043F\u043E\u043B\u0435\u0439 \u0438 \u043A\u043E\u043D\u0432\u0435\u043D\u0446\u0438\u0438 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B \u0434\u043B\u044F \u043E\u0431\u043B\u0430\u0447\u043D\u043E\u0433\u043E Bitrix24, \u043D\u043E \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0435 \u043D\u0430 \u0434\u0440\u0443\u0433\u043E\u0439\n\u043F\u043E\u0440\u0442\u0430\u043B \u0441\u0432\u0435\u0440\u044F\u0439\u0441\u044F \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C (`docs/reconnaissance.md`).\n\n---\n\n## 1. \u041A\u0430\u043A \u0432\u044B\u0437\u044B\u0432\u0430\u0442\u044C\n\n- **`bitrix_call { name, params }`** \u2014 \u0443\u043D\u0438\u0432\u0435\u0440\u0441\u0430\u043B\u044C\u043D\u044B\u0439 \u0432\u044B\u0437\u043E\u0432 \u043B\u044E\u0431\u043E\u0433\u043E \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043D\u043D\u043E\u0433\u043E \u0438\u043C\u0435\u043D\u0438 \u0438\u0437 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430\n (`actions.json`). `params` \u2014 \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 Bitrix (\u0441\u043C. \u0440\u0430\u0437\u0434\u0435\u043B 3). \u041A\u0430\u0442\u0430\u043B\u043E\u0433 \u043C\u043E\u0436\u0435\u0442 \u0432\u043A\u043B\u044E\u0447\u0430\u0442\u044C\n \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0435 \u0432\u044B\u0437\u043E\u0432\u044B; allowlist (`actions.json`) \u2014 \u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\u043D\u043D\u0430\u044F \u0433\u0440\u0430\u043D\u0438\u0446\u0430, \u043D\u0435 \u0440\u0435\u0436\u0438\u043C \u0447\u0442\u0435\u043D\u0438\u044F.\n- **\u0422\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B** \u2014 \u043E\u0431\u0451\u0440\u0442\u043A\u0438 \u0441 \u0440\u0430\u0437\u0443\u043C\u043D\u044B\u043C\u0438 \u0434\u0435\u0444\u043E\u043B\u0442\u0430\u043C\u0438 \u043D\u0430\u0434 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u043E\u043C. \u0422\u043E\u0447\u043D\u0430\u044F \u0432\u044B\u0431\u043E\u0440\u043A\u0430 \u2014 \u0447\u0435\u0440\u0435\u0437\n \u043E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0439 `params`, \u043E\u043D \u043C\u0435\u0440\u0436\u0438\u0442\u0441\u044F **\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u043C** \u0438 \u043F\u0435\u0440\u0435\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u0434\u0435\u0444\u043E\u043B\u0442\u044B. \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044E\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0442\u0435,\n \u0447\u044C\u0451 \u0438\u043C\u044F \u0435\u0441\u0442\u044C \u0432 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0435 (`actions.json`); \u0438\u043D\u0430\u0447\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u0435\u0442\u0441\u044F. \u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u043D\u0430\u0431\u043E\u0440:\n - \u0417\u0430\u0434\u0430\u0447\u0438: `bitrix_tasks_list`, `bitrix_task_get`, `bitrix_task_get_v2` (v2/JSON),\n `bitrix_task_scrum_info`, `bitrix_task_files`, `bitrix_task_views_count`,\n `bitrix_task_subtasks` (\u043F\u043E\u0434\u0437\u0430\u0434\u0430\u0447\u0438), `bitrix_task_related` (\u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435).\n - \u041F\u0440\u043E\u0435\u043A\u0442\u044B: `bitrix_projects_list`, `bitrix_project_get`.\n - \u0427\u0430\u0442\u044B: `bitrix_chats_recent`, `bitrix_recent_load` (\u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u043F\u043E \u0441\u0435\u043A\u0446\u0438\u0438 \u2014 \u0432 \u0442.\u0447. `tasksTask` =\n \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447), `bitrix_recent_tail` (\u043B\u0438\u0441\u0442\u0430\u0442\u044C \u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u0432\u0433\u043B\u0443\u0431\u044C), `bitrix_chat_load` (\u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043F\u043E\n `dialogId`/`chatId`), `bitrix_chat_messages`, `bitrix_chat_history` (\u043B\u0438\u0441\u0442\u0430\u0442\u044C \u0432\u0433\u043B\u0443\u0431\u044C \u043F\u043E `beforeId`),\n `bitrix_chat_get_dialog_id` (dialogId \u043F\u043E externalId), `bitrix_chat_mark_read` (\u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439),\n `bitrix_chat_read_all` (\u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439).\n - \u041B\u044E\u0434\u0438/\u043F\u043E\u0438\u0441\u043A: `bitrix_user_get` (\u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u044E\u0437\u0435\u0440\u0430), `bitrix_entity_selector` (\u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0441\u0435\u043B\u0435\u043A\u0442\u043E\u0440\u0430),\n `bitrix_entity_search` (\u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u043F\u043E\u0438\u0441\u043A \u0447\u0430\u0442\u043E\u0432/\u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 `ui.entityselector.doSearch`).\n\n \u041B\u044E\u0431\u043E\u0435 \u0438\u043C\u044F \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u0438 \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E \u0447\u0435\u0440\u0435\u0437 `bitrix_call { name, params }`.\n- **`bitrix_help`** \u2014 \u044D\u0442\u043E\u0442 \u0436\u0435 \u0433\u0430\u0439\u0434, \u043E\u0442\u0434\u0430\u0451\u0442\u0441\u044F \u0447\u0435\u0440\u0435\u0437 MCP (\u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 + resource `bitrix://api-notes`).\n \u0418\u0441\u0442\u043E\u0447\u043D\u0438\u043A \u2014 **\u044D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B** (`docs/api-notes.md`).\n\n\u041F\u043E\u043B\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A \u0438\u043C\u0451\u043D \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u043E\u0442\u0434\u0430\u0451\u0442 `bitrix_call` \u0432 \u0441\u0432\u043E\u0451\u043C \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0438 (`deps.catalog.names()`).\n\n---\n\n## 2. \u0424\u043E\u0440\u043C\u0430\u0442 \u043E\u0442\u0432\u0435\u0442\u0430 (\u0432\u0430\u0436\u043D\u043E!)\n\nAjax-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u044B (`/bitrix/services/main/ajax.php`) \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0442 HTTP 200 \u0441 \u043A\u043E\u043D\u0432\u0435\u0440\u0442\u043E\u043C:\n\n```jsonc\n{ "status": "success" | "error",\n "data": { ... },\n "errors": [] } // \u041F\u0423\u0421\u0422\u041E\u0419 \u043C\u0430\u0441\u0441\u0438\u0432 \u043F\u0440\u0438 \u0443\u0441\u043F\u0435\u0445\u0435! (\u0432 JS [] \u2014 truthy)\n```\n\n- \u0423\u0441\u043F\u0435\u0445 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442\u0441\u044F `status:"success"` \u0438/\u0438\u043B\u0438 **\u043F\u0443\u0441\u0442\u044B\u043C** `errors`. \u041D\u0435\u043F\u0443\u0441\u0442\u043E\u0439 `errors` / `status:"error"` /\n top-level `error` \u2014 \u0440\u0435\u0430\u043B\u044C\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430 (\u043C\u043E\u0441\u0442 \u043C\u0430\u043F\u043F\u0438\u0442 \u044D\u0442\u043E \u0432 `ok:false`).\n- REST-\u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u044B (`/rest/*.json`) \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0442 \u0438\u043D\u0430\u0447\u0435: `{ "result": \u2026, "next", "total", "time" }` \u2014 \u0431\u0435\u0437 `errors`.\n\n---\n\n## 3. \u0422\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442: form vs json (\u0440\u0430\u0437\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043F\u043E \u043C\u0435\u0442\u043E\u0434\u0443!)\n\n\u0423 \u043A\u0430\u0436\u0434\u043E\u0439 \u0437\u0430\u043F\u0438\u0441\u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0435\u0441\u0442\u044C **`bodyType`** \u2014 \u043A\u0430\u043A \u043C\u043E\u0441\u0442 \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u043B\u043E:\n\n- **`bodyType: "form"`** (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E) \u2014 `application/x-www-form-urlencoded`; \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E\u0441\u0442\u044C \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044F\n PHP-\u0441\u0442\u0438\u043B\u0435\u043C (`filter[STATUS]=2`, `select[0]=ID`). \u041E\u0431\u044A\u0435\u043A\u0442 \u0432 `params` \u0440\u0435\u043A\u0443\u0440\u0441\u0438\u0432\u043D\u043E \u0440\u0430\u0437\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0432 \u0442\u0430\u043A\u0438\u0435\n \u043A\u043B\u044E\u0447\u0438. \u041A\u043B\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043A\u0438\u0435 `tasks.task.*`, \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440 `im.v2.*`, REST \u2014 \u0432\u0441\u0451 \u044D\u0442\u043E \u0444\u043E\u0440\u043C\u0430.\n- **`bodyType: "json"`** \u2014 \u0442\u0435\u043B\u043E \u0443\u0445\u043E\u0434\u0438\u0442 \u043A\u0430\u043A `JSON.stringify(params)` \u0441 `Content-Type: application/json`.\n \u0422\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 **`tasks.v2.*`** (\u043D\u0430\u043F\u0440. `tasks.v2.Task.get` \u0436\u0434\u0451\u0442 `{"task":{"id":N}}`) \u0438 `ui.entityselector.*`.\n `params` \u043F\u0440\u0438 \u044D\u0442\u043E\u043C \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0435\u0442 \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u0443\u044E \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0443 \u043A\u0430\u043A \u0435\u0441\u0442\u044C (\u043D\u0435 \u0440\u0430\u0437\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0432 bracket-\u043A\u043B\u044E\u0447\u0438).\n\n> \u0418\u0441\u0442\u043E\u0440\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u0437\u0430\u043C\u0435\u0442\u043A\u0430: \u0440\u0430\u043D\u044C\u0448\u0435 \u043C\u043E\u0441\u0442 \u0443\u043C\u0435\u043B \u0442\u043E\u043B\u044C\u043A\u043E \u0444\u043E\u0440\u043C\u0443, \u0438 `tasks.v2.*` \u0431\u044B\u043B\u0438 \u043D\u0435\u043F\u0440\u0438\u0433\u043E\u0434\u043D\u044B. \u0422\u0435\u043F\u0435\u0440\u044C\n> \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0430\u043D\u044B \u2014 \u0432 \u0437\u0430\u043F\u0438\u0441\u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0441\u0442\u0430\u0432\u044C `"bodyType": "json"`, \u0438 \u043C\u043E\u0441\u0442 \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442 \u0438\u0445 \u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u043E.\n\n**CSRF / sessid:** \u043C\u043E\u0441\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0448\u043B\u0451\u0442 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A **`X-Bitrix-Csrf-Token: <sessid>`** (\u0441\u0432\u0435\u0436\u0438\u0439\n`BX.bitrix_sessid()`). Form-\u0442\u0435\u043B\u0430 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043D\u0435\u0441\u0443\u0442 `sessid` \u043F\u043E\u043B\u0435\u043C \u0432 \u0442\u0435\u043B\u0435 (legacy REST \u044D\u0442\u043E \u0442\u0440\u0435\u0431\u0443\u0435\u0442);\nJSON-\u0442\u0435\u043B\u0430 \u043D\u0435\u0441\u0443\u0442 sessid **\u0442\u043E\u043B\u044C\u043A\u043E** \u0432 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0435. \u041E\u0442\u0432\u0435\u0442 `invalid_csrf`/`invalid_authentication` = \u0441\u0435\u0441\u0441\u0438\u044F\n\u043F\u0440\u043E\u0442\u0443\u0445\u043B\u0430 (\u043F\u0435\u0440\u0435\u043B\u043E\u0433\u0438\u043D\u044C\u0441\u044F \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435).\n\n| \u041C\u0435\u0442\u043E\u0434 (action / endpoint) | bodyType | \u0413\u0434\u0435 `select`/`filter`/`order` | \u041F\u0430\u0433\u0438\u043D\u0430\u0446\u0438\u044F |\n|---|---|---|---|\n| `tasks.task.list` | form | **\u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C**: `select[]`, `filter{}`, `order{}` | `start` (\u0441\u0434\u0432\u0438\u0433, \u0448\u0430\u0433 50) |\n| `tasks.task.get` | form | \u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C: `taskId`, `select[]` | \u2014 |\n| `tasks.v2.Task.get` | **json** | `{"task": {"id": N}}` | \u2014 |\n| `tasks.v2.Scrum.getTaskInfo` | **json** | `{"taskId": N}` | \u2014 |\n| `tasks.v2.File.listObjects` | **json** | `{"ids": [N,\u2026]}` | \u2014 |\n| `tasks.v2.Task.View.User.count` | **json** | `{"task": {"id": N}}` | \u2014 |\n| `tasks.v2.Task.Relation.Child.list` | **json** | `{"taskId": N, "withIds":true, "navigation":{"size":N}}` | `navigation` |\n| `tasks.v2.Task.Relation.Related.list` | **json** | `{"taskId": N, \u2026}` (\u043A\u0430\u043A Child) | `navigation` |\n| `socialnetwork.api.workgroup.list` | form | **\u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C**: `select[]`, `order{}`, `filter{}` | (nav \u2014 \u043D\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u043E) |\n| `socialnetwork.api.workgroup.get` | form | **\u043E\u0431\u0451\u0440\u043D\u0443\u0442\u043E**: `params[groupId]`, `params[select][]` | \u2014 |\n| `/rest/im.recent.list.json` | form (rest) | \u043F\u043B\u043E\u0441\u043A\u043E: `LIMIT`, `SKIP_OPENLINES`, `UNREAD_ONLY`, \u2026 | `LIMIT` |\n| `/rest/im.user.get.json` | form (rest) | \u043F\u043B\u043E\u0441\u043A\u043E: `ID` | \u2014 |\n| `im.v2.Recent.load` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `limit`, `filter[recentSection]`, `filter[unread]`, `filter[parentId]` | `im.v2.Recent.tail` |\n| `im.v2.Recent.tail` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `limit`, `filter[lastMessageDate]` (\u043A\u0443\u0440\u0441\u043E\u0440), `filter[recentSection]` | `filter[lastMessageDate]` |\n| `im.v2.Chat.load` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `dialogId`\\|`chatId`, `messageLimit` | \u2014 |\n| `im.v2.Chat.getDialogId` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `externalId` | \u2014 |\n| `im.v2.Chat.Message.list` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `limit` | \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u044F\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u2014 \u043D\u0430\u0437\u0430\u0434 **\u043D\u0435 \u043B\u0438\u0441\u0442\u0430\u0435\u0442**, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 `.tail` |\n| `im.v2.Chat.Message.tail` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `limit`, `filter[lastId]`, `order[id]` | **\u0441\u043C. \u0440\u0430\u0437\u0434\u0435\u043B 6** |\n| `im.v2.Chat.Message.read` | form | \u043F\u043B\u043E\u0441\u043A\u043E: `chatId`, `ids[]`, `actionUuid` | \u2014 (\u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439) |\n| `im.v2.Chat.readAll` | form | \u0431\u0435\u0437 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 | \u2014 (\u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439) |\n| `ui.entityselector.load` | **json** | `{"dialog": {entities,preselectedItems,\u2026}}` | \u2014 |\n| `ui.entityselector.doSearch` | **json** | `{"dialog": {\u2026}, "searchQuery": {"query": "...", "queryWords": ["..."]}}` | \u2014 |\n\n---\n\n## 4. \u041A\u0430\u0442\u0430\u043B\u043E\u0433: \u0438\u043C\u044F \u2192 action \u2192 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B\n\n| \u0418\u043C\u044F (`actions.json`) | action / endpoint | bodyType | \u041A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 params |\n|---|---|---|---|\n| `tasks.list` | `tasks.task.list` | form | `filter{RESPONSIBLE_ID,REAL_STATUS,GROUP_ID,\u2026}`, `select[]`, `order{}`, `start` |\n| `task.get` | `tasks.task.get` | form | `taskId`, `select[]` |\n| `task.v2.get` | `tasks.v2.Task.get` | json | `task.id` (id \u0437\u0430\u0434\u0430\u0447\u0438) |\n| `task.scrum.info` | `tasks.v2.Scrum.getTaskInfo` | json | `taskId` |\n| `task.files` | `tasks.v2.File.listObjects` | json | `ids` (\u043C\u0430\u0441\u0441\u0438\u0432 id) |\n| `task.views.count` | `tasks.v2.Task.View.User.count` | json | `task.id` (id \u0437\u0430\u0434\u0430\u0447\u0438) |\n| `task.subtasks` | `tasks.v2.Task.Relation.Child.list` | json | `taskId`, `navigation{size}` |\n| `task.related` | `tasks.v2.Task.Relation.Related.list` | json | `taskId`, `navigation{size}` |\n| `projects.list` | `socialnetwork.api.workgroup.list` | form | `select[]`, `order{}`, `filter{}` |\n| `projects.get` | `socialnetwork.api.workgroup.get` | form | `params[groupId]`, `params[select][]` |\n| `chats.recent` | `/rest/im.recent.list.json` | form | `LIMIT`, `UNREAD_ONLY`, `SKIP_OPENLINES` |\n| `recent.load` | `im.v2.Recent.load` | form | `filter[recentSection]` (`tasksTask`/`collab`/\u2026), `limit`, `filter[unread]` |\n| `recent.tail` | `im.v2.Recent.tail` | form | `filter[lastMessageDate]`, `filter[recentSection]`, `limit` |\n| `chat.load` | `im.v2.Chat.load` | form | `dialogId`\\|`chatId`, `messageLimit` |\n| `chat.dialogId` | `im.v2.Chat.getDialogId` | form | `externalId` (\u043D\u0430\u043F\u0440. `"sg"+groupId`) |\n| `chat.messages` | `im.v2.Chat.Message.list` | form | `chatId`, `limit` (\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435; \u0432\u0433\u043B\u0443\u0431\u044C \u2014 `chat.messages.tail`) |\n| `chat.messages.tail` | `im.v2.Chat.Message.tail` | form | `chatId`, `filter[lastId]`, `order[id]`, `limit` |\n| `chat.message.read` | `im.v2.Chat.Message.read` | form | `chatId`, `ids[0]`, `actionUuid` |\n| `chat.read.all` | `im.v2.Chat.readAll` | form | \u2014 (\u26A0 \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0439) |\n| `im.user.get` | `/rest/im.user.get.json` | form | `ID` |\n| `entityselector.load` | `ui.entityselector.load` | json | `dialog` (\u043E\u0431\u044A\u0435\u043A\u0442) |\n| `entityselector.search` | `ui.entityselector.doSearch` | json | `dialog`, `searchQuery{query,queryWords}` |\n\n---\n\n## 5. \u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A \u043F\u043E\u043B\u0435\u0439\n\n**\u0417\u0430\u0434\u0430\u0447\u0430** (`tasks.task.*`): `ID`, `TITLE`, `DESCRIPTION`, `STATUS`, `REAL_STATUS`, `RESPONSIBLE_ID`,\n`CREATED_BY`, `CREATED_DATE`, `CHANGED_DATE`, `DEADLINE`, `CLOSED_DATE`, `PRIORITY`, `GROUP_ID`,\n`TAGS`, `TIME_ESTIMATE`, `UF_*`. \u041E\u0442\u0432\u0435\u0442 \u0442\u0430\u043A\u0436\u0435 \u043F\u043E\u0434\u043A\u043B\u0430\u0434\u044B\u0432\u0430\u0435\u0442 \u043E\u0431\u044A\u0435\u043A\u0442\u044B `group`, `responsible`, `creator`, `action`.\n\n\u0421\u0442\u0430\u0442\u0443\u0441\u044B \u0437\u0430\u0434\u0430\u0447\u0438 (`STATUS`): `1` \u041D\u043E\u0432\u0430\u044F \xB7 `2` \u0416\u0434\u0451\u0442 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \xB7 `3` \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \xB7 `4` \u0416\u0434\u0451\u0442 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044F \xB7\n`5` \u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430 \xB7 `6` \u041E\u0442\u043B\u043E\u0436\u0435\u043D\u0430 \xB7 `7` \u041E\u0442\u043A\u043B\u043E\u043D\u0435\u043D\u0430.\n\n**\u0417\u0430\u0434\u0430\u0447\u0430 v2** (`tasks.v2.*`): id \u0437\u0430\u0434\u0430\u0447\u0438 \u043F\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044F \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u043E \u2014 **`{"task": {"id": N}}`** (\u0443 `Task.get` \u0438\n`Task.View.User.count`), \u0430 \u0443 `Scrum.getTaskInfo` \u0438 `Relation.*` \u2014 \u043F\u043B\u043E\u0441\u043A\u043E `{"taskId": N}`. \u042D\u0442\u043E \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u0430\u044F\n\u043F\u043E\u0434\u0441\u0438\u0441\u0442\u0435\u043C\u0430 scrum-\u0431\u043E\u0440\u0434\u0430; \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0443 \u043E\u0442\u0432\u0435\u0442\u0430 \u0441\u0432\u0435\u0440\u044C \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C \u2014 \u0432 \u0437\u0430\u0445\u0432\u0430\u0442\u0435 \u0432\u0438\u0434\u043D\u044B \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0437\u0430\u043F\u0440\u043E\u0441\u0430.\n\n**\u0413\u0440\u0443\u043F\u043F\u0430/\u043F\u0440\u043E\u0435\u043A\u0442 \u2014 \u0441\u043F\u0438\u0441\u043E\u043A** (`workgroup.list`, camelCase \u0432 \u043E\u0442\u0432\u0435\u0442\u0435): `ID`, `NAME`, `DESCRIPTION`,\n`NUMBER_OF_MEMBERS`, `OWNER_ID`, `DATE_CREATE`, `PROJECT` (Y/N), `TYPE`.\n**\u0413\u0440\u0443\u043F\u043F\u0430 \u2014 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430** (`workgroup.get`): \u043F\u043B\u044E\u0441 `OWNER_DATA`, `SUBJECT_DATA`, `MEMBERS[]`,\n`MODERATOR_MEMBERS[]`, `CHAT_ID`, `DIALOG_ID`, `IMAGE_ID`, UF-\u043F\u043E\u043B\u044F.\n\n**\u041D\u0435\u0434\u0430\u0432\u043D\u0438\u0439 \u0447\u0430\u0442** (`im.recent.list`): `chat_id`, `title`, `type`, `message{id,text,date,author_id}`,\n`last_id`, `unread`, `pinned`, `user{\u2026}`, `chat{\u2026}`.\n**\u041D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u043F\u043E \u0441\u0435\u043A\u0446\u0438\u0438** (`im.v2.Recent.load`): \u0444\u0438\u043B\u044C\u0442\u0440 `filter[recentSection]` \u2014 `default` (\u043E\u0431\u044B\u0447\u043D\u044B\u0435\n\u0434\u0438\u0430\u043B\u043E\u0433\u0438), **`tasksTask` (\u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447)**, `collab`/`collabDefault` (\u043A\u043E\u043B\u043B\u0430\u0431\u044B). \u041B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u0432\u0433\u043B\u0443\u0431\u044C \u2014\n`im.v2.Recent.tail` \u0441 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u043C `filter[lastMessageDate]` (ISO-\u0434\u0430\u0442\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B).\n**\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u044E\u0437\u0435\u0440\u0430** (`im.user.get`): `id`, `name`, `first_name`, `last_name`, `avatar`, `work_position`,\n`gender`, `status`, `online` \u2014 \u0440\u0435\u0437\u043E\u043B\u0432 \u0430\u0432\u0442\u043E\u0440\u0430 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F (`authorId`) \u0432 \u0438\u043C\u044F.\n**\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435** (`im.v2.Chat.Message.*`): `id`, `chatId`, `authorId`, `date`, `text`, `params`, `viewed`.\n\u041E\u0442\u0432\u0435\u0442 \u0442\u0430\u043A\u0436\u0435 \u043D\u0435\u0441\u0451\u0442 `users[]` (\u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0438), `additionalMessages[]`, `hasPrevPage`/`hasNextPage`.\n`chatId` \u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 `im.recent.list` (`chat_id`) \u0438\u043B\u0438 \u0438\u0437 `workgroup.get` (`CHAT_ID`/`DIALOG_ID`).\n\n**\u0410\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044F \u0447\u0430\u0442\u0430 (`chat.load`): `dialogId` vs `chatId`.** `chat.load` \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442 \u043B\u044E\u0431\u043E\u0439 \u0438\u0437 \u0434\u0432\u0443\u0445:\n- `dialogId` = **ID \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F** (\u0447\u0438\u0441\u043B\u043E, \u043D\u0430\u043F\u0440. `11`) \u2192 **\u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 1-\u043D\u0430-1** \u0441 \u044D\u0442\u0438\u043C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C.\n- `dialogId` = **`"chat"+CHAT_ID`** (\u043D\u0430\u043F\u0440. `"chat7111"`) \u2192 **\u0433\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439 \u0447\u0430\u0442** (\u043F\u0440\u043E\u0435\u043A\u0442\u0430/\u0437\u0430\u0434\u0430\u0447\u0438/\u043A\u0430\u043D\u0430\u043B\u0430).\n- `chatId` = \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 `CHAT_ID` \u2014 \u0442\u043E \u0436\u0435, \u0447\u0442\u043E \u0433\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439 `dialogId`, \u043D\u043E \u0431\u0435\u0437 \u043F\u0440\u0435\u0444\u0438\u043A\u0441\u0430.\n\n\u041E\u0442\u0432\u0435\u0442 `chat.load` \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 `chatId` \u2014 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 \u0435\u0433\u043E \u0434\u0430\u043B\u044C\u0448\u0435 \u0434\u043B\u044F `chat.messages` /\n`chat.messages.tail` (\u043B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u0432\u0433\u043B\u0443\u0431\u044C) \u0438 `chat.message.read` (\u044D\u0442\u0438 \u0442\u0440\u0438 \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 \u043F\u043E `chatId`, \u043D\u0435 \u043F\u043E `dialogId`).\n\n---\n\n## 6. \u041F\u0440\u0438\u043C\u0435\u0440\u044B \u0432\u044B\u0437\u043E\u0432\u043E\u0432\n\n```jsonc\n// \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0433\u043E 55, \u043F\u043E \u0434\u0435\u0434\u043B\u0430\u0439\u043D\u0443, \u0432\u0442\u043E\u0440\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430\nbitrix_tasks_list { "params": { "filter": {"RESPONSIBLE_ID":55,"REAL_STATUS":2},\n "order": {"DEADLINE":"asc"}, "start": 50 } }\n\n// \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u043D\u044B\u043C \u043D\u0430\u0431\u043E\u0440\u043E\u043C \u043F\u043E\u043B\u0435\u0439\nbitrix_task_get { "taskId": 4229, "params": { "select": ["ID","TITLE","DESCRIPTION","TAGS","TIME_ESTIMATE"] } }\n\n// \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 v2-\u043F\u043E\u0434\u0441\u0438\u0441\u0442\u0435\u043C\u0443 (JSON-\u0442\u0435\u043B\u043E; id \u0432\u043B\u043E\u0436\u0435\u043D \u0432 task)\nbitrix_task_get_v2 { "taskId": 4229 } // \u2192 { "task": { "id": 4229 } }\nbitrix_call { "name": "task.v2.get", "params": { "task": { "id": 4229 } } }\n\n// \u0444\u0430\u0439\u043B\u044B \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043A \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u043E\u0432 (v2, JSON-\u0442\u0435\u043B\u043E); \u043F\u043E\u0434\u0437\u0430\u0434\u0430\u0447\u0438/\u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435\nbitrix_call { "name": "task.files", "params": { "ids": [4229] } }\nbitrix_call { "name": "task.views.count", "params": { "task": { "id": 4229 } } }\nbitrix_task_subtasks { "taskId": 4229 }\nbitrix_task_related { "taskId": 4229 }\n\n// \u043F\u0440\u043E\u0435\u043A\u0442\u044B \u043F\u043E \u0434\u0430\u0442\u0435 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F; \u043F\u043E\u043B\u043D\u0430\u044F \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0433\u0440\u0443\u043F\u043F\u044B\nbitrix_projects_list { "params": { "order": {"DATE_CREATE":"desc"} } }\nbitrix_project_get { "groupId": 15 }\n\n// \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0447\u0430\u0442 (\u043F\u0435\u0440\u0432\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F)\nbitrix_chat_load { "chatId": 485, "messageLimit": 50 }\n\n// \u041B\u0418\u0421\u0422\u0410\u041D\u0418\u0415 \u0418\u0421\u0422\u041E\u0420\u0418\u0418 \u0412\u0413\u041B\u0423\u0411\u042C (\u0441\u0442\u0430\u0440\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F): beforeId = \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 id \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\n// \u0438\u0437 \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B. \u041F\u043E\u0432\u0442\u043E\u0440\u044F\u0439, \u0443\u043C\u0435\u043D\u044C\u0448\u0430\u044F beforeId, \u0434\u043E \u043D\u0430\u0447\u0430\u043B\u0430 \u0438\u0441\u0442\u043E\u0440\u0438\u0438 (order DESC \u2014 \u0434\u0435\u0444\u043E\u043B\u0442).\nbitrix_chat_history { "chatId": 485, "beforeId": 1861279 }\n\n// \u043F\u043E\u043C\u0435\u0442\u0438\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u043C\u0438 (\u041C\u0423\u0422\u0418\u0420\u0423\u042E\u0429\u0418\u0419). actionUuid \u0433\u0435\u043D\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.\nbitrix_chat_mark_read { "chatId": 40271, "ids": [1884131] }\n```\n\n### 6.1. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0439: \u0447\u0430\u0442 \u0441 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u044B\u043C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C\n\n\u041B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 1-\u043D\u0430-1 \u0430\u0434\u0440\u0435\u0441\u0443\u0435\u0442\u0441\u044F `dialogId` = **ID \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F**. Id \u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 \u0437\u0430\u0434\u0430\u0447\u0438\n(`RESPONSIBLE_ID`/`CREATED_BY`), \u0438\u0437 `bitrix_chats_recent`, \u043B\u0438\u0431\u043E \u0440\u0435\u0437\u043E\u043B\u0432\u0438\u0442\u0441\u044F \u043F\u043E\u0438\u0441\u043A\u043E\u043C (\xA76.3).\n\n```jsonc\n// 1) \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442 \u0441 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C 11 \u2192 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 chatId\nbitrix_chat_load { "dialogId": 11 }\n// 2) \u043B\u0438\u0441\u0442\u0430\u0442\u044C \u0435\u0433\u043E \u0438\u0441\u0442\u043E\u0440\u0438\u044E \u0432\u0433\u043B\u0443\u0431\u044C \u043F\u043E chatId \u0438\u0437 \u043E\u0442\u0432\u0435\u0442\u0430 \u0448\u0430\u0433\u0430 1\nbitrix_chat_history { "chatId": 485, "beforeId": 1861279 }\n```\n\n### 6.2. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0439: \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 (\u0447\u0430\u0442) \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438\n\n\u0423 \u043A\u0430\u0436\u0434\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0435\u0441\u0442\u044C \u0441\u0432\u043E\u0439 im-\u0447\u0430\u0442-\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435. \u0414\u0432\u0430 \u043F\u0443\u0442\u0438 \u043D\u0430\u0439\u0442\u0438 \u0435\u0433\u043E `chatId`:\n\n**\u0410. \u0427\u0435\u0440\u0435\u0437 \u0441\u043F\u0438\u0441\u043E\u043A \u0447\u0430\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447 (\u043F\u0440\u044F\u043C\u043E\u0439).** `im.v2.Recent.load` \u0441 \u0441\u0435\u043A\u0446\u0438\u0435\u0439 `tasksTask` \u043E\u0442\u0434\u0430\u0451\u0442 \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447\n(\u0432 `bitrix_chats_recent` / `/rest/im.recent.list` \u0438\u0445 \u041D\u0415\u0422). \u041B\u0438\u0441\u0442\u0430\u0442\u044C \u0432\u0433\u043B\u0443\u0431\u044C \u2014 `bitrix_recent_tail`.\n\n```jsonc\nbitrix_recent_load { "section": "tasksTask" } // \u2192 \u0447\u0430\u0442\u044B \u0437\u0430\u0434\u0430\u0447 \u0441 chatId/dialogId\nbitrix_recent_tail { "section": "tasksTask", "lastMessageDate": "2026-06-29T17:25:38+03:00" }\n// \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u044B\u0439 \u0447\u0430\u0442 \u0438 \u043B\u0438\u0441\u0442\u0430\u0442\u044C \u0438\u0441\u0442\u043E\u0440\u0438\u044E\nbitrix_chat_load { "dialogId": "chat38849" } // \u0438\u043B\u0438 { "chatId": 38849 }\nbitrix_chat_history { "chatId": 38849, "beforeId": 1722353 }\n```\n\n**\u0411. \u041F\u043E\u0438\u0441\u043A\u043E\u043C \u043F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E \u0437\u0430\u0434\u0430\u0447\u0438** \u2014 `bitrix_entity_search` \u0441 \u0441\u0435\u043A\u0446\u0438\u0435\u0439 `tasksTask`:\n\n```jsonc\nbitrix_entity_search { "query": "\u0442\u0440\u0435\u043A\u0435\u0440", "section": "tasksTask" }\n```\n\n**\u0427\u0430\u0442 \u041F\u0420\u041E\u0415\u041A\u0422\u0410 \u0437\u0430\u0434\u0430\u0447\u0438** (\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B, \u043D\u0435 \u0441\u0430\u043C\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438) \u2014 \u0447\u0435\u0440\u0435\u0437 `GROUP_ID`:\n\n```jsonc\nbitrix_task_get { "taskId": 4229, "params": { "select": ["ID","GROUP_ID"] } }\nbitrix_project_get { "groupId": 15 } // \u043E\u0442\u0434\u0430\u0451\u0442 CHAT_ID / DIALOG_ID\nbitrix_chat_load { "dialogId": "chat7111" }\nbitrix_chat_get_dialog_id { "externalId": "sg15" } // \u043B\u0438\u0431\u043E \u0440\u0435\u0437\u043E\u043B\u0432 dialogId \u0441\u043E\u0446\u0433\u0440\u0443\u043F\u043F\u044B \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E\n```\n\n### 6.3. \u0421\u0446\u0435\u043D\u0430\u0440\u0438\u0439: \u043F\u043E\u0438\u0441\u043A \u0447\u0430\u0442\u0430 / \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\n\n\u0422\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u043F\u043E\u0438\u0441\u043A \u2014 `bitrix_entity_search` (\u043E\u0431\u0451\u0440\u0442\u043A\u0430 \u043D\u0430\u0434 `ui.entityselector.doSearch`): \u0441\u0430\u043C \u0441\u043E\u0431\u0438\u0440\u0430\u0435\u0442\n\u0434\u0438\u0430\u043B\u043E\u0433 `IM_CHAT_SEARCH` \u0438 `searchQuery` \u0438\u0437 \u0441\u0442\u0440\u043E\u043A\u0438:\n\n```jsonc\nbitrix_entity_search { "query": "\u0434\u043C\u0438\u0442\u0440\u0438\u0439" } // \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0447\u0430\u0442\u043E\u0432/\u0434\u0438\u0430\u043B\u043E\u0433\u043E\u0432\nbitrix_entity_search { "query": "\u0442\u0440\u0435\u043A\u0435\u0440", "section": "tasksTask" } // \u0441\u0440\u0435\u0434\u0438 \u0447\u0430\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447\n```\n\n\u0411\u044B\u0441\u0442\u0440\u044B\u0439 \u043F\u0443\u0442\u044C \u0431\u0435\u0437 \u043F\u043E\u0438\u0441\u043A\u0430 \u2014 \u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u0447\u0430\u0442\u044B \u0438 \u0444\u0438\u043B\u044C\u0442\u0440\u0430\u0446\u0438\u044F \u043D\u0430 \u0441\u0442\u043E\u0440\u043E\u043D\u0435 \u0430\u0433\u0435\u043D\u0442\u0430; \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0430\u0432\u0442\u043E\u0440\u0430 \u043F\u043E id:\n\n```jsonc\nbitrix_chats_recent { } // \u0441\u043E\u043F\u043E\u0441\u0442\u0430\u0432\u044C \u043F\u043E title / user\nbitrix_recent_load { "section": "tasksTask" }\nbitrix_user_get { "userId": 11 } // \u0440\u0435\u0437\u043E\u043B\u0432 authorId \u2192 \u0438\u043C\u044F\n```\n\n### 6.4. \u041B\u0435\u0433\u0430\u0441\u0438-\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 (HTML-\u043F\u043E\u0434\u0434\u043E\u043C\u0435\u043D \u2014 \u043F\u043E\u043A\u0430 \u041D\u0415 \u0432 \u043C\u043E\u0441\u0442\u0435)\n\n\u0423 \u0437\u0430\u0434\u0430\u0447 \u0434\u0432\u0430 \u043D\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043C\u044B\u0445 \u0444\u0438\u0434\u0430 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u044F:\n- **im.v2-\u0447\u0430\u0442** \u2014 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u043D\u044B\u0439 JSON, \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044F \u0443\u0436\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 (\xA76.2); \u043E\u0431\u044B\u0447\u043D\u043E \u044D\u0442\u043E\u0433\u043E \u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E.\n- **\u0424\u043E\u0440\u0443\u043C\u043D\u044B\u0435 \u043B\u0435\u0433\u0430\u0441\u0438-\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438** \u2014 \u0440\u0435\u043D\u0434\u0435\u0440\u044F\u0442\u0441\u044F \u043A\u0430\u043A **HTML** \u0432 side-slider\'\u0435. \u042D\u0442\u043E \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0439\n \xABHTML-\u043F\u043E\u0434\u0434\u043E\u043C\u0435\u043D\xBB \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u0433\u043E API, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 **\u0442\u0435\u043A\u0443\u0449\u0438\u0439 \u043C\u043E\u0441\u0442 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442** (\u0431\u043B\u043E\u043A\u0435\u0440\u044B \u043D\u0438\u0436\u0435).\n\n**\u041A\u0430\u043A \u0433\u0440\u0443\u0437\u044F\u0442\u0441\u044F (\u0440\u0435\u0432\u0435\u0440\u0441).** \u041F\u0435\u0440\u0432\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u2014 GET HTML-\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B iframe (\u0441\u0435\u0440\u0432\u0435\u0440 \u0442\u0443\u0442 \u0436\u0435 \u043C\u0438\u043D\u0442\u0438\u0442 \u043F\u043E\u0434\u043F\u0438\u0441\u044C):\n\n```\nGET /task/comments/<taskId>/?IFRAME=Y&IFRAME_TYPE=SIDE_SLIDER \u2192 HTML (\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 + signedParameters)\n```\n\n\u041B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u2014 POST \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043D\u043E\u0433\u043E ajax (\u0444\u043E\u0440\u043C\u0430, \u043E\u0442\u0434\u0430\u0451\u0442 HTML-\u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442):\n\n```\nPOST /bitrix/services/main/ajax.php?mode=class&c=bitrix:forum.comments&action=navigateComment\nform: AJAX_POST=Y, ENTITY_XML_ID=TASK_<taskId>, taskId=<taskId>, MODE=LIST,\n FILTER[<ID]=<\u043A\u0443\u0440\u0441\u043E\u0440: id, \u0414\u041E \u043A\u043E\u0442\u043E\u0440\u043E\u0433\u043E \u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0441\u0442\u0430\u0440\u044B\u0435>, PAGEN_1=1,\n signedParameters=<\u043F\u043E\u0434\u043F\u0438\u0441\u0430\u043D\u043D\u044B\u0439 blob>, IFRAME=Y, IFRAME_TYPE=SIDE_SLIDER\nheaders: bx-ajax: true, x-bitrix-site-id: s1 (\u043F\u043B\u044E\u0441 \u043E\u0431\u044B\u0447\u043D\u044B\u0439 X-Bitrix-Csrf-Token)\n```\n\n`signedParameters` \u2014 base64 PHP-\u043C\u0430\u0441\u0441\u0438\u0432\u0430 + HMAC-\u043F\u043E\u0434\u043F\u0438\u0441\u044C \u0441\u0435\u0440\u0432\u0435\u0440\u0430; \u043A\u043E\u0434\u0438\u0440\u0443\u0435\u0442\n`FORUM_ID, ENTITY_TYPE=TK, ENTITY_ID=<taskId>, ENTITY_XML_ID=TASK_<taskId>, \u2026`. **\u041F\u043E\u0434\u0434\u0435\u043B\u0430\u0442\u044C \u043D\u0435\u043B\u044C\u0437\u044F** \u2014\n\u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 HTML \u043F\u0435\u0440\u0432\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B.\n\n**\u041F\u043E\u0447\u0435\u043C\u0443 \u043F\u043E\u043A\u0430 \u043D\u0435 \u0432 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0435 (3 \u0431\u043B\u043E\u043A\u0435\u0440\u0430):**\n1. \u041C\u043E\u0441\u0442 \u043F\u0430\u0440\u0441\u0438\u0442 \u043E\u0442\u0432\u0435\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u0430\u043A JSON (`extension/src/connector.ts` \u2192 `resp.json()`) \u2014 HTML \u0431\u0440\u043E\u0441\u0438\u0442 \u0438\u0441\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435.\n2. Path-\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432 URL (`/task/comments/<taskId>/`) \u2014 \u0437\u0430\u043F\u0438\u0441\u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u043D\u044B, \u0448\u0430\u0431\u043B\u043E\u043D\u043E\u0432 \u043F\u0443\u0442\u0438 \u043D\u0435\u0442.\n3. `signedParameters` + \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0438 `bx-ajax`/`x-bitrix-site-id` \u2014 \u043D\u0443\u0436\u0435\u043D \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 GET HTML-\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B.\n\n**\u0427\u0442\u043E\u0431\u044B \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C** (\u0431\u0443\u0434\u0443\u0449\u0430\u044F \u0440\u0430\u0431\u043E\u0442\u0430): \u043D\u0430\u0443\u0447\u0438\u0442\u044C \u043C\u043E\u0441\u0442 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044C text/HTML \u043F\u0440\u0438 \u043D\u0435-JSON \u043E\u0442\u0432\u0435\u0442\u0435 \u0438\n\u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044C path-\u0448\u0430\u0431\u043B\u043E\u043D \u044D\u043D\u0434\u043F\u043E\u0438\u043D\u0442\u0430; \u0437\u0430\u0442\u0435\u043C \u043E\u0431\u0451\u0440\u0442\u043A\u0430 `bitrix_task_comments { taskId }` (GET \u043F\u0435\u0440\u0432\u043E\u0439\n\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B), \u0430 \u043B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u2014 \u0447\u0435\u0440\u0435\u0437 `navigateComment` \u0441 \u0432\u044B\u043F\u0430\u0440\u0441\u0435\u043D\u043D\u044B\u043C `signedParameters`.\n\n> \u0422\u043E\u0442 \u0436\u0435 HTML-\u043F\u043E\u0434\u0434\u043E\u043C\u0435\u043D: **\u0434\u0435\u0442\u0430\u043B\u0438 \u0437\u0432\u043E\u043D\u043A\u0430** \u2014 `GET /call/detail/<callId>?IFRAME=Y&IFRAME_TYPE=SIDE_SLIDER`\n> (\u043E\u0442\u0434\u0430\u0451\u0442 HTML). \u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438\u044F \u0438\u0434\u0435\u043D\u0442\u0438\u0447\u043D\u044B.\n\n---\n\n## 7. \u041A\u0430\u043A \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044C (\u043D\u043E\u0432\u044B\u0439 \u0434\u043E\u043C\u0435\u043D: \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C, \u0434\u0438\u0441\u043A, CRM, \u2026)\n\n1. \u0421\u043D\u0438\u043C\u0438 \u0440\u0435\u0430\u043B\u044C\u043D\u044B\u0435 \u0432\u044B\u0437\u043E\u0432\u044B (`docs/reconnaissance.md` \u2014 \u0430\u0432\u0442\u043E-\u0437\u0430\u043F\u0438\u0441\u044C `bun run capture` \u0438\u043B\u0438 HAR \u2192\n `bun run catalog:draft`). \u0427\u0435\u0440\u043D\u043E\u0432\u0438\u043A `actions.draft.json` \u043D\u0430\u043A\u0430\u043F\u043B\u0438\u0432\u0430\u0435\u0442 **\u0432\u0441\u0435 \u0443\u043D\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u043A\u043E\u043C\u0431\u0438\u043D\u0430\u0446\u0438\u0438\n \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432** \u043D\u0430 \u044D\u043A\u0448\u0435\u043D \u0438 \u043F\u0440\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 `bodyType` (form/json) \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.\n2. \u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0438 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 \u043F\u043E \u0440\u0430\u0437\u0434\u0435\u043B\u0443 3: \u0435\u0441\u043B\u0438 \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A \u043F\u043E\u043A\u0430\u0437\u0430\u043B `"bodyType": "json"` \u2014 \u043F\u0435\u0440\u0435\u043D\u0435\u0441\u0438 \u0435\u0433\u043E \u0432 \u0437\u0430\u043F\u0438\u0441\u044C.\n3. \u0414\u043E\u0431\u0430\u0432\u044C \u0437\u0430\u043F\u0438\u0441\u044C \u0432 `actions.json` (\u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0435\u0439 \u2014 \u043A\u0430\u0442\u0430\u043B\u043E\u0433 \u044D\u0442\u043E \u0434\u043E\u043F\u0443\u0441\u043A\u0430\u0435\u0442). \u041F\u0440\u043E\u0432\u0435\u0440\u044C \u0447\u0435\u0440\u0435\u0437\n `bitrix_call { name, params }`.\n4. \u0415\u0441\u043B\u0438 \u0443\u0434\u043E\u0431\u043D\u043E \u2014 \u043E\u0431\u0435\u0440\u043D\u0438 \u0432 \u0442\u0438\u043F\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u0432 `src/tools/register.ts` (\u0441 \u0434\u0435\u0444\u043E\u043B\u0442\u043D\u044B\u043C `select`).\n\n> `actions.json` / `actions.draft.json` \u2014 \u0434\u0430\u043D\u043D\u044B\u0435 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0433\u043E \u043F\u043E\u0440\u0442\u0430\u043B\u0430 (gitignored). \u042D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B\n> (`api-notes.md`) \u2014 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u043C\u044B\u0435 \u0437\u043D\u0430\u043D\u0438\u044F \u043E \u0441\u0430\u043C\u043E\u043C API; \u0434\u0435\u0440\u0436\u0438 \u0435\u0433\u043E \u0432 \u0430\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u043E\u043C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0438 \u043F\u0440\u0438 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0438\n> \u043D\u043E\u0432\u044B\u0445 \u043C\u0435\u0442\u043E\u0434\u043E\u0432.\n' : load();
|
|
25334
25300
|
|
|
25335
25301
|
// src/tools/register.ts
|
|
25302
|
+
import { randomUUID as randomUUID2 } from "node:crypto";
|
|
25336
25303
|
function ok(data) {
|
|
25337
25304
|
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
25338
25305
|
}
|
|
@@ -25372,7 +25339,7 @@ function registerTools(server, deps) {
|
|
|
25372
25339
|
server.registerTool(
|
|
25373
25340
|
"bitrix_call",
|
|
25374
25341
|
{
|
|
25375
|
-
description: "\u0412\u044B\u0437\u0432\u0430\u0442\u044C \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043D\u043D\u044B\u0439 Bitrix24-\u0432\u044B\u0437\u043E\u0432 \u043F\u043E \u0438\u043C\u0435\u043D\u0438 \u0438\u0437 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 (
|
|
25342
|
+
description: "\u0412\u044B\u0437\u0432\u0430\u0442\u044C \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043D\u043D\u044B\u0439 Bitrix24-\u0432\u044B\u0437\u043E\u0432 \u043F\u043E \u0438\u043C\u0435\u043D\u0438 \u0438\u0437 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 (\u0432\u043A\u043B\u044E\u0447\u0430\u044F \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0435 \u2014 \u043A\u0430\u0442\u0430\u043B\u043E\u0433 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F allowlist). \u0414\u0430\u043D\u043D\u044B\u0435 \u0430\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u044B \u043D\u0430 \u043C\u043E\u043C\u0435\u043D\u0442 \u0437\u0430\u043F\u0440\u043E\u0441\u0430. \u0418\u043C\u0435\u043D\u0430: " + deps.catalog.names().join(", "),
|
|
25376
25343
|
inputSchema: { name: external_exports.string(), params: external_exports.record(external_exports.unknown()).optional(), portal: external_exports.string().optional() }
|
|
25377
25344
|
},
|
|
25378
25345
|
async ({ name, params, portal }) => {
|
|
@@ -25429,21 +25396,199 @@ function registerTools(server, deps) {
|
|
|
25429
25396
|
{
|
|
25430
25397
|
tool: "bitrix_chat_messages",
|
|
25431
25398
|
catalogName: "chat.messages",
|
|
25432
|
-
description: "\
|
|
25399
|
+
description: "\u041F\u041E\u0421\u041B\u0415\u0414\u041D\u0418\u0415 N \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u0447\u0430\u0442\u0430 \u043F\u043E chatId (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E 20; im.v2). chatId \u2014 \u0438\u0437 bitrix_chats_recent \u0438\u043B\u0438 \u0438\u0437 \u043E\u0442\u0432\u0435\u0442\u0430 bitrix_chat_load. \u0427\u0442\u043E\u0431\u044B \u043B\u0438\u0441\u0442\u0430\u0442\u044C \u0421\u0422\u0410\u0420\u042B\u0415 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0432\u0433\u043B\u0443\u0431\u044C \u2014 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 bitrix_chat_history: \u044D\u0442\u043E\u0442 \u043C\u0435\u0442\u043E\u0434 (im.v2.Chat.Message.list) \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 \u0438 \u043D\u0430\u0437\u0430\u0434 \u043F\u043E \u043A\u0443\u0440\u0441\u043E\u0440\u0443 \u041D\u0415 \u043B\u0438\u0441\u0442\u0430\u0435\u0442.",
|
|
25433
25400
|
inputSchema: {
|
|
25434
25401
|
chatId: external_exports.union([external_exports.number(), external_exports.string()]),
|
|
25435
25402
|
limit: external_exports.number().optional(),
|
|
25436
|
-
beforeId: external_exports.union([external_exports.number(), external_exports.string()]).optional(),
|
|
25437
25403
|
params: external_exports.record(external_exports.unknown()).optional(),
|
|
25438
25404
|
portal: external_exports.string().optional()
|
|
25439
25405
|
},
|
|
25440
|
-
// im.v2
|
|
25406
|
+
// im.v2.Chat.Message.list returns the latest page only; backward paging lives in
|
|
25407
|
+
// ...Message.tail (bitrix_chat_history). filter[lastId] is not honored here — d22adca7
|
|
25408
|
+
// hit this: beforeId on .list kept returning the same tail. So we don't expose it.
|
|
25441
25409
|
toParams: (a) => ({
|
|
25442
25410
|
chatId: a.chatId,
|
|
25443
|
-
limit: a.limit ?? 20
|
|
25411
|
+
limit: a.limit ?? 20
|
|
25444
25412
|
// G8: sane default guards against huge histories
|
|
25445
|
-
...a.beforeId !== void 0 ? { "filter[lastId]": a.beforeId } : {}
|
|
25446
25413
|
})
|
|
25414
|
+
},
|
|
25415
|
+
{
|
|
25416
|
+
tool: "bitrix_task_get_v2",
|
|
25417
|
+
catalogName: "task.v2.get",
|
|
25418
|
+
description: "\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 v2-\u043F\u043E\u0434\u0441\u0438\u0441\u0442\u0435\u043C\u0443 scrum-\u0431\u043E\u0440\u0434\u0430 (JSON API). taskId \u2014 id \u0437\u0430\u0434\u0430\u0447\u0438.",
|
|
25419
|
+
inputSchema: { taskId: external_exports.union([external_exports.number(), external_exports.string()]), params: external_exports.record(external_exports.unknown()).optional(), portal: external_exports.string().optional() },
|
|
25420
|
+
// v2 wraps the id: { task: { id } } — verified by capture (not the flat { task } older notes claimed)
|
|
25421
|
+
toParams: (a) => ({ task: { id: a.taskId } })
|
|
25422
|
+
},
|
|
25423
|
+
{
|
|
25424
|
+
tool: "bitrix_task_scrum_info",
|
|
25425
|
+
catalogName: "task.scrum.info",
|
|
25426
|
+
description: "Scrum-\u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043F\u043E \u0437\u0430\u0434\u0430\u0447\u0435 (\u0441\u043F\u0440\u0438\u043D\u0442, \u044D\u043F\u0438\u043A, story points \u0438 \u0442.\u043F.; JSON API).",
|
|
25427
|
+
inputSchema: { taskId: external_exports.union([external_exports.number(), external_exports.string()]), params: external_exports.record(external_exports.unknown()).optional(), portal: external_exports.string().optional() },
|
|
25428
|
+
toParams: (a) => ({ taskId: a.taskId })
|
|
25429
|
+
},
|
|
25430
|
+
{
|
|
25431
|
+
tool: "bitrix_task_files",
|
|
25432
|
+
catalogName: "task.files",
|
|
25433
|
+
description: "\u0424\u0430\u0439\u043B\u044B, \u043F\u0440\u0438\u043A\u0440\u0435\u043F\u043B\u0451\u043D\u043D\u044B\u0435 \u043A \u0437\u0430\u0434\u0430\u0447\u0435(\u0430\u043C) (JSON API). ids \u2014 \u043C\u0430\u0441\u0441\u0438\u0432 id \u0437\u0430\u0434\u0430\u0447.",
|
|
25434
|
+
inputSchema: { ids: external_exports.array(external_exports.union([external_exports.number(), external_exports.string()])).min(1), params: external_exports.record(external_exports.unknown()).optional(), portal: external_exports.string().optional() },
|
|
25435
|
+
toParams: (a) => ({ ids: a.ids })
|
|
25436
|
+
},
|
|
25437
|
+
{
|
|
25438
|
+
tool: "bitrix_task_views_count",
|
|
25439
|
+
catalogName: "task.views.count",
|
|
25440
|
+
description: "\u0421\u043A\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u043B\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 (JSON API).",
|
|
25441
|
+
inputSchema: { taskId: external_exports.union([external_exports.number(), external_exports.string()]), params: external_exports.record(external_exports.unknown()).optional(), portal: external_exports.string().optional() },
|
|
25442
|
+
toParams: (a) => ({ task: { id: a.taskId } })
|
|
25443
|
+
},
|
|
25444
|
+
{
|
|
25445
|
+
tool: "bitrix_chat_load",
|
|
25446
|
+
catalogName: "chat.load",
|
|
25447
|
+
description: '\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0447\u0430\u0442 \u0438 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043F\u0435\u0440\u0432\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F. \u0410\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044F: dialogId = ID \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u2192 \u041B\u0418\u0427\u041D\u042B\u0419 \u0447\u0430\u0442 1-\u043D\u0430-1; dialogId = "chat"+CHAT_ID (\u0438\u043B\u0438 chatId = CHAT_ID) \u2192 \u0413\u0420\u0423\u041F\u041F\u041E\u0412\u041E\u0419. \u0427\u0430\u0442 \u043F\u043E \u0417\u0410\u0414\u0410\u0427\u0415: bitrix_task_get \u2192 GROUP_ID \u2192 bitrix_project_get \u2192 CHAT_ID. \u041D\u0435 \u0437\u043D\u0430\u0435\u0448\u044C id \u2014 \u043D\u0430\u0439\u0434\u0438 \u0447\u0435\u0440\u0435\u0437 bitrix_chats_recent \u0438\u043B\u0438 bitrix_entity_selector. \u041E\u0442\u0432\u0435\u0442 \u0432\u0435\u0440\u043D\u0451\u0442 \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0439 chatId \u2014 \u043F\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0439 \u0435\u0433\u043E \u0432 bitrix_chat_history / bitrix_chat_mark_read. messageLimit \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E 25.',
|
|
25448
|
+
inputSchema: {
|
|
25449
|
+
chatId: external_exports.union([external_exports.number(), external_exports.string()]).optional(),
|
|
25450
|
+
dialogId: external_exports.union([external_exports.number(), external_exports.string()]).optional(),
|
|
25451
|
+
messageLimit: external_exports.number().optional(),
|
|
25452
|
+
params: external_exports.record(external_exports.unknown()).optional(),
|
|
25453
|
+
portal: external_exports.string().optional()
|
|
25454
|
+
},
|
|
25455
|
+
toParams: (a) => ({
|
|
25456
|
+
...a.chatId !== void 0 ? { chatId: a.chatId } : {},
|
|
25457
|
+
...a.dialogId !== void 0 ? { dialogId: a.dialogId } : {},
|
|
25458
|
+
...a.messageLimit !== void 0 ? { messageLimit: a.messageLimit } : {}
|
|
25459
|
+
})
|
|
25460
|
+
},
|
|
25461
|
+
{
|
|
25462
|
+
tool: "bitrix_chat_history",
|
|
25463
|
+
catalogName: "chat.messages.tail",
|
|
25464
|
+
description: "\u041B\u0438\u0441\u0442\u0430\u0442\u044C \u0438\u0441\u0442\u043E\u0440\u0438\u044E \u0447\u0430\u0442\u0430 \u0412\u0413\u041B\u0423\u0411\u042C (\u0441\u0442\u0430\u0440\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F). beforeId \u2014 \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 id \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0438\u0437 \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B; \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u0439, \u0443\u043C\u0435\u043D\u044C\u0448\u0430\u044F beforeId, \u0434\u043E \u043D\u0430\u0447\u0430\u043B\u0430 \u0438\u0441\u0442\u043E\u0440\u0438\u0438. limit \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E 25, \u043F\u043E\u0440\u044F\u0434\u043E\u043A \u2014 DESC.",
|
|
25465
|
+
inputSchema: {
|
|
25466
|
+
chatId: external_exports.union([external_exports.number(), external_exports.string()]),
|
|
25467
|
+
beforeId: external_exports.union([external_exports.number(), external_exports.string()]).optional(),
|
|
25468
|
+
limit: external_exports.number().optional(),
|
|
25469
|
+
params: external_exports.record(external_exports.unknown()).optional(),
|
|
25470
|
+
portal: external_exports.string().optional()
|
|
25471
|
+
},
|
|
25472
|
+
toParams: (a) => ({
|
|
25473
|
+
chatId: a.chatId,
|
|
25474
|
+
...a.beforeId !== void 0 ? { "filter[lastId]": a.beforeId } : {},
|
|
25475
|
+
...a.limit !== void 0 ? { limit: a.limit } : {}
|
|
25476
|
+
})
|
|
25477
|
+
},
|
|
25478
|
+
{
|
|
25479
|
+
tool: "bitrix_chat_mark_read",
|
|
25480
|
+
catalogName: "chat.message.read",
|
|
25481
|
+
description: "\u26A0 \u041C\u0423\u0422\u0418\u0420\u0423\u042E\u0429\u0418\u0419. \u041F\u043E\u043C\u0435\u0442\u0438\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0447\u0430\u0442\u0430 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u043C\u0438. ids \u2014 \u043C\u0430\u0441\u0441\u0438\u0432 id \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439; actionUuid \u0433\u0435\u043D\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438, \u0435\u0441\u043B\u0438 \u043D\u0435 \u043F\u0435\u0440\u0435\u0434\u0430\u043D.",
|
|
25482
|
+
inputSchema: {
|
|
25483
|
+
chatId: external_exports.union([external_exports.number(), external_exports.string()]),
|
|
25484
|
+
ids: external_exports.array(external_exports.union([external_exports.number(), external_exports.string()])).min(1),
|
|
25485
|
+
actionUuid: external_exports.string().optional(),
|
|
25486
|
+
params: external_exports.record(external_exports.unknown()).optional(),
|
|
25487
|
+
portal: external_exports.string().optional()
|
|
25488
|
+
},
|
|
25489
|
+
toParams: (a) => ({ chatId: a.chatId, ids: a.ids, actionUuid: a.actionUuid ?? randomUUID2() })
|
|
25490
|
+
},
|
|
25491
|
+
{
|
|
25492
|
+
tool: "bitrix_entity_selector",
|
|
25493
|
+
catalogName: "entityselector.load",
|
|
25494
|
+
description: '\u041F\u043E\u0438\u0441\u043A/\u0440\u0435\u0437\u043E\u043B\u0432 \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0435\u0439 (\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0438, \u043F\u0440\u043E\u0435\u043A\u0442\u044B, \u0447\u0430\u0442\u044B) \u0447\u0435\u0440\u0435\u0437 entityselector (JSON API). \u041D\u0430\u0439\u0442\u0438 \u0427\u0410\u0422/\u0434\u0438\u0430\u043B\u043E\u0433: dialog={id:"im-chat-search",context:"IM_CHAT_SEARCH",entities:[{id:"im-recent-v2",dynamicLoad:true,dynamicSearch:true}]}. \u041D\u0430\u0439\u0442\u0438 \u041F\u041E\u041B\u042C\u0417\u041E\u0412\u0410\u0422\u0415\u041B\u042F: entities:[{id:"user"}]. \u0421\u0432\u043E\u0431\u043E\u0434\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u0437\u0430\u043F\u0440\u043E\u0441 \u0441\u0432\u0435\u0440\u044C \u0440\u0435\u0432\u0435\u0440\u0441\u043E\u043C.',
|
|
25495
|
+
inputSchema: { dialog: external_exports.record(external_exports.unknown()), params: external_exports.record(external_exports.unknown()).optional(), portal: external_exports.string().optional() },
|
|
25496
|
+
toParams: (a) => ({ dialog: a.dialog })
|
|
25497
|
+
},
|
|
25498
|
+
{
|
|
25499
|
+
tool: "bitrix_recent_load",
|
|
25500
|
+
catalogName: "recent.load",
|
|
25501
|
+
description: '\u041D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u0447\u0430\u0442\u044B \u043F\u043E \u0421\u0415\u041A\u0426\u0418\u0418 (im.v2). section: "tasksTask" \u2014 \u0427\u0410\u0422\u042B \u0417\u0410\u0414\u0410\u0427 (\u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u044F \u0437\u0430\u0434\u0430\u0447; \u0432 bitrix_chats_recent \u0438\u0445 \u043D\u0435\u0442), "collab"/"collabDefault" \u2014 \u043A\u043E\u043B\u043B\u0430\u0431\u044B, \u0438\u043D\u0430\u0447\u0435 \u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0434\u0438\u0430\u043B\u043E\u0433\u0438. \u041E\u0442\u0434\u0430\u0451\u0442 chatId/dialogId \u2014 \u0434\u0430\u043B\u044C\u0448\u0435 \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0439 bitrix_chat_load. \u041B\u0438\u0441\u0442\u0430\u0442\u044C \u0433\u043B\u0443\u0431\u0436\u0435 \u2014 bitrix_recent_tail.',
|
|
25502
|
+
inputSchema: {
|
|
25503
|
+
section: external_exports.string().optional(),
|
|
25504
|
+
limit: external_exports.number().optional(),
|
|
25505
|
+
unread: external_exports.boolean().optional(),
|
|
25506
|
+
parentId: external_exports.union([external_exports.number(), external_exports.string()]).optional(),
|
|
25507
|
+
params: external_exports.record(external_exports.unknown()).optional(),
|
|
25508
|
+
portal: external_exports.string().optional()
|
|
25509
|
+
},
|
|
25510
|
+
toParams: (a) => ({
|
|
25511
|
+
limit: a.limit ?? 50,
|
|
25512
|
+
...a.section !== void 0 ? { "filter[recentSection]": a.section } : {},
|
|
25513
|
+
...a.parentId !== void 0 ? { "filter[parentId]": a.parentId } : {},
|
|
25514
|
+
"filter[unread]": a.unread ? "Y" : "N"
|
|
25515
|
+
})
|
|
25516
|
+
},
|
|
25517
|
+
{
|
|
25518
|
+
tool: "bitrix_recent_tail",
|
|
25519
|
+
catalogName: "recent.tail",
|
|
25520
|
+
description: "\u041B\u0438\u0441\u0442\u0430\u0442\u044C \u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u0412\u0413\u041B\u0423\u0411\u042C (im.v2). lastMessageDate \u2014 ISO-\u0434\u0430\u0442\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B (\u043A\u0443\u0440\u0441\u043E\u0440); section \u2014 \u043A\u0430\u043A \u0432 bitrix_recent_load. \u041F\u043E\u0432\u0442\u043E\u0440\u044F\u0439, \u0441\u0434\u0432\u0438\u0433\u0430\u044F lastMessageDate.",
|
|
25521
|
+
inputSchema: {
|
|
25522
|
+
lastMessageDate: external_exports.string(),
|
|
25523
|
+
section: external_exports.string().optional(),
|
|
25524
|
+
limit: external_exports.number().optional(),
|
|
25525
|
+
unread: external_exports.boolean().optional(),
|
|
25526
|
+
params: external_exports.record(external_exports.unknown()).optional(),
|
|
25527
|
+
portal: external_exports.string().optional()
|
|
25528
|
+
},
|
|
25529
|
+
toParams: (a) => ({
|
|
25530
|
+
limit: a.limit ?? 50,
|
|
25531
|
+
"filter[lastMessageDate]": a.lastMessageDate,
|
|
25532
|
+
...a.section !== void 0 ? { "filter[recentSection]": a.section } : {},
|
|
25533
|
+
"filter[unread]": a.unread ? "Y" : "N"
|
|
25534
|
+
})
|
|
25535
|
+
},
|
|
25536
|
+
{
|
|
25537
|
+
tool: "bitrix_entity_search",
|
|
25538
|
+
catalogName: "entityselector.search",
|
|
25539
|
+
description: '\u0422\u0415\u041A\u0421\u0422\u041E\u0412\u042B\u0419 \u043F\u043E\u0438\u0441\u043A \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 entityselector (JSON API). query \u2014 \u0441\u0442\u0440\u043E\u043A\u0430 \u043F\u043E\u0438\u0441\u043A\u0430. \u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0438\u0449\u0435\u0442 \u0447\u0430\u0442\u044B/\u0434\u0438\u0430\u043B\u043E\u0433\u0438 (context IM_CHAT_SEARCH); section: "tasksTask" \u2014 \u0441\u0440\u0435\u0434\u0438 \u0447\u0430\u0442\u043E\u0432 \u0437\u0430\u0434\u0430\u0447, "default" \u2014 \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445. \u0414\u043B\u044F \u0438\u043D\u044B\u0445 \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0435\u0439 \u043F\u0435\u0440\u0435\u0434\u0430\u0439 \u0441\u0432\u043E\u0439 dialog \u0446\u0435\u043B\u0438\u043A\u043E\u043C.',
|
|
25540
|
+
inputSchema: {
|
|
25541
|
+
query: external_exports.string(),
|
|
25542
|
+
section: external_exports.string().optional(),
|
|
25543
|
+
dialog: external_exports.record(external_exports.unknown()).optional(),
|
|
25544
|
+
params: external_exports.record(external_exports.unknown()).optional(),
|
|
25545
|
+
portal: external_exports.string().optional()
|
|
25546
|
+
},
|
|
25547
|
+
toParams: (a) => ({
|
|
25548
|
+
dialog: a.dialog ?? {
|
|
25549
|
+
id: "im-chat-search",
|
|
25550
|
+
context: "IM_CHAT_SEARCH",
|
|
25551
|
+
entities: [{ id: "im-recent-v2", dynamicLoad: true, dynamicSearch: true, options: { searchRecentSection: a.section ?? "default", parentId: 0 } }],
|
|
25552
|
+
preselectedItems: [],
|
|
25553
|
+
clearUnavailableItems: false
|
|
25554
|
+
},
|
|
25555
|
+
searchQuery: { query: a.query, queryWords: [a.query] }
|
|
25556
|
+
})
|
|
25557
|
+
},
|
|
25558
|
+
{
|
|
25559
|
+
tool: "bitrix_chat_get_dialog_id",
|
|
25560
|
+
catalogName: "chat.dialogId",
|
|
25561
|
+
description: '\u0420\u0435\u0437\u043E\u043B\u0432 dialogId \u0447\u0430\u0442\u0430 \u043F\u043E externalId (im.v2). \u041D\u0430\u043F\u0440. externalId "sg"+<groupId> \u2192 dialogId \u0447\u0430\u0442\u0430 \u0441\u043E\u0446\u0433\u0440\u0443\u043F\u043F\u044B/\u043F\u0440\u043E\u0435\u043A\u0442\u0430. \u0417\u0430\u0442\u0435\u043C \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0439 \u0447\u0435\u0440\u0435\u0437 bitrix_chat_load.',
|
|
25562
|
+
inputSchema: { externalId: external_exports.string(), params: external_exports.record(external_exports.unknown()).optional(), portal: external_exports.string().optional() },
|
|
25563
|
+
toParams: (a) => ({ externalId: a.externalId })
|
|
25564
|
+
},
|
|
25565
|
+
{
|
|
25566
|
+
tool: "bitrix_chat_read_all",
|
|
25567
|
+
catalogName: "chat.read.all",
|
|
25568
|
+
description: "\u26A0 \u041C\u0423\u0422\u0418\u0420\u0423\u042E\u0429\u0418\u0419. \u041F\u043E\u043C\u0435\u0442\u0438\u0442\u044C \u0412\u0421\u0415 \u0447\u0430\u0442\u044B \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u043C\u0438 (im.v2). \u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u043D\u0435\u0442.",
|
|
25569
|
+
inputSchema: { params: external_exports.record(external_exports.unknown()).optional(), portal: external_exports.string().optional() },
|
|
25570
|
+
toParams: () => ({})
|
|
25571
|
+
},
|
|
25572
|
+
{
|
|
25573
|
+
tool: "bitrix_task_subtasks",
|
|
25574
|
+
catalogName: "task.subtasks",
|
|
25575
|
+
description: "\u041F\u043E\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 (v2 relations, JSON API). taskId \u2014 id \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044F. navigation.size \u0443\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435\u0439.",
|
|
25576
|
+
inputSchema: { taskId: external_exports.union([external_exports.number(), external_exports.string()]), params: external_exports.record(external_exports.unknown()).optional(), portal: external_exports.string().optional() },
|
|
25577
|
+
toParams: (a) => ({ taskId: a.taskId, withIds: true, withCompleted: true, withSubTasks: true, navigation: { size: 10 } })
|
|
25578
|
+
},
|
|
25579
|
+
{
|
|
25580
|
+
tool: "bitrix_task_related",
|
|
25581
|
+
catalogName: "task.related",
|
|
25582
|
+
description: "\u0421\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 (v2 relations, JSON API). taskId \u2014 id \u0437\u0430\u0434\u0430\u0447\u0438.",
|
|
25583
|
+
inputSchema: { taskId: external_exports.union([external_exports.number(), external_exports.string()]), params: external_exports.record(external_exports.unknown()).optional(), portal: external_exports.string().optional() },
|
|
25584
|
+
toParams: (a) => ({ taskId: a.taskId, withIds: true, withCompleted: true, withSubTasks: true, navigation: { size: 10 } })
|
|
25585
|
+
},
|
|
25586
|
+
{
|
|
25587
|
+
tool: "bitrix_user_get",
|
|
25588
|
+
catalogName: "im.user.get",
|
|
25589
|
+
description: "\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440\u0430 \u043F\u043E id (\u0438\u043C\u044F, \u0430\u0432\u0430\u0442\u0430\u0440, \u0441\u0442\u0430\u0442\u0443\u0441). userId \u2014 id \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F.",
|
|
25590
|
+
inputSchema: { userId: external_exports.union([external_exports.number(), external_exports.string()]), params: external_exports.record(external_exports.unknown()).optional(), portal: external_exports.string().optional() },
|
|
25591
|
+
toParams: (a) => ({ ID: a.userId })
|
|
25447
25592
|
}
|
|
25448
25593
|
];
|
|
25449
25594
|
const available = new Set(deps.catalog.names());
|
|
@@ -25596,7 +25741,7 @@ function buildManifest(config2) {
|
|
|
25596
25741
|
manifest_version: 3,
|
|
25597
25742
|
name: "Bitrix24 MCP Bridge",
|
|
25598
25743
|
version: "0.1.0",
|
|
25599
|
-
description: "\u041E\u0442\u0434\u0430\u0451\u0442 \
|
|
25744
|
+
description: "\u041E\u0442\u0434\u0430\u0451\u0442 \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0441\u0435\u0441\u0441\u0438\u044E Bitrix24 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u043C\u0443 MCP-\u0441\u0435\u0440\u0432\u0435\u0440\u0443 (\u0447\u0442\u0435\u043D\u0438\u0435 \u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u0432\u044B\u0437\u043E\u0432\u043E\u0432 \u0438\u0437 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430).",
|
|
25600
25745
|
host_permissions: matches,
|
|
25601
25746
|
content_scripts: [
|
|
25602
25747
|
{ matches, js: ["connector.js"], world: "ISOLATED", run_at: "document_idle" },
|