Перейти к содержимому

Резервирование товара - момент резерва, снятие, доступное количество

Разбираемся, когда товар уходит в резерв, сколько его на самом деле доступно к продаже и почему резерв иногда живёт своей жизнью.

Решение

Смотрим остаток и резерв товара:

$row = \Bitrix\Catalog\ProductTable::getList([
'select' => ['ID', 'QUANTITY', 'QUANTITY_RESERVED', 'QUANTITY_TRACE', 'CAN_BUY_ZERO'],
'filter' => ['=ID' => $productId],
])->fetch();
$available = $row['QUANTITY'] - $row['QUANTITY_RESERVED']; // вот это и продаётся

Остаток и резерв - два разных числа у одного товара. Доступным к продаже считается их разность, и именно её показывают покупателю, а не общий остаток со склада.

Выбираем момент резервирования:

- при оформлении заказа: товар держат сразу, но брошенные заказы держат его зря
- при оплате: витрина честнее, но между оформлением и оплатой товар могут купить
- срок резервирования задаётся настройкой модуля каталога, в днях

Момент резерва - это выбор между двумя неприятностями. Резерв при оформлении копит мёртвые заказы, резерв при оплате допускает продажу одного товара дважды, и магазин выбирает то, что дешевле именно ему.

Снимаем резерв у отменённых заказов:

$order = \Bitrix\Sale\Order::load($orderId);
$shipmentCollection = $order->getShipmentCollection();
foreach ($shipmentCollection as $shipment) {
$shipment->tryUnreserve(); // возвращаем товар в продажу
}
$order->save();

Отменённый заказ обязан вернуть товар в продажу. Иначе через месяц каталог показывает нули там, где на складе полно товара, а причина расходится по сотне старых заказов.

Сверяем резерв после обмена:

// выгрузка остатков из учётной системы пишет общее количество
// если она пишет ещё и резерв, локальные резервы сайта затираются
printf("%s: остаток %s, резерв %s\n", $row['ID'], $row['QUANTITY'], $row['QUANTITY_RESERVED']);
// расхождение стоит проверять регулярным отчётом, а не по жалобе

Обмен приносит остаток, а резерв живёт на сайте. Выгрузка, которая заодно переписывает поле резерва, стирает заказы, оформленные за последние часы, и это обнаруживается не сразу.

Резервирование включают вместе с решением о том, что делать при нехватке товара. Возможность купить при нулевом остатке и резерв - настройки соседние, а результат у них противоположный.

Резерв по складам поддерживается не во всех версиях платформы. Прежде чем обещать магазину «резерв на конкретном складе», это стоит проверить именно на его версии.

Ежедневный отчёт о расхождении остатка и резерва дешевле разбирательства с покупателем. Товар, который нельзя купить при полном складе, обычно замечают позже, чем хотелось бы.

Правила резервирования стоит проговорить с магазином словами, а не выводить из настроек задним числом. Вопрос «через сколько дней неоплаченный заказ отпускает товар» имеет ответ у бизнеса, а не у разработчика.

Типичные проблемы

Товар в наличии, но купить его нельзя.

Весь остаток занят резервом старых заказов. Резерв снимают при отмене и по истечении срока.

Один и тот же товар продан дважды.

Резерв ставится только при оплате, а между оформлением и оплатой прошло время. Момент резервирования выбирают осознанно.

После обмена резерв обнулился.

Выгрузка из учётной системы переписала поле резерва вместе с остатком. Резерв сайта в обмене не участвует.

Витрина показывает больше, чем можно купить.

В карточке выводится общий остаток без вычета резерва. Покупателю показывают доступное количество.

Резерв не ставится вовсе.

Резервирование выключено в настройках модуля каталога. Настройку проверяют до разбора кода.

Частые вопросы

Когда резервировать: при оформлении или при оплате?

При оформлении - для дорогих и редких товаров, при оплате - для ходовых. Универсального ответа нет.

Что показывать в карточке товара?

Доступное количество, то есть остаток за вычетом резерва. Общий остаток покупателю ни о чём не говорит.

Как чистить старые резервы?

Сроком резервирования в настройках и разбором отменённых заказов. Оба способа нужны вместе.

Работает ли резерв по складам?

Зависит от версии платформы и настроек учёта. Проверять нужно на своей версии, а не по описанию.

Смежное

Первоисточник