Налаштування резервування товару в конкретному магазині 1С-Бітрікс
Резервування дозволяє покупцю зафіксувати товар у вибраному магазині до моменту оплати або візиту. Залишок зменшується віртуально — інші покупці бачать знижену кількість, хоча фізично товар ще на полиці. Це окреме завдання від BOPIS: можна резервувати без подальшого онлайн-замовлення, просто «відкласти» для візиту.
Модель резервування в Бітрікс
Бітрікс має вбудований механізм резервування через таблицю b_catalog_store_product_reserve. Поля:
-
STORE_ID— ID складу зb_catalog_store -
PRODUCT_ID— ID товару -
AMOUNT— зарезервована кількість -
ORDER_ID— прив'язка до замовлення (якщо резерв від замовлення) -
DATE_RESERVE— дата створення резерву -
DATE_RESERVE_END— термін дії резерву
Доступна кількість = b_catalog_store_product.AMOUNT − SUM(b_catalog_store_product_reserve.AMOUNT) для даного складу і товару.
Створення резерву через API
CModule::IncludeModule('catalog');
$result = CCatalogStoreProductReserve::Add([
'STORE_ID' => $storeId,
'PRODUCT_ID' => $productId,
'AMOUNT' => $quantity,
'DATE_RESERVE' => new CDBDateTime(),
'DATE_RESERVE_END' => new CDBDateTime(time() + 86400 * 3), // 3 дні
]);
При знятті резерву (закінчився термін, покупець скасував) викликається CCatalogStoreProductReserve::Delete($reserveId).
Форма резервування на сайті
На картці товару розміщується кнопка «Зарезервувати в магазині». Форма містить:
- Вибір магазину зі списку з актуальними залишками
- Кількість (з перевіркою доступного залишку)
- Контактні дані (ім'я, телефон) для сповіщення
- Термін резервування (зазвичай 24–48 годин)
Запит доступного залишку для конкретного складу:
$available = CCatalogStoreProduct::GetList(
[],
['STORE_ID' => $storeId, 'PRODUCT_ID' => $productId],
false, false,
['AMOUNT']
)->Fetch()['AMOUNT'];
$reserved = array_sum(array_column(
CCatalogStoreProductReserve::GetList(
[], ['STORE_ID' => $storeId, 'PRODUCT_ID' => $productId]
)->fetchAll(), 'AMOUNT'
));
$canReserve = $available - $reserved;
Сповіщення за життєвим циклом резерву
| Подія | Кому | Канал |
|---|---|---|
| Резерв створено | Покупець | SMS + email |
| Резерв створено | Менеджер магазину | |
| Резерв закінчується через 2 години | Покупець | SMS |
| Резерв знято (закінчився) | Менеджер | системне сповіщення |
Нагадування реалізуються через агент, який раз на 30 хвилин перевіряє DATE_RESERVE_END і надсилає сповіщення через CEvent::Send() або SMS-шлюз.
Автоматичне зняття резерву
Агент для звільнення прострочених резервів:
$expiredReserves = CCatalogStoreProductReserve::GetList(
[],
['<DATE_RESERVE_END' => date('Y-m-d H:i:s')]
);
while ($reserve = $expiredReserves->Fetch()) {
CCatalogStoreProductReserve::Delete($reserve['ID']);
// Сповістити менеджера
}
Адміністративний інтерфейс
Менеджер магазину має бачити список активних резервів свого складу: товар, кількість, контакт покупця, термін. Інтерфейс будується на основі AdminListTable або як окрема сторінка в розділі «Склади».
Що входить у налаштування
- Форма резервування з вибором магазину та перевіркою залишків
- Створення резерву через
CCatalogStoreProductReserve::Add() - Агент для автоматичного зняття прострочених резервів
- Сповіщення покупцю та менеджеру через SMS і email
- Адміністративний інтерфейс управління резервами для співробітників







