Как перенести дело из одного типа объекта в другой
Scope:
crmКто может выполнять метод: пользователи с правом на изменение элементов CRM
Если вы разрабатываете интеграции для Битрикс24 с помощью AI-инструментов (Codex, Claude Code, Cursor), подключите MCP-сервер, чтобы ассистент использовал официальную REST-документацию.
Дела, связанные с элементами CRM, хранятся в таймлайне карточки элемента. Перенос дел может потребоваться между элементами разных типов: лид, сделка, контакт, компания, счет, смарт-процесс. Например, у клиента два электронных адреса, но в карточке компании вашего Битрикс24 сохранен только один. Когда клиент напишет письмо со второго, неизвестного вам, адреса, почта создаст новый лид, а не прикрепит письмо в карточку существующей компании. Для хранения информации о клиенте в одном месте можно перенести дело из лида в карточку компании.
Для переноса дела последовательно выполним четыре метода:
-
crm.activity.list — получим ID дела
-
crm.company.list — получим ID компании для переноса дела
-
crm.activity.binding.add — добавим связь дела с компанией
-
crm.activity.binding.delete — удалим связь дела с лидом
1. Получаем ID дела
Используем метод crm.activity.list с фильтром:
-
OWNER_TYPE_ID— тип объекта, укажем1для лида -
OWNER_ID— ID элемента, из которого будем переносить дело
Как использовать примеры в документации
BX24.callMethod(
"crm.activity.list",
{
filter:
{
"OWNER_TYPE_ID": 1,
"OWNER_ID": 1000977
},
},
);
require_once('crest.php');
$result = CRest::call(
'crm.activity.list',
[
'filter' => [
'OWNER_TYPE_ID' => 1,
'OWNER_ID' => 1000977 /
]
]
);
В результате получим все дела, связанные с указанным элементом.
{
"result": [
{
"ID": "7685",
"OWNER_ID": "1000977",
"OWNER_TYPE_ID": "1",
"TYPE_ID": "4",
"PROVIDER_ID": "CRM_EMAIL",
"PROVIDER_TYPE_ID": "EMAIL",
"PROVIDER_GROUP_ID": null,
"ASSOCIATED_ENTITY_ID": "0",
"SUBJECT": "для лидов",
"CREATED": "2025-03-10T10:57:41+03:00",
"LAST_UPDATED": "2025-03-10T10:57:41+03:00",
"START_TIME": "2025-03-10T10:57:34+03:00",
"END_TIME": "2025-03-10T20:00:00+03:00",
"DEADLINE": "9999-12-31T00:00:00+03:00",
"COMPLETED": "N",
"STATUS": "1",
"RESPONSIBLE_ID": "29",
"PRIORITY": "2",
"NOTIFY_TYPE": "0",
"NOTIFY_VALUE": "0",
"DESCRIPTION": "<div>письмо первое</div>\r\n",
"DESCRIPTION_TYPE": "3",
"DIRECTION": "1",
"LOCATION": "",
"SETTINGS": {
"EMAIL_META": {
"__email": "some_email@gmail.com",
"from": "Some client <some_client@gmail.com>",
"replyTo": "",
"to": "\"some_email@gmail.com\" <some_email@gmail.com>",
"cc": "",
"bcc": ""
},
"SANITIZE_ON_VIEW": 1
},
"ORIGINATOR_ID": null,
"ORIGIN_ID": null,
"AUTHOR_ID": "1",
"EDITOR_ID": "29",
"PROVIDER_PARAMS": [],
"PROVIDER_DATA": null,
"RESULT_MARK": "0",
"RESULT_VALUE": null,
"RESULT_SUM": null,
"RESULT_CURRENCY_ID": null,
"RESULT_STATUS": "0",
"RESULT_STREAM": "0",
"RESULT_SOURCE_ID": null,
"AUTOCOMPLETE_RULE": "0"
},
],
"total": 1,
}
2. Получаем ID компании
Используем метод crm.company.list с фильтром:
TITLE— название компании
Чтобы ограничить возвращаемые поля, добавим параметр select и укажем только поля ID и TITLE.
BX24.callMethod(
"crm.company.list",
{
filter: { "TITLE": "Название_компании" },
select: [ "ID", "TITLE" ]
},
);
require_once('crest.php');
$result = CRest::call(
'crm.company.list',
[
'filter' => [
'TITLE' => 'Название_компании'
],
'select' => [
'ID', 'TITLE'
]
]
);
В результате получим ID компании — ID: 173.
{
"result": [
{
"ID": "173",
"TITLE": "Название_компании"
}
],
"total": 1,
}
3. Добавляем связь дела с компанией
Для связи дела и компании используем метод crm.activity.binding.add с параметрами:
-
activityId— ID дела, получили на шаге 1 в методе crm.activity.list -
entityTypeId— ID типа объекта, укажем4для компании -
entityId— ID компании, получили на шаге 2 в методе crm.company.list
BX24.callMethod(
'crm.activity.binding.add',
{
activityId: 7685,
entityTypeId: 4,
entityId: 173
},
);
require_once('crest.php');
$result = CRest::call(
'crm.activity.binding.add',
[
'activityId' => 7685,
'entityTypeId' => 4,
'entityId' => 173
]
);
В результате получим true, добавление связи для дела прошло успешно. Если в результате вы получили ошибку error, изучите описание возможных ошибок в документации метода crm.activity.binding.add.
{
"result": true,
}
4. Удаляем связь дела с лидом
Используем метод crm.activity.binding.delete с параметрами:
-
activityId— ID дела, получили на шаге 1 в методе crm.activity.list -
entityTypeId— ID типа объекта, укажем1для лида -
entityId— ID лида, откуда удаляем дело
BX24.callMethod(
'crm.activity.binding.delete',
{
activityId: 7685,
entityTypeId: 1,
entityId: 1000977
},
);
require_once('crest.php');
$result = CRest::call(
'crm.activity.binding.delete',
[
'activityId' => 7685,
'entityTypeId' => 1,
'entityId' => 1000977
]
);
В результате получим true, удаление связи дела с лидом прошло успешно. Если в результате вы получили ошибку error, изучите описание возможных ошибок в документации метода crm.activity.binding.delete.
{
"result": true,
}
Пример кода
// Функция для выполнения всех шагов
function transferActivityToCompany() {
// Запрашиваем ID лида у пользователя
const leadId = prompt("Введите ID лида:");
// Запрашиваем название компании у пользователя
const companyName = prompt("Введите название компании:");
// Шаг 1: Получаем список дел для указанного лида
BX24.callMethod(
"crm.activity.list",
{
filter: {
"OWNER_TYPE_ID": 1,
"OWNER_ID": leadId
},
},
function(result) {
if (result.error()) {
console.error(result.error());
return;
}
const activities = result.data();
if (activities.length === 0) {
console.log("Дела для указанного лида не найдены.");
return;
}
const activityId = activities[0].ID;
// Шаг 2: Ищем компанию по названию
BX24.callMethod(
"crm.company.list",
{
filter: { "TITLE": companyName },
select: [ "ID", "TITLE" ]
},
function(result) {
if (result.error()) {
console.error(result.error());
return;
}
const companies = result.data();
if (companies.length === 0) {
console.log("Компания с указанным названием не найдена.");
return;
}
const companyId = companies[0].ID;
// Шаг 3: Создаем связь для найденного дела и компании
BX24.callMethod(
'crm.activity.binding.add',
{
activityId: activityId,
entityTypeId: 4,
entityId: companyId
},
function(result) {
if (result.error()) {
console.error(result.error());
return;
}
console.log("Связь дела с компанией успешно создана.");
// Шаг 4: Удаляем связь дела и лида
BX24.callMethod(
'crm.activity.binding.delete',
{
activityId: activityId,
entityTypeId: 1,
entityId: leadId
},
function(result) {
if (result.error()) {
console.error(result.error());
} else {
console.log("Связь дела с лидом успешно удалена.");
}
}
);
}
);
}
);
}
);
}
// Запускаем функцию
transferActivityToCompany();
require_once('crest.php');
// Функция для выполнения всех шагов
function transferActivityToCompany($leadId, $companyName) {
// Шаг 1: Получаем список дел для указанного лида
$activityResult = CRest::call(
'crm.activity.list',
[
'filter' => [
'OWNER_TYPE_ID' => 1,
'OWNER_ID' => $leadId
]
]
);
if (isset($activityResult['error'])) {
echo 'Ошибка: ' . $activityResult['error_description'];
return;
}
$activities = $activityResult['result'];
if (empty($activities)) {
echo "Дела для указанного лида не найдены.";
return;
}
$activityId = $activities[0]['ID'];
// Шаг 2: Ищем компанию по названию
$companyResult = CRest::call(
'crm.company.list',
[
'filter' => ['TITLE' => $companyName],
'select' => ['ID', 'TITLE']
]
);
if (isset($companyResult['error'])) {
echo 'Ошибка: ' . $companyResult['error_description'];
return;
}
$companies = $companyResult['result'];
if (empty($companies)) {
echo "Компания с указанным названием не найдена.";
return;
}
$companyId = $companies[0]['ID'];
// Шаг 3: Создаем связь для найденного дела и компании
$bindingAddResult = CRest::call(
'crm.activity.binding.add',
[
'activityId' => $activityId,
'entityTypeId' => 4,
'entityId' => $companyId
]
);
if (isset($bindingAddResult['error'])) {
echo 'Ошибка: ' . $bindingAddResult['error_description'];
return;
}
echo "Связь дела с компанией успешно создана.";
// Шаг 4: Удаляем связь дела и лида
$bindingDeleteResult = CRest::call(
'crm.activity.binding.delete',
[
'activityId' => $activityId,
'entityTypeId' => 1,
'entityId' => $leadId
]
);
if (isset($bindingDeleteResult['error'])) {
echo 'Ошибка: ' . $bindingDeleteResult['error_description'];
} else {
echo "Связь дела с лидом успешно удалена.";
}
}
// Запрашиваем ID лида и название компании у пользователя
$leadId = readline("Введите ID лида: ");
$companyName = readline("Введите название компании: ");
// Запускаем функцию
transferActivityToCompany($leadId, $companyName);