Перейти к основному содержимому

Маршруты подписания

Маршрут подписания определяет, кто, в каком порядке и каким способом подписывает документ или заявление. Без понимания маршрута нельзя корректно отправить документ на подпись.

Что получится в конце

Интеграция сможет выбрать шаблон маршрута, сопоставить участников с сотрудниками, передать participantId при создании документа и обработать изменение шаблона без ручного разбора ошибки.

Когда использовать

Используйте эту страницу, когда интеграция выбирает шаблон маршрута, заполняет участников документа, сопоставляет participantId или разбирает статусы подписания по этапам.

Что нужно заранее

Что нужноГде получить
clientIdТекущий пользователь
ТокенАутентификация
Шаблон маршрутаПолучить шаблоны маршрутов
Юрлицо документа или тип заявленияДокументы или Заявления
Сотрудники-участникиМодель данных

Какие методы используются

СценарийМетод
Получить шаблон маршрутаПолучить шаблоны маршрутов
Создать документ с маршрутомСоздать группу и отправить на подписание
Проверить маршрут документаПолучить документ или Получить документ по externalId
Взять заявление в работуВзять заявление в работу

Типовые сценарии

Выбрать маршрут для документа

  1. Вызовите Получить шаблоны маршрутов с signingObjectType=DOCUMENT.
  2. Выберите маршрут, привязанный к нужному юрлицу.
  3. Передайте routeTemplateId и signingOrder: ROUTE при создании документа.

Заполнить участников маршрута

  1. Найдите участников с типом SELECTABLE_EMPLOYEE или другим типом, где сотрудник задаётся при создании.
  2. Возьмите participantId из шаблона.
  3. Передайте participantId и сотрудника в массиве participants.

Обработать изменение шаблона

  1. Сохраняйте version шаблона вместе с participantId.
  2. Перед отправкой документа перечитайте шаблон.
  3. Если version изменилась, обновите participantId.

Ограничения и ошибки

  • Маршруты нельзя создавать или редактировать через публичный API.
  • participantId пересоздаётся при любом сохранении шаблона маршрута.
  • Тип участника ROLE работает только в маршрутах заявлений.
  • Ошибка 13.1914 означает, что клиент передал устаревший или неверный participantId.
  • В новых интеграциях для документов используйте signingOrder: ROUTE.

Структура маршрута

SigningRouteTemplate (шаблон маршрута)
└─ stages[] (этапы)
├─ Stage 1 (например: подписание сотрудником)
│ ├─ type: SIGNING
│ ├─ completenessCondition: ALL
│ └─ participants[] (участники)
│ ├─ Participant (type: EMPLOYEE, actionType: SIGNING)
│ └─ Participant (type: SELECTABLE_EMPLOYEE, actionType: APPROVING)
└─ Stage 2 (например: подписание руководителем)
├─ type: SIGNING
├─ completenessCondition: ALL
└─ participants[]
└─ Participant (type: EMPLOYER, actionType: SIGNING)

Этапы (stages)

Каждый этап имеет тип и условие завершения.

Типы этапов

ТипОписание
SIGNINGПодписание — участники подписывают или согласовывают документ
RECEIVINGПолучение — участники получают документ для ознакомления

Условие завершения этапа

УсловиеОписание
ALLВсе участники этапа должны выполнить действие
ANYЛюбой участник этапа должен выполнить действие

Этапы выполняются последовательно: следующий этап начинается только после завершения предыдущего.

Типы участников

В шаблоне маршрута 6 типов участников (SigningRouteParticipantType). При создании документа они материализуются в подписантов с более компактным набором из 3 типов (DocumentSignerType) — подробнее в разделе Шаблон маршрута и маршрут документа.

Тип в шаблонеОписаниеКак определяется сотрудникВ документе приходит как
EMPLOYEEСотрудник-подписантПри создании документаEMPLOYEE
EMPLOYERПредставитель работодателяПередаётся в поле headManagerId при создании документа, или автоматически через правило автозаполнения из шаблонаHEAD_MANAGER
FIXED_EMPLOYEEКонкретный сотрудник, указанный в шаблоне маршрутаНе нужно — уже зафиксирован в маршрутеPARTICIPANT
SELECTABLE_EMPLOYEEСотрудник, которого выбирают при создании документаПри создании документаPARTICIPANT
ROLEСотрудник с одной из ролей EmployeeRoleType: HEAD_MANAGER (руководитель), HR (кадровик) или CLERK (делопроизводитель)Система выбирает сотрудника по его ролям (только для заявлений)PARTICIPANT
RESPONSIBLEОдин из «ответственных» за заявление — их назначают методом Взять заявление в работу. Работает на этапе с responsibleEnabled: true (только для заявлений)Система берёт сотрудника из списка ответственных заявленияPARTICIPANT

