Интеграция 1С-Битрикс с МойСклад (WMS)
МойСклад — один из самых распространённых выборов для малого и среднего e-commerce в РФ: удобный интерфейс, API с хорошей документацией, нативное мобильное приложение для кладовщика. Интеграция с 1С-Битрикс выглядит простой на бумаге, но на практике ломается в трёх местах: синхронизация модификаций товаров, обработка частичных отгрузок и маппинг статусов заказов.
API МойСклад и точки интеграции
МойСклад предоставляет REST API на базе JSON-API (стандарт JSON:API). Базовый URL: https://api.moysklad.ru/api/remap/1.2/. Аутентификация — Bearer-токен или Basic Auth.
Основные сущности, с которыми работает интеграция:
-
entity/product— товары (без модификаций) -
entity/variant— модификации (торговые предложения в терминах Битрикс) -
entity/customerorder— заказы покупателей -
entity/demand— отгрузки -
entity/stock— остатки (только чтение через отчёт)
Получение остатков по всем складам: GET /report/stock/all?groupBy=variant — возвращает JSON с полями stock (свободный остаток), reserve (резерв), inTransit (в пути).
Самая сложная часть: синхронизация модификаций
В 1С-Битрикс товарные предложения (модификации) хранятся в b_catalog_sku и связаны с родительским товаром через IBLOCK_ID торговых предложений. В МойСклад это variant с ссылкой на product.
Проблема возникает при первичной загрузке: нужно правильно связать variant.id из МойСклад с ID торгового предложения в Битрикс. Без таблицы маппинга каждый запуск синхронизации будет пытаться создать дубли. Храним соответствие в отдельной таблице custom_moysklad_mapping (или в свойстве инфоблока MOYSKLAD_ID).
При обновлении остатков модификаций нужно сначала получить variant.id → найти в таблице маппинга соответствующий ID торгового предложения → обновить b_catalog_product для этого предложения.
// Обновление остатка торгового предложения
\Bitrix\Catalog\ProductTable::update($offerBitrixId, [
'QUANTITY' => $stockData['stock'],
'QUANTITY_RESERVED' => $stockData['reserve'],
]);
\Bitrix\Catalog\Catalog::clearProductCache($offerBitrixId);
Передача заказов в МойСклад
Новый заказ в Битрикс → создание customerorder в МойСклад. Минимальный набор полей:
-
organization— ссылка на организацию продавца (обязательна) -
agent— покупатель (counterparty в МойСклад), создаётся автоматически или маппится по email -
positions— позиции заказа с ссылками наvariantилиproductи количеством -
vatEnabled,vatIncluded— настройки НДС должны совпадать с настройками организации
Частичная отгрузка — сценарий, который ломает простые интеграции. Заказ на 5 позиций, отгрузили 3. В МойСклад создаётся demand с 3 позициями, связанный с customerorder. Статус заказа в Битрикс должен перейти в «Частично отгружен», а не в «Выполнен». Это обрабатывается через вебхук МойСклад на событие создания demand — сравниваем demand.positions с customerorder.positions и выбираем нужный статус Битрикс.
Вебхуки МойСклад
МойСклад поддерживает вебхуки для событий: CREATE, UPDATE, DELETE по любой сущности. Подписка:
POST /notification/webhook
{
"entityType": "customerorder",
"action": "UPDATE",
"url": "https://your-bitrix-site.ru/api/moysklad/webhook/"
}
На стороне Битрикс создаём контроллер (наследник \Bitrix\Main\Engine\Controller) или простой init.php-обработчик. Важно вернуть HTTP 200 в течение 3 секунд — МойСклад считает вебхук неудавшимся если ответ не пришёл вовремя, и ретраит его.
Типичные грабли
Лимиты API. МойСклад ограничивает запросы: 45 запросов в секунду на бесплатном тарифе, 100 на платных. При массовом обновлении остатков (1000+ позиций) добавляем usleep(100000) между пакетами.
Разница часовых поясов. МойСклад хранит даты в UTC+3. Битрикс работает в серверном часовом поясе. При сравнении дат синхронизации («что изменилось с последнего запуска») учитываем смещение.
Удалённые товары. Если товар удалён из МойСклад, он не появится в ответе /entity/product. Битрикс об удалении не узнает. Нужна периодическая полная сверка или проверка через archived: true.
Ориентиры по срокам
| Сценарий | Срок |
|---|---|
| Односторонняя синхронизация остатков | 1–2 недели |
| Двусторонний обмен заказами и остатками | 3–6 недель |
| Полная синхронизация с вебхуками и частичными отгрузками | 6–10 недель |
Стоимость рассчитывается индивидуально после анализа номенклатуры, схемы складов и бизнес-процессов обработки заказов.







