Налаштування консолідації замовлень з різних складів 1С-Bitrix
Клієнт замовив три товари: один є на складі А, інший на складі Б, третій потрібно везти з віддаленого складу В. Задача — або чекати складання всього замовлення та відправити однією посилкою, або відправити частинами. Bitrix не управляє цим автоматично — логіка консолідації будується поверх стандартної багатоскладської системи.
Багатоскладовість у Bitrix
Склади зберігаються в b_catalog_store, залишки — в b_catalog_store_product. Резервування при замовленні працює через b_sale_reserve_quantity. При оформленні замовлення Bitrix не вибирає склад автоматично — це робиться вручну або через кастомну логіку.
Для визначення, з якого складу везти кожен товар, використовуйте \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) - Оновлення статусів підзамовлень при змінах документів складу
- Відображення підзамовлень у особистому кабінеті клієнта та адміністративному інтерфейсі







