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

Синхронизация сотрудников

Гайд описывает, как загрузить и поддерживать организационную структуру (юрлица, отделы, должности, пользователи, сотрудники) во внешней системе (1С, SAP, Битрикс24) и в HRlink одной согласованной моделью.

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

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

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

Что нужноГде получить
tenantHostАдрес тенантаTenant Экземпляр системы HRlink на отдельном домене (например, company.hr-link.ru). Внутри одного тенанта может быть несколько пространств клиентов. HRlink
clientIdТекущий пользователь
ТокенАутентификация
Внешние идентификаторыexternalId Внешний идентификатор сущности — произвольная строка, задаваемая интегратором при создании. Связывает сущность HRlink с записью во внешней системе (1С, SAP и др.) без хранения маппинга UUID.В кадровой системе: 1С, SAP, Битрикс24 или другой мастер-системе
Данные оргструктурыЮрлица, отделы, должности, пользователи и сотрудники
Права на bulk syncАвторизация и права доступа

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

ШагМетод
Создать задачу синхронизацииСоздать задачу синхронизации
Проверить статус задачиСтатус задачи синхронизации
Уволить или восстановить сотрудниковМассовое увольнение и восстановление
Сверить результатПолучить сотрудников
Только массовая синхронизация

Работа с оргструктурой ведётся через Создать задачу синхронизации и Массовое увольнение и восстановление. Bulk sync покрывает все сценарии: первичную загрузку, инкременты, частичные обновления.

Порядок типов синхронизации

Сущности зависят друг от друга, поэтому задачи bulk sync запускаются строго в указанном порядке:

Нельзя менять порядок

CLIENT_USERS_V6 создаёт пользователей вместе с сотрудниками. Если юрлица, отделы и должности не загружены заранее, задача завершится ошибками валидации по legalEntityExternalId, departmentExternalId, positionExternalId.

ШагТип задачиЧто синхронизируется
1LEGAL_ENTITIESЮрлица
2CLIENT_DEPARTMENTSОтделы (иерархия через parentExternalId)
3EMPLOYEE_POSITIONSДолжности
4CLIENT_USERS_V6Пользователи клиента и их сотрудники одной задачей
5EMPLOYEE_FUNCTIONAL_MANAGERSУправленческие руководители (опционально)

Запуск задачи bulk sync

Все типы синхронизации создаются одним методом — Создать задачу синхронизации. Отличаются только поля type и data.

curl -X POST "https://{tenantHost}/api/v1/clients/{clientId}/bulkDataSyncTasks" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "User-Api-Token: {token}" \
-d '{
"type": "LEGAL_ENTITIES",
"data": [
{
"externalId": "LE-001",
"name": "ООО Компания",
"shortName": "Компания",
"inn": "7712345678",
"ogrn": "1177746123456",
"kpp": "771201001"
}
]
}'

В ответе сервер возвращает bulkDataSyncTask.id. Прогресс и итог проверяйте методом Статус задачи синхронизации.

Запускайте задачи одного типа последовательно

Сервер не блокирует параллельный запуск двух задач одного type через этот метод, но конкурирующие задачи (особенно для CLIENT_DEPARTMENTS) могут давать неожиданные результаты — последующая задача увидит ещё не применённые изменения предыдущей. Безопаснее дождаться финального статуса (SUCCEEDED / FAILED / PARTIALLY_SUCCEEDED) перед запуском следующей задачи того же типа. Задачи разных типов выполняются параллельно.

{
"type": "LEGAL_ENTITIES",
"data": [
{
"externalId": "LE-001",
"name": "ООО Компания",
"shortName": "Компания",
"inn": "7712345678",
"ogrn": "1177746123456",
"kpp": "771201001"
}
]
}
ПолеОбязательностьОписание
externalIdДаIDid Внутренний идентификатор сущности в формате UUID, генерируемый HRlink при создании. Неизменяемый, используется во всех внутренних операциях. юрлица во внешней системе
nameДаПолное название
shortNameНетКороткое название
innНетИНН (10 или 12 цифр)
ogrnНетОГРН
kppНетКПП

Шаг 2. Отделы — CLIENT_DEPARTMENTS

Иерархия задаётся через parentExternalId. Корневой отдел создаётся автоматически при создании клиента; ссылайтесь на него через parentExternalId: null или не указывайте поле для отделов первого уровня.

{
"type": "CLIENT_DEPARTMENTS",
"parameters": {
"syncDepartmentsMode": "CREATE_OR_UPDATE"
},
"data": [
{
"externalId": "DEP-IT",
"name": "IT-отдел",
"legalEntityExternalId": "LE-001",
"parentExternalId": null
},
{
"externalId": "DEP-IT-DEV",
"name": "Разработка",
"legalEntityExternalId": "LE-001",
"parentExternalId": "DEP-IT"
}
]
}

