bitrix24-mcp-bridge 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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 (read-only). \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(", "),
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: "\u0418\u0441\u0442\u043E\u0440\u0438\u044F \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 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0445; beforeId \u2014 \u043B\u0438\u0441\u0442\u0430\u0442\u044C \u0432\u0433\u043B\u0443\u0431\u044C). chatId \u0438\u0437 bitrix_chats_recent (im.v2).",
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 param names (this portal's messenger): chatId / limit / filter[lastId]
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 \u0434\u0430\u043D\u043D\u044B\u0435 \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 Bitrix24 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u043C\u0443 MCP-\u0441\u0435\u0440\u0432\u0435\u0440\u0443 (read-only).",
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" },