ФиксИнтернет-магазин на 1С-Битрикс под ключ за 30 дней по фиксированной цене

Event-driven архитектура для синхронизации заказов и складов

Event-driven архитектура синхронизации заказов и остатков между сайтом на 1С-Битрикс и 1С через очереди и события

Классическая картина: обмен с 1С ходит раз в пятнадцать минут, перекладывает весь массив остатков, и всё это время сайт живёт с устаревшими данными. Ходовой товар продали в опте, но на сайте он ещё «в наличии» — покупатель оформляет заказ, а его нечем отгружать. Плюс сам тяжёлый обмен раз в интервал даёт всплеск нагрузки, во время которого каталог подтормаживает. Пакетная синхронизация по расписанию — узкое место, которое одновременно и медленное, и тяжёлое.

Эта статья — о том, как перейти от пакетного обмена к событийной (event-driven) архитектуре синхронизации заказов и складов между сайтом на 1С-Битрикс и 1С: что такое события, зачем очереди и идемпотентность, как гарантировать доставку и как совместить это со штатным CommerceML. Такие интеграции мы проектируем и внедряем в рамках автоматизации продаж и склада на 1С.

Коротко

  • Event-driven реагирует на конкретное изменение, а не перекладывает весь массив по расписанию — данные свежее, нагрузка ниже.
  • Надёжность держится на очередях, подтверждениях доставки и повторах при сбоях.
  • Идемпотентность обязательна: события дублируются, и обработчик не должен применять изменение дважды.
  • Оптимален гибрид — событийная модель для оперативных данных поверх штатного обмена CommerceML как основы.

Боль пакетного обмена по расписанию

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

Первый — задержка. Остаток на сайте всегда отстаёт от учёта на интервал обмена. Для ходовых позиций это прямой источник оверселлинга: товар уже продан в другом канале, а сайт ещё принимает заказы. Второй — нагрузка. Тяжёлый обмен раз в интервал создаёт пиковую нагрузку, во время которой витрина проседает. Уменьшать интервал, чтобы данные были свежее, — значит чаще нагружать систему. Пакетная модель ставит скорость и стабильность в конфликт.

Что такое event-driven подход

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

КритерийПакетный обменEvent-driven
ТриггерТаймерИзменение данных
Объём за разВесь массивОдно изменение
СвежестьИнтервал обменаСекунды–минуты
НагрузкаПики по расписаниюРавномерный поток
МасштабированиеТяжелеет с ростомГоризонтальное по воркерам

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

Обмен данными сайта с 1С Сайткаталог, заказытовары, заказыОбменочередь / APIДанные идут в обе стороны по расписанию или по событию
Схема: сайт и 1С обмениваются данными в обе стороны — по расписанию или по событию. Товары и остатки приходят на сайт, заказы уходят обратно.

События заказов и остатков

Начать стоит с определения событий предметной области — что именно считается значимым изменением.

Каждое событие несёт минимально необходимые данные и стабильный идентификатор. Оно описывает факт («остаток стал равен N»), а не команду, — это делает обработку предсказуемой и упрощает идемпотентность. Аккуратная работа с сущностями заказов и остатков на уровне ORM здесь важна; подходы мы разбираем в статье про D7 ORM в Битрикс.

Очереди и надёжная доставка

Прямая синхронная отправка события «в лоб» хрупка: если приёмник недоступен, событие теряется или блокирует отправителя. Поэтому между отправителем и получателем ставят очередь.

Очередь развязывает системы во времени: событие складывается в неё и обрабатывается воркером тогда, когда получатель готов. Что это даёт:

Принцип надёжности: событие считается доставленным только после подтверждения обработки. До этого оно остаётся в очереди и будет доставлено снова. Это база гарантии «хотя бы один раз» — и именно поэтому нужна идемпотентность.

Идемпотентность обработчиков

