Ситуация: клиент терял до 30% заказов из-за неработающей доставки в регионы Казахстана
К нам обратился интернет-магазин с товарооборотом 5 млн тенге в месяц. Частные курьеры доставляли только в Алматы и Астану, в районные центры — только Казпочта. Встроенный модуль Битрикса не справлялся: расчёт стоимости выдавал ошибки, трекинг отсутствовал. Ручная выписка накладных занимала 2 часа в день, а ошибки в индексах приводили к возвратам. Мы провели аудит и решили полностью переписать обработчик доставки через REST API Казпочты. Экономия на ручной обработке заказов составила 15 часов в месяц. В результате после внедрения клиент автоматизировал 90% заказов, время обработки сократилось с 30 минут до 2 минут на заказ. Кроме того, мы устранили ошибки округления стоимости, которые возникали из-за неверной конвертации валют. Теперь покупатели из любого города Казахстана могут оформить доставку онлайн, а магазин получает актуальную стоимость с учётом веса и объявленной ценности.
Как работает интеграция с Казпочтой?
Казпочта — государственный оператор с 3500+ отделений. API доступен партнёрам после договора. Базовый URL: https://api.kazpost.kz/api/v1. Авторизация через X-Api-Key. Основные методы:
-
POST /delivery/calculate— расчёт стоимости -
POST /shipment/create— создание отправления -
GET /shipment/{barcode}/track— трекинг -
GET /offices— список отделений по индексу
Подробнее о REST API — архитектуре, на которой построен сервис.
Расчёт стоимости
class KazposhtaHandler extends \Bitrix\Sale\Delivery\Services\Base { protected function calculateConcrete( \Bitrix\Sale\Shipment $shipment ): \Bitrix\Sale\Delivery\CalculationResult { $result = new \Bitrix\Sale\Delivery\CalculationResult(); $toIndex = $this->getPostIndex($shipment); if (!$toIndex) { $result->addError(new \Bitrix\Main\Error('Не указан почтовый индекс получателя')); return $result; } $response = $this->apiPost('/delivery/calculate', [ 'from_index' => $this->getOption('SENDER_INDEX'), 'to_index' => $toIndex, 'weight' => max((int)$shipment->getWeight(), 100), 'declared_value' => round($shipment->getOrder()->getPrice()), 'mail_type' => 'PARCEL', 'mail_class' => 'ORDINARY', ]); if (!empty($response['total_rate'])) { $result->setDeliveryPrice((float)$response['total_rate']); $min = $response['delivery_days_min'] ?? 3; $max = $response['delivery_days_max'] ?? 14; $result->setPeriodDescription("{$min}–{$max} дней"); } return $result; } private function getPostIndex(\Bitrix\Sale\Shipment $shipment): ?string { $props = $shipment->getOrder()->getPropertyCollection(); $index = $props->getItemByOrderPropertyCode('ZIP')?->getValue(); return preg_match('/^\d{6}$/', (string)$index) ? $index : null; } } Почтовый индекс — обязательное поле. В форме оформления заказа делаем его обязательным и валидируем формат (6 цифр).
Как настроить обработчик доставки?
- Установите модуль доставки Казпочты или создайте свой класс, унаследованный от
\Bitrix\Sale\Delivery\Services\Base. - Зарегистрируйте обработчик в административной панели Битрикса: настройки → службы доставки → добавить.
- Добавьте свойства заказа:
ZIP(индекс),ADDRESS,FIO,PHONE. Для трекинга — пользовательское свойствоUF_KAZPOST_BARCODE. - Реализуйте методы
calculateConcreteиcreateShipment, как показано выше. - Настройте агент для периодического опроса статусов.
Создание отправления
public function createShipment(\Bitrix\Sale\Shipment $shipment): string { $order = $shipment->getOrder(); $props = $order->getPropertyCollection(); $response = $this->apiPost('/shipment/create', [ 'sender' => [ 'index' => $this->getOption('SENDER_INDEX'), 'address' => $this->getOption('SENDER_ADDRESS'), 'name' => $this->getOption('SENDER_NAME'), 'phone' => $this->getOption('SENDER_PHONE'), ], 'recipient' => [ 'index' => $props->getItemByOrderPropertyCode('ZIP')?->getValue(), 'address' => $props->getItemByOrderPropertyCode('ADDRESS')?->getValue(), 'name' => $props->getItemByOrderPropertyCode('FIO')?->getValue(), 'phone' => $props->getItemByOrderPropertyCode('PHONE')?->getValue(), ], 'parcel' => [ 'weight' => max((int)$shipment->getWeight(), 100), 'declared_value' => round($order->getPrice()), 'mail_type' => 'PARCEL', 'description' => 'Товар', ], 'payment_type' => 'PREPAID', ]); return $response['barcode'] ?? ''; } Штрих-код отправления сохраняем в UF_KAZPOST_BARCODE.
Почему агент обязателен для трекинга?
API Казпочты не отправляет вебхуки — статусы нужно опрашивать. Заводим агент Битрикс, запускаемый раз в 6 часов. Он проверяет штрих-коды заказов в статусе "P" (оплачен) и при статусе "DELIVERED" переводит заказ в "F" (доставлен). Важно предусмотреть timeout для API запросов (рекомендуем 10–15 сек) и логирование ошибок, чтобы при сбое Казпочты агент не зависал. Механизм повторов при ошибке 500–503 помогает избежать потери статусов.
function checkKazposhtaStatus(): string { $orders = \Bitrix\Sale\Order::getList([ 'filter' => ['=PROPERTY_VAL.UF_KAZPOST_BARCODE' => true, '=STATUS_ID' => 'P'], 'select' => ['ID'] ]); foreach ($orders as $order) { $barcode = $order->getPropertyCollection()->getItemByOrderPropertyCode('UF_KAZPOST_BARCODE')->getValue(); $track = new KazposhtaHandler()->track($barcode); if ($track['status'] === 'DELIVERED') { $order->setField('STATUS_ID', 'F'); $order->save(); } } return 'checkKazposhtaStatus();'; } При ошибках API (например, 400 с телом {"error": "Invalid index"}) обработчик выводит сообщение: "Почтовый индекс получателя указан неверно". Все запросы логируются в /bitrix/logs/kazpost.log для отладки.
Типичные ошибки при интеграции
-
Неверный формат индекса — должен быть 6 цифр. Валидируйте на клиента через маску ввода и на сервере через
preg_match('/^\d{6}$/'). При ошибке выводите сообщение "Проверьте почтовый индекс получателя". -
Отсутствие обязательных свойств заказа (
ZIP,ADDRESS,FIO,PHONE) — предотвратите пустые данные обязательными полями в форме оформления. Перед запросом к API выполняйте проверку черезisset()и!empty(). -
Не настроен агент для трекинга — статусы не обновляются. Убедитесь, что агент зарегистрирован в админке и запускается по расписанию (cron). Проверьте логи в
/bitrix/logs/при отсутствии обновлений. - Некорректный API-ключ — возвращает 401. Проверьте наличие ключа в переменных окружения и срок его действия у партнёра Казпочты (ключи требуют периодического обновления контракта).
Особенности доставки Казпочтой
- Адресная доставка до двери — только в крупных городах (Алматы, Астана, Шымкент), в остальных — до отделения.
- EMS — быстрее и надёжнее для срочных отправлений в крупные города.
- API Казпочты поддерживает наложенный платёж (COD), комиссия ~2% от суммы.
- Тариф рассчитывается в тенге — проверьте настройку валюты магазина.
Сроки и этапы работ
| Этап | Срок |
|---|---|
| Разработка обработчика расчёта и создания отправления | 4–5 дней |
| Подключение трекинга и уведомлений | +2 дня |
| Реализация наложенного платежа (COD) | +1 день |
| Тестирование на реальных заказах | 1–2 дня |
| Итого | 7–10 дней |
| Тип отправления | mail_type | mail_class | Описание |
|---|---|---|---|
| Посылка обычная | PARCEL | ORDINARY | Стандартная посылка |
| EMS | EMS | EMS | Ускоренная доставка |
| Ценная посылка | PARCEL | VALUABLE | С объявленной ценностью |
Что входит в работу
- Разработка класса-обработчика доставки (на базе
\Bitrix\Sale\Delivery\Services\Base). - Настройка свойств заказа: индекс, адрес, штрих-код.
- Создание агента для трекинга.
- Интеграция с фискализацией (54-ФЗ) — обсуждается отдельно.
- Тестирование на тестовом и боевом контурах.
- Передача документации и доступов.
Стоимость интеграции рассчитывается индивидуально и обычно составляет от 80 000 до 150 000 тенге. Мы гарантируем стабильную работу. Опыт — 5+ лет, более 20 проектов по интеграции 1С-Битрикс с почтовыми службами. По запросу предоставляем сертификаты партнёра 1С-Битрикс.
Получите консультацию по интеграции — свяжитесь с нами. Оценим ваш проект за 1 день и подготовим предложение. Закажите расчёт по почте или через форму обратной связи.







