Блог Горошко Андрея Bitrix24,PHP Как использовать сквозную аналитику при создании сделки и контакта

Как использовать сквозную аналитику при создании сделки и контакта

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

Как использовать сквозную аналитику при создании сделки и контакта

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

Пример использования сквозной аналитики при создании сделки и контакта. Предварительно создайте php-страницу с веб-формой обратной связи: Ф.И.О, телефон. На странице разместите код примера.

Что происходит во время выполнения кода?

1. Подключается стандартный js-код из сквозной аналитики Битрикс24
2. После заполнения формы, помимо полей формы, в скрытом поле передается код для сквозной аналитики b24Tracker.guest.getTrace()
3. Далее создается сделка и связанный контакт
4. И затем регистрируется «след» аналитики для этих объектов, с передачей их типов и идентификаторов вида:

/rest/crm.tracking.trace.add?ENTITIES[0][TYPE]=CONTACT&ENTITIES[0][ID]=3215&ENTITIES[1][TYPE]=LEAD&ENTITIES[1][ID]=1&TRACE=…

Скрипт сквозной аналитики устанавливается на вашем сайте перед закрывающим тегом </body> на всех страницах сайта, включая страницу с формой.

  • JS
    <!DOCTYPE html>
    <html lang="ru">
    <head>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" crossorigin="anonymous">
    </head>
    <body class="container">
    <h1>Feedback</h1>
    <div class="col-12">
        <p id="message"></p>
    </div>
    <form id="feedbackForm">
        <input type="hidden" id="FORM_TRACE" name="TRACE">
        <div class="row">
            <div class="col-4 mt-3">
                <label>Name*</label>
            </div>
            <div class="col-6 mt-3">
                <input type="text" name="NAME" required>
            </div>
        </div>
        <div class="row">
            <div class="col-4 mt-3">
                <label>Last name*</label>
            </div>
            <div class="col-6 mt-3">
                <input type="text" name="LAST_NAME" required>
            </div>
        </div>
        <div class="row">
            <div class="col-4 mt-3">
                <label>Phone*</label>
            </div>
            <div class="col-6 mt-3">
                <input type="text" name="PHONE" required>
            </div>
        </div>
        <div class="row">
            <div class="col-sm-10">
                <input type="submit" class="btn btn-primary" value="Send">
            </div>
        </div>
    </form>
    <script>
        document.getElementById('feedbackForm').addEventListener('submit', function(event) {
            event.preventDefault();
            var formData = new FormData(event.target);
            var fields = {
                NAME: formData.get('NAME'),
                LAST_NAME: formData.get('LAST_NAME'),
                PHONE: [{ value: formData.get('PHONE') }]
            };

            BX24.callMethod(
                'crm.contact.add',
                { fields: fields },
                function(resultContact) {
                    if (resultContact.error()) {
                        document.getElementById('message').innerText = 'Feedback has not been saved: ' + resultContact.error_description();
                    } else {
                        var arDealFields = {
                            TITLE: 'Feedback page: ' + formData.get('NAME') + ' ' + formData.get('LAST_NAME'),
                            CONTACT_ID: resultContact.data()
                        };

                        BX24.callMethod(
                            'crm.deal.add',
                            { fields: arDealFields },
                            function(resultDeal) {
                                if (resultDeal.error()) {
                                    document.getElementById('message').innerText = 'Feedback has not been saved: ' + resultDeal.error_description();
                                } else {
                                    if (formData.get('TRACE')) {
                                        BX24.callMethod(
                                            'crm.tracking.trace.add',
                                            {
                                                ENTITIES: [
                                                    { TYPE: 'CONTACT', ID: resultContact.data() },
                                                    { TYPE: 'DEAL', ID: resultDeal.data() }
                                                ],
                                                TRACE: formData.get('TRACE')
                                            },
                                            function(resultTrace) {
                                                if (resultTrace.error()) {
                                                    document.getElementById('message').innerText = 'Feedback has not been saved: ' + resultTrace.error_description();
                                                } else {
                                                    document.getElementById('message').innerText = 'Feedback saved';
                                                }
                                            }
                                        );
                                    } else {
                                        document.getElementById('message').innerText = 'Feedback saved';
                                    }
                                }
                            }
                        );
                    }
                }
            );
        });

        window.onload = function(e) {
            var traceDom = document.getElementById('FORM_TRACE');
            if (traceDom) {
                var trace = b24Tracker.guest.getTrace();
                traceDom.value = trace;
            }
        }
    </script>
    </body>
    </html>
  • PHP