Типы действий участников

ДействиеОписание
SIGNINGПодписание документа
APPROVINGСогласование документа
RECEIVINGПолучение (ознакомление)
PROCESSINGОбработка

Шаблон маршрута и маршрут документа

В API HRlink работают две связанные, но разные модели:

  • Шаблон маршрута (SigningRouteTemplate) — разметка процесса: какие этапы есть, какого типа участники их проходят и в каком порядке. Шаблон настраивается администратором один раз и переиспользуется.
  • Маршрут документа (route внутри документа) — материализованный снимок шаблона на момент отправки документа на подписание: с конкретными сотрудниками, датами действий и текущим статусом каждого участника.

Когда документ отправляется на подписание, 6 типов участников шаблона сворачиваются в 3 типа подписантов документа:

Тип в шаблонеТип в документеПочему
EMPLOYEEEMPLOYEEРоль «подписант-сотрудник» сохраняется как есть
EMPLOYERHEAD_MANAGERРоль «подписант от работодателя» — в документе это конкретный руководитель
FIXED_EMPLOYEE, SELECTABLE_EMPLOYEE, ROLE, RESPONSIBLEPARTICIPANTВ шаблоне эти типы описывают как выбрать сотрудника. После создания документа выбор уже сделан, и все четыре обобщаются в одного «участника этапа»

Для сопоставления подписанта документа с участником шаблона используется participantId — он одинаков в обоих представлениях. Подробнее — в разделе participantId — критически важная деталь.

Что это значит для интегратора

Если вы читаете шаблон через getSigningRouteTemplates — увидите SigningRouteParticipantType. Если читаете документ через getDocument — увидите DocumentSignerType. Это не баг и не разные версии API, а разные модели для разных этапов жизненного цикла.

Порядок подписания (DocumentSigningOrder)

При создании документа передайте signingOrder:

ПорядокОписание
EMPLOYEE_FIRSTПервым подписывает сотрудник, затем руководитель
MANAGER_FIRSTПервым подписывает руководитель, затем сотрудник
EMPLOYEE_ONLYПодписывает только сотрудник
MANAGER_ONLYПодписывает только руководитель
ROUTEОчерёдность задаёт маршрут подписания (этапы)
Когда использовать ROUTE

В новых интеграциях всегда используйте ROUTE. Значения EMPLOYEE_FIRST, MANAGER_FIRST, EMPLOYEE_ONLY и MANAGER_ONLY сохранены для обратной совместимости.

participantId — критически важная деталь

participantId пересоздаётся при любом изменении шаблона

participantId каждого участника полностью пересоздаётся каждый раз, когда администратор сохраняет изменения шаблона маршрута — даже если изменилось только название. Внутри HRlink обновление шаблона устроено как «удалить все этапы и участников, создать заново», поэтому никакие IDid Внутренний идентификатор сущности в формате UUID, генерируемый HRlink при создании. Неизменяемый, используется во всех внутренних операциях. не сохраняются.

Как работает participantId

  1. Получаете шаблон маршрута через Получить шаблоны маршрутов.
  2. В ответе у каждого участника есть поле id — это и есть participantId.
  3. При создании документа передаёте participantId в массиве participants — для тех типов участников, где это требуется (см. Когда participantId нужен).
  4. Если между шагами 1 и 3 администратор сохранил шаблон, все participantId стали другими. Запрос вернёт ошибку 13.1914.

Стратегия защиты через поле version

У каждого шаблона маршрута есть поле version (long). Оно увеличивается при любом изменении шаблона — и только тогда. Это даёт надёжный способ детектить изменения без сравнения полей:

  • Если ваша сохранённая version совпадает с version в свежем ответе — participantId гарантированно те же, можно использовать кэшированные значения.
  • Если version изменилась — перечитайте участников из свежего ответа перед отправкой.

Рекомендуемый алгоритм перед каждой отправкой документа:

  1. Получить шаблоны маршрутов с фильтром по нужному шаблону, забрать version.
  2. Если version совпадает с ранее сохранённой — использовать кэшированные participantId.
  3. Если version отличается — обновить кэш, пересопоставить своих сотрудников с новыми участниками шаблона (по порядку этапов, типам участников, isMultipleSigners — стабильных альтернативных идентификаторов у участника нет).
  4. Отправить документ.

Обработка ошибки 13.1914

Если запрос на подписание вернул ошибку 13.1914 (HTTP 404, «По заданному IDid Внутренний идентификатор сущности в формате UUID, генерируемый HRlink при создании. Неизменяемый, используется во всех внутренних операциях. не найден участник этапа маршрута подписания») — это означает, что шаблон изменили между вашими шагами 1 и 3, и кэш устарел. Действия:

  1. Перезапросить шаблон, забрать новый version и участников.
  2. Пересопоставить своих сотрудников с новыми participantId.
  3. Повторить запрос на подписание.

