ipr.ipr.draft.add
Scope:
iprКто может вызывать: те же правила, что у ipr.ipr.add: актор готовит карточку себе (
userId == текущий пользователь) либо может управлять сотрудником (canManageEmployee: руководитель по оргструктуре, участник группы ИПР/HR, администратор). Подробнее: Роли и права доступа
Проверяет данные для создания карточки ИПР/ПИС так же, как ipr.ipr.add, но карточку не создаёт. Проверенные данные сохраняются как черновик, а в ответе возвращается ссылка на штатную форму создания ИПР с параметром DRAFT_ID: форма открывается с предзаполненными полями, и карточку создаёт пользователь кнопкой «Создать». Сценарий HR-ассистента: ассистент собирает данные, пользователь утверждает их в знакомой форме.
HTTP: POST
Побочные эффекты: Создаёт запись черновика (таблица ithive_ipr_program_draft); у автора остаётся не более 50 неиспользованных черновиков — самые старые удаляются при создании нового. Элементы инфоблока ИПР, компетенции и действия не создаются.
Параметры метода
Состав, типы, алиасы и правила проверки параметров полностью совпадают с ipr.ipr.add.
| Параметр | Тип | Обяз. | Описание |
|---|---|---|---|
userId |
int |
да | ID сотрудника, для которого готовится карточка |
managerId |
int |
да | ID руководителя, должен отличаться от userId |
competenceIds |
int[] |
да | ID компетенций каталога (минимум одна) |
type |
string |
нет | IPR | PIS. По умолчанию — тип шаблона или IPR |
templateId |
int |
нет | ID шаблона программы |
title |
string |
нет | Название, максимум 255 символов |
deadline |
string |
нет | Дедлайн YYYY-MM-DD; если не задан — вычисляется из term |
term |
int |
нет | Срок в месяцах |
sendBossAgreement |
bool |
нет | Согласование руководителем, по умолчанию true |
positionId |
int |
нет | Текущая должность |
targetPositionId |
int |
нет | Целевая должность |
nextTemplateId |
int |
нет | Шаблон следующей программы |
observers |
int[] |
нет | Наблюдатели |
targetFunction |
string |
нет | Целевая функция |
competenceDeadlines |
object |
нет | { "<competenceId>": "YYYY-MM-DD" } |
competenceRunOptions |
object |
нет | Действия по компетенциям: ключи строго <type>_<id>, набор полей и проверка дат как в ipr.ipr.add (лишние поля отбрасываются, неверный ключ или дата — VALIDATION_ERROR) |
competenceGoals |
object |
нет | Цели по компетенциям: { "<competenceId>": "текст цели" }. HTML удаляется, пустые значения отбрасываются, максимум 4000 символов на цель |
Проверяются права актора, существование сотрудника, руководителя и шаблона, тип программы, лимит активных программ сотрудника (IPR_ALREADY_EXISTS), формат дат и даты проведения мероприятий в competenceRunOptions.
Как форма использует черновик. Форма создания читает DRAFT_ID и подставляет сотрудника, руководителя, шаблон, срок и дату завершения, отмечает компетенции (с индивидуальными сроками из competenceDeadlines), цели и развивающие действия, наблюдателей и название. Черновик с templateId открывает форму в режиме ИПР/ПИС с выбранным шаблоном: срок в месяцах, целевая функция, целевая должность и согласование берутся из шаблона, как при ручном выборе, а дата завершения, компетенции с их сроками, цели, действия и наблюдатели — из черновика; черновик без templateId открывает форму в режиме свободного выбора компетенций. Открыть черновик может только его автор или привилегированный пользователь; несуществующий или чужой черновик открывает пустую форму с предупреждением. После нажатия «Создать» черновик помечается использованным (usedAt, iprId); повторное открытие использованного черновика тоже даёт пустую форму с предупреждением и ссылкой на созданную карточку, чтобы не создать дубль.
Размер сохраняемого payload ограничен 256 КБ (VALIDATION_ERROR, details.reason = draft_payload_too_large). Черновики не имеют срока действия: неиспользованные хранятся, пока их не вытеснят более новые (не более 50 на автора), использованные остаются как ссылка на созданную карточку.
Права на «Создать» в форме совпадают с ipr.ipr.add: администратор и группа ИПР/HR, руководитель по оргструктуре, текущий руководитель сотрудника, а себе — по настройкам доступа модуля (access_to_ipr / access_to_pis). Ограничение формы: черновик типа PIS без templateId открывается в режиме свободного выбора и создаёт ИПР, поэтому для ПИС всегда передавайте templateId.
Возвращаемые данные
| Поле | Тип | Описание |
|---|---|---|
id |
int |
ID черновика |
url |
string |
Ссылка на форму создания ИПР с черновиком: /university/ipr/add/?DRAFT_ID=<id> (относительно каталога сайта). Открывается в слайдере (BX.SidePanel.Instance.open(url)) или как обычная страница |
userId |
int |
Сотрудник |
createdBy |
int |
Автор черновика (актор) |
createdAt |
string |
Дата создания, YYYY-MM-DD HH:MM:SS (время сервера) |
usedAt |
string|null |
Когда по черновику создана карточка; null, пока форма не сохранена |
iprId |
int|null |
ID созданной по черновику карточки, если она уже создана |
payload |
object |
Нормализованные данные черновика, см. ниже |
Структура payload
Это проверенные и приведённые к единому виду параметры запроса — ровно то, что подставляется в форму.
| Поле | Тип | Описание |
|---|---|---|
userId, managerId |
int |
Сотрудник и руководитель |
competenceIds |
int[] |
Компетенции каталога |
type |
string |
IPR | PIS |
templateId |
int|null |
Шаблон программы |
title |
string |
Название (пустая строка — форма подставит своё) |
deadline |
string|null |
Дедлайн, как был передан |
dateClose |
string |
Плановая дата завершения YYYY-MM-DD: deadline, либо вычислена из term |
term |
int |
Срок в месяцах |
pisPeriod |
string|null |
Для PIS — XML_ID периода (PERIOD_PIS), иначе null |
sendBossAgreement |
bool |
Согласование руководителем |
positionId, targetPositionId, nextTemplateId |
int |
0, если не задано |
targetFunction |
string |
Целевая функция |
observers |
int[] |
Наблюдатели |
competenceDeadlines |
object |
{ "<competenceId>": "YYYY-MM-DD" } только для явно переданных компетенций; некорректная дата — VALIDATION_ERROR |
competenceRunOptions |
object |
Нормализованы: ключи <type>_<id>, только разрешённые поля, даты проверены |
competenceGoals |
object |
{ "<competenceId>": "текст" } без пустых значений |
Обработка ошибок
Справочник кодов: error-codes.md. Коды и условия совпадают с ipr.ipr.add.
| Код | Описание |
|---|---|
UNAUTHORIZED |
Пользователь не авторизован |
VALIDATION_ERROR |
Не передан обязательный параметр, managerId == userId, некорректный deadline/type, title длиннее 255 символов, цель длиннее 4000 символов, ключ действия не вида <type>_<id> или дата действия некорректна, дата проведения в competenceRunOptions не относится к мероприятию; details.reason = draft_payload_too_large — payload больше 256 КБ |
NOT_FOUND |
Сотрудник, руководитель, templateId или дата проведения мероприятия не найдены |
PERMISSION_DENIED |
Нет прав готовить карточку для указанного userId; прошедшая дата проведения не от администратора; тип программы не разрешён настройками для создания себе |
IPR_ALREADY_EXISTS |
У сотрудника уже достигнут лимит активных программ |
INTERNAL_ERROR |
Внутренняя ошибка сервера / не удалось сохранить черновик |
Пример запроса (POST)
curl -X POST "https://{портал}/rest/{user_id}/{webhook_code}/ipr.ipr.draft.add.json"
-H "Content-Type: application/json"
-H "Accept: application/json"
--data '{
"userId": 15,
"managerId": 1,
"competenceIds": [1049, 1051],
"deadline": "2026-12-30",
"competenceGoals": {
"1049": "Проводить переговоры с ключевыми клиентами без сопровождения руководителя"
},
"competenceRunOptions": {
"1049": { "course_12": { "type": "course", "id": 12, "selected": true } }
}
}'
Пример ответа
{
"result": {
"result": {
"id": 7,
"url": "/university/ipr/add/?DRAFT_ID=7",
"userId": 15,
"createdBy": 1,
"createdAt": "2026-10-28 12:00:00",
"usedAt": null,
"iprId": null,
"payload": {
"userId": 15,
"managerId": 1,
"competenceIds": [1049, 1051],
"type": "IPR",
"templateId": null,
"title": "",
"deadline": "2026-12-30",
"dateClose": "2026-12-30",
"term": 12,
"pisPeriod": null,
"sendBossAgreement": true,
"positionId": 0,
"targetPositionId": 0,
"nextTemplateId": 0,
"targetFunction": "",
"observers": [],
"competenceDeadlines": {},
"competenceRunOptions": {
"1049": { "course_12": { "type": "course", "id": 12, "selected": true } }
},
"competenceGoals": {
"1049": "Проводить переговоры с ключевыми клиентами без сопровождения руководителя"
}
}
},
"total": null,
"next": null,
"error": null
}
}