Налаштування регіональних складів і доставки 1С-Бітрікс
Коли інтернет-магазин має кілька складів у різних містах, проста схема «один склад — одна доставка» перестає працювати. Покупець з Харкова повинен отримати доставку з найближчого складу, а не чекати відправлення з Києва. 1С-Бітрікс надає інструменти для такої архітектури, але їх правильне налаштування потребує розуміння взаємозв'язків між модулями sale, catalog та службами доставки.
Склади в 1С-Бітрікс
Склади управляються через модуль торгового каталогу: Торговий каталог → Склади. Кожен склад — запис у таблиці 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;
Резервування при додаванні до кошика або оформленні замовлення налаштовується в Торговий каталог → Налаштування → Резервування.
Логіка вибору складу для замовлення
1С-Бітрікс не вибирає склад автоматично на основі геолокації покупця з коробки — це кастомна логіка. Реалізується через обробник події перед створенням відвантаження:
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(код міста в CDEK)
Умова показу служби доставки задається через правила: Магазин → Налаштування → Правила доставки. Прив'язка до складу:
// Кастомний обробник доставки з прив'язкою до складу
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 днів |







