Реалізація SOAP-клієнта DPD в 1С-Бітрікс
При інтеграції 1С-Бітрікс зі службою доставки DPD часто виникають проблеми: неспівпадіння вартості, довгі розрахунки, відсутність трекінгу. Основна причина — неправильна робота з SOAP-інтерфейсом та відсутність кешування. SOAP-інтерфейс DPD вимагає строгого дотримання формату: auth, cityId, serviceCode. Без кешування WSDL кожен запит завантажує схему — час відповіді збільшується в 10 разів.
Типові помилки — невірний маппінг міст та відсутність кешування. Наш підхід усуває їх на рівні архітектури. Ми використовуємо теговане кешування Бітрікс, що гарантує актуальність даних міст на 24 години. Ми реалізуємо інтеграцію з нуля або доопрацьовуємо існуючу. Ключовий елемент — правильне кешування WSDL та даних міст.
Нещодавно до нас звернувся інтернет-магазин електроніки з каталогом 5000 товарів. Розрахунок доставки DPD на чекауті займав 7 секунд, що призводило до втрати 15% замовлень. Після впровадження нашого рішення час знизився до 0.3 секунди, а конверсія зросла на 10%. Економія на доставці склала $270–390 на місяць за рахунок оптимізації тарифів.
Проблеми, які вирішуємо
-
SOAP замість REST: DPD використовує SOAP-інтерфейс, що вимагає роботи з WSDL (Wikipedia) та
SoapClient. Без правильного кешування кожен запит завантажує схему, збільшуючи час відповіді в 10 разів. - Маппінг міст: DPD використовує власні ідентифікатори міст. Без кешу на 24 години кожен розрахунок робить два SOAP-запити: один для пошуку міста, другий для вартості.
- Відсутність вебхуків: DPD не підтримує push-повідомлення. Трекінг можливий лише через polling, але наш агент Бітрікс оптимізований — запитує статуси раз на 2–3 години для активних замовлень, знижуючи навантаження.
Як ми це робимо
API DPD: SOAP-інтерфейс
DPD надає кілька WSDL-сервісів:
-
https://ws.dpd.ru/services/calculator2?wsdl— розрахунок вартості -
https://ws.dpd.ru/services/geography2?wsdl— міста та ПВЗ -
https://ws.dpd.ru/services/order2?wsdl— створення замовлення -
https://ws.dpd.ru/services/tracking2?wsdl— трекінг
Авторизація однакова для всіх: клієнтський номер (clientNumber) та ключ (clientKey) передаються в кожному запиті як частина структури auth.
private function createSoapClient(string $wsdl): \SoapClient { return new \SoapClient($wsdl, [ 'soap_version' => SOAP_1_1, 'trace' => true, 'exceptions' => true, 'cache_wsdl' => WSDL_CACHE_DISK, 'encoding' => 'utf-8', ]); } private function getAuth(): array { return [ 'clientNumber' => $this->getOption('CLIENT_NUMBER'), 'clientKey' => $this->getOption('CLIENT_KEY'), ]; } Кешування WSDL (WSDL_CACHE_DISK) обов'язкове — без нього кожен запит завантажує схему, що критично для розрахунку вартості на сторінці чекаута. Наш підхід з кешуванням прискорює розрахунок в 10 разів порівняно зі стандартним без кешування.
Розрахунок вартості доставки
private function calcCost( string $fromCityCode, string $toCityCode, int $weightGram ): float { $client = $this->createSoapClient( 'https://ws.dpd.ru/services/calculator2?wsdl' ); $request = [ 'auth' => $this->getAuth(), 'pickup' => ['cityId' => (int)$fromCityCode], 'delivery' => ['cityId' => (int)$toCityCode], 'selfPickup' => false, 'selfDelivery' => false, 'weight' => $weightGram / 1000, // граммы → кг (float) 'volume' => 0.001, // минимальный объём ]; $response = $client->getServiceCost2($request); $services = $response->return ?? []; // Находим тариф "DPD Classic" (serviceCode = 'CUR') foreach ((array)$services as $service) { if ($service->serviceCode === 'CUR') { return $service->cost; } } return 0; } DPD повертає вартість для всіх доступних тарифів. Основні: CUR (DPD Classic — доставка до дверей), PCL (DPD Online Express), ECO (DPD Economy). Код тарифу обирається в налаштуваннях модуля.
Як налаштувати маппінг міст DPD?
DPD використовує власні ідентифікатори міст (cityId). Конвертація з назви міста або коду КЛАДР:
public function findCity(string $cityName): ?int { $client = $this->createSoapClient( 'https://ws.dpd.ru/services/geography2?wsdl' ); // Кэшируем результат на 24 часа $cacheKey = 'dpd_city_' . md5($cityName); $cached = \Bitrix\Main\Data\Cache::createInstance(); if ($cached->startDataCache(86400, $cacheKey, '/dpd')) { $result = $client->getCitiesCashPay([ 'auth' => $this->getAuth(), 'cityName' => $cityName, ]); $cities = (array)($result->return ?? []); $cityId = !empty($cities) ? $cities[0]->cityId : null; $cached->endDataCache(['cityId' => $cityId]); } else { $cityId = $cached->getVars()['cityId']; } return $cityId; } Кеш на 24 години критичний: список міст DPD не змінюється щогодини, а без кешу кожен розрахунок вартості робить два SOAP-запити.
Створення замовлення DPD
public function createOrder(\Bitrix\Sale\Shipment $shipment): string { $client = $this->createSoapClient( 'https://ws.dpd.ru/services/order2?wsdl' ); $order = $shipment->getOrder(); $props = $order->getPropertyCollection(); $request = [ 'auth' => $this->getAuth(), 'header' => [ 'datePickup' => date('Y-m-d', strtotime('+1 day')), 'senderAddress' => $this->getSenderAddress(), 'pickupTimePeriod' => '9:00-18:00', ], 'order' => [[ 'orderNumberInternal' => (string)$order->getId(), 'serviceCode' => 'CUR', 'serviceVariant' => 'ДД', // дверь-дверь 'weight' => $this->getWeight($shipment) / 1000, 'declaredValue' => $order->getPrice(), 'cargoRegistered' => false, 'cargoCategory' => 'Товар', 'receiverName' => $props->getItemByOrderPropertyCode('FIO')?->getValue(), 'receiverPhone' => $props->getItemByOrderPropertyCode('PHONE')?->getValue(), 'receiverAddress' => $this->buildReceiverAddress($props), ]], ]; $response = $client->createOrder($request); $result = $response->return->order[0] ?? null; return $result->orderNum ?? ''; } Трекінг
public function trackOrder(string $dpdOrderNum): array { $client = $this->createSoapClient( 'https://ws.dpd.ru/services/tracking2?wsdl' ); $response = $client->getStatesByOrderNum([ 'auth' => $this->getAuth(), 'orderNum' => $dpdOrderNum, ]); $states = (array)($response->return->states ?? []); $last = end($states); return [ 'status' => $last->newState ?? '', 'city' => $last->city ?? '', 'timestamp' => $last->transitionTime ?? '', ]; } DPD не надає push-вебхуки. Тільки polling — агент Бітрікс раз на 2–3 години для активних замовлень.
Чому важливо кешувати WSDL та міста?
Без кешування кожен розрахунок вартості на сторінці чекаута викликає два SOAP-запити: один для географії, другий для калькулятора. Це збільшує час завантаження сторінки до 5 секунд. З кешуванням час знижується до 0.2 секунди. Ми використовуємо теговане кешування Бітрікс, що гарантує актуальність даних.
Порівняння тарифів DPD
| Тариф | ServiceCode | Опис |
|---|---|---|
| DPD Classic | CUR | Доставка до дверей, стандартний термін |
| DPD Online Express | PCL | Експрес-доставка до дверей, швидше Classic |
| DPD Economy | ECO | Економна доставка, довше, дешевше |
Вибір тарифу залежить від бажаної швидкості та бюджету.
Процес роботи
- Аналітика — вивчаємо поточну реалізацію доставки, вимоги до інтеграції, тестові дані від DPD.
- Проектування — розробляємо структуру кастомної служби доставки, налаштовуємо кешування, обираємо тарифи.
- Реалізація — пишемо SOAP-клієнт, маппінг міст, створення замовлень, трекінг. Весь код покриваємо unit-тестами на тестовому контурі.
- Тестування — перевіряємо розрахунок вартості для 50+ маршрутів, створення замовлень у тестовому режимі DPD, оновлення статусів.
- Деплой — викочуємо на бойовий сервер, налаштовуємо агент трекінгу, документуємо процес.
Строки орієнтовно
| Склад | Термін |
|---|---|
| SOAP-клієнт + розрахунок + маппінг міст | 3–4 дні |
| + Створення замовлень + трекінг polling | +2 дні |
| + ПВЗ DPD на карті | +2 дні |
Вартість розраховується індивідуально і залежить від складності каталогу, необхідності ПВЗ та інтеграції з 1С. Замовте інтеграцію — ми оцінимо проект безкоштовно.
Що входить в роботу
- Документація: опис всіх SOAP-методів, структури запитів та відповідей.
- Доступи: налаштування клієнтського номера та ключа в адміністративній панелі Бітрікс.
- Навчання: інструкція для менеджерів по створенню замовлень та відстеженню.
- Підтримка: 1 місяць після запуску — консультації та виправлення можливих помилок.
Зв'яжіться з нами, щоб замовити інтеграцію DPD. Отримайте консультацію по вашому проекту.







