Настройка оптимизации маршрутов курьерской доставки 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для хранения оптимизированных маршрутов - Генерацию ссылок на маршрут и рассылку курьерам







