1С, CRM И САЙТ: как системы обмениваются данными

 

 

 

АРХИТЕКТУРА // SYSTEM_INTEGRATION_OVERVIEW

На схеме интеграция 1С, CRM и сайта часто выглядит элементарно:

1ССайтCRM

На практике такая схема почти ничего не говорит о том, что именно происходит с данными.

Где хранится актуальная цена?
Какая система знает настоящий остаток товара?
Кто создаёт заказ?
Где меняется его статус?
Что происходит, если менеджер изменил данные в CRM, а через минуту в 1С пришла другая информация?
А если сайт был недоступен два часа?

Именно на таких вопросах заканчиваются простые интеграции и начинается нормальная архитектура обмена данными.

Потому что задача заключается не в том, чтобы «соединить 1С с сайтом».

Задача — построить систему, в которой несколько независимых приложений согласованно работают с одними и теми же бизнес-данными.

 

 

ЗОНЫ ОТВЕТСТВЕННОСТИ // SYSTEM_RESPONSIBILITIES

Зачем вообще нужны три системы

У каждой системы обычно своя зона ответственности.

1С может отвечать за:

товары;
характеристики;
цены;
остатки;
склады;
документы;
заказы;
бухгалтерские и складские операции.

Сайт отвечает за взаимодействие с покупателем:

каталог;
карточки товаров;
корзину;
оформление заказа;
личный кабинет;
отображение доступности товара.

CRM работает с клиентской и коммерческой частью:

контакты;
компании;
лиды;
сделки;
менеджеры;
коммуникации;
задачи;
история работы с клиентом.

Получается, что один и тот же бизнес-процесс проходит через несколько систем.

Например:

ПокупательСайтЗаказCRM1ССклад / отгрузкаСтатусСайт + CRM

И здесь уже недостаточно знать адрес API каждой системы.

Нужно понимать жизненный цикл данных.

 

 

ПРАВИЛА ДАННЫХ // DATA_SOURCE_OF_TRUTH

Главное правило: у каждого типа данных должен быть источник истины

Одна из самых частых ошибок — хранить одни и те же данные как независимые значения сразу в нескольких системах.

Например:

// CONFLICT_DUPLICATION_RISK //
Цена
 ├── 1С: 5 490 ₽
 ├── CRM: 5 490 ₽
 └── Сайт: 5 490 ₽

Пока значения одинаковые, кажется, что всё работает.

Но затем кто-то изменил цену в 1С.

Через час сайт всё ещё показывает старую.

CRM содержит третье значение.

И уже непонятно, какая цифра правильная.

Поэтому ещё до разработки интеграции нужно определить:

Какая система является владельцем конкретного типа данных?

Например:

Данные: Товар
Источник истины: 1С
Данные: Цена
Источник истины: 1С
Данные: Остаток
Источник истины: 1С
Данные: Клиент
Источник истины: CRM
Данные: Задачи менеджеров
Источник истины: CRM
Данные: Контент страницы
Источник истины: Сайт
Данные: Корзина
Источник истины: Сайт
Данные: Заказ
зависит от архитектуры

Последняя строка особенно важна.

Заказ может появиться на сайте, но после оформления стать объектом CRM и затем документом в 1С.

Это не означает, что три системы должны хранить три независимых заказа.

Они должны хранить свои представления одного бизнес-объекта, связанные общими идентификаторами.

 

 

ТОПОЛОГИЯ // INTEGRATION_LAYER_ISOLATION

Не нужно синхронизировать всё со всем

На первый взгляд хочется построить такую архитектуру:

1СCRMСайт

Каждая система напрямую общается с каждой.

Сначала это кажется удобным.

Потом появляется новая система.

Например, интернет-магазин, mobile приложение, сервис доставки и аналитическая платформа.

Связей становится всё больше:

// DEPENDENCY_OVERLOAD_LOG //
10:37:05 1С ↔ CRM
10:37:06 1С ↔ Сайт
10:37:06 CRM ↔ Сайт
10:37:07 1С ↔ Мобильное приложение
10:37:07 CRM ↔ Мобильное приложение
10:37:08 Сайт ↔ Аналитика
...

Каждая новая интеграция добавляет новые зависимости.

Поэтому в крупных проектах часто появляется отдельный интеграционный слой:

1СИнтеграционныйслойСайтCRMAPI

Он может отвечать за преобразование данных, очереди, маршрутизацию, журналирование и повторную обработку.

 

 

ИДЕНТИФИКАЦИЯ // DATA_MAPPING_STRATEGY

Один товар в разных системах — это не три разных товара

Предположим, в 1С товар имеет идентификатор:

