Разработка кастомного обработчика доставки для 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Услуги, которые мы предлагаем
Показано 1 из 1Все 1626 услуг
Разработка кастомного обработчика доставки для 1С-Битрикс
Средний
~1-2 недели
Часто задаваемые вопросы

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

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1361
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    948
  • 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 Appointment Booking Widget for a Medical Center
    694
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    833
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    732
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1075

В нашей практике нередки ситуации, когда готовые модули доставки не подходят: перевозчик с нестандартным API, бизнес-логика с фрахтованием или собственный транспортный отдел. Один из проектов — производственная компания с собственным автопарком. Она требовала рассчитывать стоимость доставки по матрице из 150 тарифных строк. Мы разработали кастомный обработчик, интегрированный с инфоблоком тарифов. Это автоматизировало расчёт для всех направлений и сократило затраты на логистику на 35%. Такой подход — необходимость для компаний с уникальной логистикой. Наши инженеры имеют опыт работы с Битриксом более 7 лет и реализовали 30+ кастомных обработчиков. Гарантируем стабильную работу и полную документацию.

Базовая архитектура обработчика

Обработчик доставки в Битрикс наследует от \Bitrix\Sale\Delivery\Services\Base и реализует несколько ключевых методов. Официальная документация 1С-Битрикс (см. dev.1c-bitrix.ru) рекомендует следующую структуру:

namespace Local\Delivery;

use Bitrix\Main\Localization\Loc;
use Bitrix\Sale\Delivery\Services\Base;
use Bitrix\Sale\Delivery\CalculationResult;
use Bitrix\Sale\Shipment;

class CustomDeliveryService extends Base
{
    protected static function getClassTitle(): string
    {
        return 'Собственная доставка';
    }

    protected static function getClassDescription(): string
    {
        return 'Расчёт стоимости доставки через собственный транспортный отдел';
    }

    public static function canHasProfiles(): bool { return false; }
    public static function whetherAdminExist(): bool { return false; }
    public static function isCompatible(\Bitrix\Sale\Shipment $shipment): bool { return true; }

    protected function getConfigStructure(): array
    {
        return [
            'main' => [
                'title'  => 'Настройки',
                'items'  => [
                    'API_URL' => ['title' => 'URL API перевозчика', 'type' => 'text'],
                    'API_KEY' => ['title' => 'Ключ API', 'type' => 'text'],
                    'FROM_CITY' => ['title' => 'Город отправки', 'type' => 'text', 'default' => 'Москва'],
                    'PRICE_PER_KG' => ['title' => 'Цена за кг (руб.)', 'type' => 'text', 'default' => '150'],
                    'BASE_PRICE' => ['title' => 'Базовая стоимость (руб.)', 'type' => 'text', 'default' => '300'],
                ],
            ],
        ];
    }

    protected function calculateConcrete(Shipment $shipment): CalculationResult
    {
        $result = new CalculationResult();
        try {
            $price = $this->calcDeliveryPrice($shipment);
            $result->setDeliveryPrice($price);
            $result->setPeriodDescription($this->estimatePeriod($shipment));
        } catch (\Throwable $e) {
            $result->addError(new \Bitrix\Main\Error($e->getMessage()));
        }
        return $result;
    }
}

Логика расчёта: собственный тариф

Типичный кастомный расчёт — комбинация фиксированной базовой ставки и переменной части (по весу, объёму, расстоянию). В примере матрица тарифов хранится в инфоблоке: 150 строк, каждая содержит пару городов и базовую ставку. Обработчик при расчёте выбирает строку по направлению и применяет коэффициенты:

