Остаток товара не тот - разбор причин
Количество на витрине не сходится со складом или с учётной системой. Разбираем причины по убыванию частоты, начиная с самих чисел в базе.
С чего начать
Смотрим количество и резерв у товара:
$row = \Bitrix\Catalog\ProductTable::getRow([ 'select' => ['ID', 'QUANTITY', 'QUANTITY_RESERVED', 'QUANTITY_TRACE', 'CAN_BUY_ZERO'], 'filter' => ['=ID' => $productId],]);print_r($row);// доступное количество меньше складского ровно на величину резерваОбщее количество и резерв - разные числа, и витрина показывает первое. Разница между ними объясняет большинство жалоб на «неверный остаток» без всякого разбора складских документов.
Смотрим остатки по складам:
$rows = \Bitrix\Catalog\StoreProductTable::getList([ 'select' => ['STORE_ID', 'AMOUNT', 'QUANTITY_RESERVED', 'TITLE' => 'STORE.TITLE'], 'filter' => ['=PRODUCT_ID' => $productId],])->fetchAll();// сумма остатков складов и общее количество расходятся при выключенном учётеprint_r($rows);// при включённом учёте общее количество складывается из этих строкПри включённом складском учёте общее количество считается из остатков по складам. Ручная правка общего количества в этом режиме теряется при первом же пересчёте.
Проверяем, у кого лежит остаток:
$offers = \CCatalogSKU::getOffersList($productId);print_r(array_keys($offers[$productId] ?? []));// у товара с вариантами остаток хранится у предложений, а не у карточкиОстатки товара с вариантами живут у торговых предложений. Число на родительской карточке в этом случае ничего не значит и сбивает с толку при разборе.
Сверяем числа с суммой по складам:
$sum = 0;foreach ($rows as $row) { $sum += (float)$row['AMOUNT']; }printf("склады=%.2f общее=%.2f\n", $sum, (float)$product['QUANTITY']);// расхождение означает ручную правку общего количества мимо документовСумма по складам и общее количество обязаны совпадать при включённом учёте. Расхождение прямо указывает на правку числа мимо складских документов и объясняет, почему оно потом «возвращается».
Причины
-
Остаток правили напрямую при включённом учёте примерно 30% случаев
ПризнакЧисло меняется и через некоторое время возвращается к прежнему значению.
ПроверкаСмотрим, включён ли складской учёт, и сравниваем общее количество с суммой по складам.
Что делатьМеняем остатки складскими документами: при включённом учёте общее количество пересчитывается из складов.
-
Разница объясняется резервом примерно 25% случаев
ПризнакНа витрине число больше, чем можно купить, а склад считает иначе.
ПроверкаСравниваем количество и резерв у товара и по каждому складу.
Что делатьСчитаем доступное количество как разность: витрина по умолчанию показывает складское число.
-
Остаток задан не тому объекту примерно 20% случаев
ПризнакУ товара с вариантами количество есть, а купить вариант нельзя.
ПроверкаСмотрим список предложений товара и остатки по каждому из них.
Что делатьПишем остаток предложению: у товара с вариантами продаётся именно оно.
-
Обмен перезаписал количество примерно 15% случаев
ПризнакПравки остатков живут до ближайшего обмена с учётной системой.
ПроверкаСмотрим журнал обмена и время последней выгрузки остатков.
Что делатьРешаем, кто хозяин числа: при обмене остатками правки на сайте бессмысленны.
-
Витрина показывает старое число из кэша примерно 10% случаев
ПризнакВ административной части одно количество, на странице товара другое.
ПроверкаСбрасываем кэш страницы и сравниваем числа ещё раз.
Что делатьНастраиваем сброс кэша по тегу при изменении товара, а не ждём истечения времени жизни.
Частые вопросы
Почему количество отличается от доступного?
Доступное количество меньше складского на величину резерва под оформленными заказами. Витрина по умолчанию показывает складское число, и разница объясняется именно резервом.
Можно ли править остаток руками при складском учёте?
Нет, общее количество в этом режиме пересчитывается из остатков по складам. Изменения вносят складскими документами, иначе они теряются.
Куда писать остаток у товара с вариантами?
Каждому торговому предложению отдельно. Количество на родительской карточке при продаже не используется и только путает.
Почему остатки возвращаются после обмена?
Обмен перезаписывает количество данными учётной системы. При таком обмене хозяин числа - учётная система, и правки на сайте живут до следующей выгрузки.
Как сделать, чтобы витрина обновлялась сразу?
Сбросом кэша по тегу при изменении товара. Ожидание истечения времени жизни кэша даёт заметную задержку и жалобы покупателей.
Смежное
- Склады и остатки - оглавление подтемы
- Складские документы: приход, списание, перемещение, резерв - как менять остатки правильно
- Резервирование товара: момент резерва, снятие, доступное количество - откуда берётся резерв
- Остатки из 1С: сопоставление складов и приём количества - когда числами управляет учётная система
- Торговые предложения не выводятся: разбор причин - остатки у предложений
- Кэш не срабатывает: страница собирается заново каждый раз - когда виноват кэш витрины
- Каталог: комплекты, скидки, склады, доступность - устройство складского учёта
- Остатки по складам не обновляются: разбор причин - когда расходится именно разрез по складам