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

Сайт должен показывать количество товара, которое магазин может продать с учётом уже принятых заказов. Для этого ему нужны данные о наличии, резервах и изменениях на складе. Разберём, как связать эти данные и проверить обмен на одном товаре.
Общий путь от проверки наличия до передачи посылки разобран в статье об обработке заказов в интернет-магазине. Здесь подробнее рассмотрим, как на этих этапах меняются остаток и резерв и что должен получать сайт.
Остаток и доступное количество
Предположим, на одном складе лежат 10 исправных белых кружек объёмом 300 мл. Три уже закреплены за принятыми заказами, но ещё не отгружены. Физический остаток — 10, резерв — 3, для новых заказов доступно 7.
В этом примере расчёт простой: доступно = остаток − резерв. Мы считаем только принятый исправный товар на одном складе, без будущих поступлений и дополнительного запаса, который магазин решил не выставлять на продажу.
В реальном учёте часть вещей может ждать проверки, находиться в браке или быть отложена для другого канала продаж. Такие количества нужно учитывать отдельно. Если складская программа уже передаёт число «Доступно», повторно вычитать из него резервы нельзя.

Остатки нескольких складов можно складывать для сайта, только если магазин действительно способен выполнить заказ из этих мест. Наличие пяти кружек в другом городе само по себе не означает, что их можно сегодня забрать в выбранном пункте. На сайте должны учитываться место исполнения заказа и срок перемещения.
Где меняются данные
Определите систему, в которой ведут складской учёт: принимают поставки, оформляют отгрузки, перемещения и исправления после пересчёта. Сайт получает из неё согласованные данные. Если сотрудники отдельно правят одно и то же количество и на сайте, и в складской программе, следующее обновление может затереть одну из правок.
Обмен должен узнавать конкретный товар по устойчивому коду. Для нашей кружки это, например, CUP-WH-300. Названия недостаточно: под ним могут скрываться другой цвет, объём или набор. Как устроены такие различия, разобрано в статье о вариантах товара.
Сопоставляют также склады и единицы измерения. Если склад передаёт две коробки по шесть кружек, а сайт понимает число 2 как две штуки, частое обновление эту ошибку не исправит. Правило пересчёта и состав упаковки должны быть определены до запуска.
Заказы с сайта, покупки в торговой точке и заказы, принятые оператором по телефону, должны участвовать в общем расчёте доступности, если они используют один запас. Запись разговора в CRM сама по себе товар не резервирует: нужно предусмотренное для этого действие в системе учёта заказов.
Когда меняется резерв
Заранее выберите момент резервирования: например, при принятии заказа или после подтверждения менеджером. Простое добавление товара в корзину не следует считать резервом без отдельного правила. Если товар удерживают на время оплаты, нужны срок удержания и порядок освобождения неоплаченного заказа.
Продолжим пример с кружками. Из десяти штук три уже зарезервированы. Новый заказ содержит ещё две. В таблице отмена и отгрузка — два возможных продолжения этого нового заказа:
| Событие | На складе | В резерве | Доступно |
|---|---|---|---|
| До нового заказа | 10 | 3 | 7 |
| Новый заказ на 2 штуки принят в резерв | 10 | 5 | 5 |
| Эти 2 штуки отгружены | 8 | 3 | 5 |
| Либо заказ отменён до отгрузки | 10 | 3 | 7 |
При отгрузке двух кружек уменьшается физический остаток и закрывается резерв именно этих двух штук. Доступное количество остаётся равным пяти. Если остаток уже стал 8, а резерв ошибочно остался равным 5, сайт покажет только 3 доступные кружки. Две штуки окажутся вычтены дважды.
Освобождённый резерв тоже должен дойти до всех каналов продаж. Если оплата пришла после окончания удержания, наличие проверяют заново: за это время товар могли зарезервировать другому покупателю. Такой заказ требует отдельной обработки.
Возврат денег и возвращение вещи на склад учитывают раздельно. Кружка снова становится доступной после фактического приёма и проверки состояния. Одного сообщения «Возврат оформлен» для увеличения доступного количества недостаточно.
Продажа последней единицы
Предположим, осталась одна свободная кружка. Сайт и оператор видят её в наличии. Если каждый примет заказ по своей копии остатков, магазин может пообещать одну вещь двум покупателям. Уменьшение интервала обновления сокращает время такого расхождения, но не исключает его.
Для общего запаса нужна единая проверка с резервированием: система проверяет доступность и закрепляет товар за заказом одной операцией. Первый подтверждённый резерв занимает кружку; следующий заказ уже не должен получить подтверждение наличия. Это работает, когда все каналы обращаются к одному расчёту и учитывают его ответ.
Если какой-то канал не умеет работать так, можно выделить ему отдельное количество. Например, часть товара продаётся только на сайте, часть — в торговой точке. Перераспределение между ними тоже нужно учитывать. Ещё один вариант — принимать заявку и подтверждать наличие до оплаты. Небольшой запас, скрытый от продажи, снижает риск расхождений, но не заменяет проверку.
Как передаются изменения
Изменения можно отправлять после каждого события или забирать через заданные интервалы. При обмене по расписанию между двумя обновлениями сайт пользуется прежними данными. Подходящий интервал зависит от скорости продаж и того, как подтверждаются заказы; одинаковое значение для всех магазинов назначать нельзя.
Передача может прерваться после того, как склад уже принял заказ, но сайт ещё не получил ответ. При повторной отправке система должна узнать тот же заказ и ту же операцию, чтобы не создать второй резерв. Позднее сообщение со старым количеством тоже не должно перезаписать более новое состояние.
Кроме передачи изменений нужна сверка: совпадают ли доступные количества и действующие резервы в системах. Она помогает заметить пропущенное обновление. Для сотрудника полезно показывать время последнего успешного обмена, ошибку и затронутые товары. Статус «Обмен включён» не говорит, когда данные действительно обновились.
Для сбоя заранее определяют поведение сайта. Если свежие данные получить не удалось, можно временно принимать заявки с уточнением наличия или остановить продажу затронутых позиций. Ошибка связи не означает, что товар закончился, и не подтверждает прежний остаток. Покупатель должен увидеть условие до оплаты.
Как найти расхождение

