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

Как перенести дело из одного типа объекта в другой

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

Как перенести дело из одного типа объекта в другой

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

Дела, связанные с элементами CRM, хранятся в таймлайне карточки элемента. Перенос дел может потребоваться между элементами разных типов: лид, сделка, контакт, компания, счет, смарт-процесс. Например, у клиента два электронных адреса, но в карточке компании вашего Битрикс24 сохранен только один. Когда клиент напишет письмо со второго, неизвестного вам, адреса, почта создаст новый лид, а не прикрепит письмо в карточку существующей компании. Для хранения информации о клиенте в одном месте можно перенести дело из лида в карточку компании.

Для переноса дела последовательно выполним четыре метода:

1. crm.activity.list — получим ID дела

2. crm.company.list — получим ID компании для переноса дела

3. crm.activity.binding.add — добавим связь дела с компанией

4. crm.activity.binding.delete — удалим связь дела с лидом

1. Получаем ID дела {#first}

Используем метод crm.activity.list с фильтром:

  • OWNER_TYPE_ID — тип объекта, укажем 1 для лида
  • OWNER_ID — ID элемента, из которого будем переносить дело
  • JS
    BX24.callMethod(
        "crm.activity.list",
        {
            filter:
            {
                "OWNER_TYPE_ID": 1, 
                "OWNER_ID": 1000977 
            },
        },
    );
  • PHP
    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"
        },
    ],
    "total": 1,
}