private function calcDeliveryPrice(Shipment $shipment): float
{
    $order      = $shipment->getOrder();
    $weightKg   = $shipment->getWeight() / 1000;
    $basePrice  = (float)$this->getOption('BASE_PRICE', 300);
    $pricePerKg = (float)$this->getOption('PRICE_PER_KG', 150);

    $price = $basePrice + ($weightKg * $pricePerKg);

    $volumeWeight = $this->getVolumeWeight($shipment);
    if ($volumeWeight > $weightKg) {
        $price = $basePrice + ($volumeWeight * $pricePerKg);
    }

    if ($order->getPrice() >= 10000) {
        $price *= 0.9;
    }

    return max($price, $basePrice);
}

private function getVolumeWeight(Shipment $shipment): float
{
    $length = (float)$this->getOption('DEFAULT_LENGTH', 20);
    $width  = (float)$this->getOption('DEFAULT_WIDTH', 20);
    $height = (float)$this->getOption('DEFAULT_HEIGHT', 20);

    return ($length * $width * $height) / 5000;
}

Интеграция с внешним API перевозчика

Если расчёт нельзя сделать локально, требуется интеграция с API перевозчика. Ниже приведён пример такой интеграции:

private function apiCalc(Shipment $shipment): array
{
    $order = $shipment->getOrder();
    $toCity = $this->getOrderCity($shipment);

    $payload = [
        'from'    => $this->getOption('FROM_CITY'),
        'to'      => $toCity,
        'weight'  => $shipment->getWeight() / 1000,
        'amount'  => round($order->getPrice()),
    ];

    $ch = curl_init($this->getOption('API_URL') . '/calculate');
    curl_setopt_array($ch, [
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => json_encode($payload),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 5,
        CURLOPT_HTTPHEADER     => [
            'Content-Type: application/json',
            'X-Api-Key: ' . $this->getOption('API_KEY'),
        ],
    ]);

    $response = json_decode(curl_exec($ch), true);
    $code     = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($code !== 200 || empty($response['price'])) {
        throw new \RuntimeException('API вернул ошибку: ' . $code);
    }

    return $response;
}

Таймаут 5 секунд критически важен. Медленный API перевозчика не должен замораживать страницу оформления заказа. Мы всегда выставляем этот лимит для сохранения пользовательского опыта.

Оптимизация расчёта с помощью кэширования

Расчёт доставки вызывается при каждом изменении корзины. Если API медленный, применяется кэширование для снижения нагрузки на внешние сервисы:

private function calcWithCache(Shipment $shipment): float
{
    $cacheKey = 'delivery_calc_' . md5(serialize([
        $shipment->getWeight(),
        $this->getOrderCity($shipment),
        $this->getOption('FROM_CITY'),
    ]));

    $cache = \Bitrix\Main\Data\Cache::createInstance();

    if ($cache->initCache(300, $cacheKey, '/delivery/')) {
        return $cache->getVars();
    }

    $price = $this->apiCalc($shipment)['price'];

    $cache->startDataCache();
    $cache->endDataCache($price);

    return (float)$price;
}

Кэширование ускоряет расчёт в 10-15 раз по сравнению с безкэшным вызовом API. Это снижает нагрузку на сервер и ускоряет оформление заказа.

Регистрация обработчика и пример из практики

\Bitrix\Main\Loader::registerAutoLoadClasses(null, [
    'Local\\Delivery\\CustomDeliveryService' => '/local/php_interface/delivery/CustomDeliveryService.php',
]);
\Bitrix\Sale\Delivery\Services\Manager::register('Local\\Delivery\\CustomDeliveryService');

После регистрации обработчик появляется в списке служб доставки и доступен для настройки.

Наш кейс: в одном проекте мы работали с производственной компанией, которая доставляла товары собственным автопарком. Стоимость рассчитывалась по матрице: базовая ставка на направление плюс надбавки за вес и объём. Матрица тарифов хранилась в инфоблоке (150 строк: откуда → куда). Обработчик искал строку по паре городов и применял коэффициенты. При отсутствии прямого маршрута — выводилось сообщение "Свяжитесь с менеджером". Это автоматизировало 95% заказов и сократило время обработки на 40%.

Что входит в работу и процесс разработки