Если сайт показывает 3 доступные кружки, а расчёт после отгрузки даёт 5, возьмите одну позицию и проследите её изменения. Сравнивайте один код, один склад, одну единицу измерения и данные на один момент времени. Физический остаток 8 и доступное количество 5 сами по себе не противоречат друг другу.
- Проверьте фактическое количество в местах хранения и последние движения: приёмку, отгрузку, перемещение. Учтите операции, прошедшие во время проверки.
- Посмотрите, какими заказами заняты резервы. У отгруженного заказа на две кружки резерв должен быть закрыт в соответствии с выбранным порядком учёта.
- Сравните число, подготовленное складской системой, с тем, которое принял сайт. Проверьте время передачи и ошибки по этой позиции.
- Исправьте причину в учёте или обмене и повторно сверьте результат. Простая ручная правка числа на витрине может исчезнуть при следующем обновлении.
Если данные сайта и складской программы совпадают, а товар на полке не находится, повторная синхронизация его не обнаружит. Нужна проверка мест хранения и учётных операций. И наоборот: когда физическое количество и учёт верны, искать ошибку следует в передаче, пересчёте или отображении данных.
Что проверить перед запуском
Проверку проводят на выделенных позициях и заказах, чтобы не затронуть покупки клиентов. Для каждого действия фиксируют физический остаток, резерв, доступное количество и результат на сайте. Полезно пройти несколько ситуаций:
- Заказ на две штуки: резерв вырос на две, физическое количество ещё не изменилось.
- Отмена до отгрузки: две штуки снова доступны, лишнего поступления на склад нет.
- Отгрузка: остаток уменьшился, соответствующий резерв закрыт, повторного вычитания нет.
- Два канала одновременно запрашивают последнюю единицу: подтверждение получает только один заказ либо действует заранее выбранное ограничение.
- Ответ на передачу потерян: повтор не создаёт новый заказ и второй резерв.
- Связь восстановилась после сбоя: количества сверены, ошибки разобраны, покупателям снова показываются проверенные условия.
