Інтеграція 1С-Бітрікс з Яндекс Маршрутизація

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Інтеграція 1С-Бітрікс з Яндекс Маршрутизація
Середня
~1-2 тижні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Інтеграція 1С-Бітрікс з Яндекс Маршрутизацією

Яндекс Маршрутизація (Яндекс.Курьєр API) — російський сервіс оптимізації логістики з урахуванням реального трафіку, часових вікон та обмежень транспортних засобів. API дозволяє створювати рейси, призначати замовлення водіям та отримувати трекінг у реальному часі. Інтеграція з Бітрікс дає повний цикл: від замовлення на сайті до повідомлення клієнта про доставку.

Реєстрація у Яндекс.Курьєр

Для роботи з API потрібно:

  1. Зареєструвати компанію в кабінеті courier.yandex.ru
  2. Отримати COMPANY_ID — числовий ідентифікатор компанії
  3. Отримати OAuth-токен через Яндекс OAuth для доступу до API
  4. Налаштувати склад (депо) — точку відправлення з координатами

Базовий URL API: https://courier.yandex.ru/api/v1/companies/{company_id}/

Створення рейсу через API

Рейс у Яндекс.Маршрутизації — набір замовлень, призначених на один транспортний засіб. Створення рейсу:

class YandexCourierClient
{
    private string $baseUrl;
    private string $oauthToken;
    private int    $companyId;

    public function __construct()
    {
        $this->baseUrl    = 'https://courier.yandex.ru/api/v1';
        $this->oauthToken = \Bitrix\Main\Config\Option::get('main', 'YANDEX_COURIER_TOKEN');
        $this->companyId  = (int)\Bitrix\Main\Config\Option::get('main', 'YANDEX_COURIER_COMPANY_ID');
    }

    public function createRoute(array $depot, array $vehicle, array $orders): array
    {
        $payload = [
            'number'    => 'BX-' . date('Ymd') . '-' . uniqid(),
            'depot'     => [
                'id'    => $depot['id'],
                'point' => ['lat' => $depot['lat'], 'lon' => $depot['lon']],
                'time_window' => [$depot['open'], $depot['close']],
            ],
            'vehicle'   => [
                'id'          => $vehicle['id'],
                'max_weight'  => $vehicle['max_weight'],
                'max_volume'  => $vehicle['max_volume'],
            ],
            'orders'    => $this->formatOrders($orders),
        ];

        $http = new \Bitrix\Main\Web\HttpClient();
        $http->setHeader('Authorization', 'OAuth ' . $this->oauthToken);
        $http->setHeader('Content-Type', 'application/json');

        $result = $http->post(
            "{$this->baseUrl}/companies/{$this->companyId}/routes",
            json_encode($payload, JSON_UNESCAPED_UNICODE)
        );

        if ($http->getStatus() !== 200) {
            throw new \RuntimeException('Yandex Courier API error: ' . $result);
        }

        return json_decode($result, true);
    }

    private function formatOrders(array $orders): array
    {
        return array_map(fn($o) => [
            'number'          => (string)$o['bitrix_order_id'],
            'point'           => ['lat' => $o['lat'], 'lon' => $o['lon']],
            'address'         => $o['address'],
            'time_window'     => [$o['time_from'], $o['time_to']],
            'weight_kg'       => $o['weight'],
            'customer_name'   => $o['customer_name'],
            'customer_phone'  => $o['customer_phone'],
            'service_duration' => 300,
        ], $orders);
    }
}

Трекінг водіїв та замовлень

Яндекс.Курьєр надає вебхуки для відстеження подій. Зареєструйте вебхук у налаштуваннях компанії:

$http->post("{$this->baseUrl}/companies/{$this->companyId}/webhooks", json_encode([
    'url'    => 'https://your-site.ru/bitrix/yandex_courier_webhook.php',
    'events' => ['order_status_changed', 'route_started', 'route_finished'],
]));

Обробник вебхука:

// /bitrix/yandex_courier_webhook.php
\Bitrix\Main\Loader::includeModule('sale');

$data = json_decode(file_get_contents('php://input'), true);

if ($data['event'] === 'order_status_changed') {
    $orderId = (int)$data['order']['number'];  // ми передавали bitrix_order_id як number
    $status  = $data['order']['status'];

    $statusMap = [
        'confirmed'    => 'TD',
        'in_progress'  => 'OD',
        'finished'     => 'F',
        'cancelled'    => 'CF',
    ];

    $bitrixStatus = $statusMap[$status] ?? null;

    if ($orderId && $bitrixStatus) {
        $order = \Bitrix\Sale\Order::load($orderId);
        $order?->setField('STATUS_ID', $bitrixStatus);
        $order?->save();

        if ($status === 'finished') {
            \Bitrix\Main\Mail\Event::send([
                'EVENT_NAME' => 'SALE_ORDER_DELIVERED',
                'LID'        => SITE_ID,
                'C_FIELDS'   => ['ORDER_ID' => $orderId],
            ]);
        }
    }
}

http_response_code(200);

Розрахунок координат з адрес

Яндекс.Маршрутизація вимагає координати (lat/lon), а не текстові адреси. Для геокодування використовуйте Яндекс Geocoder API при оформленні замовлення:

function geocodeAddress(string $address): ?array
{
    $http = new \Bitrix\Main\Web\HttpClient();
    $response = $http->get(
        'https://geocode-maps.yandex.ru/1.x/?' . http_build_query([
            'apikey'   => YANDEX_GEOCODER_API_KEY,
            'geocode'  => $address,
            'format'   => 'json',
            'results'  => 1,
        ])
    );

    $data = json_decode($response, true);
    $pos  = $data['response']['GeoObjectCollection']['featureMember'][0]
            ['GeoObject']['Point']['pos'] ?? null;

    if ($pos) {
        [$lon, $lat] = explode(' ', $pos);
        return ['lat' => (float)$lat, 'lon' => (float)$lon];
    }

    return null;
}

Координати зберігаються у користувацькі властивості замовлення UF_DELIVERY_LAT та UF_DELIVERY_LON.

Посилання для клієнта на відстеження

Яндекс.Курьєр генерує публічне посилання на трекінг посилки. Отримайте його через API та відправте клієнту:

$trackingUrl = $routeResponse['tracking_url'] ?? null;
if ($trackingUrl) {
    $order->setField('UF_TRACKING_URL', $trackingUrl);
    // Відправити у листі клієнту
}

Терміни виконання

Етап Терміни
Базова інтеграція: створення рейсів 3–4 дні
Вебхуки та оновлення статусів 2–3 дні
Геокодування при оформленні 1–2 дні
Адміністративний інтерфейс управління рейсами 3–5 днів
Тестування та налагодження 2–3 дні

Що налаштовуємо

  • Клас YandexCourierClient з методами створення рейсів та управління замовленнями
  • Агент збору замовлень на день та автоматичного створення рейсів
  • Геокодування адрес при оформленні замовлення зі збереженням у властивості UF_DELIVERY_LAT/LON
  • Вебхук-обробник для оновлення статусів замовлень Бітрікс
  • Відправку клієнту посилання на трекінг посилки при старті рейсу