Выгрузка каталога на Ozon — это не разовый импорт файла, а программный конвейер: из инфоблока Битрикса товар превращается в JSON по схеме Seller API, проходит валидацию площадки и становится карточкой. Разберём, как построить этот конвейер на 1С-Битрикс правильно.
Что и через что выгружаем
Ozon принимает товары только через Seller API — REST-интерфейс с базовым адресом https://api-seller.ozon.ru. Никакого YML-фида, как у Яндекс Маркета, здесь нет: каждый товар отправляется методом POST /v3/product/import в виде объекта с атрибутами. Авторизация — по двум заголовкам:
Client-Id— идентификатор кабинета продавца;Api-Key— ключ, созданный в разделе «Настройки → Seller API».
Источник данных на стороне сайта — инфоблок каталога (модуль catalog), где товары и торговые предложения (SKU) хранятся как элементы, а характеристики — как свойства инфоблока. Задача интегратора: сопоставить свойства Битрикса с обязательными атрибутами категории Ozon и собрать корректный запрос.
offer_id.Ключевые поля: offer_id и категория
Главный идентификатор связки — offer_id, ваш собственный артикул. Именно по нему вы потом обновляете цены, остатки и контент, а Ozon возвращает свой внутренний product_id и sku. Артикул должен быть стабильным и уникальным — обычно это XML_ID элемента инфоблока или значение свойства «Артикул».
Категория задаётся связкой description_category_id + type_id из нового дерева категорий. Дерево и обязательные атрибуты забираются методами:
POST /v1/description-category/tree— дерево категорий и типов;POST /v1/description-category/attribute— список атрибутов категории;POST /v1/description-category/attribute/values— справочные значения (для атрибутов-словарей).
dictionary_value_id. Если передать текст «Красный» вместо id из справочника — товар уйдёт в ошибку валидации. Нужен маппинг значений свойств Битрикса на id справочника Ozon.Структура запроса v3/product/import
Один запрос /v3/product/import отправляет пачку товаров (массив items, до 100 за раз). Минимально жизнеспособный объект содержит артикул, категорию, имя, штрихкод, цену, НДС, габариты и атрибуты:
{
"items": [{
"offer_id": "SKU-10241",
"description_category_id": 17028922,
"type_id": 91565,
"name": "Кофемолка ручная 20 г",
"barcode": "4600000012345",
"price": "2490", "old_price": "2990",
"vat": "0.2", "currency_code": "RUB",
"weight": 350, "weight_unit": "g",
"depth": 120, "width": 80, "height": 200,
"dimension_unit": "mm",
"images": ["https://site.ru/upload/iblock/aa/mill.jpg"],
"attributes": [
{"complex_id":0,"id":85,"values":[{"dictionary_value_id":971082156}]}
]
}]
}Картинки Ozon скачивает по URL, поэтому они должны быть доступны публично. Удобно отдавать оригиналы из /upload/iblock/ или заранее подготовленные версии нужного размера.
Как реализовать на 1С-Битрикс
Запросы к API удобно строить на D7-классе \Bitrix\Main\Web\HttpClient, а тело собирать через \Bitrix\Main\Web\Json::encode(). Выборку товаров ведём через CIBlockElement::GetList() или ORM каталога. Логику стоит оформить отдельным модулем, а не класть в init.php.
- Выбираем изменённые элементы инфоблока (по
TIMESTAMP_Xили собственному флагу «изменён»). - Для каждого собираем объект по схеме категории, подставляя маппинг свойств.
- Отправляем пачками по 100 через
/v3/product/import. - Сохраняем возвращённый
task_idдля проверки статуса.
Регулярность выгрузки обеспечивает агент Битрикса (CAgent::AddAgent()) или задание в cron. Инкрементальный режим — только изменённые товары — экономит лимиты API и время.
Контроль статуса и ошибок
Метод /v3/product/import не создаёт карточку мгновенно — он ставит задачу. Реальный результат узнаём вторым запросом:
| Метод | Назначение |
|---|---|
/v1/product/import/info | статус задачи по task_id: обработан, ошибка, в очереди |
/v2/product/info/list | текущее состояние карточек, product_id, sku |
/v1/product/info/stocks | сводка остатков по товарам |
В ответе import/info по каждому товару приходит массив errors с кодом и описанием. Эти сообщения обязательно логировать (например, в свой инфоблок-журнал или лог-файл), иначе часть каталога «молча» не доедет до площадки. Типичные причины: не заполнен обязательный атрибут категории, недоступна картинка, дубль штрихкода.
Практические нюансы каталога
Несколько вещей, которые экономят недели на проекте:
- НДС. Поле
vatпринимает строку доли:0,0.1,0.2. Значение берём из ставки товара в каталоге Битрикса. - Габариты обязательны. Без веса и размеров карточка не пройдёт — заполняйте соответствующие свойства заранее.
- Штрихкод. Если товара нет в общем каталоге Ozon, штрихкод обязателен для создания новой карточки.
- Модерация. После загрузки карточка проходит модерацию; статус виден в
product/info. - Идемпотентность. Повторная отправка того же
offer_idобновляет карточку, а не создаёт дубль — это удобно для регулярной синхронизации.
Итог
Выгрузка на Ozon из Битрикса состоит из трёх слоёв: корректный маппинг инфоблока на дерево категорий и атрибуты, аккуратная сборка запроса /v3/product/import и обязательный контроль статуса через import/info. Стабильный offer_id и справочники значений в Highload-блоке делают процесс повторяемым и безопасным для регулярного обмена.
Мы в B2Bsite настраиваем такой конвейер под конкретный каталог: описываем маппинг, реализуем модуль обмена с логированием и агентом, разбираем ошибки модерации. Если планируете вывести ассортимент на Ozon без ручного заведения карточек — поможем сделать это на стороне 1С-Битрикс.
Частые вопросы
Можно ли выгрузить товары на Ozon фидом, как на Яндекс Маркет?
Нет. Ozon работает только через Seller API методом v3/product/import. Фид формата YML площадка не принимает, товары отправляются JSON-запросами.
Что использовать как offer_id?
Стабильный уникальный артикул: XML_ID элемента инфоблока или значение свойства «Артикул». Главное, чтобы он не менялся, так как по нему идёт последующее обновление цен, остатков и контента.
Почему товар загрузился, но не появился на витрине?
После import/import карточка проходит модерацию. Проверьте статус через product/info: возможно, товар в очереди, отклонён модерацией или содержит ошибки в обязательных атрибутах.
Как передать бренд или цвет?
Это атрибуты-словари. Нужно передавать dictionary_value_id из справочника категории, полученного методом description-category/attribute/values, а не текстовую строку.
Сколько товаров можно отправить за один запрос?
До 100 позиций в массиве items одного вызова v3/product/import. Большой каталог отправляется пачками с контролем лимитов API.
Нужны ли габариты и вес?
Да, они обязательны. Без корректных weight и размеров (depth, width, height) карточка не пройдёт валидацию, поэтому эти свойства заполняются в каталоге заранее.
Как автоматизировать регулярную выгрузку?
Через агент Битрикса CAgent или задание cron, которые в инкрементальном режиме отбирают только изменённые товары и отправляют их в API, экономя лимиты.
Поможем с настройкой и поддержкой Интеграции и связки систем
Поможем с настройкой, доработкой и поддержкой Интеграции и связки систем.