Программирование

Связать контакт и компанию в Битрикс24 роботом из 1С

Как автоматически привязать контакт к компании в Битрикс24 при импорте сделок из 1С с помощью роботов и REST API. Пошаговая настройка триггеров, crm.deal.get, crm.company.contact.add, права доступа и примеры кода для CRM.

Как в Битрикс24 автоматически связать контакт и компанию, если они указаны в одной сделке (сделки импортируются из 1С, а в 1С контакт и компания не связаны)? Я хочу, чтобы в карточке компании отображались связанные контакты, а в карточке контакта — связанные компании. Можно ли реализовать это с помощью робота Битрикс24? Какие события/триггеры робота использовать, какие права и параметры нужны, и какова рекомендуемая последовательность действий или пример реализации (например, с использованием REST API: crm.deal.contact.items.get, crm.deal.get для получения id контактов и компании и crm.company.contact.add для добавления контактов к компании)?

Да — в Битрикс24 можно автоматически привязать контакт к компании при импорте сделок из 1С с помощью робота Битрикс24 и вызовов REST API. Обычно используют триггер «Создание/Обновление сделки» или переход в стадию, затем получают данные сделки через crm.deal.get, контакты через crm.deal.contact.items.get и создают связь через crm.company.contact.add (или отправляют данные на внешний сервис, который выполняет эти вызовы). Ниже — пошаговая схема, варианты реализации, пример кода и рекомендации по правам и отладке.


Содержание


Роботы Битрикс24 для автоматической связи контакта и компании

Почему это работает? При импорте из 1С сделка может прийти с полями «Компания» и «Контакт», но без внутрисистемной связи между ними. Робот Битрикс24 — хороший триггер для автоматизации: он срабатывает при создании/обновлении сделки или при переходе в нужную стадию и запускает логику, которая добавляет связь между компанией и контактами через REST API или через внешний сервис.

Какие триггеры подходят:

  • Создание сделки (если 1С создаёт сделку один раз и сразу передаёт все данные).
  • Обновление сделки (надежнее, т.к. 1С часто сначала создаёт запись, потом её дополняет).
  • Переход в конкретную стадию (например «Контроль»), когда вы хотите запускать проверку только после импорта.

Практика: часто используют робот, который отправляет POST на ваш сервис (вебхук). Там лежит скрипт, который выполняет последовательность: получить сделку, получить контакты сделки, получить/проверить связи компании и добавить недостающие через crm.company.contact.add. Примеры настройки и подходов по смыслу описаны в статье про робота для проверки компании/контакта на vc.ru и в справке по полю «Клиент» в CRM helpdesk.bitrix24.ru.


Права, авторизация и безопасный доступ (CRM_READ/WRITE, входящий вебхук)

Какие права нужны:

  • Для вызова методов REST нужны права доступа к CRM (в терминах интеграции — scope/crm или эквивалент: чтение/запись по сделкам, контактам и компаниям). В анализе: CRM_READ/WRITE для сделок, контактов и компаний.
  • Если вы используете входящий вебхук (самый простой вариант для облачного Битрикс24), вебхук работает под пользователем, от имени которого создан; этот пользователь должен иметь доступ к нужным сущностям.

Варианты авторизации:

  • Входящий вебхук (Incoming webhook): задаёте права «CRM», получаете ключ, с которым вызываете методы вида https://yourdomain.bitrix24.ru/rest/{user_id}/{webhook_key}/crm.method.json. Удобно для серверной реализации без OAuth.
  • OAuth-приложение (если нужен более гибкий сценарий и централизованное управление правами).
  • Робот в интерфейсе отправляет запрос на ваш внешний URL (HTTP-запрос) — тогда ваш сервер сам вызывает Битрикс REST под своим вебхуком или OAuth.

Безопасность: используйте HTTPS, ограничивайте IP/рефералы по возможности, храните ключи в секретном хранилище и назначьте специального сервисного пользователя для вебхука (чтобы не зависеть от аккаунта сотрудника).


Пример реализации через REST API битрикс24 (crm.deal.get, crm.deal.contact.items.get, crm.company.contact.add)

Рекомендуемая последовательность (простая и надёжная):

  1. Триггер робота: сделка создана/обновлена или перевод в стадию. Робот отправляет POST на ваш сервис с ID сделки.
  2. Сервис получает DEAL_ID.
  3. Вызываем crm.deal.get — получаем поля сделки, в т.ч. COMPANY_ID.
  4. Вызываем crm.deal.contact.items.get (или эквивалент) — получаем ID контактов, привязанных к сделке.
  5. Если COMPANY_ID пустой — ничего не делаем (или логируем). Если COMPANY_ID есть и есть контакты — для каждого contactId:
    a) Проверяем, связан ли контакт с компанией (можно получить список контактов компании: crm.company.contact.items.get или попытаться добавить и обработать ошибку дублирования).
    b) Если связь отсутствует — вызываем crm.company.contact.add с параметрами companyId и ENTITY_ID = contactId.
  6. По успеху можно добавить комментарий в сделку или установить флаг (кастомное поле «Связь проверена») и вернуть результат роботу.

Ссылки на документацию методов и пояснения: подробности по добавлению связи — метод crm.company.contact.add (см. документацию) — training.bitrix24.com/rest_help/crm/companies/contacts/crm_company_contact_add.php. Общие нюансы интеграции 1С и CRM — bitrix24.ru/features/crm/1c/.