SKU = 10482

На сайте он может иметь:

product_id = 7815

В CRM:

product_id = 322

Если интеграция каждый раз пытается сопоставлять товары по названию, неизбежно появятся проблемы.

Название может измениться.
Может отличаться написание.
Могут появиться одинаковые названия у разных товаров.

Поэтому нужен устойчивый внешний идентификатор.

Например:

1СSKU 10482Интеграционный IDСайт7815CRM322

Система должна понимать:

10482, 7815 и 322 — это разные технические идентификаторы одного товара.

Такое сопоставление часто называют mapping.

И чем больше интеграций, тем важнее держать его под контролем.

 

 

ТРАНСФОРМАЦИЯ // PRODUCT_DATA_TRANSFORM

Как передаются товары

Типичный сценарий может выглядеть так:

1СТовар изменёнИнтеграционный слойПроверка данныхПреобразование форматаСайт

Например, в 1С хранится:

// 1C_INTERNAL_FIELDS //
Наименование
Артикул
Цена
Остаток
Бренд
Характеристики

А сайту нужен другой формат:

// TARGET_JSON_PAYLOAD //
{
  "sku": "10482",
  "name": "Название товара",
  "price": 5490,
  "available": true
}

Поэтому интеграция не просто «пересылает JSON».

Она выполняет преобразование:

Модель 1СНормализацияМодель интеграцииМодель сайта

Именно этот слой позволяет системам не зависеть напрямую от внутренней структуры друг друга.

 

 

СЕМАНТИКА // PRICE_SEMANTICS_CONTEXT

Цена — не просто число

В реальном бизнесе цена редко является одним простым полем.

Могут существовать:

розничная цена;
оптовая цена;
цена для конкретного клиента;
акция;
минимальная цена;
цена с НДС или без НДС;
разные цены для разных каналов.

Например:

// EXTENDED_PRICE_SCHEMA //
Базовая цена:6 000 ₽
Цена сайта:5 490 ₽
Оптовая цена:5 100 ₽
Цена по акции:4 990 ₽

Если просто передать в CRM поле price, непонятно, какую именно цену мы передали.

Поэтому ещё на этапе проектирования нужно определить семантику каждого поля.

Интеграция должна передавать не просто значения.

Она должна передавать значения в понятном контексте.

 

 

ЛОГИСТИКА // STOCK_SEMANTICS_CALCULATION

Остатки — ещё сложнее

С остатками ситуация похожая.

В 1С может быть:

// 1C_WAREHOUSE_STOCKS //
Склад Москва:35
Склад Санкт-Петербург:12
Резерв:8
В пути:20

А сайту нужно показать:

Доступно: 39

Значит, сайт не обязательно должен получать все внутренние складские данные.

Для него может рассчитываться отдельный показатель:

Доступно =
остатки
− резерв
+ разрешённые поступления

Правила зависят от бизнеса.

И это хороший пример того, почему интеграция — не механическая пересылка полей.

Между системами существует бизнес-логика.

 

 

ТРАНЗИТ // ORDER_REVERSE_FLOW

Заказ проходит обратный путь

С товарами поток часто идёт из 1С на сайт.

С заказом всё наоборот.

Покупатель оформляет его на сайте:

КорзинаОформлениеЗаказ №100582

После этого информация должна попасть дальше.

Например:

СайтCRM1С

Но в каждой системе заказ может получить собственный идентификатор:

// LOCAL_ORDER_IDENTIFIERS //
Сайт: 100582
CRM:  45821
1С:   0000-123456

И снова нужен mapping.

В системе важно хранить связь:

site_order_id
crm_order_id
erp_order_id

Тогда любой участник цепочки может однозначно понять, о каком заказе идёт речь.

 

 

ФИНАНСОВАЯ НАДЕЖНОСТЬ // TRANSACTION_IDEMPOTENCY

Почему нельзя просто отправить заказ два раза

Представим:

// DUPLICATE_ORDER_RISK //
• сайт отправил заказ в 1С;
• 1С его успешно создала;
• ответ потерялся;
• сайт решил, что произошла ошибка;
• отправил заказ повторно.

Если нет защиты, в 1С появятся два заказа.

Поэтому интеграции должны учитывать идемпотентность.

Перед созданием документа можно проверить:

Внешний ID = 100582

Если такой заказ уже существует:

не создавать новый

а вернуть существующий объект.

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

 

 

СИНХРОНИЗАЦИЯ // ORDER_STATUS_MAPPING

Статус заказа тоже является данными

Заказ может пройти длинную цепочку:

