Розроблення модуля керування складами для 1С-Bitrix
У Bitrix вбудований облік складських залишків через модуль catalog: таблиці b_catalog_store (склади), b_catalog_store_product (залишки за складами та товарами). Для простих сайтів цього достатньо. Але коли з'являються кілька реальних складів з різною логікою резервування, пріоритетами відпускання, переміщенням між складами та інтеграцією з 1С — стандартний функціонал потребує суттєвого розширення.
Обмеження стандартного Bitrix
- Немає поняття «зарезервовано» у розрізі замовлення — залишок або є, або немає
- Немає логіки вибору складу для відпускання при оформленні замовлення
- Немає обліку переміщень між складами з історією
- Немає аналітики за оборотністю та дефіцитом
Розширення схеми даних
Модуль додає кілька таблиць поверх стандартних:
Таблиця b_catalog_store_reservation — резервування під замовлення:
| Поле | Тип | Призначення |
|---|---|---|
| ID | int auto_increment | — |
| STORE_ID | int | FK на b_catalog_store |
| PRODUCT_ID | int | ID торгового пропозиції |
| ORDER_ID | int | FK на b_sale_order |
| QUANTITY | decimal(18,4) | Кількість у резерві |
| RESERVED_AT | datetime | Коли зарезервовано |
| RELEASED_AT | datetime | Коли знято резерв (NULL якщо активний) |
Таблиця b_catalog_store_movement — переміщення між складами:
| Поле | Тип | Призначення |
|---|---|---|
| ID | int auto_increment | — |
| FROM_STORE_ID | int | Склад-джерело |
| TO_STORE_ID | int | Склад-приймач |
| PRODUCT_ID | int | Товар |
| QUANTITY | decimal(18,4) | Кількість |
| STATUS | enum | DRAFT, IN_TRANSIT, COMPLETED, CANCELLED |
| CREATED_BY | int | ID користувача |
| COMPLETED_AT | datetime | Коли завершено |
Резервування при оформленні замовлення
При створенні замовлення товари потребують резервування. Логіка підключається через обробник подіі OnSaleOrderSaved:
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'sale',
'OnSaleOrderSaved',
[ReservationService::class, 'onOrderSaved']
);
Метод onOrderSaved перевіряє, що статус замовлення передбачає резерв (наприклад, N — новий, P — оплачено). Для кожної позиції замовлення визначає склад-джерело та створює запис у b_catalog_store_reservation.
Вибір складу для відпускання
Стратегія вибору складу налаштовується в конфігурації модуля:
- FIFO за датою приходу — спочатку відпускається більш старий товар
- Найближчий склад — за геолокацією покупця (вимагає координат складів)
-
Пріоритет складу — поле
SORTуb_catalog_store, менше = вищий пріоритет - Мінімальний залишок — спочатку спустошувати склади з найменшим запасом
Якщо на одному складі немає потрібної кількості, система автоматично розбиває відпускання по кількох складах.
Розрахунок доступного залишку
Доступний залишок = фізичний залишок мінус активні резерви:
public static function getAvailable(int $storeId, int $productId): float
{
$physical = \Bitrix\Catalog\StoreProductTable::getList([
'filter' => ['=STORE_ID' => $storeId, '=PRODUCT_ID' => $productId],
'select' => ['AMOUNT'],
])->fetch()['AMOUNT'] ?? 0;
$reserved = \Bitrix\Main\Application::getConnection()->query(
"SELECT COALESCE(SUM(QUANTITY), 0) as RES
FROM b_catalog_store_reservation
WHERE STORE_ID = {$storeId}
AND PRODUCT_ID = {$productId}
AND RELEASED_AT IS NULL"
)->fetch()['RES'] ?? 0;
return max(0, (float)$physical - (float)$reserved);
}
На карточці товару та в корзині відображається саме доступний залишок, а не фізичний.
Адміністративний інтерфейс
В адміністративній частині (/bitrix/admin/) додаються розділи:
- Залишки за складами — матриця товар × склад з фізичним та доступним залишком, фільтрація за категорією та складом
- Переміщення — створення документа переміщення, підтвердження приходу на склад-приймач
- Резерви — список активних резервів з можливістю ручного зняття
Інтеграція з 1С
Якщо на проекті працює інтеграція з 1С через стандартний механізм (/bitrix/admin/1c_exchange.php), залишки з модуля синхронізуються через обробник подіі OnSuccessCatalogImport1C. Резерви при цьому не затираються — залишки з 1С інтерпретуються як фізичні, доступний залишок перераховується.
Терміни розроблення
| Обсяг | Склад | Тривалість |
|---|---|---|
| Базовий | Резервування при замовленні, доступний залишок, зняття резерву | 6–8 днів |
| Стандартний | + Переміщення між складами, стратегії відпускання, Admin-UI | 12–16 днів |
| Розширений | + Аналітика оборотності, інтеграція з 1С, мобільний інтерфейс для складу | 20–28 днів |







