Зависший резерв — одна из самых неприятных складских ошибок: физически товар уже может быть отправлен или заказ отменён, но доступный остаток остаётся заниженным. Самая опасная реакция — вручную поставить поле резерва в ноль. Это убирает симптом, но может нарушить связь между заказом и физическим остатком.

Сначала определите статус заказа

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

Что считать сиротским резервом

Сиротский резерв — строка резервирования, для которой исходного заказа уже нет. Такое возможно после старых импортов, ручных удалений или исторических ошибок синхронизации. В этом случае резерв блокирует доступный остаток без бизнес-основания и должен быть снят.

Безопасный алгоритм

  1. Получить список только активных резервов.
  2. Сопоставить каждый резерв с текущим заказом.
  3. Не трогать заказы в статусах «Новый» и «В обработке».
  4. По отправленным и доставленным заказам выполнить штатное списание.
  5. По отменённым, возвращённым и сиротским строкам освободить резерв.
  6. После обработки пересчитать денормализованный счётчик резервов и синхронизировать остатки с площадками.

Такой подход сохраняет историю операций и не создаёт «виртуальный» свободный товар. В СеллерСейчас для этого предусмотрена статусная сверка: сначала dry-run, затем контролируемое исправление.