Двостороння синхронізація каталогу товарів з 1С
Уявіть: менеджер оновив ціну в 1С, але на сайті вона висить попередня три дні. Або товар зняли з продажу в обліковій системі, а він все ще доступний для замовлення. Двостороння синхронізація каталогу з 1С — це не просто імпорт та експорт. Це проектування системи правил, яка вирішує конфлікти даних, коли інформація змінюється в обох системах одночасно. Без чіткого визначення джерела правди синхронізація перетворюється на хаос: дані затираються, виникають дублі, губляться замовлення.
Типова ситуація: в 1С змінили ціну та залишок, а на сайті відредагували опис. Якщо обмін налаштований як односторонній імпорт, опис може бути затертий. Наш підхід — двосторонній обмін із розділенням полів на майстер-системи. Ми проектуємо логіку так, щоб сайт і 1С залишалися узгодженими без ручного втручання.
Визначення джерел правди
Перший крок — зафіксувати для кожного поля, яка система є майстром:
| Поле | Майстер | Логіка |
|---|---|---|
| Назва товару | 1С | 1С — система номенклатури |
| Артикул / SKU | 1С | Артикул задається в обліковій системі |
| Опис | Сайт | Маркетингові тексти пишуться редактором |
| Ціна | 1С | Ціноутворення в обліковій системі |
| Залишки | 1С | Реальний облік на складах |
| Зображення | Сайт | Фото обробляються окремо |
| SEO-поля | Сайт | meta title/description — на стороні сайту |
| Статус активності | Обидві | 1С може зняти з продажу, сайт теж |
Як вирішуються конфлікти при синхронізації?
Конфлікт: поле active_site було виставлено оператором сайту в false (знято з публікації), але наступне вивантаження з 1С містить active = true. За правилами таблиці вище — 1С є майстром для active_1c, але active_site не чіпається. Підсумок: active_1c = true, active_site = false → товар не відображається. Оператор сайту зберігає контроль. Для кожного поля ми визначаємо систему-майстер і правило мержу. Це гарантує цілісність даних і виключає втрату інформації.
Схема бази даних
CREATE TABLE products (
id BIGSERIAL PRIMARY KEY,
onec_guid UUID UNIQUE, -- ідентифікатор 1С
sku TEXT,
-- Поля з 1С (перезаписуються при кожній синхронізації)
name_1c TEXT,
price_1c NUMERIC(12,2),
stock_1c INTEGER,
category_guid UUID,
active_1c BOOLEAN DEFAULT true,
-- Поля сайту (не перезаписуються синхронізацією)
description TEXT,
meta_title TEXT,
meta_description TEXT,
images JSONB,
active_site BOOLEAN DEFAULT true,
-- Мета синхронізації
last_sync_1c TIMESTAMPTZ,
sync_hash_1c CHAR(64) -- хеш даних з 1С для детекції змін
);
-- Підсумковий статус: товар активний тільки якщо активний і в 1С, і на сайті
CREATE VIEW products_active AS
SELECT * FROM products WHERE active_1c = true AND active_site = true;
Алгоритм синхронізації з 1С → сайт
class OnecToSiteSyncService
{
public function sync(CommerceMLData $data): SyncResult
{
$result = new SyncResult();
foreach ($data->products as $onecProduct) {
$syncHash = $this->computeHash($onecProduct);
$product = Product::firstOrNew(['onec_guid' => $onecProduct->guid]);
// Пропускаємо, якщо дані не змінилися
if ($product->exists && $product->sync_hash_1c === $syncHash) {
$result->skipped++;
continue;
}
// Оновлюємо ТІЛЬКИ поля з 1С (не чіпаємо description, images тощо)
$product->fill([
'sku' => $onecProduct->sku,
'name_1c' => $onecProduct->name,
'price_1c' => $onecProduct->price,
'stock_1c' => $onecProduct->stock,
'category_guid'=> $onecProduct->categoryGuid,
'active_1c' => $onecProduct->active,
'last_sync_1c' => now(),
'sync_hash_1c' => $syncHash,
]);
$product->save();
$result->updated++;
}
// Товари, які 1С більше не вивантажує — деактивуємо
$syncedGuids = $data->products->pluck('guid');
Product::whereNotIn('onec_guid', $syncedGuids)
->update(['active_1c' => false]);
return $result;
}
}
Синхронізація сайт → 1С
Сайт передає в 1С тільки те, що змінилося на сайті і має значення для 1С: нові замовлення, повернення, відгуки про оплату.
class SiteToOnecSyncService
{
public function getUnsyncedOrders(): Collection
{
return Order::where('sent_to_1c', false)
->where('status', '!=', 'draft')
->with(['items.product', 'customer'])
->get();
}
}
Чому важливо вибрати правильний формат обміну?
CommerceML — галузевий стандарт для інтеграції з 1С, але REST API дає більше контролю. Порівняння:
| Критерій | CommerceML | REST API |
|---|---|---|
| Швидкість розгортання | Швидко (з коробки) | Вимагає розробки |
| Гнучкість | Обмежена схема | Повний контроль над полями |
| Підтримка версіонування | Ні | Так (через заголовки) |
| Деталізація помилок | Загальні коди | HTTP-статуси + тіло відповіді |
| Продуктивність | Парсинг XML | JSON, швидше |
Ми обираємо підхід під конкретне завдання. Для малого бізнесу часто достатньо CommerceML, для великого каталогу з highload — REST API.
Моніторинг синхронізації
-- Останні статуси синхронізації
SELECT
source,
COUNT(*) FILTER (WHERE status = 'success') AS success,
COUNT(*) FILTER (WHERE status = 'error') AS errors,
MAX(finished_at) AS last_run,
AVG(EXTRACT(EPOCH FROM (finished_at - started_at))) AS avg_duration_sec
FROM sync_logs
WHERE started_at > NOW() - INTERVAL '7 days'
GROUP BY source;
Як часто має відбуватися синхронізація?
Інтервал залежить від інтенсивності змін та навантаження. Для інтернет-магазину з 10 000 товарів оптимально оновлювати ціни та залишки кожні 15-30 хвилин. Для великого маркетплейсу (100 000+ позицій) — раз на 5 хвилин у пікові години та рідше вночі. Завжди налаштовуємо регульований розклад з можливістю ручного запуску.
Типові помилки при налаштуванні синхронізації
- Відсутність хешування даних: кожне вивантаження перезаписує всі поля, навіть якщо дані не змінилися. Рішення — зберігати хеш останньої синхронізації та порівнювати.
- Ігнорування статусу активності: якщо товар недоступний в жодній із систем, він все одно відображається на сайті. Використовувати логіку AND між
active_1cтаactive_site. - Неправильний порядок обробки: спочатку імпорт з 1С, потім експорт замовлень — інакше можливі колізії. Дотримуватися послідовності.
Що входить в роботу
- Аудит поточної схеми даних — виявляємо невідповідності та точки зростання.
- Проектування правил синхронізації — визначаємо джерела правди та логіку вирішення конфліктів.
- Реалізація обміну — пишемо код синхронізації з використанням CommerceML або REST API.
- Тестування на реальних даних — перевіряємо на бойовій конфігурації, усуваємо помилки.
- Документація та навчання — передаємо інструкції з експлуатації.
- Підтримка після запуску — гарантуємо стабільну роботу, виправляємо інциденти.
Строки
Двостороння синхронізація каталогу з 1С, включаючи тестування на реальній конфігурації: 14–20 робочих днів. Зв'яжіться з нами для аудиту вашої поточної схеми синхронізації. Отримайте консультацію з налаштування обміну даними — оцінимо обсяг робіт і запропонуємо оптимальне рішення.







