Интеграция 1С-Битрикс с МойСклад
Интернет-магазин на 1С-Битрикс и МойСклад (облачная система управления торговлей) — распространённая связка у малого и среднего бизнеса. Но штатного модуля интеграции в Битрикс нет, а готовые решения с маркетплейса покрывают 60-70% сценариев. Остаток — нестандартный маппинг свойств, синхронизация остатков по складам, обработка характеристик — требует кастомной разработки. Разберём архитектуру интеграции, API МойСклад и типичные проблемы.
Что синхронизируем
Интеграция Битрикс ↔ МойСклад обычно включает четыре потока данных:
| Поток | Направление | Частота | Приоритет |
|---|---|---|---|
| Товары и цены | МойСклад → Битрикс | Каждые 15-60 мин | Высокий |
| Остатки по складам | МойСклад → Битрикс | Каждые 5-15 мин | Критичный |
| Заказы | Битрикс → МойСклад | По событию (при оформлении) | Критичный |
| Статусы заказов | МойСклад → Битрикс | Каждые 5-15 мин | Средний |
Направление «МойСклад как master» для товаров — типичное. Контент-менеджер работает в МойСклад, сайт получает актуальные данные. Обратная синхронизация товаров (Битрикс → МойСклад) нужна редко и создаёт риск конфликтов.
API МойСклад: Remap API 1.2
МойСклад предоставляет REST API (JSON API 1.2) по адресу https://api.moysklad.ru/api/remap/1.2/. Авторизация — Basic Auth или Bearer Token.
Ключевые эндпоинты:
-
GET /entity/product— список товаров. Поддерживает фильтрацию (filter=updated>2024-03-01), пагинацию (limit,offset), раскрытие вложенных сущностей (expand=group,productFolder). -
GET /entity/assortment— объединённый список товаров, модификаций, комплектов и услуг. Удобнееproduct, если нужно всё сразу. -
GET /report/stock/all— остатки по всем товарам. Можно фильтровать по складу (stockstore). -
POST /entity/customerorder— создание заказа покупателя. -
GET /entity/customerorder/{id}— получение заказа со статусами.
Ограничения API:
- Rate limit: 45 запросов за 3 секунды на аккаунт. При превышении — HTTP 429. Парсер должен учитывать задержки.
- Максимум 1000 объектов в одном ответе. Для выгрузки полного каталога нужна пагинация.
- Webhook-уведомления (МойСклад → ваш сервер) — доступны, но ненадёжны: нет гарантии доставки, нет повторных попыток. Для критичных данных (остатки) используйте polling.
Синхронизация товаров
Алгоритм инкрементальной синхронизации:
- Запрашиваем
GET /entity/assortment?filter=updated>${lastSyncTime}&limit=1000. - Для каждого товара ищем соответствие в инфоблоке Битрикс по внешнему коду (
XML_ID= UUID товара в МойСклад). - Если нашли —
CIBlockElement::Update()с обновлёнными полями. - Если не нашли —
CIBlockElement::Add(). - Сохраняем
lastSyncTime = now()вb_option.
Маппинг полей — ядро интеграции. Таблица соответствий:
| МойСклад | Битрикс (инфоблок) | Примечания |
|---|---|---|
name |
NAME |
— |
description |
DETAIL_TEXT |
HTML или plain text |
article |
PROPERTY_ARTICLE |
Код свойства зависит от инфоблока |
salePrices[0].value |
CATALOG_PRICE_1 |
Цена в копейках → делим на 100 |
buyPrice.value |
CATALOG_PRICE_2 (закупочная) |
Если используется |
images[].filename |
DETAIL_PICTURE / MORE_PHOTO |
Скачиваем по URL из miniature.href |
productFolder.name |
Секция инфоблока | Создаём секцию, если не существует |
Характеристики (модификации) в МойСклад — это variant внутри товара. В Битрикс им соответствуют торговые предложения (SKU) в отдельном инфоблоке. Каждый variant → элемент SKU-инфоблока с привязкой к родительскому товару через CHL_LINK (property CML2_LINK).
Синхронизация остатков
Остатки — самый чувствительный поток. Продажа товара с нулевым остатком — прямые убытки.
Вызываем GET /report/stock/all с фильтром по складам, которые участвуют в интернет-продажах. Результат содержит assortmentId и quantity. Обновляем поле CATALOG_QUANTITY в b_catalog_product или через \Bitrix\Catalog\ProductTable::update().
Для отображения остатков по складам на сайте (например, «в наличии в магазине на Ленина») используйте механизм складского учёта Битрикс: модуль catalog, таблица b_catalog_store_product. Каждый склад МойСклад маппится на склад Битрикс (b_catalog_store).
Частота: раз в 5 минут через cron-скрипт. Агенты Битрикс для этой задачи не подходят — они привязаны к хитам и не гарантируют интервал.
Передача заказов
При оформлении заказа в Битрикс (событие OnSaleOrderSaved или OnSaleComponentOrderComplete) создаём заказ в МойСклад через POST /entity/customerorder.
Структура тела запроса:
{
"organization": {"meta": {"href": "...entity/organization/{id}"}},
"agent": {"meta": {"href": "...entity/counterparty/{id}"}},
"positions": [
{
"assortment": {"meta": {"href": "...entity/product/{id}"}},
"quantity": 2,
"price": 150000
}
]
}
Контрагент (agent) — покупатель. При первом заказе создаём через POST /entity/counterparty, при повторном — ищем по email/телефону. UUID контрагента сохраняем в пользовательском свойстве заказа Битрикс или в UF_-поле пользователя.
Обработка ошибок и очередь
Сеть ненадёжна, API МойСклад иногда отвечает 500. Для заказов используйте очередь: при ошибке отправки сохраняем заказ в таблицу parser_queue (или b_sale_order с флагом «не отправлен в МойСклад»), агент повторяет отправку каждые 5 минут. Максимум 5 попыток, после чего — уведомление менеджеру.
Для товаров и остатков очередь не нужна — следующий цикл синхронизации подхватит изменения.
Сроки
| Этап | Время |
|---|---|
| Анализ структуры каталога + маппинг полей | 1-2 дня |
| Синхронизация товаров + категорий | 3-4 дня |
| Синхронизация остатков по складам | 1-2 дня |
| Передача заказов + контрагенты | 2-3 дня |
| Обратная синхронизация статусов | 1 день |
| Тестирование, отладка, edge cases | 2-3 дня |
| Итого | 1-2 недели |







