Реализация SOAP-клиента DPD в 1С-Битрикс
При интеграции 1С-Битрикс со службой доставки DPD часто возникают проблемы: несовпадение стоимости, долгие расчёты, отсутствие трекинга. Основная причина — неправильная работа с SOAP-интерфейсом и отсутствие кэширования. SOAP-интерфейс DPD требует строгого соблюдения формата: auth, cityId, serviceCode. Без кэширования WSDL каждый запрос загружает схему — время ответа увеличивается в 10 раз.
Типичные ошибки — неверный маппинг городов и отсутствие кэширования. Наш подход устраняет их на уровне архитектуры. Мы используем тегированное кэширование Битрикс, что гарантирует актуальность данных городов на 24 часа. Мы реализуем интеграцию с нуля или дорабатываем существующую. Ключевой элемент — правильное кэширование WSDL и данных городов.
Недавно к нам обратился интернет-магазин электроники с каталогом 5000 товаров. Расчёт доставки DPD на чекауте занимал 7 секунд, что приводило к потере 15% заказов. После внедрения нашего решения время снизилось до 0.3 секунды, а конверсия выросла на 10%. Экономия на доставке составила 30 000 ₽ в месяц за счёт оптимизации тарифов.
Проблемы, которые решаем
-
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. Получите консультацию по вашему проекту.







