Для AI-агентов: markdown этой страницы — /docs-content/entities/tasks/dependencies.md индекс документации — /llms.txt

Связи задач

Связи задачи — это её предшественники: задачи, от которых она зависит. В карточке Битрикс24 они показаны блоком «Связанные задачи». Ресурс только для чтения.

Битрикс24 API: tasks.task.get (поле RELATED_TASKS) Скоуп: task

Операции

  • GET /v1/tasks/:taskId/dependencies — связи одной задачи
  • POST /v1/tasks/dependencies/bulk — связи до 50 задач одним вызовом

Что нужно знать до интеграции

Отдаются только предшественники. Обратного ребра — «кто зависит от этой задачи» — REST Битрикс24 не отдаёт ни одним методом. Дашборд, которому нужен граф целиком, строит обратные рёбра сам, инверсией собранных пар. Ради этого и существует пакетный вызов: собрать пары по сотне задач одним запросом дешевле, чем сотней.

Тип связи не читается. У связи в Битрикс24 есть тип (например, «финиш-старт»), но ни один метод REST его не возвращает. Поэтому поле типа здесь не публикуется вовсе: пустое или угаданное значение в контракте хуже, чем его отсутствие.

Связи, созданные «гантт-методом», не видны. Битрикс24 хранит связи в двух местах. Штатные — те, что записаны при создании или изменении задачи, — читаются. Связи, добавленные методом task.dependence.add, физически существуют, но не возвращаются ни одним методом чтения, включая task.item.getdependson. Отличить «связей нет» от «связи есть, но в невидимом хранилище» невозможно — ни через это API, ни через сырой REST.

В списке задач связей нет. GET /v1/tasks и POST /v1/tasks/search поля связей не отдают: Битрикс24 молча выбрасывает его из ответа списка при любом select. Отсюда отдельный ресурс.

Задача может ссылаться сама на себя. Если это так, самопетля приезжает как есть — это факт из портала, а не ошибка ответа. Дашборд, строящий граф инверсией пар, должен быть к ней готов.

Связи одной задачи — `GET /v1/tasks/:taskId/dependencies`

Terminal
curl -H "X-Api-Key: $KEY" \
  "https://vibecode.bitrix24.tech/v1/tasks/4029/dependencies"
JSON
{
  "success": true,
  "data": [
    { "id": 4023, "title": "Подготовить смету" },
    { "id": 4027, "title": "Согласовать бюджет" }
  ],
  "meta": { "total": 2, "hasMore": false, "direction": "predecessors", "source": "RELATED_TASKS" }
}

Записи отсортированы по id по возрастанию. title может быть null — тогда название задачи портал не отдал. meta.total всегда равен длине data.

Код HTTP Когда
INVALID_PARAMS 400 taskId не положительное целое
TOKEN_MISSING 401 у ключа нет кредов портала
SCOPE_DENIED 403 у ключа нет скоупа task
TASK_NOT_FOUND 404 задачи нет либо она не видна ключу — оба случая отвечают одинаково
DEPENDENCY_LIMIT_EXCEEDED 422 связей у задачи больше, чем эндпоинт отдаёт. Ответ не усекается никогда: либо полный, либо этот отказ

Транзиентный отказ портала — превышение лимита запросов, недоступность Битрикс24, протухший токен — приходит своим кодом, а не подменяется на TASK_NOT_FOUND.

Пакетный вызов — `POST /v1/tasks/dependencies/bulk`

Terminal
curl -X POST -H "X-Api-Key: $KEY" -H "Content-Type: application/json" \
  -d '{"taskIds": [4029, 4033, 4041]}' \
  "https://vibecode.bitrix24.tech/v1/tasks/dependencies/bulk"
JSON
{
  "success": true,
  "data": {
    "results": { "4029": [ { "id": 4023, "title": "Подготовить смету" } ], "4033": [] },
    "errors":  { "4041": { "code": "TASK_NOT_FOUND", "message": "Task not found." } }
  },
  "meta": { "requested": 3, "succeeded": 2, "failed": 1, "direction": "predecessors", "source": "RELATED_TASKS" }
}

taskIds принимает и числа, и десятичные строки: ["4029"] эквивалентно [4029].

Ответ приходит с кодом 200 даже тогда, когда отказали все подвызовы. Частичный отказ — это смысл пакетного вызова, поэтому проверять надо errors, а не только results.

Дубли схлопываются молча, и meta.requested считает уникальные идентификаторы. Поэтому requested всегда равен succeeded + failed. А вот позиция в сообщении об ошибке INVALID_PARAMS считается по исходному массиву — это две разные системы координат в одном ответе, и обе названы намеренно.

Коды в errors — закрытый набор:

Код Когда
TASK_NOT_FOUND задачи нет либо она не видна ключу
RATE_LIMITED подвызов отбит ограничением частоты
OPERATION_TIME_LIMIT портал попросил снизить нагрузку
UPSTREAM_INCOMPLETE годного ответа по этому идентификатору не получено
DEPENDENCY_LIMIT_EXCEEDED у этой задачи связей больше, чем эндпоинт отдаёт

Отказы всего запроса:

Код Когда
INVALID_REQUEST тела нет, оно не объект, taskIds не массив или пустой
INVALID_PARAMS элемент не положительное целое; сообщение указывает позицию в исходном массиве
BATCH_LIMIT_EXCEEDED два разных условия: больше 500 элементов в исходном массиве либо больше 50 уникальных идентификаторов после схлопывания дублей
SCOPE_DENIED / TOKEN_MISSING как у одиночного вызова, проверяются первыми

Пакетный вызов ограничен по частоте на портал, а не на ключ: два ключа одного портала делят одно ведро, и разогнать выдачу вторым ключом не получится. При превышении приходит 429, актуальное число и Retry-After — в теле ответа.

Заголовок Content-Type: application/json обязателен, если тело непустое. Пустое тело и запрос без заголовка обрабатываются штатно и отвечают INVALID_REQUEST.

Запись связей

Отдельного эндпоинта записи нет. Набор связей меняется полем DEPENDS_ON в обновлении задачи, и семантика там — полная замена набора, а не добавление: переданный список вытесняет прежний целиком, а пустой список очищает связи.

Смотрите также