Расхождение остатков — главная причина отменённых заказов и недовольных покупателей. Задача синхронизации — чтобы витрина Битрикс показывала ровно то количество, что реально доступно в МойСклад, с учётом резервов и разных складов.
Модель остатков в обеих системах
МойСклад различает несколько показателей: остаток, резерв, ожидание и доступно (остаток минус резерв). На сайт почти всегда нужно отдавать именно «доступно», иначе зарезервированный под другой заказ товар снова попадёт в продажу.
В Битрикс остаток хранится в двух местах: поле CATALOG_QUANTITY в таблице каталога и построчно по складам в b_catalog_store_product при включённом складском учёте. Решите заранее, работаете вы с суммарным остатком или с раскладкой по складам.
| Показатель МойСклад | Что значит | Отдавать на сайт? |
|---|---|---|
| Остаток | Физически на складе | Обычно нет |
| Резерв | Забронировано под заказы | Нет |
| Доступно | Остаток − резерв | Да |
Направление и мастер-система
Для остатков мастером всегда должна быть учётная система — МойСклад. Сайт остатки только принимает и отображает, но никогда не редактирует напрямую. Единственное исключение — списание при оформлении заказа, но и его правильнее делать через создание документа в МойСклад, а не правкой количества на сайте.
Из этого правила следует и практический вывод: витрина Битрикс не должна уводить остаток в минус самостоятельно. Даже при оформлении заказа корректнее не уменьшать число в каталоге напрямую, а фиксировать резерв и ждать, пока учётная система подтвердит движение и вернёт актуальное «доступно».
Несколько складов и что показывать
Когда складов несколько, возможны три стратегии выгрузки на сайт.
- Суммарный остаток — складываем «доступно» по всем складам в одно число. Просто, подходит для магазина с общим пулом товара.
- Выбранные склады — на сайт едут остатки только с розничных складов, а транзитные и брак игнорируются.
- Раскладка по складам — Битрикс показывает наличие в конкретных точках (актуально для сети магазинов с самовывозом).
Для третьего варианта в Битрикс должны быть заведены склады (catalog_store), сопоставленные со складами МойСклад по ID.
Частота обновления и вебхуки
Есть два режима синхронизации, их часто комбинируют.
- По расписанию (pull). Cron или агент Битрикс раз в 5–15 минут запрашивает у МойСклад отчёт по остаткам
/report/stock/all/currentи обновляет каталог. - По вебхукам (push). МойСклад при изменении остатка шлёт уведомление на ваш обработчик, и обновляется только затронутый товар — почти в реальном времени.
Пример точечного обновления в Битрикс после получения нового остатка:
\Bitrix\Catalog\Model\Product::update($productId, ['QUANTITY' => $available]);
Единицы измерения и кратность
Отдельный источник расхождений — разные единицы измерения. Если в МойСклад товар учитывается в упаковках или коробках, а на сайте продаётся поштучно, остаток надо пересчитывать по коэффициенту кратности.
- Зафиксируйте базовую единицу учёта в МойСклад и единицу продажи в Битрикс.
- Задайте коэффициент пересчёта (например, 1 коробка = 12 штук) и применяйте его при выгрузке.
- Весовой и метражный товар округляйте по согласованному правилу, иначе появятся дробные остатки.
Решите заранее и вопрос дробных остатков: показывать ли 0.5 или округлять вниз до целого доступного количества.
Резервы и защита от оверселлинга
Оверселлинг — продажа товара, которого уже нет, — возникает в окне между заказом и следующей синхронизацией. Минимизировать его помогает несколько приёмов.
- Отдавать на сайт доступный остаток, а не физический.
- При оформлении заказа сразу создавать резерв в МойСклад, а не ждать очередной выгрузки.
- Использовать штатный резерв Битрикс (
CATALOG_RESERVATION) как временную блокировку до подтверждения. - На ходовых позициях сократить интервал синхронизации или перейти на вебхуки.
Полезно предусмотреть и поведение при нулевом остатке: скрывать товар, показывать «под заказ» или оставлять с пометкой о сроке поставки. Это бизнес-решение, но реализуется оно на уровне обмена — обычно через служебное свойство или изменение активности элемента ACTIVE.
Контроль и сверка
Даже отлаженный обмен нужно проверять. Заведите регулярную сверку и алерты.
| Проверка | Как | Периодичность |
|---|---|---|
| Полная сверка остатков | Сравнение отчёта МойСклад и CATALOG_QUANTITY | Раз в час/сутки |
| Проверка живости обмена | Время последней успешной синхронизации | Каждый запуск |
| Товары без сопоставления | Список артикулов, которых нет на сайте | Ежедневно |
Логируйте каждый запуск: сколько позиций обновлено, сколько ошибок, длительность. Это первый инструмент при разборе жалоб на «неправильные остатки». Полезно хранить и историю значений по ходовым позициям — так проще доказать, в какой момент и почему остаток изменился, и отличить ошибку обмена от реального движения на складе.
Итог
Синхронизация остатков надёжна, когда мастером выступает МойСклад, на сайт едет доступный (а не физический) остаток, а обмен сочетает вебхуки для скорости и часовую сверку для надёжности. Оверселлинг гасится ранним резервированием и коротким интервалом обновления на ходовых позициях.
Мы в B2Bsite настраиваем такой обмен с учётом ваших складов, резервов и нагрузки, добавляем сверку и мониторинг. Если остатки регулярно расходятся или магазин перерос типовой модуль — соберём устойчивую схему под ваш каталог.
Частые вопросы
Какой остаток отдавать на сайт — физический или доступный?
Доступный, то есть остаток за вычетом резервов. Так товар, уже забронированный под другой заказ, не попадёт в продажу повторно.
Как часто синхронизировать остатки?
По расписанию оптимально каждые 5–15 минут. Для ходовых позиций и минимизации оверселлинга лучше добавить вебхуки МойСклад для почти мгновенного обновления.
Можно ли показывать наличие по разным складам?
Да, если в Битрикс включён складской учёт и склады сопоставлены со складами МойСклад по ID. Тогда витрина покажет наличие в конкретных точках.
Почему возникает оверселлинг?
Из-за окна между заказом и следующей синхронизацией. Его сокращают ранним резервированием в МойСклад при оформлении и уменьшением интервала обмена.
Нужно ли писать остатки из Битрикс обратно в МойСклад?
Нет. Остатки должны иметь один источник истины — МойСклад. Сайт их только отображает, а списание идёт через документы в учётной системе.
Что делать при превышении лимита API?
Разбивать выгрузку на батчи, использовать сводный отчёт остатков вместо поштучных запросов и делать паузы между пакетами, чтобы уложиться в лимит 45 запросов за 3 секунды.
Как понять, что обмен остановился?
Отслеживать время последней успешной синхронизации и настроить алерт, если оно превышает норму. Полезна и суточная полная сверка остатков.
Поможем с настройкой и поддержкой Интеграции и связки систем
Поможем с настройкой, доработкой и поддержкой Интеграции и связки систем.