НовыйПодтверждёнПередан в обработкуСобираетсяГотов к отгрузкеОтгруженДоставляетсяПолучен

Но разные системы могут использовать разные статусы.

Например:

// SYSTEM_STATUS_MISMATCH_LOG //
1С:
Отгружен

Сайт:
Передан в доставку

CRM:
Заказ выполнен

Поэтому между системами нужен словарь соответствий:

ERP статусПравило преобразованияСтатус сайта

Иначе одна система может показывать клиенту информацию, которая не соответствует реальному состоянию заказа.

 

 

КОНФЛИКТЫ // BIDIRECTIONAL_CONFLICT_RESOLUTION

Двусторонний обмен требует особенно аккуратной логики

Представим:

1ССайт

Цена изменилась в 1С, сайт получил новую цену.

Всё просто.

Но если сайт тоже может изменять цену:

1ССайт

возникает вопрос:

кто теперь главный?

Если оба источника могут менять одно поле, появляется конфликт.

Например:

// INFINITE_LOOP_RACE_CONDITION //
10:00 — 1С: 5 490 ₽
10:01 — Сайт: 5 290 ₽
10:02 — 1С: 5 490 ₽
10:03 — Сайт: 5 290 ₽

Можно получить бесконечную борьбу изменений.

Поэтому для каждого поля необходимо определить:

кто может его менять;
кто является владельцем;
куда изменение передаётся;
что происходит при конфликте.

Чем больше двусторонних связей, тем важнее эти правила.

 

 

РЕЖИМЫ ОБМЕНА // SYNCHRONIZATION_STRATEGIES

Синхронизация бывает разной

Не все данные нужно передавать одинаково.

Периодический обмен

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

Каждые 5 минутПолучить измененияОбновить сайт

Это простой и надёжный вариант, если задержка в несколько минут допустима.

Событийный обмен

Если данные должны передаваться практически сразу:

Изменение в 1ССобытиеИнтеграционный слойСайт

Например, изменение остатка может практически сразу отразиться на сайте.

Комбинированный вариант

На практике часто используется оба подхода.

События обеспечивают оперативность, а периодическая сверка обнаруживает то, что по какой-либо причине не дошло.

СобытияБыстрое обновлениеПериодическая сверкаКонтроль целостности

Это гораздо надёжнее, чем рассчитывать только на один механизм.

 

 

ОТКАЗОУСТОЙЧИВОСТЬ // FAILOVER_RETRY_POLICY

А что если данные не дошли?

Ошибки обмена — нормальная часть любой интеграции.

Проблема не в том, что ошибка произошла.

Проблема — если система не умеет её обнаружить и обработать.

Например:

1СAPIСайт

Сайт вернул:

500 Internal Server Error

Интеграция должна понимать:

можно ли повторить запрос;
сколько раз;
через какой интервал;
нужно ли уведомить администратора;
надо ли поместить операцию в очередь;
нужно ли отменить дальнейшую цепочку.

 

 

КЛАССИФИКАЦИЯ // ERROR_CLASSIFICATION_RETRY

Повторять нужно не все ошибки

Например:

500
503
timeout

могут быть временными ошибками.

Повторная попытка имеет смысл.

Но:

400
invalid field
missing required value

обычно требуют исправления данных.

Если автоматически повторять такой запрос сто раз, ничего не изменится.

Поэтому ошибки стоит классифицировать.

ОшибкаВременнаяПовторитьПостояннаяИсправить

Для временных ошибок можно использовать увеличивающийся интервал между попытками.

Это снижает нагрузку на систему, которая и так может находиться под нагрузкой.

 

 

БУФЕРИЗАЦИЯ // TRANSACTIONAL_QUEUES

Очередь позволяет не терять изменения

Для важных операций полезно использовать очередь сообщений или заданий.

Например:

Изменение товараОчередьОбработчикСайт

Если сайт недоступна:

ОчередьПовторПовторСайт доступенОбработка выполнена

При этом основной процесс в 1С не обязательно должен ждать ответа сайта.

Это особенно важно для больших объёмов данных.

 

 

ДИФФЕРЕНЦИАЦИЯ // DATA_DIFF_SYNCHRONIZATION

Полная синхронизация и обмен изменениями

Есть два принципиально разных подхода.

Первый:

Передать все 100 000 товаров

Второй:

Найти 37 изменившихся товаровПередать только их

Для больших каталогов второй вариант значительно эффективнее.

Но тогда системе необходимо отслеживать изменения:

время изменения;
версию;
статус синхронизации;
внешний ID;
результат последней передачи.

Например:

// OBJECT_SYNC_SUCCESS //
SKU 10482
Изменён: 10:42
Передан: 10:42
Результат: OK

