Блог Горошко Андрея Bitrix24,PHP Добавить контакт с реквизитами через веб-форму

Добавить контакт с реквизитами через веб-форму

Эффективная интеграция и кастомизация функционала в Битрикс24 часто требует работы на уровне API. Сегодня мы подробно рассмотрим «Добавить контакт с реквизитами через веб-форму». Вы узнаете экспертные методики работы с битрикс и научитесь избегать типичных ошибок начинающих разработчиков.

Добавить контакт с реквизитами через веб-форму

> Scope: crm
>
> Кто может выполнять метод: пользователи с правом создания контактов в CRM

На сайте можно разместить форму для сбора данных и реквизитов клиентов. Когда клиент заполнит форму, его данные попадут в CRM, и вы сможете обработать заявку.

Настройка формы состоит из двух шагов.

1. Разместим форму на PHP-странице. В коде страницы получим список шаблонов реквизитов и поля адреса для формы. Данные формы отправим в обработчик.

2. Создадим файл для обработки данных. Обработчик примет и подготовит данные, а затем создаст контакт с реквизитами.

1\. Создаем веб-форму

Для формирования полей формы используем данные из Битрикс24. Чтобы получить информацию о настройках реквизитов, выполним последовательно два метода:

1. crm.address.fields — получаем список полей адреса. Результат сохраняем в arAddressFields,

   $arAddressFields = CRest::call('crm.address.fields', []);

2. crm.requisite.preset.list — запрашиваем список шаблонов реквизитов. С помощью параметра select выбираем поля ID и NAME для каждого шаблона. Результат сохраняем в arRequisiteType.

   $arRequisiteType = CRest::call(
       'crm.requisite.preset.list', [
           'select' => ["ID", "NAME"]
       ]
   );

Добавим на страницу сайта веб-форму с полями:

  • REQ_TYPE — выпадающий список с типом реквизитов из массива arRequisiteType, обязательное,
  • NAME — имя контакта, обязательное,
  • LAST_NAME — фамилия,
  • PHONE — телефон,
  • ${addressFieldsInputs} — поля адреса, которые создаются динамически из массива arAddressFields.

Форма отправляет данные методом POST в файл form.php.

Полный пример кода страницы с формой

<?php
// Получаем список полей адреса и шаблонов реквизитов
$arAddressFields = CRest::call('crm.address.fields', []);
$arRequisiteType = CRest::call('crm.requisite.preset.list', [
    'select' => ["ID", "NAME"]
]);

if (!empty($arRequisiteType['result'])): 
    $arRequisiteType = array_column($arRequisiteType['result'], 'NAME', 'ID');

    // Удаляем системные и неиспользуемые поля адреса
    $excludeFields = ['TYPE_ID', 'ENTITY_TYPE_ID', 'ENTITY_ID', 'COUNTRY_CODE', 'ANCHOR_TYPE_ID', 'ANCHOR_ID'];
    foreach ($excludeFields as $field) {
        unset($arAddressFields['result'][$field]);
    }
?>
    <form id="form_to_crm">
        <select name="REQ_TYPE" required>
            <option value="" disabled selected>Выберите тип реквизитов</option>
            <?php foreach ($arRequisiteType as $id => $name): ?>
                <option value="<?=$id?>"><?=$name?></option>
            <?php endforeach; ?>
        </select>
        <input type="text" name="NAME" placeholder="Имя" required>
        <input type="text" name="LAST_NAME" placeholder="Фамилия">
        <input type="text" name="PHONE" placeholder="Телефон">
        <?php foreach ($arAddressFields['result'] as $key => $arField): ?>
            <input type="text" name="ADDRESS[<?=$key?>]" 
                   placeholder="<?=$arField['title']?>" 
                   <?=$arField['isRequired'] ? 'required' : ''?>>
        <?php endforeach; ?>
        <input type="submit" value="Отправить">
    </form>
<?php else: ?>
    <p>Нет доступных типов реквизитов.</p>
<?php endif; ?>

