# Действия над чек-листом и файл задачи

Эти маршруты оборачивают `tasks.task.checklist.*` и `tasks.task.files.attach`. Это другое семейство Bitrix24, чем [старые маршруты `task.checklistitem.*`](./checklist.md). Для всех вызовов нужны API-ключ со скоупом `task` или `tasks` и право на запись. Каждый ответ имеет вид `{ "success": true, "data": <result Bitrix24> }`: значение `result` передаётся без перестройки. Ошибки Bitrix24 проходят через обычную обработку ошибок `/v1`.

| Метод и путь | Bitrix24 | Тело JSON |
| --- | --- | --- |
| `POST /v1/tasks/:taskId/checklist/tree` | `tasks.task.checklist.save` | `{ "items": [...], "parameters"?: { ... } }` |
| `POST /v1/tasks/:taskId/checklist/:itemId/complete-all` | `tasks.task.checklist.completeAll` | не требуется |
| `POST /v1/tasks/:taskId/checklist/:itemId/move-before` | `tasks.task.checklist.moveBefore` | `{ "beforeItemId": 123 }` |
| `POST /v1/tasks/:taskId/checklist/:itemId/move-after` | `tasks.task.checklist.moveAfter` | `{ "afterItemId": 123 }` |
| `POST /v1/tasks/:taskId/checklist/:itemId/members` | `tasks.task.checklist.addMembers` | `{ "members": { "42": "A" } }` |
| `POST /v1/tasks/:taskId/checklist/:itemId/members/remove` | `tasks.task.checklist.removeMembers` | `{ "membersIds": [42] }` |
| `POST /v1/tasks/:taskId/checklist/:itemId/attachments/content` | `tasks.task.checklist.addAttachmentByContent` | `{ "attachmentParameters": { "NAME": "file.txt", "CONTENT": "<base64>" } }` |
| `POST /v1/tasks/:taskId/checklist/:itemId/attachments/disk` | `tasks.task.checklist.addAttachmentsFromDisk` | `{ "filesIds": [123] }` |
| `POST /v1/tasks/:taskId/checklist/:itemId/attachments/remove` | `tasks.task.checklist.removeAttachments` | `{ "attachmentsIds": [456] }` |
| `POST /v1/tasks/:taskId/files/attach` | `tasks.task.files.attach` | `{ "fileId": 123 }` |

`taskId` и `itemId` — положительные целые числа. `save` передаёт массив `items` как есть: формирование узлов дерева и проверка прав выполняются Bitrix24. Массив плоский: у каждого пункта есть уникальный `NODE_ID`, корневой пункт задаёт `PARENT_NODE_ID: 0`, а дочерний ссылается на `NODE_ID` родителя через `PARENT_NODE_ID`. Новому пункту нужен `TITLE`; вложенное поле `CHILDREN` контроллер не сохраняет.

`save` **заменяет весь чек-лист задачи**: старые пункты, которых нет в `items`, удаляются. `"items": []` удаляет все пункты. Для сохранения существующего пункта передайте его верхнерегистровый `ID` вместе с полным актуальным набором; без `ID` Bitrix24 создаёт новую запись и удаляет старую. Успешный вызов с непустым массивом возвращает `data.checkListItem.traversedItems` как объект с ключами `NODE_ID` и `data.checkListItem.taskId: null`. При пустом массиве `data.checkListItem` равен `[]`.

```json
{"items":[{"ID":9,"NODE_ID":"root-1","PARENT_NODE_ID":0,"TITLE":"Подготовить выпуск","IS_COMPLETE":false,"IS_IMPORTANT":false},{"NODE_ID":"child-1","PARENT_NODE_ID":"root-1","TITLE":"Проверить чек-лист","IS_COMPLETE":false,"IS_IMPORTANT":false}]}
```

`completeAll` возвращает массив пунктов, действия над одним пунктом — объект `checkListItem`; `files.attach` возвращает объект `attachmentId` с ID **связи** файла с задачей. `fileId` — ID уже существующего файла Диска. Загрузка файла здесь не выполняется.

Содержимое для `addAttachmentByContent` передаётся в JSON как base64; действует обычный лимит размера тела `/v1` (1 MiB). Отдельный multipart или URL transport для этого маршрута не добавлен.