Режимы синхронизации отделов

РежимПоведениеКогда использовать
CREATE_OR_UPDATE (по умолчанию, если parameters не задан)Создаёт отсутствующие отделы и обновляет существующие. Отделы, не указанные в data, не трогаетПолнаЛНА Локальный нормативный акт — внутренний документ организации, с которым сотрудники знакомятся через HRlink. Управляется через отдельный набор API-методов.я или дельта-синхронизация без удалений
UPDATEТолько обновляет существующие отделы. Отсутствующие в системе пропускает (статус SKIPPED), не создаваяЧастичные правки, когда новые отделы создавать не нужно
Режима «удалить отсутствующие» нет

Bulk sync для отделов не удаляет отделы, которых нет в data. Удаление выполняется отдельным методом справочника отделов.

Шаг 3. Должности — EMPLOYEE_POSITIONS

{
"type": "EMPLOYEE_POSITIONS",
"data": [
{ "externalId": "POS-DEV", "name": "Разработчик" },
{ "externalId": "POS-QA", "name": "Инженер по тестированию" }
]
}

Шаг 4. Пользователи и сотрудники — CLIENT_USERS_V6

CLIENT_USERS_V6 загружает пользователя клиента (физлицо, идентифицируется по СНИЛС) и одновременно связанных с ним сотрудников. Один человек может быть сотрудником в нескольких юрлицах — все его записи передаются массивом employees.

{
"type": "CLIENT_USERS_V6",
"data": [
{
"snils": "12345678901",
"email": "ivanov@company.ru",
"surname": "Иванов",
"name": "Иван",
"patronymic": "Иванович",
"employees": [
{
"externalId": "EMP-001",
"legalEntityExternalId": "LE-001",
"departmentExternalId": "DEP-IT-DEV",
"positionExternalId": "POS-DEV",
"number": "ТН-042",
"isMainWorkplace": true,
"fullTimeEquivalent": "1.0"
}
]
}
]
}
ПолеУровеньОбязательностьОписание
snilsuserUser Физическое лицо в системе HRlink. Один User соответствует одному реальному человеку. С пользователем связаны персональные данные, документы (СНИЛС, паспорт, ИНН) и логины (email, телефон).ДаСНИЛС, ключ идентификации физлица
surname, nameuserUser Физическое лицо в системе HRlink. Один User соответствует одному реальному человеку. С пользователем связаны персональные данные, документы (СНИЛС, паспорт, ИНН) и логины (email, телефон).ДаФамилия и имя
patronymicuserUser Физическое лицо в системе HRlink. Один User соответствует одному реальному человеку. С пользователем связаны персональные данные, документы (СНИЛС, паспорт, ИНН) и логины (email, телефон).НетОтчество
emailuserUser Физическое лицо в системе HRlink. Один User соответствует одному реальному человеку. С пользователем связаны персональные данные, документы (СНИЛС, паспорт, ИНН) и логины (email, телефон).НетEmail пользователя
employees[].externalIdemployeeEmployee Связь пользователя пространства клиента с юрлицом — пара (clientUserId, legalEntityId). Один пользователь может иметь несколько записей Employee в разных юрлицах или даже в одном.ДаIDid Внутренний идентификатор сущности в формате UUID, генерируемый HRlink при создании. Неизменяемый, используется во всех внутренних операциях. сотрудника во внешней системе
employees[].legalEntityExternalIdemployeeEmployee Связь пользователя пространства клиента с юрлицом — пара (clientUserId, legalEntityId). Один пользователь может иметь несколько записей Employee в разных юрлицах или даже в одном.ДаexternalId юрлица из шага 1
employees[].departmentExternalIdemployeeEmployee Связь пользователя пространства клиента с юрлицом — пара (clientUserId, legalEntityId). Один пользователь может иметь несколько записей Employee в разных юрлицах или даже в одном.НетexternalId отдела из шага 2
employees[].positionExternalIdemployeeEmployee Связь пользователя пространства клиента с юрлицом — пара (clientUserId, legalEntityId). Один пользователь может иметь несколько записей Employee в разных юрлицах или даже в одном.НетexternalId должности из шага 3
employees[].numberemployeeEmployee Связь пользователя пространства клиента с юрлицом — пара (clientUserId, legalEntityId). Один пользователь может иметь несколько записей Employee в разных юрлицах или даже в одном.НетТабельный номер
employees[].isMainWorkplaceemployeeEmployee Связь пользователя пространства клиента с юрлицом — пара (clientUserId, legalEntityId). Один пользователь может иметь несколько записей Employee в разных юрлицах или даже в одном.НетПризнак основного места работы
employees[].fullTimeEquivalentemployeeEmployee Связь пользователя пространства клиента с юрлицом — пара (clientUserId, legalEntityId). Один пользователь может иметь несколько записей Employee в разных юрлицах или даже в одном.НетСтавка (FTE), строка вида "1.0"
СНИЛС — ключ идентификации

