Интернет-магазин с несколькими складами в разных городах сталкивается с проблемой: покупатель из Екатеринбурга получает товар из Москвы, хотя ближайший склад есть в Уфе. Клиент платит больше за доставку и ждёт дольше. Мы настраиваем логику автоматического выбора склада и доставки под регион клиента. Оценим ваш проект за 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 год.







