Настройка трекинга отправлений на 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка трекинга отправлений на 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1173
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • 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
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    745
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка трекинга отправлений на 1С-Битрикс

Трекинг отправлений — задача, которая на первый взгляд кажется простой, пока не начинаешь делать её правильно. «Показывать статус заказа» означает: получать актуальный статус от перевозчика, хранить историю статусов, уведомлять покупателя при изменении, корректно отображать в личном кабинете.

Архитектура трекинговой системы

Базовая схема: агент Битрикс периодически опрашивает API перевозчиков для заказов в активных статусах, сохраняет историю, при смене статуса отправляет уведомление.

// Таблица истории трекинга (миграция)
class TrackingHistoryTable extends \Bitrix\Main\ORM\Data\DataManager
{
    public static function getTableName(): string { return 'custom_tracking_history'; }

    public static function getMap(): array
    {
        return [
            new \Bitrix\Main\ORM\Fields\IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
            new \Bitrix\Main\ORM\Fields\IntegerField('ORDER_ID'),
            new \Bitrix\Main\ORM\Fields\StringField('CARRIER'),          // sdek, boxberry, etc.
            new \Bitrix\Main\ORM\Fields\StringField('TRACK_NUMBER'),
            new \Bitrix\Main\ORM\Fields\StringField('STATUS_CODE'),
            new \Bitrix\Main\ORM\Fields\StringField('STATUS_TEXT'),
            new \Bitrix\Main\ORM\Fields\StringField('LOCATION'),         // текущее местонахождение
            new \Bitrix\Main\ORM\Fields\DatetimeField('STATUS_DATE'),
            new \Bitrix\Main\ORM\Fields\DatetimeField('CREATED_AT'),
        ];
    }
}

Агент трекинга

class DeliveryTrackingAgent
{
    public static function run(): string
    {
        // Выбираем заказы с трекинг-номерами в активных статусах
        $orders = \Bitrix\Sale\Order::getList([
            'filter' => [
                '!PROPERTY_TRACK_NUMBER' => false,
                'STATUS_ID'              => ['N', 'P', 'Q'], // не закрыты
            ],
            'select' => ['ID', 'PROPERTY_TRACK_NUMBER', 'PROPERTY_CARRIER_CODE'],
        ]);

        $carriers = [
            'sdek'     => new SdekTracker(),
            'boxberry' => new BoxberryTracker(),
            'pochta'   => new PochtaTracker(),
        ];

        while ($order = $orders->fetch()) {
            $carrier = $carriers[$order['PROPERTY_CARRIER_CODE_VALUE']] ?? null;
            if (!$carrier) continue;

            try {
                $status = $carrier->getStatus($order['PROPERTY_TRACK_NUMBER_VALUE']);
                self::saveStatus($order['ID'], $status);
            } catch (\Throwable $e) {
                // логируем, не падаем
                \Bitrix\Main\Diag\Debug::writeToFile($e->getMessage(), 'tracking', '/local/logs/tracking.log');
            }
        }

        return __CLASS__ . '::run();';
    }

    private static function saveStatus(int $orderId, array $status): void
    {
        // Проверяем, изменился ли статус
        $last = TrackingHistoryTable::getRow([
            'filter' => ['ORDER_ID' => $orderId],
            'order'  => ['STATUS_DATE' => 'DESC'],
            'select' => ['STATUS_CODE'],
        ]);

        if ($last && $last['STATUS_CODE'] === $status['code']) return; // не изменился

        TrackingHistoryTable::add([
            'ORDER_ID'    => $orderId,
            'STATUS_CODE' => $status['code'],
            'STATUS_TEXT' => $status['text'],
            'LOCATION'    => $status['location'] ?? '',
            'STATUS_DATE' => new \Bitrix\Main\Type\DateTime($status['date']),
            'CREATED_AT'  => new \Bitrix\Main\Type\DateTime(),
        ]);

        // Отправить уведомление при смене статуса
        self::notifyCustomer($orderId, $status);
    }
}

Страница трекинга в личном кабинете

// Компонент отображения истории трекинга
$orderId = (int)$_REQUEST['ORDER_ID'];
$order   = \Bitrix\Sale\Order::load($orderId);

if ($order && $order->getUserId() === $USER->GetID()) {
    $history = TrackingHistoryTable::getList([
        'filter' => ['ORDER_ID' => $orderId],
        'order'  => ['STATUS_DATE' => 'ASC'],
        'select' => ['STATUS_CODE', 'STATUS_TEXT', 'LOCATION', 'STATUS_DATE'],
    ])->fetchAll();

    // Трекинговый номер для ссылки на сайт перевозчика
    $trackNumber = $order->getPropertyCollection()
        ->getItemByOrderPropertyCode('TRACK_NUMBER')
        ?->getValue();
}
Перевозчик Ссылка для трекинга
СДЭК https://www.cdek.ru/ru/tracking?order_id={track}
Boxberry https://boxberry.ru/tracking/?id={track}
Почта России https://www.pochta.ru/tracking#{track}
Яндекс Доставка Через личный кабинет по claim_id

Сроки

Состав Срок
Агент трекинга + история статусов 2–3 дня
+ Страница трекинга в ЛК +1 день
+ Email-уведомления при смене статуса +1 день