Інтеграція 1С-Бітрікс з CRM Бітрікс24
Типова точка болю: інтернет-магазин на 1С-Бітрікс приймає замовлення, а відділ продажів працює в Бітрікс24 CRM. Менеджери вручну переносять дані між системами — втрачають замовлення, дублюють контакти, не бачать історію клієнта. Готове рішення — REST API + вебхуки між двома продуктами одного вендора, але налаштувати це правильно складніше, ніж здається.
Архітектура зв'язки
Бітрікс24 надає REST API через OAuth 2.0 або вхідні вебхуки. 1С-Бітрікс спілкується з ним через модуль bitrix24connector (якщо встановлений) або напряму через \Bitrix\Main\Web\HttpClient.
Ключові методи REST, задіяні в інтеграції:
| Метод Бітрікс24 | Призначення |
|---|---|
crm.lead.add |
Створення ліда з форми сайту |
crm.contact.add / crm.contact.update |
Створення/оновлення контакту |
crm.deal.add / crm.deal.update |
Створення/оновлення угоди із замовлення |
crm.deal.productrows.set |
Прив'язка товарних позицій до угоди |
crm.company.add |
Створення компанії (для B2B) |
crm.activity.add |
Додавання активності (дзвінок, лист) |
Двостороння синхронізація: де виникають конфлікти
Одностороння передача (сайт → CRM) реалізується швидко. Проблеми починаються при двосторонній: менеджер змінює статус угоди в Бітрікс24 → сайт повинен оновити статус замовлення. Водночас клієнт на сайті може змінити замовлення → CRM повинна оновити угоду.
Кейс. Інтернет-магазин будматеріалів, 200–300 замовлень на добу. Через 3 дні після запуску двосторонньої синхронізації виявилося: статуси замовлень «гуляють» — замовлення, оплачене на сайті, поверталося до статусу «новий» з CRM. Причина: вебхук з Бітрікс24 приходив пізніше події на сайті, перезаписував статус без перевірки пріоритету.
Рішення — поле-джерело правди (source_system) в мепінгу статусів:
// При отриманні вебхука з Б24 — перевіряємо мітку часу
$localOrder = CSaleOrder::GetByID($orderId);
$localUpdated = strtotime($localOrder['DATE_UPDATE']);
$b24Updated = strtotime($webhook['data']['FIELDS']['DATE_MODIFY']);
if ($b24Updated > $localUpdated) {
// Оновлюємо замовлення на сайті
CSaleOrder::StatusOrder($orderId, $newStatus);
}
Мепінг статусів
Статуси замовлень у 1С-Бітрікс зберігаються в b_sale_status, статуси угод Бітрікс24 — у стадіях воронки (crm.status.list). Мепінг — не взаємно однозначний: у Бітрікс24 може бути 10 стадій, на сайті — 5 статусів. Створюємо таблицю відповідностей, яка зберігається в користувацькій таблиці або в налаштуваннях модуля.
| Статус замовлення (сайт) | Стадія угоди (Б24) |
|---|---|
| N (новий) | NEW |
| P (оплачений) | WON |
| F (доставлений) | WON |
| C (скасований) | LOSE |
| D (доставляється) | EXECUTING |
Синхронізація товарного каталогу
Якщо в Бітрікс24 використовується каталог (crm.product.*), важливо синхронізувати його з каталогом сайту. Інакше в угоді будуть «ручні» позиції без прив'язки до номенклатури. Метод crm.deal.productrows.set приймає масив позицій з PRODUCT_ID — ID товару в каталозі Бітрікс24.
Стратегія: при створенні товару на сайті через подію OnAfterIBlockElementAdd автоматично створюємо/оновлюємо запис у Бітрікс24 через crm.product.add. XML_ID зберігається як зовнішній ідентифікатор для дедублікації.
Обробка помилок та черга
REST API Бітрікс24 має rate limit: 2 запити на секунду на хмарному тарифі. При сплеску замовлень прямий синхронний виклик впреться в ліміт. Правильна архітектура — черга:
- Подія на сайті (
OnSaleOrderSaved) розміщує завдання в таблицю черги. - Агент Бітрікса кожні 30 секунд обробляє чергу порціями по 2 запити/с.
- При помилці запис залишається в черзі зі збільшеним лічильником спроб (max 5).
| Етап інтеграції | Трудовитрати |
|---|---|
| Налаштування OAuth / вебхуків | 2–4 год |
| Мепінг полів і статусів | 4–6 год |
| Розробка обробників подій | 8–12 год |
| Реалізація черги та обробки помилок | 6–10 год |
| Двостороння синхронізація статусів | 6–10 год |
| Тестування та налагодження | 8–12 год |







