Коды ошибок REST API модуля ithive.ipr
Методы ipr.* возвращают ошибки в конверте модуля (Vibe API) внутри стандартной обёртки Bitrix REST.
Полный перечень кодов совпадает с IPR\Rest\RestApi. На страницах методов указаны только актуальные для конкретного endpoint'а коды — этот справочник содержит все коды модуля.
Формат ответа при ошибке
{
"result": {
"result": null,
"total": null,
"next": null,
"error": {
"code": "VALIDATION_ERROR",
"message": "Required parameter \"userId\" must be a positive integer",
"details": {
"field": "userId"
}
}
},
"time": {}
}
details опционален (часто field, id, userId, allowed и т. п.). Ошибки доменных сервисов (ipr.employee.update, ipr.point.set, ipr.course.review.*) дополнительно несут машинный ключ details.reason — он описан на страницах методов.
HTTP-статус
HTTP-статус ответа выставляется по коду ошибки (RestApi::getHttpStatusForCode). Важная особенность модуля: коды, не перечисленные явно в таблице ниже как 401/403/500, отдаются с HTTP 400 (в том числе NOT_FOUND и METHOD_NOT_FOUND) — в отличие от привычного REST-соглашения «404 для NOT_FOUND». Ориентируйтесь на поле error.code в теле ответа, а не только на HTTP-статус.
Общие коды
| Код | HTTP | Когда возникает |
|---|---|---|
UNAUTHORIZED |
401 | Пользователь не авторизован (нет пользователя в контексте REST-вызова) |
PERMISSION_DENIED |
403 | Недостаточно прав на операцию или сущность. В коде также встречается алиас ERROR_ACCESS_DENIED — это то же самое значение PERMISSION_DENIED, отдельного кода ACCESS_DENIED в ответах нет |
VALIDATION_ERROR |
400 | Некорректные, неполные или несовместимые параметры запроса |
NOT_FOUND |
400 | Сущность не найдена или недоступна вызывающему |
INVALID_LIMIT |
400 | limit не является положительным целым числом |
LIMIT_EXCEEDED |
400 | limit больше 500 |
INVALID_OFFSET |
400 | offset отрицательный |
INVALID_FILTER |
400 | Некорректная структура filter (например, пустой массив в $in/$nin) либо неизвестное поле фильтра (details.field) |
INVALID_FILTER_OPERATOR |
400 | Неизвестный оператор фильтра (разрешены $eq, $ne, $gt, $gte, $lt, $lte, $in, $nin) |
FETCH_ALL_LIMIT_EXCEEDED |
400 | При fetchAll=true количество подходящих записей больше 5000 |
METHOD_NOT_FOUND |
400 | Метод REST не зарегистрирован (зарезервированный код; фактически на неизвестный метод отвечает REST-движок Bitrix) |
NOT_IMPLEMENTED |
400 | Метод зарегистрирован, но бизнес-логика ещё не реализована |
IPR_ALREADY_EXISTS |
400 | У сотрудника уже достигнут лимит активных ИПР/ПИС (опция модуля «Количество возможных программ», по умолчанию 2) |
FILE_TOO_LARGE |
400 | Загружаемый файл превышает лимит размера (зарезервировано) |
INTERNAL_ERROR |
500 | Непредвиденная ошибка на сервере. Сообщение всегда общее: Internal error; причина — в error.details.reason (если есть), подробности пишутся только в журнал сервера |
Сообщения VALIDATION_ERROR, NOT_FOUND и PERMISSION_DENIED адресованы пользователю и приходят без изменений; внутренние детали (тексты исключений) клиенту не отдаются.
Специфичные для методов ситуации
ipr.ipr.add/ipr.programtemplate.launch/ipr.programtemplate.masslaunch— при достижении лимита активных программ у сотрудника:IPR_ALREADY_EXISTS.ipr.ipr.draft.add— те же коды и условия, что уipr.ipr.add(включаяIPR_ALREADY_EXISTS), карточка при этом не создаётся.ipr.ipr.draft.get— черновик не найден:NOT_FOUND(details.reason = draft_not_found); черновик другого пользователя у непривилегированного актора:PERMISSION_DENIED(details.reason = draft_foreign); payload больше 256 КБ:VALIDATION_ERROR(details.reason = draft_payload_too_large).ipr.ipr.update(сменаstatus),ipr.ipr.complete/approve/reject/reopen— недопустимый переход статуса из текущего состояния карточки:VALIDATION_ERROR(полеstatusвdetails).ipr.ipr.delete,ipr.action.delete(безforce) — попытка удалить карточку/обязательное действие без прав или в неудаляемом состоянии:PERMISSION_DENIED.ipr.test.attempt.start— если у теста нет привязанных вопросов:VALIDATION_ERROR; исчерпан лимит попыток теста (details.limit):VALIDATION_ERROR;userIdне совпадает с текущим пользователем:PERMISSION_DENIED; тест неактивен или недоступен по ACL обучения:NOT_FOUND.ipr.test.attempt.answer— вопрос не относится к попытке или попытка уже завершена (STATUS = F):VALIDATION_ERROR/NOT_FOUND; на вопрос уже дан ответ (повторный ответ запрещён):VALIDATION_ERROR.ipr.lesson.add/relation.update,ipr.question.add,ipr.test.add/update— урок не входит в дерево указанного курса:PERMISSION_DENIED(details.lessonId,details.courseId).- Методы, зависящие от модуля
iblockилиlearning(все, кромеcurrentUser/schema/history.*): если модуль не подключён на портале —INTERNAL_ERROR.