When an online store outgrows a single warehouse — opens distribution centers or connects retail outlets — the challenge arises: to show the customer real stock and automatically select the shipping warehouse?
Standard inventory management in 1C-Bitrix with one warehouse does not cover these scenarios: you risk selling a product that is not in the required warehouse, or sending an order 500 km away when there is a warehouse nearby. A typical situation: an electronics store with 5 warehouses in different cities. Managers manually check stock and inform the customer which warehouse ships. Result — 30% of orders are canceled due to mismatch between promised and actual delivery time. Automating multi-warehouse solves this: the customer sees accurate stock for their region, and the system automatically selects the nearest warehouse.
We are a team with 10+ years of experience in multi-warehouse accounting, having set up multi-warehouse for 200+ stores — from catalogs of 50,000 products to chains with 15 warehouses. Our certified specialists guarantee reliable integration. The catalog module includes multi-warehouse starting from the 'Small Business' edition. Below we will cover setup, typical challenges, and custom modifications with real numbers and code examples. If you face similar issues, get a consultation — we will analyze your configuration and offer a solution.
Enabling Multi-Warehouse
Path: Store → Catalog → Settings → 'Warehouse' tab.
- Use warehouses — enable
- Create at least two warehouses (
Store → Catalog → Warehouses)
After enabling, stock is stored in the b_catalog_store_product table with breakdown by STORE_ID. The table contains fields: PRODUCT_ID, STORE_ID, AMOUNT (stock), QUANTITY_RESERVED. For large catalogs (50,000+ products), it is important to create indexes on STORE_ID and PRODUCT_ID — default indexes are not always optimized.
Configuring Shipping Warehouses in Orders
In the delivery service settings (Store → Settings → Delivery services → [edit]), specify the warehouse from which the shipment is made. This allows different delivery services to work with different warehouses. For more flexible management — warehouse selection rules are configured via the OnSaleOrderBeforeSaved event handler:
AddEventHandler('sale', 'OnSaleOrderBeforeSaved', function(\Bitrix\Main\Event $event) { $order = $event->getParameter('ENTITY'); // logic for selecting shipping warehouse based on order composition, region, etc. }); In one project, we implemented warehouse selection by the region closest to the customer: the handler parsed the delivery index and substituted the required warehouse. This reduced delivery times by 30%.
How to Display Warehouse Stock on the Storefront?
In the catalog.element component (bitrix:catalog.element), parameter USE_STORE_QUANTITY — enable to display warehouse stock. The component template receives the $arResult['STORE_QUANTITY'] variable — an array of stock per warehouse. For custom output, use:
$storeData = \Bitrix\Catalog\StoreProductTable::getList([ 'filter' => ['=PRODUCT_ID' => $productId], 'select' => ['STORE_ID', 'AMOUNT', 'STORE_TITLE' => 'STORE.TITLE'], 'runtime' => [ new \Bitrix\Main\ORM\Fields\Relations\Reference( 'STORE', \Bitrix\Catalog\StoreTable::class, \Bitrix\Main\ORM\Query\Join::on('this.STORE_ID', 'ref.ID') ) ] ]); If you have 10+ warehouses, consider adding tagged caching for this query — otherwise each product view will hit the database. More about caching can be read in the 1C-Bitrix documentation.
Limitations of Standard Reservation
Reserves in b_sale_order_reserve contain the STORE_ID field — the reserve is tied to a specific warehouse. During automatic reservation, Bitrix selects a warehouse by priority (the SORT field in b_catalog_store). If the first warehouse does not have sufficient quantity, reservation by default does not split the order across multiple warehouses — this requires custom logic. Here is a comparison of approaches:
| Criteria | Standard mechanism | Custom reservation |
|---|---|---|
| Warehouse selection | By single priority | By set of rules (region, stock) |
| Split across multiple warehouses | No | Yes, via agent or event |
| Implementation complexity | Zero | Medium (2-4 hours of work) |
| Flexibility | Low | High |
We most often use the custom approach — it gives up to 40% savings on logistics by reserving from the nearest warehouse. Custom reservation is approximately 2 times more efficient than standard in order processing speed.
Example of custom reservation:
AddEventHandler('sale', 'OnSaleReserveQuantity', function($orderId, $basketId, $reserveInfo) { // Your distribution logic across warehouses }); In one project, we processed 500 orders per day through this handler — the system worked without failures for a year.
Stock Synchronization with 1C
During exchange with 1C via CommerceML 2, stock is transmitted in the <Stores> section of the exchange file. A critical requirement: the XML_ID of warehouses in Bitrix must match the warehouse identifiers in 1C. Mapping is configured in /bitrix/admin/1c_exchange.php. If identifiers differ, the exchange will produce errors. More about the format can be read in the CommerceML documentation.
A typical mistake: in 1C warehouses are named in Russian, while in Bitrix they are in Latin, causing stock to "go to zero." We always verify mapping on a test exchange.
Edition Comparison for Multi-Warehouse
| Edition | Multi-warehouse | Reservation by warehouse | 1C integration |
|---|---|---|---|
| Start | No | No | No |
| Small Business | Yes (basic) | Yes (single warehouse) | Yes |
| Business | Yes (extended) | Yes (with custom) | Yes |
| Enterprise | Yes (full) | Yes (custom) | Yes |
What is Included in the Multi-Warehouse Setup Work?
- Audit of the current configuration and identification of bottlenecks
- Enabling and configuring multi-warehouse in the admin panel
- Creating warehouses and linking them to delivery services
- Writing a warehouse selection handler for your business process
- Modifying component templates to display warehouse stock
- Custom reservation logic (if splitting is required)
- Integration with 1C: setting up mapping and test exchange
- Testing all scenarios: orders, returns, stock recalculations
- Providing documentation, access credentials, and training for your team
- Post-setup support for 30 days
Timeframes and Costs
Basic setup with two or three warehouses, shipping rules, and storefront display — 4–8 hours, from $500. If custom warehouse selection logic and 1C integration are needed — 1–2 working days, from $1,200. Complex cases (reservation splitting, dynamic region-based selection) may require 3–4 days, from $2,500. The exact cost is calculated individually after reviewing your configuration. Request a consultation on multi-warehouse setup — we will analyze your store and offer an optimal solution. Contact us for a project evaluation.