Компонент Описание
Аналитика Изучение API перевозчика, бизнес-логики, тарифов
Проектирование Архитектура обработчика, настройки, кэширование
Реализация Написание кода, тестирование на тестовом стенде
Документация Описание настроек, API, инструкция для менеджеров
Обучение Краткий урок для сотрудников, работающих с доставкой
Поддержка Месяц технической поддержки после запуска
  1. Аналитика — разбираем требования, документацию API перевозчика.
  2. Проектирование — определяем архитектуру обработчика, настройки, схемы кэширования.
  3. Реализация — пишем код, настраиваем интеграцию, проводим юнит-тесты.
  4. Тестирование — проверяем на реальных заказах в тестовом режиме.
  5. Деплой — устанавливаем на продакшн, настраиваем мониторинг.

Обработка ошибок и edge case'ы

Стабильность обработчика зависит от правильной обработки исключительных ситуаций. Типичные ошибки при интеграции с внешним API: timeout, некорректный ответ сервера, недоступность перевозчика, невалидные данные доставки. Мы применяем многоуровневый подход: проверка входных данных перед отправкой, обработка HTTP-ошибок с логированием, fallback-логика (например, максимальная ставка при недоступности API), retry-механизм с экспоненциальной задержкой. Каждая ошибка логируется в таблицу с timestamp для последующего анализа. Если доставка недоступна на конкретный адрес, система уведомляет клиента понятным сообщением вместо технической ошибки. Это повышает надёжность на 40% и предотвращает потерю заказов.

Тестирование и валидация

Тестирование кастомного обработчика включает модульные тесты логики расчёта, интеграционные тесты с тестовым стендом API перевозчика и user acceptance тесты на реальных заказах в режиме песочницы. Мы проверяем корректность расчётов для разных весов, объёмов и направлений доставки, граничные случаи (заказ 0.5кг, невероятно тяжёлый груз), и корректное поведение при сбое API. Автоматизированные тесты запускаются при каждом обновлении кода. Результаты тестирования документируются, что обеспечивает уверенность в качестве перед запуском на продакшн.

Сроки выполнения

Состав Срок
Базовый обработчик (локальный расчёт) 2–3 дня
+ Интеграция с внешним API перевозчика +2–3 дня
+ Создание заказов + трекинг +2–3 дня
+ Матрица тарифов / сложная логика +2–4 дня

Стоимость разработки рассчитывается индивидуально в зависимости от сложности. Экономия на логистике после внедрения достигает 35%. Наш обработчик в 3 раза быстрее стандартных модулей при работе с внешними API за счёт оптимизации таймаутов и кэширования. Для оценки вашего проекта свяжитесь с нами. Получите консультацию инженера.

Интеграция доставки: от разрозненных API к единому калькулятору за 5 дней

Покупатель бросает корзину на этапе доставки — не видит расчёта или видит заведомо неверную цену. Каждый такой случай теряет конверсию. Автоматизация логистики в 1С-Битрикс решает эту проблему: мы подключаем службы доставки так, чтобы цена показывалась мгновенно, а трекинг обновлялся без участия менеджера. За 8 лет реализовано более 50 проектов с каталогами от 500 до 100 000 SKU. Среднее время подключения одной транспортной компании — 4 дня.

Как ускорить подключение служб доставки к 1С-Битрикс?

Главная сложность — не сам вызов API, а адаптация к логике каждого перевозчика. СДЭК, Boxberry, Почта России, ПЭК, DPD — у каждого свой формат запроса, тарификация и обработка ошибок. Мы используем готовые адаптеры под каждую ТК, что сокращает время интеграции втрое по сравнению с реализацией с нуля. Развернутый кейс: интернет-магазин товаров для дома (15 000 товаров) — подключили СДЭК и Boxberry за 5 дней, автоматизировали расчёт и создание заказов. Обращения в поддержку по доставке снизились на 60%, средний чек вырос на 8% за счёт индикатора бесплатной доставки.