<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) {
        el.preventDefault();
        $.ajax({
            method: 'POST',
            dataType: 'json',
            url: 'form.php',
            data: $(this).serialize(),
            success: function(data) {
                alert(data.message);
            }
        });
    });
});
</script>

2\. Создаем обработчик формы

Чтобы обработать значения из полей формы и добавить контакт в CRM, создадим обработчик form.php.

Подготавливаем данные

Получаем и очищаем данные из формы:

  • REQ_TYPE приводим к числу,
  • NAME, LAST_NAME, PHONE очищаем от HTML-тегов.
$iRequisitePresetID = intVal($_POST["REQ_TYPE"]);
$sName = htmlspecialchars($_POST["NAME"]);
$sLastName = htmlspecialchars($_POST["LAST_NAME"]);
$sPhone = htmlspecialchars($_POST["PHONE"]);

Подготавливаем поля адреса и собираем их в массив $arAddress.

  • Значения полей из формы очищаем от HTML-тегов.
  • Добавляем тип адреса TYPE_ID. Получить типы адресов можно методом crm.enum.addresstype. Укажем значение — 1, то есть фактический адрес.
  • Добавляем идентификатор типа объекта ENTITY_TYPE_ID. Получить идентификаторы можно методом crm.enum.ownertype. Укажем значение — 8, то есть реквизит.
$arAddress = [];
foreach($_POST["ADDRESS"] as $key => $val) {
    $arAddress[$key] = htmlspecialchars($val);
}
$arAddress['TYPE_ID'] = 1;
$arAddress['ENTITY_TYPE_ID'] = 8;

Система хранит телефон как массив объектов crm_multifield, поэтому его нужно привести к формату массива.

1. Добавляем телефон первым элементом VALUE в массив, а вторым значением указываем тип VALUE_TYPE, например, WORK.

2. Для пустого значения передаем пустой массив.

$arPhone = !empty($sPhone) ? [['VALUE' => $sPhone, 'VALUE_TYPE' => 'WORK']] : [];

Добавляем контакт

Для создания контакта выполним метод crm.contact.add. В объекте fields передаем поля:

  • NAME — имя контакта,
  • LAST_NAME — фамилия,
  • PHONE — телефон.

Проверьте, какие обязательные поля настроены для контактов в вашем Битрикс24. Все обязательные поля нужно передать в метод crm.contact.add.

CRest::call(
    'crm.contact.add', [
        'fields' => [
            'NAME' => $sName,
            'LAST_NAME' => $sLastName,
            'PHONE' => $arPhone
        ]
    ]
);

В результате получим идентификатор нового контакта, например, 23.

{
	"result": 23
}

Добавляем реквизиты в контакт

Для добавления реквизитов в контакт выполним метод crm.requisite.add. В объекте fields передаем поля:

  • ENTITY_TYPE_ID — идентификатор типа объекта. Получить идентификаторы можно методом crm.enum.ownertype. В примере укажем значение 3, то есть контакт,
  • ENTITY_ID — идентификатор контакта, который получили в предыдущем запросе,
  • PRESET_ID — идентификатор шаблона реквизитов, который получили из формы,
  • ACTIVE — активность реквизита Y,
  • NAME — название реквизита, например, объединим имя и фамилию контакта,
CRest::call(
    'crm.requisite.add', 
    [
        'fields' => [
            'ENTITY_TYPE_ID' => 3,
            'ENTITY_ID' => $contactId,
            'PRESET_ID' => $iRequisitePresetID,
            'ACTIVE' => 'Y',
            'NAME' => implode(' ', [$sName, $sLastName]),
        ]
    ]
);

В результате получим идентификатор реквизитов.

{
    "result": 34
}

Добавляем адрес для реквизита

Добавим адрес для реквизита методом crm.address.add, если реквизит создался успешно. В $arAddress добавляем ENTITY_ID с ID реквизита из ответа предыдущего запроса. В объекте fields передаем массив $arAddress с полями адреса.

if(!empty($resultRequisite['result'])) {
	$arAddress['ENTITY_ID'] = $resultRequisite['result'];
	CRest::call(
		'crm.address.add',
		[
			'fields' => $arAddress
		]
	);
}

