Добавить повторный лид
Scope:
crmКто может выполнять метод: пользователи с правом на чтение лидов, контактов, компаний и правом на создание лидов
Если вы разрабатываете интеграции для Битрикс24 с помощью AI-инструментов (Codex, Claude Code, Cursor), подключите MCP-сервер, чтобы ассистент использовал официальную REST-документацию.
Когда клиент заполняет форму на сайте, его данные передаются в обработчик. Скрипт ищет в CRM совпадения по телефону или электронной почте среди лидов, контактов и компаний. Если совпадения найдены, лид помечается как повторный и привязывается к имеющейся записи. Такой подход помогает избежать дублей и повышает эффективность работы менеджеров.
В Битрикс24 должен быть включен режим работы с повторными лидами. Подробнее читайте в статье Повторные лиды и сделки.
Настройка состоит из двух этапов:
-
Подготавливаем поля и размещаем форму на странице.
-
Создаем файл-обработчик, который вызывает последовательно методы crm.duplicate.findbycomm, crm.lead.list, crm.lead.add.
1. Создаем веб-форму
Создаем HTML-форму с полями:
-
NAME— имя клиента, обязательное поле, -
LAST_NAME— фамилия, -
PHONE— телефон, -
EMAIL— электронная почта.
Форма передает данные методом POST в файл form.php.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(document).ready(function() {
$('#form_to_crm').on( 'submit', function(el) {//event submit form
el.preventDefault();//the default action of the event will not be triggered
var formData = $(this).serialize();
$.ajax({
'method': 'POST',
'dataType': 'json',
'url': 'form.php', // файл для сохранения заполненных форм
'data': formData,
success: function(data){//success callback
alert(data.message);
}
});
});
});
</script>
<form id="form_to_crm">
<input type="text" name="NAME" placeholder="Name" required>
<input type="text" name="LAST_NAME" placeholder="Last name">
<input type="text" name="PHONE" placeholder="Phone">
<input type="text" name="EMAIL" placeholder="E-mail">
<input type="submit" value="Submit">
</form>
2. Создаем обработчик формы
Создаем файл form.php. Обработчик будет обрабатывать данные, проверять дубликаты и создавать лид.
Получаем данные из формы
Получаем и безопасно обрабатываем данные из полей NAME, LAST_NAME, PHONE, EMAIL, чтобы избежать XSS-атак.
$sName = htmlspecialchars($_POST["NAME"]);
$sLastName = htmlspecialchars($_POST["LAST_NAME"]);
$sPhone = htmlspecialchars($_POST["PHONE"]);
$sEmail = htmlspecialchars($_POST["EMAIL"]);
Формируем массив $arFields с данными нового лида.
$arFields = [
'TITLE' => 'From the site: ' . implode(' ', [$sName, $sLastName]),
'NAME' => (!empty($sName)) ? $sName : 'Empty name',
'LAST_NAME' => $sLastName,
'PHONE' => (!empty($sPhone)) ? array(array('VALUE' => $sPhone, 'VALUE_TYPE' => 'HOME')) : array(),
'EMAIL' => (!empty($sEmail)) ? array(array('VALUE' => $sEmail, 'VALUE_TYPE' => 'HOME')) : array()
];
Заголовок лида формируем как From the site: Имя Фамилия.
Система хранит телефон и электронную почту как массивы объектов crm_multifield, поэтому формируем массивы PHONE и EMAIL с помощью значений $sPhone и $sEmail.
-
В поля
VALUEзаписываем$sPhoneи$sEmail. -
В поля
VALUE_TYPEпередаем типы, например,HOME.
Если в переменных $sPhone и $sEmail нет значений, указываем пустые массивы.
Ищем дубликаты лидов
Чтобы найти повторяющиеся лиды по телефону и электронной почте, используем метод crm.duplicate.findbycomm дважды. В него нужно передать следующие данные:
-
entity_type— тип объекта. ПередаемLEAD— лид. -
type— тип коммуникации. При первом вызове указываемPHONE, при втором —EMAIL. -
PHONE— массив с телефоном$arPhone, который получили из формы.
Поиск по телефону, "type" => "PHONE".
if(!empty($sPhone)){
$arResultDuplicate = CRest::call('crm.duplicate.findbycomm',[
"entity_type" => "LEAD",
"type" => "PHONE",
"values" => array($sPhone)
]);
if(!empty($arResultDuplicate['result']['LEAD'])){
$arLeadDuplicate = array_merge ($arLeadDuplicate,$arResultDuplicate['result']['LEAD']);
}
}
Поиск дубликатов по электронной почте, "type" => "EMAIL".
if(!empty($sEmail)){
$arResultDuplicate = CRest::call('crm.duplicate.findbycomm',[
"entity_type" => "LEAD",
"type" => "EMAIL",
"values" => array($sEmail)
]);
if(!empty($arResultDuplicate['result']['LEAD'])){
$arLeadDuplicate = array_merge ($arLeadDuplicate,$arResultDuplicate['result']['LEAD']);
}
}
Идентификаторы найденных дубликатов объединяем в массиве $arLeadDuplicate.
Обрабатываем дубликаты
Если дубликаты найдены, вызываем метод crm.lead.list.
-
Применяем фильтр по идентификатору и статусу
CONVERTED. -
Выбираем поля:
ID,COMPANY_ID,CONTACT_ID. -
Сохраняем результат в массиве
$arDuplicateLead. -
Заполняем поля
COMPANY_IDиCONTACT_IDв массиве$arFieldsзначениями из$arDuplicateLead.
if(!empty($arLeadDuplicate)){
$arDuplicateLead = CRest::call('crm.lead.list',[
"filter" => [
'=ID' => $arLeadDuplicate,
'STATUS_ID' => 'CONVERTED'
],
"select" => ['ID', 'COMPANY_ID', 'CONTACT_ID']
]);
if(!empty($arDuplicateLead['result'])){
$sCompany = reset(array_diff(array_column($arDuplicateLead['result'],'COMPANY_ID','ID'),['']));
$sContact = reset(array_diff(array_column($arDuplicateLead['result'],'CONTACT_ID','ID'),['']));
if($sCompany > 0) $arFields['COMPANY_ID'] = $sCompany;
if($sContact > 0) $arFields['CONTACT_ID'] = $sContact;
}
}
Добавляем новый лид
Чтобы добавить лид, используем метод crm.lead.add. В него передаем массив $arFields.
Проверьте, какие обязательные поля настроены для лидов в вашем Битрикс24. Все обязательные поля нужно передать в метод crm.lead.add.
$result = CRest::call('crm.lead.add', [
'fields' => $arFields
]);
Если лид создан успешно, метод вернет его идентификатор. Если вы получили ошибку error, изучите описание возможных ошибок в документации метода crm.lead.add.
{
"result": 3289,
}
Полный пример кода обработчика
<?
$sName = htmlspecialchars($_POST["NAME"]);
$sLastName = htmlspecialchars($_POST["LAST_NAME"]);
$sPhone = htmlspecialchars($_POST["PHONE"]);
$sEmail = htmlspecialchars($_POST["EMAIL"]);
$arFields = [
'TITLE' => (!empty($sName)) ? $sName : 'Empty name',
'LAST_NAME' => $sLastName,
'PHONE' => (!empty($sPhone)) ? array(array('VALUE' => $sPhone, 'VALUE_TYPE' => 'HOME')) : array(),
'EMAIL' => (!empty($sEmail)) ? array(array('VALUE' => $sEmail, 'VALUE_TYPE' => 'HOME')) : array()
];
$arLeadDuplicate = [];
if(!empty($sPhone)){ // поиск дубликатов по телефону
$arResultDuplicate = CRest::call('crm.duplicate.findbycomm',[
"entity_type" => "LEAD",
"type" => "PHONE",
"values" => array($sPhone)
]);
if(!empty($arResultDuplicate['result']['LEAD'])){
$arLeadDuplicate = array_merge ($arLeadDuplicate,$arResultDuplicate['result']['LEAD']);
}
}
if(!empty($sEmail)) { // поиск дубликатов по email
$arResultDuplicate = CRest::call('crm.duplicate.findbycomm', [
"entity_type" => "LEAD",
"type" => "EMAIL",
"values" => [$sEmail]
]);
if(!empty($arResultDuplicate[ 'result' ][ 'LEAD' ])) {
$arLeadDuplicate = array_merge($arLeadDuplicate, $arResultDuplicate[ 'result' ][ 'LEAD' ]);
}
}
if(!empty($arLeadDuplicate)){ // получение дубликата лида с выбором полей связанных контакта и компании
$arDuplicateLead = CRest::call('crm.lead.list',[
"filter" => [
'=ID' => $arLeadDuplicate,
'STATUS_ID' => 'CONVERTED',
],
'select' => [
'ID', 'COMPANY_ID', 'CONTACT_ID'
]
]);
if(!empty($arDuplicateLead['result'])){
$sCompany = reset(array_diff(array_column($arDuplicateLead['result'],'COMPANY_ID','ID'),['']));
$sContact = reset(array_diff(array_column($arDuplicateLead['result'],'CONTACT_ID','ID'),['']));
if($sCompany > 0)
$arFields['COMPANY_ID'] = $sCompany;
if($sContact > 0)
$arFields['CONTACT_ID'] = $sContact;
}
}
$result = CRest::call('crm.lead.add', // создание повторного лида
[
'fields' => $arFields
]
);
if(!empty($result['result'])){
echo json_encode(['message' => 'Lead add']);
}elseif(!empty($result['error_description'])){
echo json_encode(['message' => 'Lead not added: '.$result['error_description']]);
}else{
echo json_encode(['message' => 'Lead not added']);
}
?>
Продолжите изучение
- Получить лиды, контакты и компании с совпадающими данными crm.duplicate.findbycomm
- Получить список лидов crm.lead.list
- Создать новый лид crm.lead.add