А если возникла ошибка:

// OBJECT_SYNC_FAILURE //
SKU 10482
Изменён: 10:42
Передан: 10:43
Результат: ERROR
Следующая попытка: 10:48

Такой журнал позволяет контролировать не просто факт запуска обмена, а результат обработки каждого объекта.

 

 

РЕЖИМЫ ИНТЕГРАЦИИ // ARCHITECTURAL_SYNC_MODES

Начальная загрузка и последующая синхронизация — разные задачи

Это часто упускают из виду.

Когда интеграцию запускают впервые, нужно передать большой объём данных:

// INITIAL_BULK_LOAD //
50 000 товаров
20 000 клиентов
10 000 заказов

Это начальная загрузка.

После запуска ежедневный процесс выглядит совершенно иначе:

// REGULAR_INCREMENTAL_SYNC //
150 изменённых товаров
42 новых заказа
17 новых клиентов

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

Поэтому обычно существуют два режима:

первичная загрузкарегулярная синхронизация

У них разные требования к производительности, контролю и обработке ошибок.

 

 

СВЕРКА // DATA_RECONCILIATION_STRATEGY

Что делать при расхождении данных

Предположим:

// OUT_OF_SYNC_ALERT //
1С: остаток = 12
Сайт: остаток = 9

Как определить, что правильно?

Если 1С является источником истины — ответ очевиден.

Но система должна не просто исправить значение.

Она должна уметь обнаружить расхождение.

Например:

Ежедневная сверка1С: 12Сайт: 9РасхождениеПовторная синхронизацияСайт: 12

А если расхождение не исчезло — отправить уведомление.

Такие сверки особенно полезны для критичных данных.

 

 

ТРАССИРОВКА // LIVE_AUDIT_LOGGING

Логи нужны не только разработчику

Хорошая интеграция должна отвечать на вопрос:

«Почему этот заказ не появился в 1С?»

Не через поиск по серверам и догадки.

А через историю:

// ORDER_ROUTING_TRACKING //
14:21:03
Заказ №100582 получен сайтом

14:21:04
Передан в CRM

14:21:04
CRM успешно обработала

14:21:05
Передан в 1С

14:21:05
1С вернула ошибку:
Не указан способ оплаты

Теперь причина понятна.

Можно исправить данные и повторить операцию.

 

 

МОНИТОРИНГ // ECOSYSTEM_BUSINESS_MONITORING

Мониторинг должен смотреть на бизнес, а не только на сервер

Сервер может быть полностью «зелёным», а заказы при этом не передаваться.

Поэтому недостаточно контролировать:

CPU
RAM
HTTP 200

Нужно видеть бизнес-показатели:

// BUSINESS_KPI_MONITOR //
Товаров синхронизировано:12 450
Ошибок:7
Заказов за час:84
Передано в 1С:84
Заявок в очереди:3
Последняя успешная синхронизация:
10:42

Это позволяет увидеть проблему до того, как её заметит клиент или менеджер.

 

 

ИЗОЛЯЦИЯ // SYSTEM_CHANGE_ADAPTABILITY

Интеграция должна переживать изменения систем

1С, CRM и сайт не стоят на месте.

Меняются:

версии;
API;
структуры данных;
обязательные поля;
бизнес-правила;
каталоги;
статусы;
форматы документов.

Поэтому интеграция должна быть построена так, чтобы изменение одной системы не приводило к каскадному переписыванию всего решения.

Именно здесь особенно полезен отдельный слой преобразования.

1САдаптерЕдиная модельАдаптерCRM

Если API CRM изменился, корректируется её адаптер.

Внутренняя модель и логика остальных систем при этом могут остаться прежними.

 

 

ОТКАЗОУСТОЙЧИВОСТЬ // SYSTEM_DOWNTIME_SAFETY

Что происходит, если сайт временно недоступен

Допустим, на сайте идут технические работы.

В 1С продолжают меняться:

цены;
остатки;
товары.

После восстановления сайта нельзя просто сказать:

«Ну, теперь снова включим синхронизацию».

Нужно понять, какие изменения произошли за время простоя.

Поэтому полезно хранить состояние обмена:

Последняя успешная синхронизация:
08:15

После восстановления:

Найти изменения после 08:15Сформировать пакетПередатьПроверить результат

Так короткий простой одной системы не приводит к потере изменений.

 

 

ФИЛОСОФИЯ // SYSTEM_ARCHITECTURE_BOUNDARY

Где заканчивается интеграция и начинается архитектура

Если бизнес говорит:

