Налаштування оптимізації маршрутів кур'єрської доставки в 1С-Бітрікс
Оптимізація маршрутів — задача комівояжера: є N адрес доставки та кур'єр, потрібно відвідати всі з мінімальним пробігом. Бітрікс сам цю задачу не вирішує, але служить джерелом даних про замовлення. Оптимізовані маршрути будуються зовнішніми сервісами (Яндекс.Маршрутизація, Google OR-Tools, Routific) та передаються назад як завдання для кур'єрів.
Підготовка даних про доставки
Для побудови маршруту потрібен список адрес із координатами та часовими вікнами. Адреси беруться з властивостей замовлень:
$deliveries = \Bitrix\Sale\OrderTable::getList([
'filter' => [
'STATUS_ID' => 'TD', // статус "на доставку сьогодні"
'>=DATE_STATUS' => new \Bitrix\Main\Type\Date(),
],
'select' => ['ID'],
])->fetchAll();
$points = [];
foreach ($deliveries as $row) {
$order = \Bitrix\Sale\Order::load($row['ID']);
$props = $order->getPropertyCollection();
$points[] = [
'order_id' => $row['ID'],
'address' => $props->getItemByOrderPropertyCode('ADDRESS')?->getValue(),
'lat' => $props->getItemByOrderPropertyCode('LAT')?->getValue(),
'lon' => $props->getItemByOrderPropertyCode('LON')?->getValue(),
'time_from' => $props->getItemByOrderPropertyCode('DELIVERY_TIME_FROM')?->getValue(),
'time_to' => $props->getItemByOrderPropertyCode('DELIVERY_TIME_TO')?->getValue(),
'weight' => $this->getOrderWeight($order),
];
}
Координати (LAT/LON) потрібно отримати при оформленні замовлення — через геокодування API Яндекса або Google за введеною адресою. Збережіть їх у користувацькі властивості замовлення.
Геокодування адрес при оформленні
При заповненні адреси у формі замовлення — AJAX-запит до геокодера:
fetch(`https://geocode-maps.yandex.ru/1.x/?apikey=KEY&format=json&geocode=${encodeURIComponent(address)}`)
.then(r => r.json())
.then(data => {
const pos = data.response.GeoObjectCollection.featureMember[0]?.GeoObject?.Point?.pos;
if (pos) {
const [lon, lat] = pos.split(' ');
document.getElementById('lat-field').value = lat;
document.getElementById('lon-field').value = lon;
}
});
Координати зберігаються у приховані поля форми та потрапляють у властивості замовлення.
Інтеграція з сервісом оптимізації маршрутів
Після збору точок відправляємо їх в API оптимізатора маршрутів. Приклад із Яндекс.Маршрутизацією (подробиці — окремий сервіс):
$httpClient = new \Bitrix\Main\Web\HttpClient();
$response = $httpClient->post(
'https://courier.yandex.ru/api/v1/companies/{company_id}/routes',
json_encode(['vehicles' => $vehicles, 'orders' => $points]),
['Authorization' => 'Bearer ' . YANDEX_COURIER_API_KEY]
);
$routes = json_decode($response, true);
Повернені маршрути містять упорядкований список точок для кожного кур'єра. Збережіть їх у bl_courier_routes та призначте кур'єрам через CRM-завдання або мобільний додаток.
Відображення маршруту кур'єру
Створіть мобільну сторінку або відправте кур'єру посилання на маршрут у Google Maps або Яндекс.Картах з waypoints. Формат для Google Maps:
https://www.google.com/maps/dir/DEPOT_LAT,DEPOT_LON/STOP1_LAT,STOP1_LON/STOP2_LAT,STOP2_LON/...
Генеруйте це посилання з даних bl_courier_routes та відправляйте кур'єру через SMS або email.
Що налаштовуємо
- Користувацькі властивості замовлення
LAT,LON,DELIVERY_TIME_FROM,DELIVERY_TIME_TO - Геокодування адреси при оформленні замовлення через JavaScript + Яндекс/Google API
- Агент збору точок доставки та відправки запиту до оптимізатора маршрутів
- Таблицю
bl_courier_routesдля зберігання оптимізованих маршрутів - Генерацію посилань на маршрут та розповсюдження кур'єрам







