БонусБесплатный первый месяц абонентской поддержки при заказе разработки «под ключ»

Очереди и ретраи для надёжной отправки в 1С и платёжку

Очереди и ретраи для надёжной передачи заказов в 1С и платёжные системы на 1С-Битрикс

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

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

Коротко

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

Почему синхронная отправка ненадёжна

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

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

Очередь как буфер между сайтом и внешней системой

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

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

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

Синхронно против асинхронно

Разница между двумя подходами наглядна при сравнении.

АспектСинхронно (в лоб)Асинхронно (очередь)
Покупатель ждётВнешнюю системуТолько сохранение заказа
1С недоступнаОшибка, заказ теряетсяЗадача ждёт в очереди
Сбой на серединеНепонятное состояниеПовтор с идемпотентностью
Нагрузка на внешнюю системуПиками, неуправляемоРовным потоком
СложностьНижеВыше, но окупается

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

Идемпотентность: защита от дублей

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

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

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

Ретраи с нарастающей задержкой

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

  1. Первый повтор быстро. Через несколько секунд — вдруг был короткий сбой сети.
  2. Дальше с ростом задержки. Следующий позже, ещё следующий ещё позже — система получает время восстановиться.
  3. С ограничением попыток. Не бесконечно: после N неудач задача признаётся неотправляемой автоматически.
  4. С небольшим разбросом. Джиттер (случайная добавка к задержке) не даёт всем задачам биться в систему одновременно.

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

Dead letter: куда девать неотправленное

Даже с повторами часть задач в итоге не доставится: внешняя система лежит долго, данные некорректны, произошла невосстановимая ошибка. Такие задачи нельзя ни терять, ни повторять вечно — для них заводят отдельную очередь «мёртвых писем» (dead letter).

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

Особенности отправки в 1С

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

Поэтому здесь очередь работает особенно естественно: сайт сохранил заказ, показал покупателю успех, а доставка в 1С идёт фоном с повторами. Штатный обмен CommerceML в 1С-Битрикс сам по себе пакетный и асинхронный, но кастомные потоки (мгновенная передача статусов, отдельные события) стоит строить по тем же правилам — очередь, идемпотентность по идентификатору заказа, повторы. Как проектировать такие обмены устойчивыми и безопасными, мы разбираем в статьях про REST-вебхуки и безопасность и про работу с данными на D7 ORM.

Особенности платежей и чеков 54-ФЗ

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

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

Реализация очередей на 1С-Битрикс

Реализовать очередь на 1С-Битрикс можно на разном уровне сложности — и начинать стоит с простого.

  1. Таблица задач в базе. На небольших объёмах роль очереди играет таблица: сайт пишет задачу отправки, статус — «новая».
  2. Фоновый обработчик. Агент 1С-Битрикс или крон берёт новые задачи, выполняет, помечает результат.
  3. Повторы и статусы. При сбое задача остаётся с растущим счётчиком попыток и временем следующей попытки.
  4. Dead letter. После лимита попыток статус меняется на «неотправлено», задача уходит на ручной разбор.
  5. Внешний брокер при росте. Для высоких нагрузок и множества интеграций переходят на специализированный брокер очередей.

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

Мониторинг и сверка

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

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

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

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

  1. Критичные отправки асинхронны. Заказы и платежи идут через очередь, а не «в лоб».
  2. Заказ сохраняется первым. Сайт надёжно фиксирует заказ до любой внешней отправки.
  3. Идемпотентность есть. Каждая операция несёт ключ, повтор не создаёт дубль.
  4. Ретраи с backoff. Повторы с нарастающей задержкой, джиттером и лимитом попыток.
  5. Dead letter настроен. Безнадёжные задачи попадают на ручной разбор, а не теряются.
  6. Платежи под строгим контролем. Статусы фиксируются, заказ не завершается без оплаты и чека.
  7. Мониторинг работает. Размер очереди и dead letter под наблюдением.
  8. Сверка регулярна. Заказы сайта и 1С периодически сопоставляются.

Вывод

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

Три вещи делают эту схему рабочей: идемпотентность, без которой ретраи плодят дубли и двойные списания; повторы с нарастающей задержкой и лимитом; dead letter для того, что доставить не удалось. Добавьте мониторинг очереди и регулярную сверку сайта с 1С — и заказы перестанут теряться и дублироваться, а платежи и чеки будут доходить гарантированно. На 1С-Битрикс это начинается с простой таблицы задач и агента, а усложняется по мере роста нагрузки.

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

Зачем нужна очередь, если можно отправить заказ в 1С сразу?

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

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

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

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

С нарастающей задержкой (экспоненциальный backoff) и ограничением числа попыток. Не имеет смысла долбить упавшую систему каждую секунду — это её добивает. Первый повтор через несколько секунд, следующий позже, ещё позже — так система получает шанс восстановиться. После исчерпания попыток задача уходит в отдельную очередь «мёртвых писем» (dead letter) на ручной разбор, а не теряется и не повторяется бесконечно.

Чем отличается отправка в 1С от отправки в платёжную систему?

Требованиями к согласованности. Заказ в 1С можно доставить с задержкой — это фоновая синхронизация. С платежами и чеками по 54-ФЗ строже: оплата привязана к сессии пользователя и к юридическим срокам фискализации. Поэтому платёжный поток обычно быстрее и с более жёстким контролем статусов, но принципы те же — идемпотентность, повторы, фиксация каждого шага, чтобы ни платёж, ни чек не потерялись.

Что делать, если чек по 54-ФЗ не пробился?

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

Можно ли реализовать очереди на 1С-Битрикс без внешних сервисов?

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

Как понять, что интеграция теряет заказы?

Нужен мониторинг и сверка. Без них потери незаметны, пока не позвонит клиент. Минимум — логировать каждую задачу отправки и её статус, следить за размером очереди и числом задач в dead letter, регулярно сверять заказы на сайте с заказами в 1С. Рост очереди или ненулевой dead letter — сигнал, что что-то не доставляется. Сверка ловит расхождения раньше, чем их заметит бизнес.

Поделиться:

Заказы теряются или дублируются между сайтом и 1С?

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

Автоматизация на 1С

Игорь Воскресенский

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

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