Как перенести дело между элементами одного типа
Scope:
crmКто может выполнять метод: пользователи с правом на изменение элементов CRM
Если вы разрабатываете интеграции для Битрикс24 с помощью AI-инструментов (Codex, Claude Code, Cursor), подключите MCP-сервер, чтобы ассистент использовал официальную REST-документацию.
Дела, связанные с элементами CRM, хранятся в таймлайне карточки элемента. Перенос дела из одного элемента в другой может потребоваться, когда в один лид попадает несколько писем или звонков, которые с точки зрения бизнеса относятся к разным лидам. В этом случае можно разделить исходный лид на несколько новых и перенести дела для корректного учета данных.
Для переноса дела последовательно выполним три метода:
-
crm.activity.list — получим ID дела
-
crm.lead.add — создадим элемент, в который перенесем дело, в примере лид
-
crm.activity.binding.move — выполним перенос дела
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"
},
{
"ID": "7687",
"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:58:13+03:00",
"LAST_UPDATED": "2025-03-10T10:58:13+03:00",
"START_TIME": "2025-03-10T10:58:08+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": 2,
}
Выберем нужное дело из списка полученных и сохраним его ID: 7687. В примере кода выбор дела реализован через поиск по фразе из поля DESCRIPTION.
2. Создаем новый элемент
Для создания нового лида, в который перенесем дело письма, выполним метод crm.lead.add с параметрами:
-
fields[TITLE]— название лида -
fields[ASSIGNED_BY_ID]— идентификатор ответственного за новый лид -
params[REGISTER_SONET_EVENT]— параметр для регистрации уведомлений, укажемY, чтобы на новый лид сработали системные уведомления при создании
В методе должны быть указаны все обязательные поля для лидов вашего Битрикс24, иначе лид создан не будет. Проверить, какие поля обязательные, можно методом crm.lead.fields, он вызывается без параметров.
BX24.callMethod(
"crm.lead.add",
{
fields:
{
TITLE: "Второй лид",
ASSIGNED_BY_ID: 1,
},
params: {
REGISTER_SONET_EVENT: "Y",
}
},
);
require_once('crest.php');
$result = CRest::call(
'crm.lead.add',
[
'fields' => [
'TITLE' => 'Второй лид',
'ASSIGNED_BY_ID' => 1,
],
'params' => [
'REGISTER_SONET_EVENT' => 'Y',
]
]
);
В результате получим ID созданного лида.
{
"result": 1000979,
}
3. Переносим дело между элементами
Для переноса дела используем метод crm.activity.binding.move с параметрами:
-
activityId— ID дела, получили на шаге 1 в методе crm.activity.list -
sourceEntityTypeId— ID типа объекта, откуда переносим дело -
sourceEntityId— ID элемента, откуда переносим дело -
targetEntityTypeId— ID типа объекта, куда переносим дело -
targetEntityId— ID элемента, куда переносим дело, получили на шаге 2 в методе crm.lead.add
sourceEntityTypeId и targetEntityTypeId должны иметь одинаковое значение типа объекта.
BX24.callMethod(
'crm.activity.binding.move',
{
activityId: 7687,
sourceEntityTypeId: 1,
sourceEntityId: 1000977,
targetEntityTypeId: 1,
targetEntityId: 1000979
}
);
require_once('crest.php');
$result = CRest::call(
'crm.activity.binding.move',
[
'activityId' => 7687,
'sourceEntityTypeId' => 1,
'sourceEntityId' => 1000977,
'targetEntityTypeId' => 1,
'targetEntityId' => 1000979
]
);
В результате получим true, перенос дела прошел успешно. Если в результате вы получили ошибку error, изучите описание возможных ошибок в документации метода crm.activity.binding.move.
{
"result": true,
}
Пример кода
// Функция для выполнения всех шагов
function transferActivity() {
// Запрашиваем ID первого лида у пользователя
const firstLeadId = prompt("Введите ID первого лида:");
// Запрашиваем фразу для поиска по полю описание
const searchPhrase = prompt("Введите фразу для поиска по телу письма:");
// Шаг 1: Получаем список дел для указанного лида
BX24.callMethod(
"crm.activity.list",
{
filter: {
"OWNER_TYPE_ID": 1,
"OWNER_ID": firstLeadId
},
},
function(result) {
if (result.error()) {
console.error(result.error());
return;
}
const activities = result.data();
const targetActivity = activities.find(activity => activity.DESCRIPTION.includes(searchPhrase));
if (!targetActivity) {
console.log(`Дело с описанием, содержащим '${searchPhrase}', не найдено.`);
return;
}
const activityId = targetActivity.ID;
// Шаг 2: Создаем новый лид
BX24.callMethod(
"crm.lead.add",
{
fields: {
TITLE: "Второй лид",
ASSIGNED_BY_ID: 1,
},
params: {
REGISTER_SONET_EVENT: "Y",
}
},
function(result) {
if (result.error()) {
console.error(result.error());
return;
}
const newLeadId = result.data();
// Шаг 3: Переносим дело
BX24.callMethod(
'crm.activity.binding.move',
{
activityId: activityId,
sourceEntityTypeId: 1,
sourceEntityId: firstLeadId,
targetEntityTypeId: 1,
targetEntityId: newLeadId
},
function(result) {
if (result.error()) {
console.error(result.error());
} else {
console.log("Дело успешно перенесено.");
}
}
);
}
);
}
);
}
// Запускаем функцию
transferActivity();
require_once('crest.php');
// Функция для выполнения всех шагов
function transferActivity($firstLeadId, $searchPhrase) {
// Шаг 1: Получаем список дел для указанного лида
$result = CRest::call(
'crm.activity.list',
[
'filter' => [
'OWNER_TYPE_ID' => 1,
'OWNER_ID' => $firstLeadId
]
]
);
if (isset($result['error'])) {
echo 'Ошибка: ' . $result['error_description'];
return;
}
$activities = $result['result'];
$targetActivity = null;
foreach ($activities as $activity) {
if (strpos($activity['DESCRIPTION'], $searchPhrase) !== false) {
$targetActivity = $activity;
break;
}
}
if (!$targetActivity) {
echo "Дело с описанием, содержащим '{$searchPhrase}', не найдено.";
return;
}
$activityId = $targetActivity['ID'];
// Шаг 2: Создаем новый лид
$leadResult = CRest::call(
'crm.lead.add',
[
'fields' => [
'TITLE' => 'Второй лид',
'ASSIGNED_BY_ID' => 1,
],
'params' => [
'REGISTER_SONET_EVENT' => 'Y',
]
]
);
if (isset($leadResult['error'])) {
echo 'Ошибка: ' . $leadResult['error_description'];
return;
}
$newLeadId = $leadResult['result'];
// Шаг 3: Переносим дело
$moveResult = CRest::call(
'crm.activity.binding.move',
[
'activityId' => $activityId,
'sourceEntityTypeId' => 1,
'sourceEntityId' => $firstLeadId,
'targetEntityTypeId' => 1,
'targetEntityId' => $newLeadId
]
);
if (isset($moveResult['error'])) {
echo 'Ошибка: ' . $moveResult['error_description'];
} else {
echo 'Дело успешно перенесено.';
}
}
// Запрашиваем ID первого лида и фразу для поиска у пользователя
$firstLeadId = readline("Введите ID первого лида: ");
$searchPhrase = readline("Введите фразу для поиска по телу письма: ");
// Запускаем функцию
transferActivity($firstLeadId, $searchPhrase);