Синхронизация каталога через JSON API 1.2 МойСклад — это связка маппинга по externalCode, инкрементальной выгрузки по дате изменения и массового upsert. Правильно построенный обмен переносит товары, цены и остатки без дублей и лишней нагрузки.
Архитектура обмена
Прежде чем писать код, определитесь с направлением и «источником истины». Возможны три сценария:
| Сценарий | Источник истины |
|---|---|
| МойСклад → сайт | Учётная система (товары, остатки) |
| Сайт → МойСклад | Каталог сайта (контент, описания) |
| Двусторонний | Разделение по полям |
Для e-commerce типична гибридная схема: номенклатура, цены и остатки идут из МойСклад, а SEO-контент и медиа управляются на сайте. Чёткое разделение полей предотвращает «войну перезаписей».
Маппинг сущностей
Ключевой вопрос — как связать товар МойСклад с элементом каталога Битрикс. Использовать внутренние id обеих систем неудобно, поэтому применяют внешний код:
- Поле
externalCodeв МойСклад хранит идентификатор из вашей системы. - Поиск по нему:
GET /entity/product?filter=externalCode=ART-123. - Альтернатива — собственная маппинг-таблица «id Битрикс ↔ id МойСклад».
Инкрементальная выгрузка
Полная выгрузка каталога при каждом обмене избыточна и бьёт по лимитам. Забирайте только изменения по дате обновления:
GET /entity/product?filter=updated>=2026-07-16 10:00:00&limit=1000
- Храните метку времени последней успешной синхронизации.
- Запрашивайте сущности с
updatedбольше этой метки. - Пагинируйте выборку через
limitиoffset. - После успешной обработки обновляйте метку.
Так объём обмена пропорционален числу реальных изменений, а не размеру всего каталога. Держите небольшой перехлёст окна (например, вычитайте из метки минуту), чтобы не потерять сущности, изменённые ровно на границе интервала, а дубли отсекайте идемпотентной записью на приёмной стороне.
Массовый upsert
Запись изменений на сторону МойСклад делается массово. В одном POST /entity/product с массивом можно и создавать новые товары, и обновлять существующие:
- Элемент с
metaизвестной сущности — обновление. - Элемент без
meta, но с уникальнымexternalCode— создание. - Дробите на пачки по 200–500 объектов, чтобы уложиться в лимиты размера и не ловить таймауты.
Ответ разбирайте поэлементно и сохраняйте возвращённые id в маппинг, чтобы следующие обновления шли уже по прямой ссылке.
Остатки и цены
Остатки нельзя записать в товар напрямую — это расчётная величина. Их получают через отчёт остатков:
GET /report/stock/all?filter=...
- Остатки берутся отчётом, а не из карточки товара.
- Цены хранятся в товаре в массиве
salePricesи указываются в копейках. - Для больших каталогов остатки удобно тянуть асинхронным отчётом, а не постранично.
Событийная синхронизация
Периодический опрос можно дополнить или заменить вебхуками, чтобы изменения долетали почти мгновенно:
- Подписка на
UPDATEиCREATEпоproduct. - По событию делается точечный GET изменённого товара.
- Изменение применяется на стороне сайта.
Гибрид «вебхуки для оперативности + периодическая сверка для надёжности» — самый устойчивый вариант: события дают скорость, а регулярная инкрементальная выгрузка страхует от пропущенных уведомлений. Чтобы избежать «эха» (когда изменение, пришедшее из МойСклад, тут же уезжает обратно и порождает новый вебхук), помечайте изменения своим источником и сверяйте auditContext — правки, сделанные самой интеграцией, при обратной синхронизации нужно пропускать.
Итог
Надёжная синхронизация каталога стоит на четырёх опорах: чёткое разделение источника истины по полям, маппинг по externalCode или отдельной таблице, инкрементальная выгрузка по updated и массовый upsert пачками. Остатки берутся отчётом stock, а вебхуки добавляют оперативности поверх периодической сверки.
Мы в B2Bsite собираем такие обмены между 1С-Битрикс и МойСклад в отдельный модуль: маппинг, инкремент, очереди, логирование и откаты. Это превращает синхронизацию каталога в предсказуемый процесс, который выдерживает рост номенклатуры и не создаёт дублей.
Частые вопросы
Как связать товар Битрикс с товаром МойСклад?
Через поле externalCode, куда пишется идентификатор из вашей системы, либо через собственную маппинг-таблицу «id Битрикс ↔ id МойСклад». Таблица устойчивее к переименованиям.
Как выгружать только изменившиеся товары?
Фильтром по полю updated: запрашивайте сущности с updated больше метки последней успешной синхронизации и обновляйте метку после обработки.
Можно ли создавать и обновлять товары одним запросом?
Да, массовым POST с массивом: элементы с meta обновляются, без meta — создаются. Пачки лучше держать по 200–500 объектов.
Почему нельзя записать остаток в карточку товара?
Остаток в МойСклад — расчётная величина, формируемая движением документов. API отдаёт его только через отчёты stock, записать напрямую нельзя.
В каких единицах хранятся цены?
Цены хранятся в массиве salePrices в копейках: значение 150000 соответствует 1500,00 рубля.
Нужны ли вебхуки, если есть периодическая выгрузка?
Оптимален гибрид: вебхуки дают оперативность, а регулярная инкрементальная сверка страхует от пропущенных событий и восстанавливает консистентность.
Как не создавать дубли товаров?
Использовать уникальный externalCode и upsert: перед созданием проверять наличие сущности по коду или маппингу, а не слепо отправлять POST.
Поможем с настройкой и поддержкой Для разработчиков
Поможем с настройкой, доработкой и поддержкой Для разработчиков.