2. Получаем ID компании {#second}

Используем метод crm.company.list с фильтром:

  • TITLE — название компании

Чтобы ограничить возвращаемые поля, добавим параметр select и укажем только поля ID и TITLE.

  • JS
    BX24.callMethod(
        "crm.company.list",
        {
            filter: { "TITLE": "Название_компании" },
            select: [ "ID", "TITLE" ]
        },
    );
  • PHP
    require_once('crest.php');

    $result = CRest::call(
        'crm.company.list',
        [
            'filter' => [
                'TITLE' => 'Название_компании' 
            ],
            'select' => [
                'ID', 'TITLE'
            ]
        ]
    );

В результате получим ID компании — ID: 173.

{
    "result": [
        {
            "ID": "173",
            "TITLE": "Название_компании"
        }
    ],
    "total": 1,
}

3. Добавляем связь дела с компанией

Для связи дела и компании используем метод crm.activity.binding.add с параметрами:

  • activityId — ID дела, получили на шаге 1 в методе crm.activity.list
  • entityTypeId — ID типа объекта, укажем 4 для компании
  • entityId — ID компании, получили на шаге 2 в методе crm.company.list
  • JS
    BX24.callMethod(
        'crm.activity.binding.add',
        {
            activityId: 7685, 
            entityTypeId: 4, 
            entityId: 173 
        },
    );
  • PHP
    require_once('crest.php');

    $result = CRest::call(
        'crm.activity.binding.add',
        [
            'activityId' => 7685, 
            'entityTypeId' => 4, 
            'entityId' => 173 
        ]
    );

В результате получим true, добавление связи для дела прошло успешно. Если в результате вы получили ошибку error, изучите описание возможных ошибок в документации метода crm.activity.binding.add.

{
    "result": true,
}

4. Удаляем связь дела с лидом

Используем метод crm.activity.binding.delete с параметрами:

  • activityId — ID дела, получили на шаге 1 в методе crm.activity.list
  • entityTypeId — ID типа объекта, укажем 1 для лида
  • entityId — ID лида, откуда удаляем дело
  • JS
    BX24.callMethod(
        'crm.activity.binding.delete',
        {
            activityId: 7685, 
            entityTypeId: 1, 
            entityId: 1000977 
        },
    );
  • PHP
    require_once('crest.php');

    $result = CRest::call(
        'crm.activity.binding.delete',
        [
            'activityId' => 7685, 
            'entityTypeId' => 1, 
            'entityId' => 1000977 
        ]
    );

В результате получим true, удаление связи дела с лидом прошло успешно. Если в результате вы получили ошибку error, изучите описание возможных ошибок в документации метода crm.activity.binding.delete.

{
    "result": true,
}

Пример кода

  • JS
    // Функция для выполнения всех шагов
    function transferActivityToCompany() {
        // Запрашиваем ID лида у пользователя
        const leadId = prompt("Введите ID лида:");

        // Запрашиваем название компании у пользователя
        const companyName = prompt("Введите название компании:");

        // Шаг 1: Получаем список дел для указанного лида
        BX24.callMethod(
            "crm.activity.list",
            {
                filter: {
                    "OWNER_TYPE_ID": 1,
                    "OWNER_ID": leadId
                },
            },
            function(result) {
                if (result.error()) {
                    console.error(result.error());
                    return;
                }

                const activities = result.data();
                if (activities.length === 0) {
                    console.log("Дела для указанного лида не найдены.");
                    return;
                }

                const activityId = activities[0].ID;

                // Шаг 2: Ищем компанию по названию
                BX24.callMethod(
                    "crm.company.list",
                    {
                        filter: { "TITLE": companyName },
                        select: [ "ID", "TITLE" ]
                    },
                    function(result) {
                        if (result.error()) {
                            console.error(result.error());
                            return;
                        }

                        const companies = result.data();
                        if (companies.length === 0) {
                            console.log("Компания с указанным названием не найдена.");
                            return;
                        }

                        const companyId = companies[0].ID;

                        // Шаг 3: Создаем связь для найденного дела и компании
                        BX24.callMethod(
                            'crm.activity.binding.add',
                            {
                                activityId: activityId,
                                entityTypeId: 4,
                                entityId: companyId
                            },
                            function(result) {
                                if (result.error()) {
                                    console.error(result.error());
                                    return;
                                }

                                console.log("Связь дела с компанией успешно создана.");

                                // Шаг 4: Удаляем связь дела и лида
                                BX24.callMethod(
                                    'crm.activity.binding.delete',
                                    {
                                        activityId: activityId,
                                        entityTypeId: 1,
                                        entityId: leadId
                                    },
                                    function(result) {
                                        if (result.error()) {
                                            console.error(result.error());
                                        } else {
                                            console.log("Связь дела с лидом успешно удалена.");
                                        }
                                    }
                                );
                            }
                        );
                    }
                );
            }
        );
    }

    // Запускаем функцию
    transferActivityToCompany();
  • PHP
    require_once('crest.php');

    // Функция для выполнения всех шагов
    function transferActivityToCompany($leadId, $companyName) {
        // Шаг 1: Получаем список дел для указанного лида
        $activityResult = CRest::call(
            'crm.activity.list',
            [
                'filter' => [
                    'OWNER_TYPE_ID' => 1,
                    'OWNER_ID' => $leadId
                ]
            ]
        );

        if (isset($activityResult['error'])) {
            echo 'Ошибка: ' . $activityResult['error_description'];
            return;
        }

        $activities = $activityResult['result'];
        if (empty($activities)) {
            echo "Дела для указанного лида не найдены.";
            return;
        }

        $activityId = $activities[0]['ID'];

        // Шаг 2: Ищем компанию по названию
        $companyResult = CRest::call(
            'crm.company.list',
            [
                'filter' => ['TITLE' => $companyName],
                'select' => ['ID', 'TITLE']
            ]
        );

        if (isset($companyResult['error'])) {
            echo 'Ошибка: ' . $companyResult['error_description'];
            return;
        }

        $companies = $companyResult['result'];
        if (empty($companies)) {
            echo "Компания с указанным названием не найдена.";
            return;
        }

        $companyId = $companies[0]['ID'];

        // Шаг 3: Создаем связь для найденного дела и компании
        $bindingAddResult = CRest::call(
            'crm.activity.binding.add',
            [
                'activityId' => $activityId,
                'entityTypeId' => 4,
                'entityId' => $companyId
            ]
        );

        if (isset($bindingAddResult['error'])) {
            echo 'Ошибка: ' . $bindingAddResult['error_description'];
            return;
        }

        echo "Связь дела с компанией успешно создана.";

        // Шаг 4: Удаляем связь дела и лида
        $bindingDeleteResult = CRest::call(
            'crm.activity.binding.delete',
            [
                'activityId' => $activityId,
                'entityTypeId' => 1,
                'entityId' => $leadId
            ]
        );

        if (isset($bindingDeleteResult['error'])) {
            echo 'Ошибка: ' . $bindingDeleteResult['error_description'];
        } else {
            echo "Связь дела с лидом успешно удалена.";
        }
    }

    // Запрашиваем ID лида и название компании у пользователя
    $leadId = readline("Введите ID лида: ");
    $companyName = readline("Введите название компании: ");

    // Запускаем функцию
    transferActivityToCompany($leadId, $companyName);

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

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

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

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

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

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

Related Post

Добавить позицию доставки в оплату crm.item.payment.delivery.addДобавить позицию доставки в оплату crm.item.payment.delivery.add

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

Как использовать метод SDK crm.lead.productrows.set в Битрикс24Как использовать метод SDK crm.lead.productrows.set в Битрикс24

Каждый PHP-разработчик, работающий с экосистемой Bitrix Framework, должен глубоко понимать работу её ключевых компонентов. В этой статье мы проведем подробный аудит темы «Как использовать метод SDK crm.lead.productrows.set в Битрикс24», проанализируем

Изменить существующий нумератор crm.documentgenerator.numerator.updateИзменить существующий нумератор crm.documentgenerator.numerator.update

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