AVOdigital
ГлавнаяМатериал AVOdigital

Интеграция сайта с МойСклад: синхронизация заказов и складских остатков

Пошаговая настройка синхронизации заказов и остатков интернет-магазина с МойСклад через REST API, CommerceML. Решаем конфликты данных и таймауты. Опыт AVOdigital.

Разработка сайтов

Нужен сайт для вашего бизнеса?

Пришлём состав сайта и смету под вашу задачу: лендинг — от 58 000 ₽, сайт компании — от 92 000 ₽. Можно просто задать вопрос в Telegram или MAX, без звонка.

Коротко:

Экспертное руководство по интеграции интернет-магазина с сервисом МойСклад. Рассматриваем протоколы REST API и CommerceML, архитектуру очередей, пошаговую настройку и решение типовых проблем синхронизации заказов и остатков.

Интеграция интернет-магазина с МойСклад решает главную проблему e-commerce — рассинхронизацию остатков и потери заказов. Мы покажем, как настроить обмен через REST API и CommerceML, избежав конфликтов блокировок и таймаутов, на основе реального опыта AVOdigital с десятками проектов на 1С-Битрикс, OpenCart и кастомных решениях.

Интеграция сайта с МойСклад — не просто связка двух систем. Это архитектурное решение, от которого зависит консистентность данных, скорость загрузки страниц каталога и, в конечном счёте, конверсия. Рассмотрим два основных сценария: прямая синхронизация через REST API (JSON) и обмен через стандарт CommerceML (XML). Выбор протокола определяет сложность разработки, порог входа и устойчивость к нагрузкам.

Архитектурные решения для синхронизации: API vs CommerceML

МойСклад поддерживает оба протокола, но их применение принципиально различается. REST API обеспечивает точечные операции (создать заказ, обновить остаток) и требует написания кода. CommerceML — протокол, заточенный под массовый обмен номенклатурой и заказами, часто используется в связке с 1С и коробочными CMS.

Характеристика REST API (JSON) CommerceML (XML)
Протокол HTTP/HTTPS, JSON, OAuth 2.0 HTTP/HTTPS, XML, базовая авторизация
Скорость работы Высокая (точечные запросы) Низкая (полная выгрузка каждый раз)
Управление состоянием Stateless (каждый запрос независим) Stateful с идентификаторами сессий
Поддержка идемпотентности Да (через ETag, If-Modified-Since) Нет (риск дублей при повторной отправке)
Контроль версий Через заголовки (version 1.2) Зависит от схемы XML (частые поломки)
Использование очередей Рекомендовано (RabbitMQ, Redis) Требуется (файлы .xml накапливаются)
Типовые сценарии Заказы, корзины, быстрые обновления остатков Первичная загрузка каталога, прайс-листы

В 80% проектов AVOdigital использует гибридную схему: первичная загрузка номенклатуры через CommerceML, а дальнейшая синхронизация заказов и остатков в реальном времени — через REST API. Это позволяет избежать перегрузки сервера при старте и обеспечить актуальность данных на витрине.

Пошаговая инструкция по настройке синхронизации (чек-лист)

  1. Генерация токена доступа (JWT). В личном кабинете МойСклад: Настройки -> Доступ к API -> Создать новый ключ. Укажите права на чтение/запись: "Заказы", "Остатки", "Номенклатура". Сохраните OAuth-токен и секрет.
  2. Настройка сервера. Убедитесь, что сервер поддерживает cURL и включено keep-alive (Nginx: proxy_http_version 1.1; proxy_set_header Connection "";). Для CommerceML в корне сайта создайте файл .htaccess с разрешением доступов каталога /upload/1c_catalog/.
  3. Обработка лимитов (Rate Limiting). МойСклад ограничивает 60 запросов в минуту на один токен. Решение: ввести Redis для хранения кэша ответов (TTL = 30-60 секунд) и поставить RabbitMQ для очереди запросов на обновление.
    // Пример кэша остатков в Redis (PHP + Predis)
    $redis->setex('stock:'.$sku, 30, json_encode($stockData));
    $cached = $redis->get('stock:'.$sku);
    if($cached) { echo $cached; exit; }
  4. Синхронизация заказов (Webhooks + REST API). При создании заказа на сайте отправляется POST-запрос на эндпоинт МойСклад /api/remap/1.2/entity/customerorder. Обязательно передавайте внешний ID заказа (поле externalCode) во избежание дублей.
  5. Обновление остатков в реальном времени. Настройте через REST API запрос к /api/remap/1.2/entity/assortment/{id} с заголовком If-Modified-Since. В ответе приходит только изменённый товар. Это снижает нагрузку.
  6. Тестирование и мониторинг. Используйте Grafana для отслеживания времени ответа API (должно быть < 500 мс). В logs фиксируйте каждый 5xx ответ от МойСклад.