Для использования примеров на PHP настройте работу класса CRest и подключите файл crest.php в файлах, где используется этот класс. Подробнее

    <!DOCTYPE html>
    <html lang="ru">
    <head>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" crossorigin="anonymous">
    </head>
    <body class="container">
    <h1>Feedback</h1>
    <?
    include("crest.php");
    $message = '';
    if(!empty($_POST['SAVE']))
    {
        $fields = [
            'NAME' => $_POST['NAME'],
            'LAST_NAME' => $_POST['LAST_NAME'],
            'PHONE' => [ [ 'value'=>$_POST['PHONE'] ] ],
        ];
        $resultContact = CRest::call(
            'crm.contact.add',
            [
                'fields' => $fields
            ]
        );
        if (!empty($resultContact['result']))
        {
            $arDealFields = [
                'TITLE' => 'Feedback page: '.$_POST['NAME'].' '.$_POST['LAST_NAME'],
                'CONTACT_ID' => $resultContact['result']
            ];
            $resultDeal = CRest::call(
                'crm.deal.add',
                [
                    'fields' => $arDealFields
                ]
            );
            if (!empty($resultDeal['result']))
            {
                if(!empty($_POST['TRACE']))
                {
                    $resultTrace = CRest::call(
                        'crm.tracking.trace.add',
                        [
                            'ENTITIES' => [
                                [
                                    'TYPE' => 'CONTACT',//COMPANY, CONTACT, DEAL, LEAD, QUOTE
                                    'ID' => $resultContact['result']
                                ],
                                [
                                    'TYPE' => 'DEAL',//COMPANY, CONTACT, DEAL, LEAD, QUOTE
                                    'ID' => $resultDeal['result']
                                ]
                            ],
                            'TRACE' =>    $_POST['TRACE']
                        ]
                    );
                }
                $message = 'Feedback saved';
            }
            elseif (!empty($resultDeal['error_description']))
            {
                $message =    'Feedback has not been saved: '.$resultDeal['error_description'];
            }
            else
            {
                $message = 'Feedback has not been saved';
            }
        }
        elseif (!empty($resultContact['error_description']))
        {
            $message =    'Feedback has not been saved: '. $resultContact['error_description'];
        }
        else
        {
            $message = 'Feedback has not been saved';
        }
    }
    ?>
    <div class="col-12">
        <p><?=$message?></p>
    </div>
    <form method="post" action="">
        <input type="hidden" id="FORM_TRACE" name="TRACE">
        <div class="row">
            <div class="col-4 mt-3">
                <label>Name*</label>
            </div>
            <div class="col-6 mt-3">
                <input type="text" name="NAME" required>
            </div>
        </div>
        <div class="row">
            <div class="col-4 mt-3">
                <label>Last name*</label>
            </div>
            <div class="col-6 mt-3">
                <input type="text" name="LAST_NAME" required>
            </div>
        </div>
        <div class="row">
            <div class="col-4 mt-3">
                <label>Phone*</label>
            </div>
            <div class="col-6 mt-3">
                <input type="text" name="PHONE" required>
            </div>
        </div>
        <div class="row">
            <div class="col-sm-10">
                <input type="submit" name="SAVE" class="btn btn-primary" value="Send">
            </div>
        </div>
    </form>
    <script>
        window.onload = function(e){
            var traceDom = document.getElementById('FORM_TRACE');
            if(traceDom)
            {
                var trace = b24Tracker.guest.getTrace();
                traceDom.value = trace;
            }
        }
    </script>
    </body>
    </html>

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

Советы эксперта по интеграции:

  • Всегда используйте кэширование при частых запросах к битрикс, чтобы разгрузить базу данных.
  • Соблюдайте стандарты PSR при написании обработчиков для «Как использовать сквозную аналитику при создании сделки и контакта».
  • Регулярно проводите аудит производительности системы с помощью встроенного монитора 1С-Битрикс.

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

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

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

Related Post

Как использовать метод SDK sale.status.delete в Битрикс24Как использовать метод SDK sale.status.delete в Битрикс24

Эффективная интеграция и кастомизация функционала в Битрикс24 часто требует работы на уровне API. Сегодня мы подробно рассмотрим «Как использовать метод SDK sale.status.delete в Битрикс24». Вы узнаете экспертные методики работы с

Контентный блок конфигурируемого делаКонтентный блок конфигурируемого дела

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

Внедрение Битрикс24 для центров сертификации и экспертизыВнедрение Битрикс24 для центров сертификации и экспертизы

Профессиональная настройка и комплексная автоматизация Битрикс24 CRM позволяет выстроить прозрачный отдел продаж, исключить потерю обращений и автоматизировать рутинный документооборот компании. Услуга «Внедрение Битрикс24 для центров сертификации и экспертизы» обеспечивает учет