Отправка документов на подписание
Полный цикл: загрузить файл → выбрать маршрут → создать группу документов → отправить на подпись.
Что получится в конце
После выполнения сценария HRlink создаст группу документов, поставит файлы в очередь на конвертацию PDF/A и отправит документы первым участникам маршрута подписания.
Что нужно заранее
| Что нужно | Где получить |
|---|---|
tenantHost | Адрес тенантаTenant Экземпляр системы HRlink на отдельном домене (например, company.hr-link.ru). Внутри одного тенанта может быть несколько пространств клиентов. HRlink |
clientId | Текущий пользователь |
| Токен | Аутентификация |
| Файл документа | На стороне интеграции |
| Маршрут подписания | Получить шаблоны маршрутов |
| Тип документа | Получить типы документов |
Какие методы используются
| Шаг | Метод |
|---|---|
| Загрузить файл | Загрузить файл |
| Получить маршрут | Получить шаблоны маршрутов |
| Получить тип документа | Получить типы документов |
| Создать и отправить группу | Создать группу и отправить на подписание |
| Проверить результат | Получить документ по externalId или Получить реестр документов |
Общая схема
Шаг 1. Загрузить файл
Метод Загрузить файл загружает файл и возвращает fileId. Файлы принимаются только через multipart/form-data. Подробнее — в разделе Работа с файлами.
- curl
- PowerShell
- HTTP
curl -X POST "https://{tenantHost}/api/v1/files" \
-H "Accept: application/json" \
-H "User-Api-Token: {token}" \
-F "file=@/path/to/document.pdf"
Invoke-RestMethod `
-Method POST `
-Uri "https://{tenantHost}/api/v1/files" `
-Headers @{
"Accept" = "application/json"
"User-Api-Token" = "{token}"
} `
-Form @{
file = Get-Item "/path/to/document.pdf"
}
POST /api/v1/files HTTP/1.1
Host: {tenantHost}
Accept: application/json
User-Api-Token: {token}
Content-Type: multipart/form-data; boundary=----Boundary
------Boundary
Content-Disposition: form-data; name="file"; filename="document.pdf"
Content-Type: application/pdf
< /path/to/document.pdf
------Boundary--
Ответ:
{
"result": true,
"files": [
{
"id": "677de23d-088a-4454-847a-95ba8be522df",
"name": "document.pdf",
"createdDate": "2026-04-15T10:30:00Z"
}
]
}
Сохраните files[0].id — это fileId, который понадобится на шаге 4.
Допустимые форматы: .pdf, .doc, .docx, .rtf, .xls, .xlsx, .jpeg, .jpg, .bmp, .png, .tiff
Не передавайте файл как rawdata JSON — это не работает. Используйте исключительно multipart/form-data. Это частая ошибка при интеграции с SAP и 1С.
Шаг 2. Получить маршрут подписания
Метод Получить шаблоны маршрутов возвращает все шаблоны маршрутов клиента. В ответе смешаны маршруты документов и заявлений — для отправки документа нужен только первый тип. Укажите фильтр signingObjectType=DOCUMENT, чтобы сервер вернул только маршруты документов. Параметр includeDeactivated=false (значение по умолчанию) отсекает деактивированные маршруты.
- curl
- PowerShell
- HTTP
curl -X GET "https://{tenantHost}/api/v1/clients/{clientId}/routeTemplates?signingObjectType=DOCUMENT&includeDeactivated=false" \
-H "Accept: application/json" \
-H "User-Api-Token: {token}"
Invoke-RestMethod `
-Method GET `
-Uri "https://{tenantHost}/api/v1/clients/{clientId}/routeTemplates?signingObjectType=DOCUMENT&includeDeactivated=false" `
-Headers @{
"Accept" = "application/json"
"User-Api-Token" = "{token}"
}
GET /api/v1/clients/{clientId}/routeTemplates?signingObjectType=DOCUMENT&includeDeactivated=false HTTP/1.1
Host: {tenantHost}
Accept: application/json
User-Api-Token: {token}
Пример сокращённого ответа:
{
"result": true,
"signingRouteTemplates": [
{
"id": "7a2e8b5c-1d4f-4a9e-b3c7-8f6a2d5e1b4c",
"name": "Стандартный маршрут: сотрудник → руководитель",
"signingObjectType": "DOCUMENT",
"externalId": "ROUTE-STANDARD",
"legalEntities": [
{ "id": "a1b2c3d4-1111-2222-3333-444455556666", "name": "ООО «Альфа»" }
],
"stages": [
{
"id": "b3c4d5e6-1111-2222-3333-444455556666",
"indexNumber": 0,
"type": "SIGNING",
"participants": [
{ "id": "4e2b6a8c-1111-2222-3333-444455556666", "type": "EMPLOYEE", "actionType": "SIGNING" }
]
},
{
"id": "c4d5e6f7-1111-2222-3333-444455556666",
"indexNumber": 1,
"type": "SIGNING",
"participants": [
{ "id": "9c7f1a2b-1111-2222-3333-444455556666", "type": "EMPLOYER", "actionType": "SIGNING" }
]
}
]
}
]
}
Из ответа запомните:
idмаршрута → этоrouteTemplateIdдля шага 4stages[].participants[].id→ этоparticipantId(нужен только для участников типаSELECTABLE_EMPLOYEE, для других типов не требуется)
Маршруты документов привязаны к юридическим лицам через поле legalEntities. Выбирайте маршрут, у которого среди legalEntities есть то же юрлицо, что вы передадите в legalEntityId на шаге 4. Если не совпадёт — система отклонит запрос. Подробнее: Привязка маршрутов.
При любом сохранении шаблона администратором все participantId пересоздаются. Прежде чем отправлять документ с кэшированными participantId — сверьте version шаблона. Если совпадает — кэш валиден. Если нет — перезапросите участников. При ошибке 13.1914 выполните ретрай с обновлённым маршрутом.
Подробнее о маршрутах и типах участников — в разделе Маршруты подписания.
Шаг 3. Получить тип документа
Метод Получить типы документов возвращает все типы документов клиента. Типы бывают двух видов: системные (system: true) — поставляются с HRlink и соответствуют классификации Минтруда, и пользовательские — создаются администратором клиента под внутренние процессы.
- curl
- PowerShell
- HTTP
curl -X GET "https://{tenantHost}/api/v1/documentTypes" \
-H "Accept: application/json" \
-H "User-Api-Token: {token}"
Invoke-RestMethod `
-Method GET `
-Uri "https://{tenantHost}/api/v1/documentTypes" `
-Headers @{
"Accept" = "application/json"
"User-Api-Token" = "{token}"
}
GET /api/v1/documentTypes HTTP/1.1
Host: {tenantHost}
Accept: application/json
User-Api-Token: {token}
Пример сокращённого ответа:
{
"result": true,
"documentTypes": [
{
"id": "c4d2f1a8-9b3e-4c7d-8a2f-5b6d9e3c7a1b",
"name": "Трудовой договор",
"externalId": "TYPE-LABOR-CONTRACT",
"system": true,
"visible": true,
"signingByEmployeeSesEnabled": true
},
{
"id": "e8a1b3d5-1111-2222-3333-444455556666",
"name": "Приказ об отпуске",
"system": false,
"visible": true
}
]
}
Из ответа запомните id нужного типа → это typeId для шага 4. В отличие от юрлица и сотрудников, тип документа передаётся только по UUID — external-вариант поля здесь не поддерживается.
Шаг 4. Создать группу документов и отправить на подпись
Два способа
| Метод | Описание |
|---|---|
| Создать группу документов | Создать группу без отправки на подпись (черновик) |
| Создать группу и отправить на подписание | Создать группу и сразу отправить на подпись |
Если документ сразу идёт в работу, используйте documentGroupCreateAndSendToSigning — создание и отправка в одном запросе.
Создание группы — асинхронная операция. После ответа 200 OK сервер конвертирует файлы в PDF/A и создаёт документы в фоне. Если конвертация завершится ошибкой, сервер не создаст документы, а создателю уйдёт уведомление на email.
Чтобы программно убедиться, что документы созданы, передайте externalId для каждого документа при создании и опросите результат (см. ниже «Как убедиться, что документы созданы»).
Пример: документ с маршрутом (ROUTE, рекомендуется)
- curl
- PowerShell
- HTTP
curl -X POST "https://{tenantHost}/api/v1/clients/{clientId}/documentGroups/sendToSigning" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "User-Api-Token: {token}" \
-d '{
"name": "Приказ об отпуске",
"creatorExternalId": "HR-001",
"documents": [
{
"fileId": "677de23d-088a-4454-847a-95ba8be522df",
"externalId": "DOC-195",
"legalEntityExternalId": "LE-001",
"typeId": "{UUID типа документа}",
"number": "ПР-042",
"date": "2025-01-15",
"signingOrder": "ROUTE",
"routeTemplateId": "{UUID маршрута}",
"participants": [
{
"id": "{participantId для SELECTABLE_EMPLOYEE}",
"employeeExternalId": "EMP-042"
}
]
}
]
}'
$body = @{
name = "Приказ об отпуске"
creatorExternalId = "HR-001"
documents = @(
@{
fileId = "677de23d-088a-4454-847a-95ba8be522df"
externalId = "DOC-195"
legalEntityExternalId = "LE-001"
typeId = "{UUID типа документа}"
number = "ПР-042"
date = "2025-01-15"
signingOrder = "ROUTE"
routeTemplateId = "{UUID маршрута}"
participants = @(
@{
id = "{participantId для SELECTABLE_EMPLOYEE}"
employeeExternalId = "EMP-042"
}
)
}
)
} | ConvertTo-Json -Depth 5
Invoke-RestMethod `
-Method POST `
-Uri "https://{tenantHost}/api/v1/clients/{clientId}/documentGroups/sendToSigning" `
-Headers @{
"Accept" = "application/json"
"User-Api-Token" = "{token}"
} `
-ContentType "application/json" `
-Body $body
POST /api/v1/clients/{clientId}/documentGroups/sendToSigning HTTP/1.1
Host: {tenantHost}
Content-Type: application/json
Accept: application/json
User-Api-Token: {token}
{
"name": "Приказ об отпуске",
"creatorExternalId": "HR-001",
"documents": [
{
"fileId": "677de23d-088a-4454-847a-95ba8be522df",
"externalId": "DOC-195",
"legalEntityExternalId": "LE-001",
"typeId": "{UUID типа документа}",
"number": "ПР-042",
"date": "2025-01-15",
"signingOrder": "ROUTE",
"routeTemplateId": "{UUID маршрута}",
"participants": [
{
"id": "{participantId для SELECTABLE_EMPLOYEE}",
"employeeExternalId": "EMP-042"
}
]
}
]
}
Пример: legacy-порядок (EMPLOYEE_FIRST)
Значения EMPLOYEE_FIRST, MANAGER_FIRST, EMPLOYEE_ONLY и MANAGER_ONLY сохранены для существующих интеграций. В новых интеграциях используйте ROUTE с явным маршрутом — пример выше.
{
"name": "Трудовой договор",
"documents": [
{
"fileId": "677de23d-088a-4454-847a-95ba8be522df",
"legalEntityId": "{UUID юрлица}",
"typeId": "{UUID типа документа}",
"number": "ТД-001",
"date": "2025-01-15",
"signingOrder": "EMPLOYEE_FIRST",
"headManagerId": "{UUID сотрудника-руководителя}",
"employeeIds": ["{UUID сотрудника-подписанта}"]
}
]
}
Поля CreateDocumentDTO
Обязательные поля
| Поле | Тип | Описание |
|---|---|---|
fileId | UUID | IDid Внутренний идентификатор сущности в формате UUID, генерируемый HRlink при создании. Неизменяемый, используется во всех внутренних операциях. загруженного файла (из шага 1) |
legalEntityId или legalEntityExternalId | UUID / string | Юрлицо документа |
typeId | UUID | Тип документа (из шага 3) |
signingOrder | string | Порядок подписания |
Поля участников
| Поле | Когда использовать |
|---|---|
headManagerId / headManagerExternalId | При EMPLOYEE_FIRST, MANAGER_FIRST, MANAGER_ONLY |
employeeIds / employeeExternalIds | При EMPLOYEE_FIRST, MANAGER_FIRST, EMPLOYEE_ONLY |
watcherIds / watcherExternalIds | Только при MANAGER_ONLY |
routeTemplateId / routeTemplateExternalId | При ROUTE |
participants | При ROUTE — для участников типа SELECTABLE_EMPLOYEE |
Дополнительные поля
| Поле | Тип | Описание |
|---|---|---|
number | string | Номер документа |
date | date | Дата документа (ГГГГ-ММ-ДД) |
notice | string | Заметка о документе |
externalId | string | IDid Внутренний идентификатор сущности в формате UUID, генерируемый HRlink при создании. Неизменяемый, используется во всех внутренних операциях. документа во внешней системе |
deadlineDayCount | integer | Срок подписания в днях |
Как убедиться, что документы созданы
Создание группы асинхронное, поэтому интегратор проверяет результат сам. Способ проверки зависит от того, сколько сотрудников указано в документе.
Одиночный документ (один сотрудник в employeeIds).
Передайте externalId при создании и периодически вызывайте Получить документ по externalId — GET /api/v1/clients/{clientId}/documents/byExternalId/{externalId}. Как только метод вернёт документ с заполненным baseDocumentId — документ создан и отправлен на подписание. Пока возвращается 404 — обработка ещё идёт.
Размножение (несколько сотрудников в employeeIds).
externalId остаётся на черновике, у созданных документов он null — прямой опрос по externalIdexternalId Внешний идентификатор сущности — произвольная строка, задаваемая интегратором при создании. Связывает сущность HRlink с записью во внешней системе (1С, SAP и др.) без хранения маппинга UUID. не подойдёт. Вызывайте Получить реестр документов с фильтром baseDocumentExternalIds: [externalId]: как только в реестре появились документы — они созданы. Подробнее: Отправка на подписание: размножение документов.
Конвертация занимает от секунд до десятков секунд, в зависимости от размера и формата файла. Рекомендуемый стартовый интервал — 2-3 секунды, с экспоненциальным увеличением до 30 секунд и таймаутом 5-10 минут.
Ограничения и правила
Участники из одного юрлица
Все сотрудники-подписанты, руководитель и наблюдатели должны быть из одного юридического лица, указанного в legalEntityId.
Совместимость signingOrder и полей
| signingOrder | headManagerheadManager Руководитель отдела — назначается на уровне подразделения (Department). Один руководитель на отдел. Все сотрудники отдела видят этого руководителя в своих данных. | employeesEmployee Связь пользователя пространства клиента с юрлицом — пара (clientUserId, legalEntityId). Один пользователь может иметь несколько записей Employee в разных юрлицах или даже в одном. | watchers | routeTemplate | participants |
|---|---|---|---|---|---|
EMPLOYEE_FIRST | Да | Да | Нет | Нет | Нет |
MANAGER_FIRST | Да | Да | Нет | Нет | Нет |
EMPLOYEE_ONLY | Нет | Да | Нет | Нет | Нет |
MANAGER_ONLY | Да | Нет | Да | Нет | Нет |
ROUTE | Зависит от маршрута | Зависит от маршрута | Зависит от маршрута | Да | Да |
Типичные ошибки
| Ошибка | Причина | Решение |
|---|---|---|
| Нельзя указывать участников маршрута подписания для выбранного порядка подписания | participants указан при signingOrder != ROUTE | Уберите participants или используйте ROUTE |
| Не указаны получатели документа (13.1551) | Для маршрута с этапом RECEIVING не указаны watcherIds / watcherExternalIds | Добавьте наблюдателей в watcherExternalIds и соответствующий participants |
| 400 при создании группы | Невалидная структура JSON, отсутствие обязательных полей | Проверьте наличие fileId, legalEntityId, typeId, signingOrder |
| participantIdparticipantId Уникальный идентификатор участника в маршруте подписания. Может измениться при обновлении маршрута — перед созданием документа всегда запрашивайте актуальные данные маршрута. изменился | Администратор обновил маршрут между получением и использованием | Получите маршрут заново перед отправкой |
| Файл не конвертируется в PDF/A | Файл повреждён или формат не поддерживается | Проверьте файл, загрузите через UI для проверки |
Что дальше
- Отслеживание статусов — как узнать, подписан ли документ
- Маршруты подписания — подробнее о типах участников и порядке подписания
- Работа с файлами — форматы, конвертация, типичные ошибки загрузки