Эта ошибка по природе временная и retryable, в отличие от настоящих ошибок валидации — её имеет смысл обрабатывать отдельной веткой.

Когда participantId нужен

participantId обязательно передавать в массиве participants только для типов участников, где конкретный сотрудник определяется при создании документа:

  • SELECTABLE_EMPLOYEE — всегда
  • EMPLOYEE — если в маршруте не один единственный подписант-сотрудник
  • EMPLOYER — если явно назначаете через participants, а не через headManagerId

Для остальных типов participantId не нужен — система подставит сотрудника сама:

  • FIXED_EMPLOYEE — сотрудник уже зафиксирован в шаблоне
  • RESPONSIBLE — система возьмёт сотрудника из назначенных ответственных
  • ROLE — система найдёт сотрудника по его роли
  • Участники с автозаполнением (AutoSelectParticipantRuleType) — система выберет сотрудника по оргструктуре

Иными словами, если в вашем маршруте нет SELECTABLE_EMPLOYEE — про participantId можно забыть: все остальные механизмы устойчивы к переизданию шаблона.

Где найти participantId в ответе

В ответах getDocument и getHrDocumentsRegistry маршрут документа доступен в поле route:

{
"route": {
"stages": [
{
"id": "0d07668b-4e28-40a7-b25f-7a5a2a0a3b4c",
"indexNumber": 0,
"type": "SIGNING",
"participants": [
{
"id": "9a35f510-9a7c-4f2f-b5a3-8a8f87170f22",
"type": "EMPLOYEE",
"actionType": "SIGNING"
},
{
"id": "74c60239-d6f5-42f8-bf56-cfb680600415",
"type": "SELECTABLE_EMPLOYEE",
"actionType": "APPROVING",
"isMultipleSigners": false
}
]
}
]
}
}

Если в ответе есть данные об участниках или сотрудниках с полем participantId, по нему можно сопоставить сотрудника с конкретным участником и этапом маршрута.

У каждого участника в route.stages[].participants[] есть:

  • id — тот самый participantId, через который связываются шаблон и документ
  • typeDocumentSignerType (EMPLOYEE, HEAD_MANAGER или PARTICIPANT), как эта роль материализовалась в документе
  • actionType — что участник делает на этапе (SIGNING, APPROVING, RECEIVING, PROCESSING)

Как определить статус подписания

Чтобы понять текущее состояние маршрута, анализируйте данные из route.stages:

route.stages[n].participants[m] → у каждого участника:
- signedDate → если не null, участник подписал
- rejectedDate → если не null, участник отклонил
- seenDate → если не null, участник просмотрел

Состояния операции подписания

СостояниеОписание
IN_PROGRESSПодписание в процессе
WAITING_CODEОжидается ввод кода для подписания
CONFIRMINGВыполняется подтверждение запроса
WRONG_CODEВведён неверный код
SUCCEEDEDЗапрос завершился успешно
FAILEDЗапрос завершился неуспешно
EXPIREDЗапрос истёк

Способы подписания (RouteSigningType)

Общее сравнение видов подписей и правовой базы см. на странице Подписи.

СпособОписание
SESПЭППЭП Простая электронная подпись (SES). Подтверждает факт подписания, но не гарантирует неизменность документа после подписания. — простая электронная подпись
CLOUD_NQESОблачный УНЭПУНЭП Усиленная неквалифицированная электронная подпись (CLOUD_NQES). Облачная подпись, обеспечивающая целостность документа. — усиленная неквалифицированная электронная подпись
QESУКЭПУКЭП Усиленная квалифицированная электронная подпись (QES). Имеет полную юридическую силу. HRlink не хранит закрытый ключ — он находится на ПК пользователя. — усиленная квалифицированная электронная подпись
PRRЧерез портал «Работа России»
GOV_KEYГосключ
ANY_APPLICABLEЛюбой подходящий способ из доступных
УКЭП и HRlink

HRlink не хранит закрытый ключ УКЭПУКЭП Усиленная квалифицированная электронная подпись (QES). Имеет полную юридическую силу. HRlink не хранит закрытый ключ — он находится на ПК пользователя. — он находится на ПК пользователя. API только инициирует процесс подписания и получает подтверждение.

Ограничения

Маршруты нельзя создавать через API

Маршруты подписания создаются и настраиваются только через UI или Службу заботы. Через API можно:

  • получить список существующих маршрутов через getSigningRouteTemplates
  • использовать маршрут при создании документа
  • но нельзя создать новый маршрут или изменить существующий

ROLE — только для заявлений