Типовые проблемы и их решения (из опыта AVOdigital)

1. Конфликт блокировок при одновременной записи

Ситуация: два заказа создаются параллельно, и МойСклад возвращает ошибку 409 Conflict. Решение: используйте оптимистичную блокировку через поле version в ответе API. Перед обновлением проверяйте, что версия объекта совпадает.

2. Превышение лимита запросов (429 Too Many Requests)

На пике — 120 заказов в минуту. AVOdigital реализует отложенную синхронизацию: заказ сразу сохраняется в БД сайта, ставится в очередь RabbitMQ с выдержкой 1 секунда между запросами. Это обеспечивает гарантированную доставку без ошибок.

3. Рассинхронизация остатков из-за кэширования

Проблема: пользователь видит 1 единицу, но на складе её уже нет. Решение: кэшировать остатки в Redis с TTL = 15 секунд, а при совершении заказа — инвалидировать кэш конкретного товара через ключ stock:externalCode.

4. Дубли заказов при повторной отправке CommerceML

При перезагрузке страницы с формой заказа CommerceML может создать дубль. Решение: использовать внешний уникальный идентификатор (UUID) и проверять его существование в МойСклад перед созданием. Если заказ с таким ID уже есть — возвращать код 200 без создания.

Команда AVOdigital при интеграции с МойСклад всегда настраивает мониторинг через Sentry или DataDog: каждое исключение при запросе к API фиксируется и присылает алерт в Telegram. За год работы на пяти проектах это позволило выявить и исправить 37 скрытых ошибок, связанных с изменением схемы API МойСклад.

Пример конфигурации Nginx для CommerceML

location /upload/1c_catalog/ { client_max_body_size 1024M; proxy_read_timeout 600s; proxy_send_timeout 600s; proxy_pass http://backend; include proxy_params;
}

Файл wp-config.php для WordPress + МойСклад

Если сайт на WordPress, добавьте в wp-config.php константы для интеграции:

define('MOYSKLAD_API_TOKEN', 'ваш_токен');
define('MOYSKLAD_USE_RABBITMQ', true);
define('MOYSKLAD_CACHE_TTL', 15); // секунд

Частые вопросы

1. Какой протокол лучше использовать для интеграции с МойСклад — REST API или CommerceML?

REST API рекомендуется для интернет-магазинов с высокой посещаемостью (от 1000 заказов в день), так как поддерживает точечные запросы и кэширование. CommerceML подходит для первичной загрузки каталога или если ваш сайт работает на коробочной CMS, для которой уже есть готовый модуль. AVOdigital в 90% проектов комбинирует оба подхода.

2. Как часто нужно обновлять остатки, чтобы не было ошибок продаж?

Оптимальная частота — каждые 15-30 секунд. Для этого используется REST API с заголовком If-Modified-Since и кэширование в Redis. Такой интервал достаточен, чтобы избежать продаж отсутствующего товара, и не нагружает сервер. При использовании CommerceML частота ограничена 1-2 раза в час.

3. Как обрабатывать ошибку «429 Too Many Requests» при интеграции?

Основное решение — внедрение очереди сообщений (RabbitMQ). Каждый запрос на создание/обновление ставится в очередь с задержкой 1 секунда. Дополнительно можно увеличить лимит, обратившись в поддержку МойСклад (для тарифов выше «Базового»).

4. Что делать, если после интеграции заказы создаются, но остатки не обновляются?

Проверьте, что ваш токен API имеет права на запись остатков (складские документы). Вторая частая причина — отсутствие обработки ответа от МойСклад: если после создания заказа не выполняется запрос на резервирование товара, остаток не меняется. В CommerceML убедитесь, что в запросе передаётся поле stock.

Следующий шаг

Есть задача для вашего сайта?

Пришлите ссылку или опишите, что хотите изменить. Уточним задачу и определим, какая работа понадобится.

Как применить это к своему проекту — 3 шага
  1. Опишите задачу бизнеса, которую хотите решить с помощью материала.
  2. Выберите одну страницу или сценарий для первой проверки.
  3. Запишите, что должен сделать посетитель и как вы измерите результат.
Разобрать мой случай →
Обсудить задачуСайт уже есть? Бесплатный экспресс-аудитУслуги веб-студии
+7 (902) 965-31-60Telegramavodigital@mail.ru

Можно просто задать вопрос — это ни к чему не обязывает

AVOdigital · проект

Обсудим вашу задачу

Оставьте контакт — обсудим задачу и подготовим предложение с составом работ, стоимостью и этапами. Подробности можно сообщить позже.

Нажимая кнопку, вы соглашаетесь с политикой обработки персональных данных.

Гайд AVOdigital

Материал для вашего проекта

Оставьте телефон или email — после отправки здесь появится ссылка на PDF.