Как завершить бизнес-процессы уволенного сотрудника
Scope:
user_brief, user_basic, user, bizprocКто может выполнять методы: администратор
Выберите инструмент для разработки с AI-агентом:
- используйте Битрикс24 Вайбкод, чтобы создать приложение для Битрикс24 по описанию задачи без знания языков программирования. Агент напишет код и разместит приложение на сервере без ручной настройки хостинга
- используйте MCP-сервер, чтобы разрабатывать интеграцию через REST API в своем проекте. Агент будет обращаться к официальной 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
]
]
);
from b24pysdk import BitrixWebhook, Client
client = Client(
BitrixWebhook(
domain="your-domain.bitrix24.com",
webhook_token="user_id/webhook_key",
)
)
result = client.user.get(
filter={
"NAME": "employee's name",
"LAST_NAME": "employee's last name",
"ACTIVE": 0,
}
).response.result
В результате получим 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
]
]
);
result = client.bizproc.task.list(
filter={
"USER_ID": 29,
"STATUS": 0,
}
).response.result
В результате получим список невыполненных заданий. У каждого задания есть параметр 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'
]
);
result = client.bizproc.workflow.kill(
bitrix_id="67e3db8e581121.72266518",
).response.result
В результате получим 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);
from typing import Optional
from b24pysdk import BitrixWebhook, Client
from b24pysdk.errors import BitrixAPIError
def get_user_id(client, first_name: str, last_name: str) -> Optional[int]:
try:
users = client.user.get(
filter={
"NAME": first_name,
"LAST_NAME": last_name,
"ACTIVE": 0,
},
).response.result
except BitrixAPIError as error:
print(f"Ошибка: {error}")
return None
if not users:
return None
return int(users[0]["ID"])
def get_user_tasks(client, user_id: int) -> list[str]:
tasks = client.bizproc.task.list(
filter={
"USER_ID": user_id,
"STATUS": 0,
},
).response.result
return [task["WORKFLOW_ID"] for task in tasks]
def kill_workflows(client, workflow_ids: list[str]) -> None:
for workflow_id in workflow_ids:
try:
client.bizproc.workflow.kill(bitrix_id=workflow_id).response
except BitrixAPIError as error:
print(f"Ошибка: {error}")
else:
print(f"Workflow {workflow_id} завершен успешно.")
def process_employee_tasks(client, first_name: str, last_name: str) -> None:
user_id = get_user_id(client, first_name, last_name)
if user_id is None:
return
workflow_ids = get_user_tasks(client, user_id)
kill_workflows(client, workflow_ids)
client = Client(
BitrixWebhook(
domain="your-domain.bitrix24.com",
webhook_token="user_id/webhook_key",
)
)
first_name = input("Введите имя сотрудника: ")
last_name = input("Введите фамилию сотрудника: ")
process_employee_tasks(client, first_name, last_name)