Тип участника ROLE работает только в маршрутах заявлений. В маршрутах документов этот тип использовать нельзя.

Прочие ограничения

  • Один сотрудник не может быть представлен более чем одним участником на одном этапе маршрута
  • На момент создания документа все участники маршрута должны быть действующими сотрудниками: уволенных участников система не пропустит
  • Нельзя указывать participants, если signingOrder не равен ROUTE
  • При MANAGER_FIRST и EMPLOYEE_FIRST нельзя указывать watcherIds
  • При EMPLOYEE_ONLY нельзя указывать headManagerId
  • При MANAGER_ONLY нельзя указывать employeeIds

Жизненный цикл документа в маршруте

Пример: отправка документа на подпись с маршрутом

Шаг 1. Получить доступные маршруты

curl -X GET "https://{tenantHost}/api/v1/clients/{clientId}/routeTemplates" \
-H "Accept: application/json" \
-H "User-Api-Token: {token}"

Шаг 2. Найти нужный participantId

В ответе найдите нужный шаблон маршрута и его этапы. Для участников типа SELECTABLE_EMPLOYEE сохраните id: это participantId, который понадобится при создании документа.

Шаг 3. Создать группу документов

{
"documents": [
{
"fileId": "{загруженный fileId}",
"externalId": "DOC-195",
"legalEntityExternalId": "LE-001",
"typeId": "{UUID типа документа}",
"number": "001",
"date": "2024-12-17T00:00:00",
"signingOrder": "ROUTE",
"routeTemplateId": "{UUID маршрута}",
"participants": [
{
"id": "{participantId для SELECTABLE_EMPLOYEE}",
"employeeExternalId": "EMP-042"
},
{
"id": "{participantId для другого участника}",
"employeeExternalId": "EMP-099"
}
]
}
]
}
Один participantId — несколько сотрудников

Если участник маршрута типа SELECTABLE_EMPLOYEE помечен флагом «произвольное количество» (isMultipleSigners: true), можно передать несколько объектов с одинаковым participantId, но разными сотрудниками:

{
"participants": [
{"id": "28059a0c-9b7e-4df4-8bd6-8a78d7df2a31", "employeeExternalId": "913"},
{"id": "28059a0c-9b7e-4df4-8bd6-8a78d7df2a31", "employeeExternalId": "6308"}
]
}
Все участники — из одного юрлица

Все сотрудники, указанные в документе, включая подписантов и наблюдателей, должны относиться к одному юридическому лицу.

Маршруты документов и заявлений

Маршруты подписания используются и для документов, и для заявлений, но правила для них различаются.

Тип маршрута (SigningObjectType)

У каждого шаблона маршрута есть тип: DOCUMENT или APPLICATION. Шаблон маршрута для документов нельзя использовать для заявлений, и наоборот.

Привязка маршрутов

ДокументыЗаявления
Привязка маршрутаК юридическим лицамК типу заявления (templateRouteId)
Выбор маршрутаПри создании документаЗадаётся типом заявления

Системные маршруты заявлений

КлючОписание
APPROVER_AND_HRСогласующий и кадровик
ONLY_HRТолько кадровик
TWO_HR_AND_APPROVERДва кадровика и согласующий
TWO_APPROVER_AND_HRДва согласующих и кадровик
EMPLOYEE_FUNCTIONAL_HEAD_MANAGER_AND_HRУправленческий руководитель и кадровик
EMPLOYEE_FUNCTIONAL_HEAD_MANAGER_DEPARTMENT_HEAD_MANAGER_AND_HRУправленческий руководитель, руководитель отдела и кадровик
EMPLOYEE_DEPARTMENT_HEAD_MANAGER_FUNCTIONAL_HEAD_MANAGER_AND_HRРуководитель отдела, управленческий руководитель и кадровик

Различия в этапах и участниках

ВозможностьДокументыЗаявления
Тип участника ROLEНетДа
responsibleEnabled на этапеНетДа
canDeleteBeforeStageCompleted на этапеНетДа
rejectionDisabled у участникаДаНет
forbiddenSelectYourself у участникаНетДа
unchangeable у участникаНетДа

Автозаполнение участников

Участники маршрута могут заполняться автоматически по правилам:

ПравилоОписание
DEPARTMENT_HEAD_MANAGERРуководитель отдела сотрудника. При цепочке автозаполнений (несколько этапов подряд) следующим выбирается руководитель отдела, к которому относится предыдущий руководитель
HIERARCHICAL_DEPARTMENT_HEAD_MANAGERРуководитель отдела сотрудника. При цепочке автозаполнений следующим выбирается руководитель родительского отдела по иерархии оргструктуры — независимо от того, к какому отделу относится сам руководитель
FUNCTIONAL_HEAD_MANAGERУправленческий (функциональный) руководитель сотрудника