Гарантия «хотя бы один раз» означает, что события неизбежно будут повторяться: сеть переотправит, воркер упадёт после применения, но до подтверждения. Если обработчик списывает остаток на каждое получение, дубликат испортит данные — товар «уйдёт» дважды.

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

  1. Стабильный идентификатор события. Уникальный ключ, одинаковый при повторах.
  2. Журнал обработанных событий. Перед применением проверяется, не обработан ли этот идентификатор.
  3. Факты вместо дельт. «Остаток равен N» безопаснее «уменьши на 1»: повтор факта не ломает данные.
  4. Атомарность. Применение изменения и отметка об обработке — в одной транзакции.

Без идемпотентности событийная синхронизация опасна: любой сетевой повтор превращается в порчу остатков или задвоение заказа.

Двусторонний поток с 1С

Синхронизация заказов и складов двусторонняя, и события ходят в обе стороны. С сайта в 1С уходит поток о заказах и действиях клиента, из 1С на сайт — об остатках, ценах и статусах.

Со стороны 1С-Битрикс входящие события удобно принимать через защищённые вебхуки, а исходящие — публиковать в очередь. Как безопасно строить такие точки приёма, мы разбираем в статье про REST, вебхуки и безопасность в Битрикс. Важно, чтобы обе стороны договорились о формате событий и идентификаторах, иначе рассинхрон неизбежен.

Гибрид с обменом CommerceML

Событийная модель не обязана заменять штатный обмен целиком — чаще выгоден гибрид. Тяжёлый обмен CommerceML остаётся для полной выгрузки каталога и первичной синхронизации, а события работают поверх для оперативных данных.

Разделение ответственности выглядит так:

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

Обработка ошибок и повторы

В распределённой системе ошибки — норма, а не исключение. Архитектура должна их переживать, а не падать.

Комбинация очереди, подтверждений, повторов и dead letter даёт практическую гарантию: изменение либо применится, либо попадёт в видимую очередь ошибок, но не пропадёт молча.

Мониторинг и наблюдаемость

Событийную систему нельзя эксплуатировать вслепую. Без наблюдаемости накопившийся затор в очереди или растущий dead letter заметят только по жалобам клиентов.

Наблюдаемость превращает событийную интеграцию из «чёрного ящика» в управляемую систему, где проблему видно до того, как её увидит клиент.

Реализация в 1С-Битрикс

Технически событийный слой в 1С-Битрикс собирается из штатных механизмов плюс аккуратной инженерии.

  1. Определите события. Опишите факты предметной области, их данные и идентификаторы.
  2. Ловите изменения. Обработчики событий Битрикс на заказах и остатках публикуют события в очередь.
  3. Заведите очередь и воркеры. Агенты, cron-воркеры или внешний брокер разбирают очередь.
  4. Сделайте обработчики идемпотентными. Журнал обработанных событий и атомарное применение.
  5. Настройте приём от 1С. Защищённые вебхуки для входящих событий об остатках и статусах.
  6. Добавьте повторы и мониторинг. Dead letter, экспоненциальные повторы, метрики очередей.
  7. Внедряйте поэтапно. Начните с одного потока — остатков ходовых позиций — поверх существующего обмена.

Такой слой обычно оформляют как отдельный модуль с чистой архитектурой — это надёжнее правок в шаблонах; см. статью про разработку модуля под Битрикс. А безопасную и предсказуемую выкатку изменений интеграции обеспечивает CI/CD и деплой в Битрикс.

Частые ошибки

Чек-лист внедрения

  1. События описаны. Факты предметной области с данными и стабильными идентификаторами.
  2. Очередь работает. События публикуются в очередь и разбираются воркерами.
  3. Обработчики идемпотентны. Журнал обработанных событий, атомарное применение, факты вместо дельт.
  4. Двусторонний поток. Сайт → 1С и 1С → сайт согласованы по формату и идентификаторам.
  5. Ошибки обрабатываются. Экспоненциальные повторы и очередь dead letter настроены.
  6. Мониторинг включён. Глубина очередей, задержка, ошибки и расхождения под наблюдением.
  7. Гибрид с обменом. Событийный слой работает поверх CommerceML, есть периодическая сверка.

Вывод

