Интеграция 1С-Битрикс с сервисами оптимизации маршрутов
Сервисы оптимизации маршрутов — это специализированные API, которые принимают список точек доставки и возвращают оптимальный порядок объезда. Популярные: Яндекс.Маршрутизация, Route4Me, Routific, OptimoRoute, Google OR-Tools (self-hosted). Интеграция с Битрикс — это труба в обе стороны: данные заказов уходят в оптимизатор, готовые маршруты возвращаются назад.
Выбор сервиса оптимизации
| Сервис | Особенности | Модель оплаты |
|---|---|---|
| Яндекс.Маршрутизация | Российская инфраструктура, хорошая геокодинговая база | Запросы + склад курьеров |
| Route4Me | Гибкий API, поддержка временных окон, мультидепо | Подписка |
| Routific | Простое API, подходит для малого автопарка | Подписка от 5 машин |
| OptimoRoute | Поддержка приоритетов, компетенций водителей | Подписка |
| OR-Tools | Бесплатный, self-hosted, требует Python-сервер | Свои серверы |
Архитектура интеграции
Цикл работы выглядит так:
- Утром агент собирает заказы на сегодня со статусом «К доставке» из
b_sale_order - Формирует список точек с адресами, координатами и временными окнами
- Отправляет запрос в API оптимизатора
- Сохраняет маршруты в
bl_delivery_routes - Назначает водителей через CRM или вручную
- При завершении доставки вебхук от оптимизатора обновляет статусы заказов
Общий интерфейс для работы с оптимизаторами
Реализуйте паттерн адаптер — один интерфейс, несколько реализаций:
interface RouteOptimizerInterface
{
public function optimize(array $depot, array $vehicles, array $orders): array;
}
class YandexRouteOptimizer implements RouteOptimizerInterface
{
public function optimize(array $depot, array $vehicles, array $orders): array
{
$payload = [
'depot' => $depot,
'vehicles' => $vehicles,
'orders' => array_map(fn($o) => [
'id' => (string)$o['order_id'],
'point' => ['lat' => $o['lat'], 'lon' => $o['lon']],
'time_window' => [$o['time_from'], $o['time_to']],
'service_duration' => 300, // 5 минут на точку
], $orders),
];
$http = new \Bitrix\Main\Web\HttpClient();
$http->setHeader('Content-Type', 'application/json');
$http->setHeader('X-Ya-Courier-Request-Id', uniqid());
$response = $http->post(
'https://courier.yandex.ru/api/v1/companies/' . $this->companyId . '/routes',
json_encode($payload)
);
return json_decode($response, true);
}
}
class Route4MeOptimizer implements RouteOptimizerInterface
{
public function optimize(array $depot, array $vehicles, array $orders): array
{
// Route4Me-специфичная логика
}
}
Конкретная реализация выбирается через фабричный метод, конфигурируется в b_option.
Преобразование данных заказа
Ключевой момент — корректное преобразование данных Битрикс в формат API оптимизатора. Адрес нужно геокодировать в координаты (если не сделано при заказе), временные окна — конвертировать в формат оптимизатора:
function buildOrderPoint(\Bitrix\Sale\Order $order): array
{
$props = $order->getPropertyCollection();
return [
'order_id' => $order->getId(),
'lat' => (float)$props->getItemByOrderPropertyCode('LAT')?->getValue(),
'lon' => (float)$props->getItemByOrderPropertyCode('LON')?->getValue(),
'time_from' => $this->toUnix($props->getItemByOrderPropertyCode('DELIVERY_TIME_FROM')?->getValue()),
'time_to' => $this->toUnix($props->getItemByOrderPropertyCode('DELIVERY_TIME_TO')?->getValue()),
'weight_kg' => $this->getBasketWeight($order->getBasket()),
'volume_m3' => $this->getBasketVolume($order->getBasket()),
'priority' => (int)$props->getItemByOrderPropertyCode('DELIVERY_PRIORITY')?->getValue(),
];
}
Сохранение и отображение маршрутов
Структура таблицы bl_delivery_routes:
route_id — ID маршрута от оптимизатора
route_date — дата доставки
vehicle_id — ID транспортного средства
driver_id — CRM-контакт водителя
stops_json — JSONB упорядоченный список остановок
total_distance — общий пробег в км
estimated_time — предполагаемое время в минутах
status — planned / in_progress / completed
created_at
Маршрут отображается на карте в административном разделе через Яндекс.Карты API или Leaflet.js. Водителю — ссылка с waypoints.
Обновление статусов заказов
По завершении доставки в точке оптимизатор (или водитель через мобильное приложение) отправляет событие. Вебхук Битрикс обновляет статус конкретного заказа:
// /bitrix/route_webhook.php
$data = json_decode(file_get_contents('php://input'), true);
foreach ($data['completed_stops'] as $stop) {
$order = \Bitrix\Sale\Order::load((int)$stop['order_id']);
if ($order) {
$order->setField('STATUS_ID', 'F');
$order->save();
// Отправка письма клиенту о доставке
}
}
Сроки выполнения по масштабу
| Масштаб | Особенности | Сроки |
|---|---|---|
| Малый (1–3 машины) | Один адаптер, ручное назначение водителей | 3–5 дней |
| Средний (5–20 машин) | Автоназначение, карта маршрутов, вебхуки статусов | 8–12 дней |
| Крупный (20+ машин) | Мультидепо, компетенции водителей, реалтайм-трекинг | 20–35 дней |
Что настраиваем
- Интерфейс
RouteOptimizerInterfaceс адаптерами под нужные сервисы - Агент сборки заказов и отправки в оптимизатор утром рабочего дня
- Таблицу
bl_delivery_routesс хранением маршрутов и статусов - Карту маршрутов в административном разделе
- Вебхук обновления статусов заказов при выполнении доставки