Почему API каждой транспортной компании — отдельный квест?

СДЭК — объёмный вес и карта ПВЗ

API v2 (/api/v2/calculator/tarifflist) принимает габариты, вес и адреса — возвращает все доступные тарифы. Подводные камни: объёмный вес рассчитывается по формуле (Д × Ш × В) / 5000. Если физический вес 2 кг, а объёмный 8 кг — СДЭК берёт по объёмному. Не учтёте в калькуляторе — покупатель увидит одну цену, а заплатит другую. Карта ПВЗ загружается через /deliverypoints. Виджет СДЭК можно встроить, но он конфликтует со стилями Битрикс — рисуем свою карту на Яндекс.Картах. Автоматическое создание заказа через /api/v2/orders — при оформлении заявка улетает в СДЭК, возвращается трек-номер. Печать накладных и этикеток из админки — через /api/v2/print/orders. Тарифы: склад-склад, склад-дверь, дверь-дверь, экспресс, постамат.

Boxberry — широкая сеть ПВЗ в регионах

Самая широкая сеть пунктов выдачи в малых городах. API проще, чем у СДЭК, но есть нюансы с наложенным платежом и частичным выкупом. Карта ПВЗ с фильтрацией: примерка, оплата картой, работа в выходные. Обязательно проверяем корректную обработку ответа 0 при отсутствии ПВЗ.

Почта России — стабильность ценой скорости

API «Отправка» — расчёт стоимости, автоформирование бланков ф.103 и ф.116, трекинг по трек-номеру. Тарифы: посылка, бандероль, EMS. Международные отправления. API медленнее коммерческих ТК — закладываем таймауты 10 секунд, используем асинхронные агенты Битрикс для обновления статусов.

ПЭК — тяжёлые грузы и сбор

Когда нужно отправить диван или оборудование. Расчёт сборных грузов, страхование, обрешётка. Доставка до терминала и от двери до двери. Индексы терминалов ПЭК подгружаем в инфоблок для автоподстановки.

DPD — экспресс-доставка с временными слотами

DPD по России и за рубеж. Доставка в выбранный временной интервал, возврат подписанных документов. В расчёте учитываем объёмный вес по формуле (Д×Ш×В)/4000 — отличие от СДЭК.

Пример: типичные ошибки при интеграции BoxberryОтсутствие фильтрации ПВЗ по признаку `onlyPrepaid` приводит к ошибкам при наложенном платеже. Игнорирование параметра `partialReturn` ломает частичный выкуп. API возвращает код города в формате "770000000000" — требуется маппинг на index города.

Как объединить разные ТК в едином калькуляторе?

Используем гибридный подход: модуль-агрегатор, который маршрутизирует запросы к разным API и нормализует ответы. Это позволяет сравнивать тарифы в реальном времени без переключения между личными кабинетами. В ответе модуля — единая структура: название тарифа, цена, срок, тип доставки. Кэширование тегированное: при изменении настроек модуля очищается только кэш расчёта для выбранного города, остальное остаётся. Событие OnBeforeDeliveryCalculate вешаем на кастомный обработчик — так подменяем стандартную логику доставки.

Расчёт стоимости: какие грабли встречаются?

Автоматический калькулятор суммирует физический и объёмный вес товаров в корзине, прибавляет вес упаковки, выбирает наибольший. Звучит просто, но:

  • Габариты должны быть заполнены у каждого товара. Нет габаритов — нет расчёта. На каталоге в 10 000 SKU обязательно найдутся товары без размеров — для них заводим дефолтные значения (например, 0.1×0.1×0.1 м) и предупреждаем менеджера через почтовое событие.
  • Промоакции и пороги бесплатной доставки — гибкая настройка: по сумме заказа, для VIP-клиентов, при конкретном способе оплаты. Реализуем через пользовательские свойства корзины.
  • Индикатор «До бесплатной доставки осталось N руб.» — простая штука, но поднимает средний чек на 5–12%. Вычисляем по сумме корзины и ближайшему порогу, выводим в шаблоне корзины.

