Группа методов catalog.* в REST API Битрикс24 управляет товарным каталогом CRM-магазина: товарами и торговыми предложениями (SKU), ценами и типами цен, разделами, складами и остатками. Это не каталог CMS 1С-Битрикс, а сущности инфоблока торгового каталога внутри портала Битрикс24.
Что входит в группу catalog
Каталог в Битрикс24 хранится в инфоблоке торгового каталога, привязанном к CRM. Группа catalog.* даёт объектно-ориентированный доступ к этим данным через REST: у большинства сущностей единообразный набор действий add, update, get, list, delete и getFields.
catalog.catalog.*— торговые каталоги (список инфоблоков-каталогов и ихiblockId);catalog.product.*— простые товары и товары с предложениями;catalog.product.offer.*— торговые предложения (SKU);catalog.section.*— разделы каталога;catalog.price.*иcatalog.priceType.*— цены и типы цен;catalog.store.*,catalog.storeProduct.*— склады и остатки;catalog.measure.*,catalog.ratio.*,catalog.vat.*— единицы измерения, коэффициенты фасовки и ставки НДС.
crm.product.*. Для новых интеграций используйте catalog.* — она поддерживает торговые предложения, множественные цены и склады.Доступ и обязательное условие
Обращения идут через входящий вебхук или OAuth-приложение. Для методов каталога у токена должно быть право catalog (в интерфейсе — «Торговый каталог»). Базовый URL вебхука выглядит так:
https://portal.bitrix24.ru/rest/1/xxxxxxxxxxxxxxxx/catalog.product.list
catalog.catalog.list и запомните нужный iblockId — он обязателен почти во всех вызовах.Пример получения каталогов:
POST /rest/1/xxxx/catalog.catalog.list { "select": ["id", "iblockId", "name", "iblockTypeId"] }
Создание и обновление товаров
Товар создаётся методом catalog.product.add. Обязательные поля — iblockId и name. Признак type определяет вид товара: 1 — простой, 3 — товар с торговыми предложениями, 2 — предложение, 4 — услуга, 5 — комплект.
catalog.product.add { "fields": { "iblockId": 14, "name": "Кофемашина Bosch", "type": 1, "vatId": 1, "vatIncluded": "Y", "measure": 5, "purchasingPrice": 18000 } }
В ответе придёт result.element.id — идентификатор товара. Обновление — catalog.product.update с id и изменёнными полями. Пользовательские свойства инфоблока передаются как property123 внутри fields; список доступных полей всегда сверяйте через catalog.product.getFieldsByFilter (нужны iblockId и productType).
Торговые предложения (SKU)
Если товар имеет вариации (цвет, размер), создайте родительский товар с type: 3, а варианты — методом catalog.product.offer.add с указанием parentId:
catalog.product.offer.add { "fields": { "iblockId": 15, "name": "Футболка, L, чёрная", "parentId": { "value": 240 }, "property45": 12 } }
iblockIdпредложений отличается от каталога товаров — берите его изcatalog.catalog.list(у SKU-инфоблока он свой);- связка со свойствами вариаций делается через свойства инфоблока предложений;
- для получения предложений товара используйте
catalog.product.offer.listс фильтром поparentId.
Цены, типы цен и НДС
Цена — отдельная сущность, привязанная к товару и типу цены. Сначала получите типы цен через catalog.priceType.list (розница, опт и т.д.), затем задайте значение методом catalog.price.add:
catalog.price.add { "fields": { "productId": 240, "catalogGroupId": 1, "price": 24990, "currency": "RUB" } }
| Сущность | Метод | Назначение |
|---|---|---|
| Тип цены | catalog.priceType.* | Розница, опт, дилер |
| Цена | catalog.price.* | Значение для товара и типа |
| Ставка НДС | catalog.vat.* | Ставки, привязка через vatId |
| Ед. измерения | catalog.measure.* | шт., кг, м |
catalog.price.list и обновите по id, иначе получите дубль или ошибку.Разделы, склады и остатки
Каталог структурируется разделами (catalog.section.add с iblockSectionId для вложенности). Складской учёт включается отдельно; при активном учёте остатки задаются связкой товар–склад:
- получите склады —
catalog.store.list; - установите остаток —
catalog.storeProduct.addили.updateсproductId,storeIdиamount; - для документов прихода и списания используйте группу
catalog.document.*.
Для массовой выгрузки удобны фильтры и постраничность: catalog.product.list принимает filter, order, select и параметр start. Ответ содержит total и next; выборка идёт страницами по 50 элементов.
Пакетная загрузка и производительность
При импорте тысяч позиций одиночные вызовы упираются в лимиты (около 2 запросов в секунду и метод оценки нагрузки). Решение — метод batch, объединяющий до 50 команд и умеющий подставлять результат одной команды в другую через $result[...]:
batch { "halt": 0, "cmd": { "p": "catalog.product.add?fields[iblockId]=14&fields[name]=Товар", "pr": "catalog.price.add?fields[productId]=$result[p][element][id]&fields[catalogGroupId]=1&fields[price]=100" } }
haltопределяет, прерывать ли пакет при первой ошибке;- в ответе
result_errorпокажет, какие команды упали; - следите за полем
time.operating— при приближении к лимиту метода делайте паузу, иначе портал вернётOPERATION_TIME_LIMIT.
Итог
Группа catalog.* закрывает полный цикл работы с товаром CRM-магазина: каталоги, товары и SKU, цены, разделы, склады и остатки. Ключевые правила — всегда передавать корректный iblockId, сверять поля через getFields и getFieldsByFilter, не плодить дубли цен и грузить объёмы через batch с оглядкой на лимиты.
Если каталог нужно синхронизировать с 1С, сайтом или маркетплейсами без ручного заполнения, мы проектируем и внедряем такие обмены под ключ: маппинг полей, очереди, обработку ошибок и предсказуемую нагрузку. Поможем связать каталог Битрикс24 с вашими системами.
Частые вопросы
Чем catalog.* отличается от crm.product.*?
crm.product.* — упрощённый доступ к товарам без поддержки торговых предложений, множественных цен и складов. catalog.* работает напрямую с инфоблоком торгового каталога и поддерживает SKU, типы цен и остатки. Для новых интеграций используйте catalog.*.
Где взять iblockId каталога?
Вызовите catalog.catalog.list — метод вернёт список торговых каталогов портала с их id и iblockId. У товаров и у торговых предложений разные инфоблоки, поэтому проверьте оба идентификатора.
Как создать товар с вариациями?
Создайте родительский товар методом catalog.product.add с type равным 3, затем добавьте варианты через catalog.product.offer.add, указав parentId. Свойства вариаций задаются свойствами инфоблока предложений.
Почему не сохраняется цена?
Цена — отдельная сущность catalog.price, привязанная к товару и типу цены. Нужно передать существующий catalogGroupId из catalog.priceType.list и валюту. Пара товар плюс тип уникальна: повторное добавление вызовет ошибку, обновляйте по id.
Какое право нужно токену для методов каталога?
Право catalog, в интерфейсе — Торговый каталог. Без него вызовы вернут ошибку доступа. Для вебхука отметьте это право при создании, для OAuth-приложения добавьте в scope.
Как быстро загрузить большой каталог?
Используйте метод batch — до 50 команд за один HTTP-запрос с подстановкой результатов через $result. Контролируйте time.operating и держитесь в пределах лимитов, иначе портал вернёт ошибку превышения нагрузки.
Как получить только изменённые товары?
catalog.product.list принимает filter по полям, включая даты изменения, а также order, select и постраничный параметр start. Ответ содержит total и next для перебора страниц по 50 элементов.
Поможем с настройкой и поддержкой Для разработчиков
Поможем с настройкой, доработкой и поддержкой Для разработчиков.