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

Массовые операции

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

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

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

Что нужноГде получить
tenantHostАдрес тенантаTenant Экземпляр системы HRlink на отдельном домене (например, company.hr-link.ru). Внутри одного тенанта может быть несколько пространств клиентов. HRlink
clientIdТекущий пользователь
ТокенАутентификация
Данные для синхронизации или импортаНа стороне интеграции
Документы для массового подписанияРеестр документов

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

СценарийМетод
Запустить bulk syncСоздать задачу синхронизации
Проверить bulk syncСтатус задачи синхронизации или Статусы задач синхронизации
Создать пакет массового подписанияСоздать процесс массового подписания
Подписать пакетМассово подписать ПЭП, Массово подписать УНЭП или Массово подписать УКЭП
Создать выгрузкуСоздать выгрузку XLS
Получить результат выгрузкиСтатус выгрузки и Скачать результат выгрузки
Создать импортСоздать импорт из файла
Проверить импортСтатус импорта

Массовая синхронизация (Bulk Sync)

Подробное описание — в разделе Синхронизация сотрудников → Запуск задачи bulk sync.

Типы задач

ТипОписание
LEGAL_ENTITIESЮрлица
CLIENT_DEPARTMENTSОтделы
EMPLOYEE_POSITIONSДолжности
CLIENT_USERS_V6Пользователи и сотрудники
EMPLOYEE_FUNCTIONAL_MANAGERSУправленческие руководители
CALENDARSКалендари
EMPLOYEE_CUSTOM_STRUCTURE_ELEMENTSЭлементы пользовательских структур
CUSTOM_STRUCTURESСправочник пользовательских структур
EMPLOYEE_VACATIONS_V2Отпуска сотрудников
EMPLOYEE_VACATIONS_PLANNINGПланирование отпусков
CLIENT_USER_VACATIONSПлановые отпуска пользователей

Ограничения

  • Лимит элементов задаётся per-type (нет единого):
    • EMPLOYEE_FUNCTIONAL_MANAGERS1000
    • EMPLOYEE_VACATIONS*, EMPLOYEE_VACATIONS_PLANNING, EMPLOYEE_CUSTOM_STRUCTURE_ELEMENTS, CLIENT_USER_VACATIONS500
    • LEGAL_ENTITIES, CLIENT_DEPARTMENTS, EMPLOYEE_POSITIONS, CLIENT_USERS_*, CALENDARS, CUSTOM_STRUCTURES — сервер не проверяет, рекомендуем порции по 500
  • externalId обязателен у каждого элемента и уникален в пределах задачи
  • Параллельный запуск задач одного type сервер не блокирует, но безопаснее запускать последовательно — особенно для CLIENT_DEPARTMENTS
  • Статус задачи проверяйте методом Статус задачи синхронизации

Полный список ограничений — Ограничения.

Массовое подписание документов

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

Пакет массового подписания содержит не больше 50 документов. Если документов больше, запускайте процессы последовательно.

Шаг 1. Создать процесс

Вызовите Создать процесс массового подписания. В теле запроса передайте фильтр реестра документов сотрудника: например documentIds, documentExternalIds, статусы подписантов, юрлица или диапазоны дат.

curl -X POST "https://{tenantHost}/api/v1/clients/{clientId}/documents/bulkSignings" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "User-Api-Token: {token}" \
-d '{
"documentIds": [
"0f4b4b6e-68c0-4aa9-a195-2f8f8786b111",
"c14f0726-f8ad-45e6-a3d7-25efcfd36222"
],
"employeeSignerStatuses": ["WAITING_SIGNING"]
}'

Ответ содержит process.id и массив process.packages. Каждый пакет содержит:

ПолеЧто означает
idIDid Внутренний идентификатор сущности в формате UUID, генерируемый HRlink при создании. Неизменяемый, используется во всех внутренних операциях. пакета для методов подписания
typeТип пакета: NORMATIVE_ACTS, HEAD_MANAGER, EMPLOYEE_OR_PARTICIPANT
suitableSignaturesДоступные типы подписи: SES, CLOUD_NQES, QES
entities[].idIDid Внутренний идентификатор сущности в формате UUID, генерируемый HRlink при создании. Неизменяемый, используется во всех внутренних операциях. связки подписанта с пакетом для включения или исключения документа
entities[].includedПопадает ли документ в пакет

Шаг 2. Изменить состав пакета

