Інтеграція 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С-Бітрікс зі службою доставки СДЕК

СДЕК — одна з найбільших логістичних мереж у Росії та СНД. Інтеграція з Бітрікс охоплює розрахунок вартості доставки за тарифами, створення замовлень, отримання накладних і трекінг. СДЕК надає офіційний SDK для PHP (cdek-sdk2/cdek-sdk2), що спрощує роботу з API v2, але не усуває необхідності правильно вбудувати це в архітектуру Бітрікс.

API СДЕК v2: базові принципи

СДЕК використовує OAuth 2.0 для авторизації. Токен отримується через POST /v2/oauth/token з client_id і client_secret з особистого кабінету. Токен діє 3600 секунд — кешуємо його в Бітрікс-кеші (\Bitrix\Main\Data\Cache), не запитуємо при кожному виклику.

Основні ендпоінти:

  • POST /v2/calculator/tariff — розрахунок вартості за одним тарифом
  • POST /v2/calculator/tarifflist — розрахунок за всіма тарифами
  • POST /v2/orders — створення замовлення
  • GET /v2/orders?cdek_number={n} — статус замовлення
  • POST /v2/print/orders — генерація накладної PDF

Модуль доставки СДЕК в Бітрікс

class CdekDeliveryService extends \Bitrix\Sale\Delivery\Services\Base
{
    protected static function getClassTitle(): string
    {
        return 'СДЕК';
    }

    protected function calculateConcrete(
        \Bitrix\Sale\Shipment $shipment
    ): \Bitrix\Sale\Delivery\CalculationResult {
        $result = new \Bitrix\Sale\Delivery\CalculationResult();

        $toLocation = $this->getLocationCode($shipment);
        if (!$toLocation) {
            $result->addError(new \Bitrix\Main\Error('Місцезнаходження не визначено'));
            return $result;
        }

        $price = $this->calcPrice($shipment, $toLocation);
        $result->setDeliveryPrice($price);
        $result->setPeriodDescription('2–5 днів');

        return $result;
    }
}

Метод getLocationCode() конвертує місцезнаходження Бітрікс у код міста СДЕК. Конвертація будується через таблицю b_sale_location — за кодом КЛАДР або назвою міста. Для коректного маппінгу використовуємо GET /v2/location/cities?city={name}.

Розрахунок вартості

private function calcPrice(\Bitrix\Sale\Shipment $shipment, string $toCode): float
{
    $order = $shipment->getOrder();
    $weight = max($shipment->getWeight(), 100); // мінімум 100г

    $payload = [
        'type'          => 1, // 1-інтернет-магазин
        'tariff_code'   => 136, // 136-доставка до дверей
        'from_location' => ['code' => $this->getOption('FROM_LOCATION_CODE')],
        'to_location'   => ['code' => $toCode],
        'packages'      => [
            [
                'weight' => $weight,
                'length' => $this->getOption('DEFAULT_LENGTH') ?: 20,
                'width'  => $this->getOption('DEFAULT_WIDTH') ?: 20,
                'height' => $this->getOption('DEFAULT_HEIGHT') ?: 20,
            ],
        ],
        'services' => $this->getAdditionalServices($order),
    ];

    $response = $this->apiPost('/v2/calculator/tariff', $payload);
    return $response['total_sum'] ?? 0;
}

Тарифний код 136 — «Посилка склад-двері». Для доставки до ПВЗ використовується 136 або 138 («Посилка склад-склад»). Актуальний список тарифів: GET /v2/calculator/tarifflist.

Створення замовлення СДЕК

private function createCdekOrder(\Bitrix\Sale\Shipment $shipment): string
{
    $order = $shipment->getOrder();
    $propertyCollection = $order->getPropertyCollection();

    $payload = [
        'type'          => 1,
        'number'        => (string)$order->getId(),
        'tariff_code'   => 136,
        'from_location' => $this->getFromLocation(),
        'to_location'   => $this->getToLocation($propertyCollection),
        'recipient'     => [
            'name'   => $propertyCollection->getItemByOrderPropertyCode('FIO')?->getValue(),
            'phones' => [['number' => $propertyCollection->getItemByOrderPropertyCode('PHONE')?->getValue()]],
        ],
        'packages'      => $this->buildPackages($shipment),
        'comment'       => 'Замовлення #' . $order->getId(),
    ];

    $response = $this->apiPost('/v2/orders', $payload);

    // Зберігаємо ID замовлення СДЕК у властивостях замовлення Бітрікс
    $propertyCollection->getItemByOrderPropertyCode('CDEK_ORDER_UUID')
        ?->setValue($response['entity']['uuid']);

    $order->save();

    return $response['entity']['uuid'];
}

Статуси і трекінг

СДЕК підтримує вебхуки: налаштовуються в особистому кабінеті. При зміні статусу замовлення СДЕК надсилає POST на вказаний URL. Маппінг статусів:

Статус СДЕК Статус замовлення Бітрікс
RECEIVED_AT_SHIPMENT_WAREHOUSE Прийнято на склад
READY_FOR_SHIPMENT_IN_TRANSIT_CITY Відправлено
ARRIVED_AT_DESTINATION_CITY Прибуло в місто
DELIVERY Передано кур'єру
DELIVERED Доставлено
NOT_DELIVERED Не доставлено

За відсутності білого IP — polling агентом кожні 2 години для активних відправлень.

ПВЗ на сайті

СДЕК надає JavaScript-віджет для вибору ПВЗ на карті. Віджет викликається в шаблоні компонента доставки, передає вибраний код ПВЗ у приховане поле форми. При створенні замовлення замість to_location з адресою використовується delivery_point з кодом ПВЗ.

window.open_cdek_map = function() {
    window.CDEKWidget.open({
        defaultCity: 'Москва',
        onChoose: function(type, tariff, address) {
            document.getElementById('cdek_pvz_code').value = address.code;
            document.getElementById('cdek_pvz_name').value = address.name;
        }
    });
};

Накладна і штрих-код

Після створення замовлення в СДЕК доступна генерація накладної: POST /v2/print/orders з UUID замовлення. Відповідь містить посилання для завантаження PDF. Реалізуємо кнопку в адміністративній частині замовлення Бітрікс: менеджер натискає «Друк накладної СДЕК» — відкривається PDF.

Терміни

Склад Термін
Розрахунок вартості + створення замовлення 4–5 днів
+ Трекінг (вебхуки або polling) +2 дні
+ Віджет ПВЗ на сайті +2 дні
+ Накладна в адм. частині +1 день