Настройка резервирования товара в конкретном магазине 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
- Административный интерфейс управления резервами для сотрудников