Если нужно исключить документ из пакета или вернуть его обратно, вызовите Включить/исключить документ из пакета. Передайте processId из процесса и packageDocumentSignerId из process.packages[].entities[].id.

curl -X PUT "https://{tenantHost}/api/v1/clients/{clientId}/documents/bulkSignings/{processId}/inclusion/{packageDocumentSignerId}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "User-Api-Token: {token}" \
-d '{"include": false}'

ЛНАЛНА Локальный нормативный акт — внутренний документ организации, с которым сотрудники знакомятся через HRlink. Управляется через отдельный набор API-методов.-пакет (NORMATIVE_ACTS) нельзя изменять этим методом.

Шаг 3. Подписать пакет

Выберите метод по типу подписи из suitableSignatures.

Тип подписиМетодЧто передать
SESМассово подписать ПЭПТолько packageId в пути
CLOUD_NQESЗапросить массовое подписание УНЭП, затем Подтвердить массовое подписание УНЭПpackageId, затем documentBulkSigningRequestId и код подтверждения
QESМассово подписать УКЭПpackageId и массив signatures

ПЭП

curl -X PUT "https://{tenantHost}/api/v1/clients/{clientId}/documents/bulkSignings/packages/{packageId}/sign/ses" \
-H "Accept: application/json" \
-H "User-Api-Token: {token}"

УНЭП

Сначала создайте запрос подписания:

curl -X POST "https://{tenantHost}/api/v1/clients/{clientId}/documents/bulkSignings/packages/{packageId}/sign/nqes" \
-H "Accept: application/json" \
-H "User-Api-Token: {token}"

Затем подтвердите запрос кодом из канала подтверждения:

curl -X PUT "https://{tenantHost}/api/v1/clients/{clientId}/documents/bulkSignings/packages/{packageId}/sign/nqes" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "User-Api-Token: {token}" \
-d '{
"documentBulkSigningRequestId": "bb570817-aabe-4c5c-b2cf-273776f192a8",
"code": "123456"
}'

УКЭП

Для УКЭПУКЭП Усиленная квалифицированная электронная подпись (QES). Имеет полную юридическую силу. HRlink не хранит закрытый ключ — он находится на ПК пользователя. передайте подписи в Base64 и документы, которые относятся к каждой подписи. Если руководитель подписывает документ по МЧДМЧД Машиночитаемая доверенность (Attorney) — электронный документ, подтверждающий полномочия представителя юридического лица., укажите attorneyId или attorneyExternalId.

curl -X PUT "https://{tenantHost}/api/v1/clients/{clientId}/documents/bulkSignings/packages/{packageId}/sign/qes" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "User-Api-Token: {token}" \
-d '{
"signatures": [
{
"value": "{signatureBase64}",
"documents": [
{
"id": "0f4b4b6e-68c0-4aa9-a195-2f8f8786b111",
"attorneyId": "9f8b44e5-1b02-42f1-b3fb-b0c17f3f1111"
}
]
}
]
}'

Шаг 4. Проверить результат

После изменения состава или подписания перечитайте процесс методом Получить процесс массового подписания.

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

Для УНЭПУНЭП Усиленная неквалифицированная электронная подпись (CLOUD_NQES). Облачная подпись, обеспечивающая целостность документа.-запроса можно отдельно получить его состояние методом Получить запрос массового подписания.

Типы пакетов

ТипЧто подписывает
HEAD_MANAGERДокументы, где текущий пользователь подписывает как руководитель
EMPLOYEE_OR_PARTICIPANTДокументы, где текущий пользователь подписывает как сотрудник или участник маршрута
NORMATIVE_ACTSЛНАЛНА Локальный нормативный акт — внутренний документ организации, с которым сотрудники знакомятся через HRlink. Управляется через отдельный набор API-методов.; если в процессе есть ЛНАЛНА Локальный нормативный акт — внутренний документ организации, с которым сотрудники знакомятся через HRlink. Управляется через отдельный набор API-методов.-пакет, сначала подпишите его

Массовый импорт и экспорт

Экспорт данных

Экспорт работает асинхронно. Интеграция создаёт задачу методом Создать выгрузку XLS, проверяет статус и скачивает результат после перехода задачи в FINISHED.

