Настройка консолидации заказов с разных складов 1С-Битрикс
Клиент заказал три товара: один есть на складе А, другой на складе Б, третий нужно везти с удалённого склада В. Задача — либо ждать сборки всего заказа и отправить одной посылкой, либо отправить частями. Битрикс не управляет этим автоматически — логика консолидации строится поверх стандартной многоскладской системы.
Многоскладовость в Битрикс
Склады хранятся в b_catalog_store, остатки — в b_catalog_store_product. Резервирование при заказе работает через b_sale_reserve_quantity. При оформлении заказа Битрикс не выбирает склад автоматически — это делается вручную или через кастомную логику.
Для определения, с какого склада везти каждый товар, используйте \Bitrix\Catalog\StoreProductTable::getList() с фильтром по PRODUCT_ID и условием AMOUNT > 0.
Стратегии консолидации
Стратегия 1: Максимальная скорость — каждый товар отправляется с ближайшего склада сразу при наличии. Клиент получает несколько посылок. Реализация: при создании заказа агент немедленно разбивает его на подзаказы по складам.
Стратегия 2: Минимальное количество посылок — ждём сборки всего заказа на одном «главном» складе, куда перемещаются нужные позиции. Реализация: межскладское перемещение через b_catalog_store_document с типом M.
Стратегия 3: Гибридная — товары в наличии отправляем сразу, под заказ ждём.
Разбивка заказа на подзаказы
Создайте таблицу bl_order_shipments с полями order_id, store_id, status, items_json. При подтверждении заказа агент анализирует корзину:
foreach ($basket as $item) {
$stores = StoreProductTable::getList([
'filter' => ['PRODUCT_ID' => $item->getProductId(), '>AMOUNT' => 0],
'order' => ['AMOUNT' => 'DESC'],
])->fetchAll();
$bestStore = $stores[0]['STORE_ID'] ?? $defaultStoreId;
$shipments[$bestStore][] = [
'product_id' => $item->getProductId(),
'quantity' => $item->getQuantity(),
];
}
Каждая группа записывается в bl_order_shipments. Статусы подзаказов отслеживаются независимо.
Отображение клиенту
В личном кабинете и письме о заказе показывайте разбивку: «Посылка 1 (склад Москва): 2 товара — отправлена», «Посылка 2 (склад СПб): 1 товар — в пути». Компонент личного кабинета получает данные из bl_order_shipments и объединяет их с основным заказом по order_id.
Что настраиваем
- Таблицу
bl_order_shipmentsдля хранения информации о подзаказах по складам - Агент анализа наличия и распределения товаров по складам
- Стратегию консолидации (настраивается в
b_option) - Обновление статусов подзаказов при изменении документов склада
- Отображение подзаказов в личном кабинете клиента и в административном интерфейсе