Полный пример кода обработчика

<?php
require_once('crest.php');

// Получаем и очищаем данные формы
$iRequisitePresetID = intVal($_POST["REQ_TYPE"]);
$sName = htmlspecialchars($_POST["NAME"]);
$sLastName = htmlspecialchars($_POST["LAST_NAME"]);
$sPhone = htmlspecialchars($_POST["PHONE"]);

// Подготавливаем адрес
$arAddress = [];
foreach ($_POST["ADDRESS"] as $key => $val) {
    $arAddress[$key] = htmlspecialchars($val);
}
$arAddress['TYPE_ID'] = 1; // Фактический адрес
$arAddress['ENTITY_TYPE_ID'] = 8; // Тип объекта — реквизит

// Форматируем телефон для Битрикс24
$arPhone = !empty($sPhone) ? [['VALUE' => $sPhone, 'VALUE_TYPE' => 'WORK']] : [];

// Создаем контакт
$result = CRest::call('crm.contact.add', [
    'fields' => [
        'NAME' => $sName,
        'LAST_NAME' => $sLastName,
        'PHONE' => $arPhone
    ]
]);

// Получаем идентификатор нового контакта
if (!empty($result['result'])) {
    $contactId = $result['result'];

    // Добавляем реквизиты для нового контакта
    $resultRequisite = CRest::call('crm.requisite.add', [
        'fields' => [
            'ENTITY_TYPE_ID' => 3, // Тип объекта — контакт
            'ENTITY_ID' => $contactId,
            'PRESET_ID' => $iRequisitePresetID,
            'ACTIVE' => 'Y',
            'NAME' => implode(' ', [$sName, $sLastName]),
        ]
    ]);

    // Добавляем адрес, если реквизиты созданы успешно
    if (!empty($resultRequisite['result'])) {
        $arAddress['ENTITY_ID'] = $resultRequisite['result'];
        CRest::call('crm.address.add', ['fields' => $arAddress]);
    }

    echo json_encode(['message' => 'Контакт успешно добавлен']);
} else {
    $error = !empty($result['error_description']) ? $result['error_description'] : 'Неизвестная ошибка';
    echo json_encode(['message' => 'Ошибка: ' . $error]);
}
?>

💡 Экспертное мнение и рекомендации

Ключевые выводы по теме «Добавить контакт с реквизитами через веб-форму»:

Использование современных стандартов D7 при работе с битрикс позволяет писать чистый, масштабируемый и безопасный код. Не забывайте обрабатывать исключения (try/catch) и проверять права доступа текущего пользователя перед выполнением критических операций.

Похожая задача в бизнесе?

Помогу автоматизировать процессы и внедрить ИИ

Меня зовут Андрей Горошко. Я Full-stack разработчик и эксперт по 1С-Битрикс. Настраиваю CRM Битрикс24, разрабатываю защищенные API и создаю умных ИИ-агентов для автоматизации рутины.

Related Post

Получить список правил округления цен по фильтру catalog.roundingRule.listПолучить список правил округления цен по фильтру catalog.roundingRule.list

Каждый PHP-разработчик, работающий с экосистемой Bitrix Framework, должен глубоко понимать работу её ключевых компонентов. В этой статье мы проведем подробный аудит темы «Получить список правил округления цен по фильтру catalog.roundingRule.list»,

Получить поля пользовательского типа crm.type.fieldsПолучить поля пользовательского типа crm.type.fields

При разработке и поддержке проектов на платформе 1С-Битрикс критически важно использовать современные стандарты D7 API. В этом руководстве мы детально изучим тему «Получить поля пользовательского типа crm.type.fields», разберем архитектурные особенности

Удалить товар catalog.product.deleteУдалить товар catalog.product.delete

Каждый PHP-разработчик, работающий с экосистемой Bitrix Framework, должен глубоко понимать работу её ключевых компонентов. В этой статье мы проведем подробный аудит темы «Удалить товар catalog.product.delete», проанализируем лучшие практики и покажем,