curl -X POST "https://{tenantHost}/api/v1/clients/{clientId}/exportTasks" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "User-Api-Token: {token}" \
-d '{
"type": "EMPLOYEE_REGISTRY",
"params": {
"legalEntityIds": ["{legalEntityId}"]
}
}'

Ответ содержит exportTask.id:

{
"result": true,
"exportTask": {
"id": "91a2a5fb-2f74-4cf1-9f3c-e3327f4bc3e0"
}
}

Проверяйте статус методом Статус выгрузки:

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

Если exportTask.state равен FINISHED, скачайте результат методом Скачать результат выгрузки. Метод вернёт 303, а заголовок Location будет содержать одноразовую ссылку на файл.

curl -i -X GET "https://{tenantHost}/api/v1/clients/{clientId}/exportTasks/{taskId}/result" \
-H "User-Api-Token: {token}"

Если выгрузка разбита на части, в exportTask.resultParts[] будут IDid Внутренний идентификатор сущности в формате UUID, генерируемый HRlink при создании. Неизменяемый, используется во всех внутренних операциях. частей. Скачивайте каждую часть методом Скачать часть выгрузки.

curl -i -X GET "https://{tenantHost}/api/v1/clients/{clientId}/exportTasks/{taskId}/results/{resultPartId}" \
-H "User-Api-Token: {token}"

Доступные типы выгрузки:

ТипЧто выгружается
EMPLOYEE_REGISTRYРеестр сотрудников для кадровика
NORMATIVE_ACT_DOCUMENTSЛист ознакомления с ЛНАЛНА Локальный нормативный акт — внутренний документ организации, с которым сотрудники знакомятся через HRlink. Управляется через отдельный набор API-методов.
EMPLOYEES_WITH_FUNCTIONAL_MANAGERУправленческая структура
APPLICATION_REGISTRYРеестр заявлений для кадровика
DOCUMENTS_DOCFLOW_ARCHIVESАрхивы КЭДОКЭДО Кадровый электронный документооборот — подвид ЭДО для кадровых документов (трудовые договоры, приказы, заявления). Регулируется статьями 22.1–22.3 ТК РФ. по документам
APPLICATIONS_DOCFLOW_ARCHIVESАрхивы КЭДОКЭДО Кадровый электронный документооборот — подвид ЭДО для кадровых документов (трудовые договоры, приказы, заявления). Регулируется статьями 22.1–22.3 ТК РФ. по заявлениям

Импорт данных

Импорт тоже работает асинхронно. Сначала загрузите файл методом Загрузить файл, затем передайте fileId в метод Создать импорт из файла.

curl -X POST "https://{tenantHost}/api/v1/files" \
-H "Accept: application/json" \
-H "User-Api-Token: {token}" \
-F "file=@/path/to/import.xlsx"

Создайте задачу импорта:

curl -X POST "https://{tenantHost}/api/v1/clients/{clientId}/importTasks" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "User-Api-Token: {token}" \
-d '{
"fileId": "{fileId}",
"type": "FUNCTIONAL_MANAGER"
}'

Ответ содержит task.id и начальный статус:

{
"result": true,
"task": {
"id": "e84ac01e-c631-48a4-81d7-5fce23c12b2f",
"state": "QUEUED"
}
}

Проверяйте статус методом Статус импорта:

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

Финальные статусы импорта: SUCCEEDED и FAILED. При ошибке смотрите task.failReason и task.result.

Оптимизация для больших объёмов

Когда выгрузка замедляется

Если в реестре больше 45 000 документов или сотрудников, запрос всего реестра одним вызовом может не уложиться в таймаут.

Рекомендации

  1. Используйте фильтрыlegalEntityIds, dateFrom/dateTo, statuses
  2. Разбивайте по юрлицам — запрашивайте реестр для каждого юрлица отдельно
  3. Разбивайте по датам — используйте периоды (месяц, неделя)
  4. Используйте пагинациюlimit + offset, не запрашивайте всё за раз
  5. Bulk sync вместо поштучных запросов — если создаёте или обновляете более 100 сущностей
  6. Не запускайте параллельные bulk sync одного типа — дождитесь, пока предыдущая задача перейдёт в финальный статус

Пример: разбиение по порциям

Общий объём: 5000 сотрудников
Размер порции bulk sync: 500

Итого: 10 последовательных вызовов метода «Создать задачу синхронизации»
Между вызовами: проверить статус предыдущей задачи

Метод для запуска каждой порции — Создать задачу синхронизации.