Реализация двусторонней синхронизации каталога товаров с 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 рабочих дней. Свяжитесь с нами для аудита вашей текущей схемы синхронизации. Получите консультацию по настройке обмена данными — оценим объём работ и предложим оптимальное решение.