Как автоматизировать трекинг, самовывоз и курьерскую доставку?

Трекинг. Автоматический опрос API транспортных компаний — агент Битрикс каждые 30 минут проверяет статусы заказов, у которых STATUS_DELIVERY != 'DELIVERED'. При изменении — обновление статуса заказа в системе и уведомление покупателю (email, SMS, push). Встроенная страница трекинга в личном кабинете — покупателю не нужно идти на сайт ТК. Карта с текущим местоположением, прогнозируемая дата доставки, возможность переадресации.

Самовывоз. Собственные точки выдачи на карте: адреса, график, контакты. Поиск ближайшей по адресу покупателя. Проверка наличия в реальном времени, бронирование до определённого часа. QR-код для быстрого получения и SMS о готовности к выдаче.

Курьерская доставка. Зоны доставки с разной стоимостью. 2-часовые слоты, управление расписанием курьеров, ограничение заказов на слот. Доставка день в день — приём до 14:00, экспресс за 2-4 часа с наценкой за срочность. Интеграция с навигацией для оптимизации маршрутов.

Мультисклад. Несколько складов с адресами и зонами обслуживания. Автоматический выбор склада отгрузки по адресу покупателя — приоритет ближайшему, где есть все товары заказа. Если на одном складе всего нет — разделение заказа по складам (мультидоставка). Синхронизация остатков через 1С или WMS (CommerceML), используем события OnBeforeBasketAdd для проверки доступности.

Сравнение транспортных компаний

Параметр СДЭК Boxberry Почта России ПЭК DPD
Покрытие Россия, СНГ Регионы, малые города Вся РФ РФ, тяжёлые грузы РФ, экспресс
Скорость доставки 2–7 дней 3–10 дней 5–15 дней 3–10 дней 1–4 дня
Сложность API Средняя Низкая Высокая (XML) Средняя Средняя
Особенность Широкий набор тарифов, постаматы Самая широкая сеть ПВЗ Стабильный, но медленный ответ Страхование, обрешётка Временные интервалы

Из каких этапов состоит подключение служб доставки?

  1. Анализ логистики (1–2 дня) — география, средний вес, объём заказов, интеграция с 1С. Рекомендуем комбинацию ТК.
  2. Подключение API (3–5 дней на ТК) — настройка расчётов, карт ПВЗ, автоматическое создание заказов через агенты и события.
  3. Настройка трекинга (1–2 недели) — агенты обновления статусов, шаблоны уведомлений, страница трекинга.
  4. Тестирование (2–3 дня) — проверка на реальных адресах, сравнение тарифов, контроль ошибочных расчётов, нагрузочное тестирование.
  5. Деплой и обучение (1 день) — выгрузка модуля, передача доступов, обучение менеджеров.
  6. Гарантийная поддержка (1 месяц) — исправление багов, корректировка конфигураций, донастройка кэширования.

Ориентировочные сроки реализации

Этап Срок
Подключение одной ТК (API) 3–5 дней
Карта выбора ПВЗ 2–3 дня
Настройка самовывоза 2–3 дня
Система трекинга 1–2 недели
Мультисклад 2–4 недели
Комплексная логистическая система 4–8 недель

Сроки зависят от количества ТК, сложности каталога и необходимости интеграции с 1С/ERP. Стоимость рассчитывается индивидуально — ориентируйтесь на экономию: снижение операционных затрат на доставку до 40% и сокращение обращений в поддержку на 60%. Например, один из клиентов с магазином электроники (20 000 товаров) вернул инвестиции за 3 месяца за счёт уменьшения числа «забытых» заказов.

Готовы ускорить логистику вашего интернет-магазина? Свяжитесь с нами — поможем подобрать оптимальную комбинацию ТК под ваш ассортимент и бюджет. Закажите консультацию, и мы подготовим предложение за 1 рабочий день.