Інтеграція 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 або вручну
- При завершенні доставки webhook від оптимізатора оновлює статуси замовлень
Загальний інтерфейс для роботи з оптимізаторами
Реалізуйте паттерн адаптер — один інтерфейс, кілька реалізацій:
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.
Оновлення статусів замовлень
По завершенні доставки в точці оптимізатор (або водій через мобільний додаток) відправляє подію. Webhook Бітрікс оновлює статус конкретного замовлення:
// /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зі зберіганням маршрутів та статусів - Карту маршрутів в адміністративному розділі
- Webhook оновлення статусів замовлень при виконанні доставки







