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

Остаток товара не тот - разбор причин

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

С чего начать

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

$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']);
// расхождение означает ручную правку общего количества мимо документов

Сумма по складам и общее количество обязаны совпадать при включённом учёте. Расхождение прямо указывает на правку числа мимо складских документов и объясняет, почему оно потом «возвращается».

Причины

  1. Остаток правили напрямую при включённом учёте примерно 30% случаев

    ПризнакЧисло меняется и через некоторое время возвращается к прежнему значению.

    ПроверкаСмотрим, включён ли складской учёт, и сравниваем общее количество с суммой по складам.

    Что делатьМеняем остатки складскими документами: при включённом учёте общее количество пересчитывается из складов.

  2. Разница объясняется резервом примерно 25% случаев

    ПризнакНа витрине число больше, чем можно купить, а склад считает иначе.

    ПроверкаСравниваем количество и резерв у товара и по каждому складу.

    Что делатьСчитаем доступное количество как разность: витрина по умолчанию показывает складское число.

  3. Остаток задан не тому объекту примерно 20% случаев

    ПризнакУ товара с вариантами количество есть, а купить вариант нельзя.

    ПроверкаСмотрим список предложений товара и остатки по каждому из них.

    Что делатьПишем остаток предложению: у товара с вариантами продаётся именно оно.

  4. Обмен перезаписал количество примерно 15% случаев

    ПризнакПравки остатков живут до ближайшего обмена с учётной системой.

    ПроверкаСмотрим журнал обмена и время последней выгрузки остатков.

    Что делатьРешаем, кто хозяин числа: при обмене остатками правки на сайте бессмысленны.

  5. Витрина показывает старое число из кэша примерно 10% случаев

    ПризнакВ административной части одно количество, на странице товара другое.

    ПроверкаСбрасываем кэш страницы и сравниваем числа ещё раз.

    Что делатьНастраиваем сброс кэша по тегу при изменении товара, а не ждём истечения времени жизни.

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

Почему количество отличается от доступного?

Доступное количество меньше складского на величину резерва под оформленными заказами. Витрина по умолчанию показывает складское число, и разница объясняется именно резервом.

Можно ли править остаток руками при складском учёте?

Нет, общее количество в этом режиме пересчитывается из остатков по складам. Изменения вносят складскими документами, иначе они теряются.

Куда писать остаток у товара с вариантами?

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

Почему остатки возвращаются после обмена?

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

Как сделать, чтобы витрина обновлялась сразу?

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

Смежное

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