Представьте: курьерская служба обрабатывает 20 заказов ежедневно. Диспетчер тратит полчаса на построение маршрута, но половина клиентов всё равно недовольна опозданиями. В чём проблема? Чаще всего в ручном планировании и отсутствии точных данных о пробках и временных окнах. Интеграция 1С-Битрикс с сервисами маршрутизации — Яндекс.Маршрутизация или OR-Tools — решает эту задачу за 5 секунд. Пробег сокращается на 33%, а доля своевременных доставок вырастает с 60% до 95%. Это не просто экономия топлива — это выполнение обязательств перед клиентами и снижение операционных затрат.
Как интеграция решает задачу коммивояжёра?
Суть проста: Битрикс собирает данные о заказах — адреса, временные окна, вес. Внешний сервис решает NP-трудную задачу коммивояжёра — строит оптимальный порядок объезда. Результат передаётся обратно в виде маршрутных листов. Мы делаем эту связь прозрачной и надёжной. Производительность: 20 точек обрабатываются за 5 секунд, а ручное планирование занимает 30 минут — разница в 360 раз.
Подробнее о задаче коммивояжёра
Задача коммивояжёра (TSP) — классическая NP-трудная проблема поиска кратчайшего маршрута, проходящего через все заданные точки ровно один раз. В контексте доставки она решается с учётом временных окон и вместимости транспорта, что делает её ещё более сложной (VRPTW). Современные алгоритмы, такие как муравьиные колонии или линейное программирование, позволяют находить субоптимальные решения за секунды.Шаг 1: Подготовка данных
Для построения маршрута нужен список адресов с координатами и временными окнами. Адреса берутся из свойств заказов:
$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; } }); Координаты молча сохраняются в скрытые поля формы и попадают в свойства заказа. Водитель об этом даже не знает — всё автоматически.
Шаг 2: Интеграция с сервисом оптимизации
После сбора точек отправляем их в 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-задачи или мобильное приложение.
Шаг 3: Отображение маршрута курьеру
Создайте мобильную страницу или отправьте курьеру ссылку на маршрут в 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.
Что даёт оптимизация маршрутов?
| Параметр | Ручная развозка | Оптимизированная маршрутизация |
|---|---|---|
| Средний пробег на 20 точек | 180 км | 120 км (на 33% меньше) |
| Доля выполненных заказов вовремя | 60% | 95% |
| Затраты на топливо | 100% | 70% |
| Время планирования маршрута | 30 минут | 5 секунд |
Оптимизированная маршрутизация в 30 раз быстрее ручного планирования и на 33% сокращает пробег. Каждый сэкономленный километр снижает расход топлива на существенную величину, а вместе с экономией времени курьеров и диспетчеров бюджет на доставку может сократиться на 30–40%.
Типичные ошибки при настройке
| Ошибка | Последствие | Решение |
|---|---|---|
| Адрес без геокодинга | Сервис не может построить маршрут | Добавить AJAX-запрос к геокодеру |
| Не заданы временные окна | Курьер едет в любое время | Создать свойства DELIVERY_TIME_FROM/DELIVERY_TIME_TO |
| Игнорирование веса | Перегрузка курьера | Учесть вес в расчёте маршрута |
| Нет агента сборки | Данные устаревают | Настроить агент на Cron или Bitrix агенты |
Как мы автоматизируем доставку под ключ
Мы выполняем полный цикл работ:
- Создание пользовательских свойств заказа
LAT,LON,DELIVERY_TIME_FROM,DELIVERY_TIME_TO. - Реализация геокодирования на AJAX через Яндекса или Google.
- Агент сборки точек и вызова API оптимизатора.
- Таблица
bl_courier_routesдля хранения маршрутов. - Генерация ссылок на карты и рассылка курьерам.
- Обучение диспетчеров и курьеров.
- Исходный код и документация по доработке.
Наши клиенты экономят в среднем $270–390 в месяц на топливе и зарплате диспетчеров. Сертифицированные специалисты, прозрачный код, поддержка после сдачи. Свяжитесь с нами для аудита системы доставки — мы оценим бюджет и сроки в течение одного дня. Закажите настройку под ключ и получите консультацию по вашей задаче.







