Загрузка
Все статьи

Как привязать новый контакт к сделке в Битрикс24 через REST API

Создали контакт через API, создали сделку, передали CONTACT_ID в полях, а они не связаны в карточке! Разбираю, почему передача CONTACT_ID при создании сделки работает криво, если контакта секунду назад не было в Битрикс24, и как правильно использовать метод crm.deal.contact.add.

Привет! Меня зовут Артём, я бэкенд-разработчик. Кажется, что может быть проще, чем связать контакт и сделку в CRM? В Битрикс24 это сплошные грабли, если делать это динамически через REST API.

Стандартный подход, который предлагают в простых статьях:

// 1. Создаем контакт
$contact = $this->call('crm.contact.add', ['fields' => ['NAME' => 'Иван', 'PHONE' => [['VALUE' => '123']]]]);
$contactId = $contact['result'];

// 2. Создаем сделку и сразу привязываем контакт
$deal = $this->call('crm.deal.add', [
    'fields' => [
        'TITLE' => 'Сделка Ивана',
        'CONTACT_ID' => $contactId // Передаем ID только что созданного контакта
    ]
]);

Сделка создается. Но если вы зайдете в нее в браузере, вы увидите, что контакт Ивана там не отображается в верхнем блоке привязок! Хотя в ответе API поле CONTACT_ID вернулось с правильным числом. Почему?

Разница между полем и сущностью-связкой

В старых версиях Битрикса сделка и контакт были жестко связаны через поле CONTACT_ID в одной таблице. Сейчас сделка может иметь множество контактов. Связь живет в отдельной таблице биндингов.

Когда вы передаете CONTACT_ID при создании сделки, ядро Битрикса пытается создать биндинг «на лету». Но если вы создали контакт только что (микросекунду назад), кэши прав доступа или внутренние триггеры могут не успеть отработать, и биндинг молча не создастся. Поле в базе запишется, но интерфейс его проигнорирует, так как в таблице связей записи нет.

Надежный метод: Явное создание связи

Чтобы гарантированно привязать контакт к сделке, всегда делайте это отдельным запросом после создания обеих сущностей.

$dealId = 123;
$contactId = 456;

$this->call('crm.deal.contact.add', [
    'id' => $dealId,
    'fields' => [
        'CONTACT_ID' => $contactId,
        'IS_PRIMARY' => 'Y' // Указываем, что это основной контакт сделки
    ]
]);

Метод crm.deal.contact.add напрямую пишет в таблицу связей. Он 100% надежен. Да, это лишний запрос к API. Но это единственный способ быть уверенным, что менеджер увидит контакты в карточке сделки.

Бонус: если вам нужно привязать несколько контактов к уже существующей сделке, вместо цикла с add используйте метод crm.deal.contact.items.set. Он принимает массив всех контактов и полностью перезаписывает связи за один вызов.

Поделиться статьёй

Комментарии

0
0 / 2000

Пока нет комментариев

Будьте первым, кто оставит комментарий к этой статье

Читайте также

Сложности с разделами каталога в Битрикс24 через REST API: игра с деревом

Обновляете товар через API, передаете SECTION_ID, но он не появляется в нужной папке. В этой статье я объясняю разницу между простым SECTION_ID и сложным деревом инфоблоков, как правильно выстроить иерархию и почему метод crm.product.update не умеет создавать папки.

5 июля 2026 1 мин

Битрикс24: бизнес-процессы и роботы — автоматизация CRM без написания кода

Как мы автоматизировали воронку сделок в Битрикс24 с помощью бизнес-процессов и роботов — реальный кейс с SLA, автоназначением ответственных и мониторингом сбоев.

13 июня 2026 8 мин

Битрикс24: batch-запросы и обработка 10 000 элементов без таймаута

Обычный crm.deal.list возвращает 50 элементов. Для синхронизации 10 000 сделок нужно 200 запросов — и это при условии, что ни один не упадёт по таймауту. Batch-метод Битрикс24 позволяет отправить до 50 команд в одном запросе, но у него свои подводные камни: лимит на размер запроса, ошибки частичной обработки и полное отсутствие транзакционности.

12 мая 2026 9 мин