Если в кабинете Ozon остаток не такой, как на сайте, сначала разведите сборку на сайте и ответ площадки. Модуль не подставляет одно число сразу во все склады. Каждый склад из профиля уходит отдельным запросом /v2/products/stocks.
1. «Проверить выгрузку» — это не отправка на Ozon
Кнопка считает поля локально. Массив вроде:
[STOCKS] => Array (
[1020005020237210] => 0
[1020005020236680] => 0
)
это DATA_MORE на сайте, не запрос в кабинет.
/v2/products/stocks вызывается только на реальном прогоне (cron, агент или «Запустить»). Если шаг оборвался раньше, нули из превью на Express и FBS не попадут.
В режиме «только остатки» в том же окне написано, что данные служебные и в прямом виде не выгружаются. Это не ошибка модуля.
Одно и то же поле каталога на оба склада в превью — нормальная настройка. Два нуля в превью не доказывают, что Ozon принял два нуля.
2. «Доступное количество» в каталоге — не то, что уходит на склад
Число в карточке товара Битрикса («доступное количество», учётный остаток, количество на складе каталога) не отправляется само. На Ozon уходит только то, что стоит в полях профиля stock_… (в превью — массив STOCKS по warehouse_id).
Типичный промах: в каталоге уже 0, а в превью профиля stock_… = 1 (другое свойство, торговые предложения, резерв, формула). Тогда в API уйдёт "stock": 1. Если карточка в архиве, Ozon отклонит плюс (PRODUCT_IS_ARCHIVED): один склад мог успеть обнулиться раньше, второй останется с 1.
Сверяйте три числа одного offer_id: поле в превью → "stock" в запросе → ответ updated. Не карточку каталога.
3. Куда смотреть: лог профиля, не кабинет и не превью
Нужен профиль остатков (формат Ozon API, режим только остатков и цен), не профиль карточек.
- Откройте профиль → вкладка «Лог и история».
- Запустите один прогон (cron, агент или «Запустить»).
- В логе найдите артикул /
offer_id. Отказ площадки пишется без отладки: строкаOzon не принял остатоксoffer_id, складом, отправленным числом и кодом (PRODUCT_IS_ARCHIVEDи т.п.). - Полный JSON запроса и ответа (
Stocks (V2),Result for /v2/products/stocks) — только если включён «Режим отладки для данного профиля» (не глобальная отладка). После включения нажмите «Применить». После разбора галку снимите.
Пока отладка снята, полного JSON в логе не будет. Строки отказа updated=false в обычном логе есть.
4. Что значит ответ Ozon
Отказ (updated=false и код) смотрят в обычном логе. Полный JSON — после прогона с отладкой. В «Проверить выгрузку» и в кабинете Ozon этой строки нет.
| Что в логе | Что это значит |
|---|---|
"updated": true | Ozon принял значение (в том числе ноль) |
"updated": false | площадка отклонила изменение; ниже будет код |
склада нет в Stocks (V2) | этот warehouse_id в прогоне не уходил |
PRODUCT_IS_ARCHIVED | карточка в архиве; плюсовой остаток Ozon не примет, пока карточку не вернуть |
NOT_FOUND | offer_id ещё нет в кабинете или товар не processed |
лимит цен / ResourceExhausted | в прогон попали цены и упёрлись в лимит; остатки могли не дойти |
5. Почему FBS уже 0, а Express ещё 1
- В API ушло не 0. В логе
"stock": 1(или строка «отправлено 1») — смотрите маппингstock_…, не карточку каталога. - Превью ≠ прогон. Ноль на Express появится, только если в том прогоне на этот
warehouse_idушло"stock": 0иupdated: true. - Склад не в профиле. После добавления Express нажмите «Применить», появятся поля
stock_…. - Архив / автоархив. Ноль иногда проходит, плюс — нет (
PRODUCT_IS_ARCHIVED). В профиле: галка возврата из автоархива и вкладка «Диагностика». - Пустой список задач при режиме «только остатки» — это норма. Задача Ozon создаётся при выгрузке карточки, не остатка.
6. Карточки, остатки и цены — разные профили
Остатки и цены лучше вести отдельным профилем. Старый cron на профиле карточек с ценами может съесть лимит daily_update и оборвать шаг до остатков. Поле offer_id во всех профилях одного кабинета должно совпадать. Остаток на склад — когда статус товара processed.
7. Чек-лист, прежде чем писать в ТП
- Превью: оба склада, те
warehouse_id, что в кабинете; сравнитеstock_…с «доступным количеством» в каталоге. - Один прогон профиля остатков.
- В обычном логе: нет строки
Ozon не принял остаток— или есть код. - Если нужен полный JSON: отладка профиля → «Применить» → ещё один прогон.
- Вкладка «Диагностика» → «Остатки FBS по складам» по этому
offer_id. - Версии модуля экспорта и
acrit.core.
В тикет: ID профиля остатков, offer_id, фрагмент лога с отказом или с Stocks (V2) — не только скрин кабинета.
Связанные материалы: Настройка профиля выгрузки на Ozon, диагностика экспорта.
Возврат к списку