Пример на PHP (упрощённо, с входящим вебхуком в Bitrix24):

php
<?php
$domain = "https://yourdomain.bitrix24.ru";
$webhook = "1/WEBHOOK_KEY"; // user_id / webhook_key
function call($method, $params = []) {
 global $domain, $webhook;
 $url = "$domain/rest/$webhook/$method.json";
 $ch = curl_init($url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($ch, CURLOPT_POST, true);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
 $res = curl_exec($ch);
 curl_close($ch);
 return json_decode($res, true);
}

// Получаем ID сделки из POST
$dealId = intval($_POST['dealId'] ?? 0);
if(!$dealId) exit('no deal id');

$deal = call('crm.deal.get', ['ID' => $dealId]);
$companyId = $deal['result']['COMPANY_ID'] ?? 0;
if(!$companyId) { exit('no company'); }

$contacts = call('crm.deal.contact.items.get', ['id' => $dealId]);
$contactIds = array_keys($contacts['result'] ?? []);

foreach($contactIds as $cid) {
 // Опциональная проверка: получить контакты компании
 $companyContacts = call('crm.company.contact.items.get', ['id' => $companyId]);
 $companyContactIds = array_keys($companyContacts['result'] ?? []);
 if(!in_array($cid, $companyContactIds)) {
 $add = call('crm.company.contact.add', ['id' => $companyId, 'ENTITY_ID' => $cid]);
 // обработка ошибок/логирование
 }
}
echo 'done';

Curl-пример добавления связи напрямую:

bash
curl -s -X POST "https://yourdomain.bitrix24.ru/rest/1/WEBHOOK_KEY/crm.company.contact.add.json" \
 -d "id=123&ENTITY_ID=456"

Важно: иногда проще попытаться добавить связь и игнорировать ошибку «связь уже существует» — тогда код проще и идемпотентен. Если 1С создаёт записи в несколько шагов — добавьте таймер в роботе (задержку 30–120 секунд) или используйте условие на «Обновление», чтобы дождаться финальных данных.


Настройка робота в интерфейсе (условия, фильтры, предотвращение повторов)

Шаги в UI (коротко и практично):

  1. CRM → Сделки → Открыть воронку → рядом с нужной стадией нажать «Роботы».
  2. Добавить робот типа «Отправить вебхук / HTTP‑запрос» (или «Внешний сервис») — в зависимости от интерфейса.
  3. В URL указать ваш endpoint, метод POST, в теле отправить ID сделки (вставить макрос ID сделки через селектор макросов). Пример тела JSON: {“dealId”: “{макрос ID сделки}”} (в интерфейсе есть кнопка вставки параметров).
  4. Условие запуска: «Поле Компания заполнено» AND «Контакты есть» (если доступно) AND «Кастомное поле ‘Связь проверена’ ≠ Да» — чтобы робот не запускался бесконечно.
  5. Рекомендуется добавить задержку 30–120 секунд, чтобы пройти возможные дополнительные записи от 1С.
  6. В ответе сервис может вернуть статус и сообщение; при успешной привязке сервис может обновить сделку (crm.deal.update) — поставить метку «Связь проверена» или добавить комментарий через REST/робот.

Если вы не хотите свой сервер: можно создать приложение/робота, который выполняет REST-вызовы внутри Битрикс, но чаще всего удобнее подключить внешний endpoint.


Отладка, логирование и частые ошибки

Что чаще ломает процесс и как править:

  • Права. Ошибка «access denied» — вебхук создан под пользователем без прав. Проверьте scope/crm и права пользователя.
  • Гонки/нестабильность импорта 1С. 1С может отправлять данные частями — робот сработал раньше, чем заполнились поля. Решение: задержка робота, запуск на «Обновление сделки», или повторная проверка через CRON.
  • Дубли. Если попытаться добавить уже существующую связь, API вернёт ошибку. Решение: проверять наличие связи заранее или игнорировать ошибку (идемпотентность).
  • Неправильное соответствие контактов. Если в 1С контакт создаётся отдельно и не совпадает по уникальному признаку (телефон/email), может появиться другой контакт. Решение: настроить сопоставление (по email/телефон) или поиск контакта через crm.contact.list перед привязкой.
  • Логирование. Записывайте результаты в лог-файл или в комментарий сделки (или в отдельный мониторинг). Это поможет быстро понять, какие сделки остались без связи.

Совет по предотвращению повторов: после успешной обработки устанавливайте кастомное булево поле «Связь проверена» или проставляйте метку в самой сделке — тогда робот по условию больше не будет обрабатывать эту запись.


Источники


Заключение

Коротко: да — роботы битрикс24 + REST API решают задачу автоматической привязки контакта к компании при импорте из 1С. Схема простая: триггер робота → получение сделки (crm.deal.get) → получение контактов сделки (crm.deal.contact.items.get) → добавление связей (crm.company.contact.add). Обратите внимание на права (CRM_READ/WRITE или scope crm), на время запуска (задержки/обновления) и на обработку дублей/повторов. Если настроить это как внешний webhook или как приложение с нужными правами и логикой проверки — карточки компании и контакта будут корректно отображать взаимные связи.

Авторы
Проверено модерацией
Модерация
Связать контакт и компанию в Битрикс24 роботом из 1С