Если пользователь с таким snils уже есть в HRlink (например, работает у другого клиента), bulk sync привяжет существующего пользователя к вашему клиенту, а не создаст дубль.

Версии CLIENT_USERS

Каждая версия добавляет одно поле к предыдущей; обратная совместимость сохраняется.

ВерсияДобавленное поле
CLIENT_USERS (v1)Базовые поля
CLIENT_USERS_V2availableVacationDayCount
CLIENT_USERS_V3number (табельный номер)
CLIENT_USERS_V4isMainWorkplace
CLIENT_USERS_V5calendarType
CLIENT_USERS_V6fullTimeEquivalent (FTE)

В новых интеграциях используйте CLIENT_USERS_V6 — он включает все поля предыдущих версий.

Шаг 5. Управленческие руководители — EMPLOYEE_FUNCTIONAL_MANAGERS

Управленческий руководитель (functionalManager) задаётся отдельной задачей после загрузки сотрудников.

{
"type": "EMPLOYEE_FUNCTIONAL_MANAGERS",
"data": [
{
"employeeExternalId": "EMP-001",
"functionalManagerExternalId": "EMP-007"
}
]
}
Чем отличается от руководителя отдела

Руководитель отдела (headManager) — атрибут отдела, задаётся в CLIENT_DEPARTMENTS. Управленческий руководитель (functionalManager) — атрибут конкретного сотрудника, задаётся отдельным типом задачи.

Увольнение и восстановление

Жизненный цикл сотрудника после увольнения и при восстановлении обрабатывает Массовое увольнение/восстановление. Метод принимает массив employees: для увольнения передайте dismissedDate, для восстановления — тот же сотрудник без даты увольнения.

curl -X PUT "https://{tenantHost}/api/v1/clients/{clientId}/employees/bulkDismissAndRestore" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "User-Api-Token: {token}" \
-d '{
"employees": [
{ "externalId": "EMP-001", "dismissedDate": "2026-04-15", "version": 5 },
{ "externalId": "EMP-002", "version": 3 }
]
}'

Поле version обязательно для каждой записи — это optimistic lock. Получите актуальное значение через employeeGetEmployeeByExternalId перед запросом.

Стратегия дельта-синхронизации

Для регулярной сверки с внешней системой:

  1. Запросите реестр сотрудников через employeeGetPaginatedEmployees с фильтром по дате изменения.
  2. Сравните выборку с данными внешней системы.
  3. Сформируйте задачу CLIENT_USERS_V6 со всеми изменёнными и новыми пользователями (bulk sync — это upsert по externalId).
  4. Уволенных передайте в employeeBulkDismissAndRestore.employees с dismissedDate.
  5. Восстановленных передайте в employeeBulkDismissAndRestore.employees без dismissedDate.

Ограничения и пакетирование

  • externalId обязателен у каждого элемента data для всех типов и должен быть уникальным в пределах одной задачи.

  • Лимит элементов в data задаётся per-type — единого ограничения нет:

    ТипЛимит элементов
    EMPLOYEE_FUNCTIONAL_MANAGERS1000
    EMPLOYEE_VACATIONS, EMPLOYEE_VACATIONS_V2, EMPLOYEE_VACATIONS_PLANNING, EMPLOYEE_CUSTOM_STRUCTURE_ELEMENTS, CLIENT_USER_VACATIONS500
    LEGAL_ENTITIES, CLIENT_DEPARTMENTS, EMPLOYEE_POSITIONS, CLIENT_USERS_*, CALENDARS, CUSTOM_STRUCTURESсервер не проверяет
  • Для типов без серверного лимита всё равно бейте выборку на порции по 500 элементов — нагрузка на API ровнее, ошибки изолируются в маленьких пакетах. Подробнее — Массовые операции → Ограничения.

  • Сервер не блокирует параллельный запуск задач одного типа, но это не значит «безопасно». Дожидайтесь финального статуса предыдущей задачи того же type — особенно для CLIENT_DEPARTMENTS, где параллельные задачи могут видеть устаревшее состояние справочника.

  • Для CALENDARS и CUSTOM_STRUCTURES пользователю нужны дополнительные права (CALENDAR_CREATE + CALENDAR_YEARS_EDIT и CUSTOM_STRUCTURES_CREATE + CUSTOM_STRUCTURES_UPDATE соответственно) сверх базового BULK_DATA_SYNC_TASKS_CREATE.

Производительность реестров

При работе с реестрами более 45 000 записей используйте фильтры по датам и юрлицам, чтобы разбить выборку на порции. ПолнаЛНА Локальный нормативный акт — внутренний документ организации, с которым сотрудники знакомятся через HRlink. Управляется через отдельный набор API-методов.я выгрузка без фильтров медленнее и сильнее нагружает API.