Интеграция 1С-Битрикс с RetailCRM
RetailCRM — специализированная CRM для ecommerce: складской учёт, сборка заказов, доставка, аналитика по когортам. Битрикс24 — универсальная CRM; RetailCRM — заточена под операционную работу интернет-магазина. Интеграция предпочтительна, когда объём заказов превышает 50–100 в сутки.
Готовый модуль vs. собственная интеграция
RetailCRM предоставляет официальный модуль для 1С-Битрикс через маркетплейс. Модуль покрывает базовые сценарии. Собственная интеграция нужна когда:
- Нестандартные статусы заказов или свойства, которых нет в модуле.
- Сложная логика маппинга (несколько магазинов, разные склады).
- Интеграция с другими системами через RetailCRM (телефония, delivery-сервисы).
REST API RetailCRM v5
Базовый URL: https://yourdomain.retailcrm.ru/api/v5/. Аутентификация — заголовок X-API-KEY.
class RetailCRMClient {
private string $apiKey;
private string $siteKey; // код магазина в RetailCRM
private string $baseUrl;
public function createOrder(\Bitrix\Sale\Order $order): ?string {
$basket = $order->getBasket();
$props = $order->getPropertyCollection();
$items = [];
foreach ($basket as $item) {
$items[] = [
'offer' => ['xmlId' => (string)$item->getProductId()],
'quantity' => $item->getQuantity(),
'initialPrice' => $item->getBasePrice(),
'discountPercent' => 0,
];
}
$orderData = [
'number' => 'BX-' . $order->getId(),
'externalId' => (string)$order->getId(),
'site' => $this->siteKey,
'status' => $this->mapStatus($order->getField('STATUS_ID')),
'customer' => [
'externalId' => (string)$order->getUserId(),
'email' => $props->getUserEmail(),
'phone' => $props->getItemByOrderPropertyCode('PHONE')?->getValue(),
],
'items' => $items,
'delivery' => [
'code' => $this->mapDelivery($order->getDeliveryId()),
'address' => ['text' => $this->getOrderAddress($props)],
],
'paymentType' => $this->mapPayment($order->getPaymentSystemId()),
];
$http = new \Bitrix\Main\Web\HttpClient();
$http->setHeader('X-API-KEY', $this->apiKey);
$http->setHeader('Content-Type', 'application/x-www-form-urlencoded');
$response = json_decode($http->post(
$this->baseUrl . 'orders/create',
'order=' . urlencode(json_encode($orderData)) . '&site=' . $this->siteKey
), true);
return $response['id'] ?? null; // ID заказа в RetailCRM
}
}
Двусторонняя синхронизация статусов
RetailCRM меняет статус заказа (менеджер обработал, поставил на сборку, передал в доставку) — сайт должен обновить статус.
RetailCRM поддерживает исходящие вебхуки. Настраиваем в разделе «Администрирование → Вебхуки»:
// Обработчик вебхука от RetailCRM
$payload = json_decode(file_get_contents('php://input'), true);
foreach ($payload['orders'] as $orderData) {
$externalId = $orderData['externalId']; // ID заказа в Битриксе
$newStatus = $statusMap[$orderData['status']] ?? null;
if ($newStatus) {
$order = \Bitrix\Sale\Order::load($externalId);
$order->setField('STATUS_ID', $newStatus);
$order->save();
}
}
Маппинг справочников
RetailCRM хранит справочники: статусы, типы доставки, методы оплаты — каждый с кодом. Коды нужно привести к кодам Битрикса:
| Статус Битрикс | Статус RetailCRM |
|---|---|
| N (новый) | new |
| P (оплачен) | complete-payment |
| D (доставляется) | delivery |
| F (завершён) | complete |
| C (отменён) | cancel-other |
Маппинг хранится в настройках модуля или в пользовательской таблице.
Кейс: разрыв синхронизации при пиковой нагрузке
Магазин одежды в период распродажи: 800 заказов за 2 часа. Прямая синхронная передача в RetailCRM при каждом OnSaleOrderSaved привела к таймаутам — RetailCRM API отвечал с задержкой 3–5 секунд, что блокировало обработку заказа на сайте.
Решение: очередь на основе агентов Битрикса. Заказы пишутся в таблицу очереди (b_retailcrm_queue), агент каждые 10 секунд отправляет порцию по 10 заказов. Пиковая нагрузка сглаживается, заказы проходят за 1–5 минут.
| Задача | Трудозатраты |
|---|---|
| Базовая передача заказов (сайт → RetailCRM) | 6–8 ч |
| Двусторонняя синхронизация статусов | 6–10 ч |
| Маппинг справочников и доставки | 4–6 ч |
| Очередь и обработка ошибок | 6–8 ч |
| Синхронизация каталога товаров | 8–12 ч |







