Проблема синхронізації 1С та Magento 2
Ви запустили інтернет-магазин на Magento 2, а 1С — основа обліку. Товари, ціни, залишки — все має бути синхронізовано в реальному часі. На практиці інтеграція часто перетворюється на головний біль: невідповідність даних, втрата замовлень, помилки в залишках. Одного разу ми виправляли інтеграцію, де через тайм-аут REST-з'єднання пропало 20% замовлень. Після переходу на чергу RabbitMQ — нуль втрат. Правильна архітектура з чергою та обробкою помилок — запорука стабільної роботи. Замовте консультацію — ми проаналізуємо ваші дані та запропонуємо рішення.
Чому пряма REST-інтеграція ненадійна?
Пряме REST-з'єднання працює, але ненадійне при пікових навантаженнях. Черга повідомлень (RabbitMQ або Redis) дає гарантію доставки та дозволяє уникнути втрати даних. Порівняння підходів:
| Характеристика | Пряме REST | Через чергу |
|---|---|---|
| Надійність | Низька (збій → втрата) | Висока (retry, persistence) |
| Продуктивність | Обмежена швидкістю відповіді | Асинхронна, масштабується |
| Обробка помилок | Ручна | Автоматична (retry) |
Інтеграція через чергу втричі надійніша — це перевірено на десятках проєктів. Magento Developer Documentation також рекомендує асинхронну архітектуру. CommerceML — стандарт обміну даними, спрощує узгодження форматів. Для каталогів із десятками тисяч товарів прямий REST-запит на оновлення всіх залишків може тривати хвилинами, блокуючи інші операції. Черга розбиває операцію на дрібні завдання, що обробляються асинхронно. Це виключає тайм-аути та знижує навантаження на сервер.
Архітектура з чергою: як це працює
Типова архітектура включає проміжний шар, який ізолює Magento від 1С. У цьому шарі працюють три компоненти: черга повідомлень (RabbitMQ або Redis), трансформер даних та обробник помилок з retry-логікою. Черга приймає події від 1С та Magento, трансформер переводить дані у потрібний формат, а обробник повторює запити при збоях. Надійність забезпечується persistent-повідомленнями в RabbitMQ та дублюванням у базу даних.
1С ←→ Integration Layer ←→ Magento 2
Integration Layer:
- Queue (RabbitMQ / Redis)
- Transformer (1С-формат ↔ Magento-формат)
- Error Handler
- Retry Logic
Як реалізувати синхронізацію залишків з MSI?
Magento 2.3+ використовує Multi-Source Inventory. Оновлення залишків через MSI API — обов'язковий крок. Ось як це виглядає в коді:
def update_stock_msi(self, sku: str, source_code: str, qty: float):
payload = {
"sourceItems": [{
"sku": sku,
"source_code": source_code,
"quantity": qty,
"status": 1 if qty > 0 else 0
}]
}
requests.post(f"{self.m2_url}/rest/V1/inventory/source-items",
headers=self.m2_headers, json=payload)
Цей метод оновлює залишки для конкретного складу (source_code). MSI API дозволяє гнучко керувати множиною точок зберігання, що критично для компаній з кількома складами або постачальниками. У випадку legacy-інвентарю (Magento 2.2 і нижче) використовувався інший ендпоінт, але з версії 2.3 рекомендується саме MSI.
Імпорт товарів та вивантаження замовлень
Нижче — Python-воркер, який забирає товари з 1С та створює або оновлює їх в Magento.
import requests
import json
from magento.models.product import Product
class OneCMagentoSync:
def __init__(self, m2_url, m2_token, onec_url, onec_auth):
self.m2_url = m2_url
self.m2_headers = {"Authorization": f"Bearer {m2_token}", "Content-Type": "application/json"}
self.onec_url = onec_url
self.onec_auth = onec_auth
def sync_products(self):
# Get products from 1C
response = requests.get(f"{self.onec_url}/products", auth=self.onec_auth)
products_1c = response.json()
for product_data in products_1c:
self.upsert_product(product_data)
def upsert_product(self, data: dict):
sku = data['sku']
# Check existence in Magento
check = requests.get(f"{self.m2_url}/rest/V1/products/{sku}", headers=self.m2_headers)
payload = {
"product": {
"sku": sku,
"name": data['name'],
"price": float(data['price']),
"status": 1,
"type_id": "simple",
"attribute_set_id": 4,
"extension_attributes": {
"stock_item": {
"qty": int(data['quantity']),
"is_in_stock": int(data['quantity']) > 0
}
}
}
}
if check.status_code == 200:
# Update
requests.put(f"{self.m2_url}/rest/V1/products/{sku}",
headers=self.m2_headers, json=payload)
else:
# Create
requests.post(f"{self.m2_url}/rest/V1/products",
headers=self.m2_headers, json=payload)
Цей воркер передбачає, що в 1С є REST API для отримання товарів. Якщо ні — можна використовувати вивантаження в CSV або CommerceML. Важно налаштувати мапінг атрибутів: наприклад, поле 'sku' в 1С може називатися 'article'. Ми створюємо словник відповідностей для кожного клієнта.
Для повноцінного обліку важливо передавати замовлення з Magento в 1С. Код нижче отримує необроблені замовлення та надсилає їх.
def export_orders_to_1c(self):
# Get unprocessed orders
response = requests.get(
f"{self.m2_url}/rest/V1/orders",
params={
"searchCriteria[filter_groups][0][filters][0][field]": "status",
"searchCriteria[filter_groups][0][filters][0][value]": "pending",
"searchCriteria[pageSize]": 50
},
headers=self.m2_headers
)
orders = response.json()['items']
for order in orders:
order_1c = self.transform_order(order)
# Send to 1C
result = requests.post(
f"{self.onec_url}/orders",
json=order_1c,
auth=self.onec_auth,
timeout=10
)
if result.status_code == 200:
# Mark order as transferred to 1C
requests.post(
f"{self.m2_url}/rest/V1/orders/{order['entity_id']}/comments",
headers=self.m2_headers,
json={"statusHistory": {"comment": "Transferred to 1C", "status": "processing"}}
)
При вивантаженні замовлень важливо відстежувати статус: замовлення не повинне двічі потрапити в 1С. Ми використовуємо унікальний ID замовлення та перевіряємо його існування в 1С перед надсиланням. Також застосовуємо транзакційну логіку — якщо 1С не відповіла, замовлення залишається в черзі.
Щоб уникнути втрати даних, всі операції ставляться в чергу RabbitMQ. Persistent-повідомлення не зникають навіть при перезапуску.
import pika # RabbitMQ
def publish_to_queue(self, event_type: str, data: dict):
connection = pika.BlockingConnection(pika.URLParameters(RABBITMQ_URL))
channel = connection.channel()
channel.queue_declare(queue='magento_1c_sync', durable=True)
channel.basic_publish(
exchange='',
routing_key='magento_1c_sync',
body=json.dumps({"type": event_type, "data": data}),
properties=pika.BasicProperties(delivery_mode=2) # persistent
)
connection.close()
Ми налаштовуємо dead-letter exchange для повідомлень, які не вдалося обробити після кількох спроб. Це дозволяє не втрачати проблемні дані, а аналізувати їх окремо.
Типові помилки та як їх уникнути
Найчастіше проблеми виникають через некоректний мапінг атрибутів (наприклад, різний формат ціни), невідповідність одиниць вимірювання та конфлікти залишків при паралельному записі. Рішення — використовувати чергу та транзакційний API. Ми також документуємо всі трансформації даних, щоб уникнути сюрпризів. Додатково, для виключення дублювання замовлень, налаштовуємо idempotent-ключі.
Процес впровадження та терміни
- Аудит даних — виявити невідповідності в номенклатурі, цінах, одиницях вимірювання.
- Проектування схеми обміну — визначити мапінг полів, формати, протокол.
- Розробка інтеграційного шару — реалізувати чергу, трансформери, обробники помилок.
- Налаштування MSI — синхронізація залишків по складах.
- Тестування на копії даних — перевірка повноти та коректності.
- Запуск в експлуатацію — включення синхронізації в пілотному режимі.
- Моніторинг та підтримка — відстеження метрик, обробка збоїв.
| Етап | Результат |
|---|---|
| Аналітика | Схема даних, план міграції |
| Розробка | Інтеграційний шар, налаштування черг |
| Тестування | Пробний запуск, звірка даних |
| Документація | Інструкції для адміністратора |
| Навчання | Передача знань вашій команді |
| Підтримка | KPI моніторингу, SLA 99.9% |
Базова синхронізація (каталог + залишки в один бік) — 10–14 днів. Двостороння інтеграція із замовленнями, чергою та моніторингом — 3–4 тижні. Конкретні терміни розраховуємо індивідуально після аудиту даних.
Гарантії та результати
Ми надаємо письмову гарантію на коректність синхронізації протягом 3 місяців після впровадження. Будь-які збої виправляються безкоштовно. Сертифіковані спеціалісти з Magento та 1С з понад 10-річним досвідом забезпечують відповідність найкращим практикам. Скорочення витрат на підтримку до 40% та прискорення обробки замовлень на 50% — типові результати після впровадження. Отримайте консультацію — перший аналіз даних безкоштовно. Зв'яжіться з нами для оцінки вашого проєкту.







