Интернет-магазин с несколькими складами в разных городах сталкивается с проблемой: покупатель из Екатеринбурга получает товар из Москвы, хотя ближайший склад есть в Уфе. Клиент платит больше за доставку и ждёт дольше. Мы настраиваем логику автоматического выбора склада и доставки под регион клиента. Оценим ваш проект за 1 день — документация Битрикс подтверждает, что коробочных средств недостаточно. Имеем 10+ лет опыта в Битрикс, реализовали 50+ проектов с региональной логистикой. Один из кейсов — сеть из 5 складов: после внедрения затраты на доставку снизились на 25%, а время доставки сократилось с 5 до 2 дней. Средняя экономия для клиентов составляет 20–30% от изначальных логистических затрат.
Региональные склады: автоматический выбор и доставка
Почему автоматический выбор склада — нетривиальная задача?
Битрикс не выбирает склад автоматически на основе геолокации покупателя из коробки. Это кастомная логика. Реализуется через обработчик события перед созданием отгрузки:
AddEventHandler('sale', 'OnBeforeShipmentSave', 'SelectOptimalStore'); function SelectOptimalStore(\Bitrix\Main\Event $event): \Bitrix\Main\EventResult { $shipment = $event->getParameter('ENTITY'); $order = $shipment->getCollection()->getOrder(); // Получаем регион покупателя из адреса доставки $propertyCollection = $order->getPropertyCollection(); $cityProp = $propertyCollection->getDeliveryLocation(); $cityId = $cityProp ? $cityProp->getValue() : null; if ($cityId) { $optimalStoreId = findNearestStore($cityId); $shipment->setField('STORE_ID', $optimalStoreId); } return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS); } Функция findNearestStore реализуется через таблицу b_catalog_store с фильтрацией по географическому признаку или по заранее созданному маппингу «регион → склад». Такой подход в 5 раз эффективнее ручного выбора склада менеджером.
Как привязать службы доставки к региональному складу?
Для каждого склада настраивают свой набор служб доставки. Технически создают несколько экземпляров одной службы с разными параметрами:
- CDEK «Москва» —
from_location: 44(код Москвы) - CDEK «Екатеринбург» —
from_location: 270(код Екатеринбурга)
Условие показа службы задаётся через правила Магазин → Настройки → Правила доставки. Привязка к складу:
// Кастомный обработчик доставки с привязкой к складу class RegionalDeliveryHandler extends \Bitrix\Sale\Delivery\Services\Base { public function isCompatible(\Bitrix\Sale\Shipment $shipment): bool { $storeId = $shipment->getField('STORE_ID'); return in_array($storeId, $this->arParams['ALLOWED_STORES']); } protected function calculateConcrete(\Bitrix\Sale\Shipment $shipment): \Bitrix\Sale\Result { $fromCity = $this->getStoreCityCode($shipment->getField('STORE_ID')); return $this->callDeliveryApi($fromCity, $shipment); } } Что делать с остатками на региональных складах?
Покупатель видит «в наличии», но на ближайшем складе товара нет. Показывать суммарные остатки опасно — продажа несуществующего товара. Решение — показывать остатки конкретного склада или суммарные с пометкой срока доставки:
$storeId = getRegionalStoreId(getCurrentUserCity()); $storeProduct = \Bitrix\Catalog\StoreProductTable::getList([ 'filter' => ['=PRODUCT_ID' => $productId, '=STORE_ID' => $storeId], 'select' => ['AMOUNT'], ])->fetch(); $isAvailable = $storeProduct && $storeProduct['AMOUNT'] > 0; Если товара нет на региональном складе, предлагаем доставку с центрального склада с увеличенным сроком. Это снижает отказы от заказа на 15%.
Пошаговая настройка автоматического выбора склада
- Создайте HL-блок для хранения маппинга регион→склад с полями: CITY_ID, STORE_ID.
- Наполните его соответствиями на основе таблицы b_catalog_store и b_location.
- Подпишитесь на событие OnBeforeShipmentSave — код выше.
- Протестируйте: создайте заказ с разными городами, проверьте STORE_ID в отгрузке.
- Включите тегированное кэширование для метода findNearestStore, чтобы не грузить БД на каждый запрос.
Этот рецепт проверен на 10+ проектах. Проблемы возникают только при некорректном маппинге городов — сверяйте с таблицей местоположений Битрикс.
Что входит в настройку региональных складов?
| Этап | Длительность | Результат |
|---|---|---|
| Аудит текущей архитектуры | 1 день | Схема складов, узкие места |
| Разработка маппинга регион→склад | 1-2 дня | HL-блок или таблица соответствий |
| Кастомный обработчик выбора склада | 2-3 дня | Рабочий код с резервированием |
| Настройка служб доставки | 1-2 дня | Экземпляры CDEK, Почты с верными from_location |
| Синхронизация с 1С | 3-5 дней | Автообмен остатками по складам |
| Тестирование и обучение | 1-2 дня | Документация, передача доступов |
Сравнение: коробочная логика vs кастомное решение
| Параметр | Коробочный функционал | Кастомное решение |
|---|---|---|
| Автовыбор по геолокации | Нет | Да, через событие OnBeforeShipmentSave |
| Привязка доставки к складу | Только ручное правило | Автоматическая, через обработчик |
| Поддержка резервирования | Да, но не сегментировано | Да, с учётом региональных остатков |
| Время внедрения | 0 (готово) | 3-5 дней |
Кастомное масштабирование в 5 раз эффективнее коробки для сетей с 3+ складами.
Типичные ошибки
Показ суммарных остатков приводит к продаже несуществующего товара. Выход — использовать остатки по складу покупателя. Неправильный маппинг города вызывает ошибку выбора склада — сверяйтесь с таблицей местоположений. Игнорирование резервирования создаёт отрицательные остатки — включайте его при оформлении заказа. Медленная загрузка страниц из-за отсутствия кэширования — решается тегированным кэшированием для складов.
Сроки ориентировочно
| Конфигурация | Срок |
|---|---|
| Настройка складов + маппинг регион→склад | 1–2 дня |
| Автовыбор склада + региональные службы доставки | 3–5 дней |
| Полная схема с резервированием и синхронизацией 1С | 5–10 дней |
Получите консультацию инженера — мы проанализируем ваш каталог и предложим оптимальную схему. Свяжитесь с нами для аудита. Гарантия на все работы — 1 год.