Event-driven архитектура снимает главный конфликт пакетного обмена — между свежестью данных и нагрузкой. Реагируя на конкретные изменения, а не перекладывая весь массив по таймеру, событийная синхронизация держит остатки и статусы заказов актуальными и распределяет нагрузку ровно. Цена этого — инженерная дисциплина: очереди, идемпотентность, надёжная доставка и мониторинг.

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

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

Чем event-driven синхронизация лучше обмена по расписанию?

Обмен по расписанию перекладывает весь массив данных раз в N минут независимо от того, что изменилось, — это нагрузка и задержка: остаток на сайте отстаёт от учёта на интервал обмена. Событийная синхронизация реагирует на конкретное изменение: продали товар — сразу ушло событие «остаток изменился». Данные актуальнее, нагрузка ниже, а система масштабируется, потому что обрабатывает поток мелких событий, а не редкие тяжёлые пакеты.

Нужны ли очереди для событийной синхронизации в 1С-Битрикс?

Для надёжности — да. Очередь развязывает отправителя и получателя: событие складывается в очередь и обрабатывается воркером, даже если приёмник временно недоступен. Без очереди пик заказов или недоступность 1С приводят к потере событий или блокировке сайта. В 1С-Битрикс роль обработчика играют агенты, cron-воркеры или внешний брокер очередей — выбор зависит от объёмов и требований к задержке.

Что такое идемпотентность и почему она критична?

Идемпотентность — свойство обработчика давать одинаковый результат при повторном получении одного и того же события. В распределённых системах события дублируются: сеть повторяет доставку, воркер падает после обработки, но до подтверждения. Если списывать остаток на каждое получение, дубль испортит данные. Идемпотентный обработчик по идентификатору события распознаёт повтор и не применяет изменение дважды. Без этого событийная синхронизация опасна.

Как не потерять события при сбое?

Нужны надёжная доставка и повторы. Событие считается обработанным только после подтверждения; до этого оно остаётся в очереди и будет доставлено снова. Добавляют экспоненциальные повторы при ошибках и очередь недоставленных сообщений (dead letter) для разбора. Ещё полезен журнал событий: если что-то потерялось, состояние восстанавливают воспроизведением. Комбинация очереди, подтверждений и журнала даёт гарантию, что изменение не пропадёт.

Можно ли совместить событийную модель со штатным обменом CommerceML?

Да, и часто это оптимально. Штатный обмен CommerceML остаётся для полной выгрузки каталога и первичной синхронизации, а событийная модель работает поверх для оперативных изменений — остатков, цен, статусов заказов. Получается гибрид: тяжёлый периодический обмен как основа согласованности плюс быстрые события для актуальности. Полная сверка по расписанию тогда играет роль страховки, выравнивающей расхождения.

Как события помогают синхронизировать заказы с сайта в 1С?

При оформлении заказа на сайте возникает событие «создан заказ», которое кладётся в очередь и надёжно доставляется в 1С, где создаётся документ. Изменение статуса в 1С — оплачен, собран, отгружён — порождает обратное событие, обновляющее статус на сайте и в личном кабинете. Двусторонний поток событий держит заказ синхронным в обеих системах без ручного вмешательства и без ожидания следующего пакетного обмена.

Какая задержка достижима при событийной синхронизации?

На практике от секунд до единиц минут против интервала пакетного обмена в 5–30 минут. Точная величина зависит от скорости воркеров, доступности 1С и объёма потока. Для остатков ходовых товаров и статусов заказов такая свежесть критична: она снижает оверселлинг и держит клиента в курсе. Гарантировать «мгновенность» нельзя — 1С не всегда доступна в реальном времени, — но событийная модель сокращает задержку кратно.

С чего начать переход на событийную архитектуру?

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

Поделиться:

Остатки на сайте отстают от учёта и рождают оверселлинг?

Спроектируем событийную синхронизацию заказов и складов с 1С на 1С-Битрикс. Разберём вашу интеграцию и рассчитаем работу.

Редакция B2Bsite

Команда B2Bsite. С 2014 года разрабатываем интеграции сайтов на 1С-Битрикс с 1С: событийную синхронизацию, надёжный обмен заказами и остатками, очереди и мониторинг для среднего и крупного бизнеса.

← Все статьи блога