Настройка региональных складов и доставки 1С-Битрикс
Когда у интернет-магазина несколько складов в разных городах, простая схема «один склад — одна доставка» перестаёт работать. Покупатель из Екатеринбурга должен получить доставку с уральского склада, а не ждать отправки из Москвы. Битрикс предоставляет инструменты для такой архитектуры, но их правильная конфигурация требует понимания взаимосвязей между модулями sale, catalog и службами доставки.
Склады в Битрикс
Склады управляются через модуль торгового каталога: Торговый каталог → Склады. Каждый склад — запись в таблице b_catalog_store с полями: адрес, GPS-координаты, признак «активен», связь с местоположением.
Остатки по складам хранятся в b_catalog_store_product:
SELECT cs.title, csp.amount, csp.quantity_reserved
FROM b_catalog_store_product csp
JOIN b_catalog_store cs ON cs.id = csp.store_id
WHERE csp.product_id = 12345;
Резервирование при добавлении в корзину или оформлении заказа — настраивается в Торговый каталог → Настройки → Резервирование.
Логика выбора склада для заказа
Битрикс не выбирает склад автоматически на основе геолокации покупателя из коробки — это кастомная логика. Реализуется через обработчик события перед созданием отгрузки:
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 с фильтрацией по географическому признаку или по заранее созданному маппингу «регион → склад».
Региональные службы доставки
Для каждого склада/региона настраивают свой набор служб доставки. Технически — создают несколько экземпляров одной службы с разными параметрами:
- CDEK «Москва» —
from_location: 44(код Москвы в CDEK) - 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;
Сроки
| Конфигурация | Срок |
|---|---|
| Настройка складов + маппинг регион→склад | 1–2 дня |
| Автовыбор склада + региональные службы доставки | 3–5 дней |
| Полная схема с резервированием и синхронизацией 1С | 5–10 дней |







