Как завершить бизнес-процессы уволенного сотрудника
Scope:
user_brief, user_basic, user, bizprocКто может выполнять методы: администратор
Если вы разрабатываете интеграции для Битрикс24 с помощью AI-инструментов (Codex, Claude Code, Cursor), подключите MCP-сервер, чтобы ассистент использовал официальную REST-документацию.
При увольнении сотрудника в Битрикс24 могут остаться незавершенные бизнес-процессы, за которые он был ответственен.
Чтобы завершить активные бизнес-процессы уволенного сотрудника, последовательно выполним три метода:
-
user.get — получим
IDуволенного сотрудника -
bizproc.task.list — получим список заданий процессов, за которые отвечает уволенный сотрудник
-
bizproc.workflow.kill — завершим бизнес-процессы с удалением данных. Если нужно сохранить факт запуска бизнес-процесса, используйте метод bizproc.workflow.terminate. Оба метода вызываются одинаково
1. Получим ID уволенного сотрудника
Используем метод user.get с фильтром:
-
NAME— укажем имя сотрудника -
LAST_NAME— укажем фамилию сотрудника -
ACTIVE— параметр регулирует поиск по активным или уволенным сотрудникам. Если параметр не передавать, поиск будет идти по всем сотрудникам вне зависимости от их статуса. Укажем0для поиска только среди уволенных сотрудников
Как использовать примеры в документации
BX24.callMethod(
"user.get",
{
filter: {
"NAME": "employee's name",
"LAST_NAME": "employee's last name",
"ACTIVE": 0
}
},
);
require_once('crest.php');
$result = CRest::call(
'user.get',
[
'filter' => [
'NAME' => "employee's name",
'LAST_NAME' => "employee's last name",
'ACTIVE' => 0
]
]
);
В результате получим ID уволенного сотрудника.
{
"result": [
{
"ID": "29",
"XML_ID": "28936832",
"ACTIVE": false,
"NAME": "employee's name",
"LAST_NAME": "employee's last name",
"SECOND_NAME": "",
"TITLE": "",
"EMAIL": "employee_email@gmail.com",
"LAST_LOGIN": "2025-03-27T13:49:36+03:00",
"DATE_REGISTER": "2020-04-23T03:00:00+03:00",
"TIME_ZONE": "Asia/Yekaterinburg",
"IS_ONLINE": "N",
"TIMESTAMP_X": {},
"LAST_ACTIVITY_DATE": {},
"PERSONAL_GENDER": "",
"PERSONAL_PROFESSION": "",
"PERSONAL_WWW": "",
"PERSONAL_BIRTHDAY": "",
"PERSONAL_PHOTO": "https://cdn-ru.bitrix24.ru/b13743910/main/3f2/3f212fkdjf8c3627cfe51633f959de/avatar.png",
"PERSONAL_ICQ": "",
"PERSONAL_PHONE": "",
"PERSONAL_FAX": "",
"PERSONAL_MOBILE": "",
"PERSONAL_PAGER": "",
"PERSONAL_STREET": "",
"PERSONAL_CITY": "",
"PERSONAL_STATE": "",
"PERSONAL_ZIP": "",
"PERSONAL_COUNTRY": "0",
"PERSONAL_MAILBOX": "",
"PERSONAL_NOTES": "",
"WORK_PHONE": "",
"WORK_COMPANY": "",
"WORK_POSITION": "Менеджер",
"WORK_DEPARTMENT": "",
"WORK_WWW": "",
"WORK_FAX": "",
"WORK_PAGER": "",
"WORK_STREET": "",
"WORK_MAILBOX": "",
"WORK_CITY": "",
"WORK_STATE": "",
"WORK_ZIP": "",
"WORK_COUNTRY": "0",
"WORK_PROFILE": "",
"WORK_NOTES": "",
"UF_EMPLOYMENT_DATE": "",
"UF_DEPARTMENT": [
7,
1
],
"UF_PHONE_INNER": "555",
"UF_USR_1619099890455": "12132132123",
"USER_TYPE": "employee"
}
],
"total": 1,
}
2. Получим список заданий процессов, за которые отвечает уволенный сотрудник
Используем метод bizproc.task.list с фильтром:
-
USER_ID— идентификатор сотрудника, передаем ID, полученный на шаге 1 -
STATUS— параметр отвечает за статус заданий, укажем0для отбора только невыполненных заданий
BX24.callMethod(
'bizproc.task.list',
{
filter: {
'USER_ID': 29,
'STATUS': 0,
}
},
);
require_once('crest.php');
$result = CRest::call(
'bizproc.task.list',
[
'filter' => [
'USER_ID' => 29,
'STATUS' => 0
]
]
);
В результате получим список невыполненных заданий. У каждого задания есть параметр WORKFLOW_ID — это ID бизнес-процесса, который мы завершим в следующем шаге.
{
"result": [
{
"ENTITY": "CCrmDocumentContact",
"DOCUMENT_ID": "CONTACT_2437",
"ID": "879",
"WORKFLOW_ID": "67e3db8e581121.72266518",
"DOCUMENT_NAME": "widget contact",
"NAME": "Адрес",
"DOCUMENT_URL": "/crm/contact/details/2437/"
},
{
"ENTITY": "CCrmDocumentContact",
"DOCUMENT_ID": "CONTACT_2435",
"ID": "877",
"WORKFLOW_ID": "67c5b492d0b426.74280093",
"DOCUMENT_NAME": "Контакт #2435",
"NAME": "Адрес",
"DOCUMENT_URL": "/crm/contact/details/2435/"
},
{
"ENTITY": "CCrmDocumentContact",
"DOCUMENT_ID": "CONTACT_2433",
"ID": "875",
"WORKFLOW_ID": "67c598a987d387.85575151",
"DOCUMENT_NAME": "Контакт #2433",
"NAME": "Адрес",
"DOCUMENT_URL": "/crm/contact/details/2433/"
},
{
"ENTITY": "CCrmDocumentContact",
"DOCUMENT_ID": "CONTACT_2429",
"ID": "871",
"WORKFLOW_ID": "67091df4b13dd2.83077613",
"DOCUMENT_NAME": "Петечкин Вася",
"NAME": "Адрес",
"DOCUMENT_URL": "/crm/contact/details/2429/"
},
{
"ENTITY": "CCrmDocumentContact",
"DOCUMENT_ID": "CONTACT_2427",
"ID": "859",
"WORKFLOW_ID": "66e2d5d5c64f82.28057011",
"DOCUMENT_NAME": "Иванович",
"NAME": "Адрес",
"DOCUMENT_URL": "/crm/contact/details/2427/"
},
{
"ENTITY": "CCrmDocumentContact",
"DOCUMENT_ID": "CONTACT_2425",
"ID": "857",
"WORKFLOW_ID": "66e0242399d303.52288141",
"DOCUMENT_NAME": "Петровна",
"NAME": "Адрес",
"DOCUMENT_URL": "/crm/contact/details/2425/"
},
{
"ENTITY": "CCrmDocumentContact",
"DOCUMENT_ID": "CONTACT_2423",
"ID": "855",
"WORKFLOW_ID": "66d870dfbb9542.91956540",
"DOCUMENT_NAME": "Смирнов",
"NAME": "Адрес",
"DOCUMENT_URL": "/crm/contact/details/2423/"
},
{
"ENTITY": "CCrmDocumentContact",
"DOCUMENT_ID": "CONTACT_2421",
"ID": "853",
"WORKFLOW_ID": "66d7fb6f86c0c2.49741539",
"DOCUMENT_NAME": "Калашников",
"NAME": "Адрес",
"DOCUMENT_URL": "/crm/contact/details/2421/"
},
{
"ENTITY": "CCrmDocumentContact",
"DOCUMENT_ID": "CONTACT_2419",
"ID": "851",
"WORKFLOW_ID": "66d073d9c9fc08.23457428",
"DOCUMENT_NAME": "Без имени",
"NAME": "Адрес",
"DOCUMENT_URL": "/crm/contact/details/2419/"
}
],
"total": 9,
}
3. Завершим бизнес-процессы
Используем метод bizproc.workflow.kill с параметром:
ID— идентификатор процесса, передаемWORKFLOW_ID, полученный на шаге 2
BX24.callMethod(
'bizproc.workflow.kill',
{
ID: '67e3db8e581121.72266518',
},
);
require_once('crest.php');
$result = CRest::call(
'bizproc.workflow.kill',
[
'ID' => '67e3db8e581121.72266518'
]
);
В результате получим true, удаление процесса прошло успешно. Если вы получили ошибку error, изучите описание возможных ошибок в документации метода bizproc.workflow.kill.
{
"result": true,
}
Пример кода
В примере все найденные процессы удаляются в цикле. Если вам требуется удалить большой объем данных, вы можете столкнуться с лимитами на выполнение запросов. Чтобы оптимизировать код под ваш объем работы, используйте рекомендации раздела Производительность.
// Функция для получения ID сотрудника по имени и фамилии
function getUserId(firstName, lastName, callback) {
BX24.callMethod(
"user.get",
{
"NAME": firstName,
"LAST_NAME": lastName,
"ACTIVE": 0,
},
function(result) {
if (result.error()) {
console.error(result.error());
} else {
// Предполагаем, что найден только один пользователь
const userId = result.data()[0].ID;
callback(userId);
}
}
);
}
// Функция для получения списка невыполненных заданий сотрудника
function getUserTasks(userId, callback) {
BX24.callMethod(
'bizproc.task.list',
{
filter: {
'USER_ID': userId,
'STATUS': 0,
}
},
function(result) {
if (result.error()) {
console.error(result.error());
} else {
// Извлекаем WORKFLOW_ID из каждого задания
const workflowIds = result.data().map(task => task.WORKFLOW_ID);
callback(workflowIds);
}
}
);
}
// Функция для завершения бизнес-процессов по списку WORKFLOW_ID
function killWorkflows(workflowIds) {
workflowIds.forEach(workflowId => {
BX24.callMethod(
'bizproc.workflow.kill',
{
ID: workflowId,
},
function(result) {
if (result.error()) {
console.error(result.error());
} else {
console.log(`Workflow ${workflowId} завершен успешно.`);
}
}
);
});
}
// Основная функция, которая объединяет все шаги
function processEmployeeTasks(firstName, lastName) {
getUserId(firstName, lastName, function(userId) {
getUserTasks(userId, function(workflowIds) {
killWorkflows(workflowIds);
});
});
}
// Запрашиваем у пользователя имя и фамилию
const firstName = prompt("Введите имя сотрудника:");
const lastName = prompt("Введите фамилию сотрудника:");
// Запускаем процесс
processEmployeeTasks(firstName, lastName);
require_once('crest.php');
// Функция для получения ID сотрудника по имени и фамилии
function getUserId($firstName, $lastName) {
$result = CRest::call(
'user.get',
[
'filter' => [
'NAME' => $firstName,
'LAST_NAME' => $lastName,
'ACTIVE' => 0
]
]
);
if (!empty($result['error'])) {
echo "Error: " . $result['error_description'];
return null;
}
// Предполагаем, что найден только один пользователь
return $result['result'][0]['ID'] ?? null;
}
// Функция для получения списка невыполненных заданий сотрудника
function getUserTasks($userId) {
$result = CRest::call(
'bizproc.task.list',
[
'filter' => [
'USER_ID' => $userId,
'STATUS' => 0
]
]
);
if (!empty($result['error'])) {
echo "Error: " . $result['error_description'];
return [];
}
// Извлекаем WORKFLOW_ID из каждого задания
return array_map(function($task) {
return $task['WORKFLOW_ID'];
}, $result['result']);
}
// Функция для завершения бизнес-процессов по списку WORKFLOW_ID
function killWorkflows($workflowIds) {
foreach ($workflowIds as $workflowId) {
$result = CRest::call(
'bizproc.workflow.kill',
[
'ID' => $workflowId
]
);
if (!empty($result['error'])) {
echo "Error: " . $result['error_description'];
} else {
echo "Workflow $workflowId завершен успешно.\n";
}
}
}
// Основная функция, которая объединяет все шаги
function processEmployeeTasks($firstName, $lastName) {
$userId = getUserId($firstName, $lastName);
if ($userId) {
$workflowIds = getUserTasks($userId);
killWorkflows($workflowIds);
}
}
// Запрашиваем у пользователя имя и фамилию
$firstName = readline("Введите имя сотрудника: ");
$lastName = readline("Введите фамилию сотрудника: ");
// Запускаем процесс
processEmployeeTasks($firstName, $lastName);