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

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

Оптимизация производительности и безопасности — залог успешного проекта на 1С-Битрикс. Данный материал посвящен практическому применению «Добавить компанию с реквизитами через веб-форму». Мы подготовили подробный разбор принципов работы и развернутые примеры интеграции.

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

> 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,
  • TITLE — название компании, обязательное,
  • INN — ИНН,
  • 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="TITLE" placeholder="Название организации" required>
        <input type="text" name="INN" 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 приводим к числу,
  • TITLE, INN, PHONE очищаем от HTML-тегов.
$iRequisitePresetID = intVal($_POST["REQ_TYPE"]);
$sTitle = htmlspecialchars($_POST["TITLE"]);
$sINN = htmlspecialchars($_POST["INN"]);
$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.company.add. В объекте fields передаем поля:

  • TITLE — название компании.
  • COMPANY_TYPE — тип компании. Узнать типы компаний можно методом crm.status.list, если использовать фильтр filter по полю ENTITY_ID со значением COMPANY_TYPE. В примере укажем значение CUSTOMER, так как заполняют форму только клиенты компании.
  • PHONE — телефон.

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

CRest::call(
	'crm.company.add', [
    	'fields' => [
        	'TITLE' => $sTitle,
        	'COMPANY_TYPE' => 'CUSTOMER', // Тип компании — клиент
        	'PHONE' => $arPhone
    	]
	]
);

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

{
	"result": 5
}

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

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

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

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

{
    "result": 27
}

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

Добавим адрес для реквизита методом 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"]);
$sTitle = htmlspecialchars($_POST["TITLE"]);
$sINN = htmlspecialchars($_POST["INN"]);
$sPhone = htmlspecialchars($_POST["PHONE"]);

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

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

// Создаем компанию
$result = CRest::call('crm.company.add', [
    'fields' => [
        'TITLE' => $sTitle,
        'COMPANY_TYPE' => 'CUSTOMER', // Тип — клиент
        'PHONE' => $arPhone
    ]
]);

// получаем идентификатор новой компании из ответа метода crm.company.add
if(!empty($result['result'])) {
    $companyId = $result['result'];
    
    // Добавляем реквизиты для новой компании
    $resultRequisite = CRest::call('crm.requisite.add', [
        'fields' => [
            'ENTITY_TYPE_ID' => 4, // Идентификатор типа объекта — 4, то есть компания
            'ENTITY_ID' => $companyId,
            'PRESET_ID' => $iRequisitePresetID,
            'ACTIVE' => 'Y',
            'NAME' => $sTitle,
            'RQ_INN' => $sINN
        ]
    ]);
    
    // Добавляем адрес, если реквизиты созданы успешно
    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

Очистить набор контактов, связанных с указанной компанией crm.company.contact…Очистить набор контактов, связанных с указанной компанией crm.company.contact…

Эффективная интеграция и кастомизация функционала в Битрикс24 часто требует работы на уровне API. Сегодня мы подробно рассмотрим «Очистить набор контактов, связанных с указанной компанией crm.company.contact…». Вы узнаете экспертные методики работы

Получить публичную ссылку на папку disk.folder.getexternallinkПолучить публичную ссылку на папку disk.folder.getexternallink

Оптимизация производительности и безопасности — залог успешного проекта на 1С-Битрикс. Данный материал посвящен практическому применению «Получить публичную ссылку на папку disk.folder.getexternallink». Мы подготовили подробный разбор принципов работы и развернутые примеры

Удалить настройку регулярного счета crm.invoice.recurring.deleteУдалить настройку регулярного счета crm.invoice.recurring.delete

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