«Нам нужно соединить 1С, CRM и сайт»,

это ещё не техническое задание.

Нужно выяснить:

какие данные существуют;
кто ими владеет;
где они создаются;
где изменяются;
кто потребляет эти данные;
как быстро они должны обновляться;
что делать при конфликте;
что делать при ошибке;
какие операции критичны;
какие данные можно передавать пакетами;
какие должны передаваться практически мгновенно.

Только после этого можно выбирать конкретный механизм обмена.

API
— это инструмент.
Очередь
— инструмент.
Webhook
— инструмент.
Обмен файлами
— тоже инструмент.

Сначала определяется процесс и ответственность за данные, а уже потом выбирается технология.

 

 

ТОПОЛОГИЯ // ECOSYSTEM_TOTAL_ARCHITECTURE

Как выглядит нормальная архитектура

Для типового проекта это может выглядеть так:

1СтоварыценыостаткиИнтеграционныйслойmappingвалидацияочередьлогиretryСайткаталогкорзиназаказыCRMклиентысделкизадачи

При этом направление движения данных определяется не расположением блоков на схеме, а правилами владения данными.

Например:

1С → Сайт
Товары
Цены
Остатки
Сайт → CRM
Новые обращения
Заказы
CRM → 1С
Подтверждённые данные клиента
Информация, необходимая для оформления
1С → CRM
Статус заказа
Документы
Информация об исполнении

Конкретная схема всегда зависит от бизнес-процесса.

 

 

ИТОГ // ECOSYSTEM_DECOUPLING_SUMMARY

Главное — не сделать три системы одним большим справочником

Хорошая интеграция не означает, что во всех системах должны находиться абсолютно одинаковые данные.

Наоборот.

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

// 1C REGION //
1С не обязана знать всё, что происходит в интерфейсе сайта.
// WEB REGION //
Сайт не должен хранить всю внутреннюю бухгалтерскую информацию.
// CRM REGION //
CRM не должна превращаться в копию ERP.

Задача интеграции — обеспечить согласованность необходимых данных, а не создать три одинаковые базы.

 

 

ИТОГ // ECOSYSTEM_FINAL_SUMMARY

Итог

Связать 1С, CRM и сайт технически можно довольно быстро.

Но построить между ними надёжный обмен данными — совсем другая задача.

Нужно заранее определить:

кто является источником истины;
какие данные передаются;
какие системы могут их изменять;
как идентифицируются объекты;
как синхронизируются товары;
как передаются цены и остатки;
как проходит заказ;
как сопоставляются статусы;
что происходит при повторной отправке;
как обрабатываются ошибки;
где хранится очередь;
как выполняется повторная обработка;
как обнаруживаются расхождения;
как контролируется результат обмена.

Тогда схема перестаёт выглядеть как набор соединённых API:

1С ↔ CRM ↔ Сайт

И превращается в управляемый процесс:

ДанныеИсточник истиныПреобразованиеПередачаПроверкаПолучениеПодтверждениеКонтроль

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

Хорошая интеграция — это не кабель между двумя программами. Это договорённость о том, кому принадлежат данные, как они изменяются и как система узнаёт, что изменение действительно дошло до адресата.

 

 

НАВИГАЦИЯ // SUGGESTED_READING
 
[ Модуль // ИНТЕГРАЦИИ ]

API, Webhook или очередь сообщений?

 
[ Модуль // ИНТЕГРАЦИИ ]

Когда API есть, а интеграция всё равно не работает

 
[ Модуль // АВТОМАТИЗАЦИЯ ]

Как соединить производство и корпоративные системы

 
[ EXPERTISE JOURNAL ]

Все инженерные материалы и экспертные статьи

 
[ CORE GLOSSARY ]

Полный алфавитный справочник ИТ-терминов

 

[ DIRECT EMAIL LINE ]
info@log-ai.ru

 

🔒 Данные и доступ к системам заказчика обрабатываются в соответствии с согласованными требованиями к безопасности и конфиденциальности. Условия доступа, хранения и обработки данных определяются архитектурой проекта и договором.

Сайт носит исключительно информационный характер и не является публичной офертой в соответствии со статьёй 437 Гражданского кодекса РФ. Цены, состав и условия предоставления услуг уточняются при проектировании решения и фиксируются в договоре. Условия технического сопровождения и уровень сервиса могут дополнительно определяться отдельным соглашением (SLA).

© 2026 Log-AI Москва
Автоматизация бизнеса и ИИ-решения под ключ
Самозанятый Скопец Антон Викторович ИНН 741709260870
Политика конфиденциальности Пользовательское соглашение
AI Ассистент
×