Как правильно организовать асинхронный обмен данными в 1С через брокеры сообщений и стоит ли использовать NATS Streaming?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Классические механизмы интеграции в экосистеме 1С:Предприятие традиционно базируются на планах обмена (компонентах БСП) и периодической пакетной выгрузке данных в формате XML. На малых базах эта схема работает отлично, но при росте нагрузки, увеличении количества связанных информационных систем и повышении требований к актуальности данных классический обмен начинает давать сбои. Огромные XML-пакеты нагружают оперативную память, транзакции блокируют таблицы СУБД, а разбор ошибок превращается в детективное расследование, когда из-за одного некорректного документа "откатывается" весь многомегабайтный пакет.

Альтернативой является переход к событийной архитектуре (Event-Driven Architecture, или EDA) с использованием внешних брокеров сообщений (RabbitMQ, Apache Kafka, NATS). В этой статье мы подробно разберем, как устроен гарантированный обмен сообщениями между 1С и внешними брокерами, проанализируем статус технологии NATS Streaming и рассмотрим новые архитектурные решения от самой фирмы 1С.

NATS Streaming: устаревшая технология или рабочий инструмент?

В исходном обсуждении автор интересуется возможностью использования NATS Streaming в режиме гарантированной доставки (Durable). Разберем этот вопрос с технической точки зрения.

Прежде всего, важно знать, что проект NATS Streaming (также известный как STAN) официально признан устаревшим (deprecated). Разработчики прекратили его активную поддержку и выпуск новых функций. Использовать его в новых проектах в промышленной эксплуатации крайне не рекомендуется по следующим причинам:

  1. Сложная архитектура хранения сообщений: Для обеспечения режима Durable в STAN требовалось подключать внешние реляционные базы данных (например, MySQL или PostgreSQL) либо использовать медленную запись на диск. Это лишало систему ее главного преимущества — сверхвысокой производительности.
  2. Отсутствие нативной масштабируемости: Кластеризация в NATS Streaming была сложной в настройке и часто приводила к потере консистентности данных при сбоях сети.

Ему на смену пришла современная технология — NATS JetStream, которая теперь встроена непосредственно в ядро NATS Server (начиная с версии 2.2). JetStream полностью решает проблемы старого STAN:

Таким образом, если вы рассматриваете стек NATS для интеграции с 1С, ваш выбор — исключительно NATS JetStream.

Паттерн гарантированной доставки: Transactional Outbox в 1С

Основной страх разработчиков при отказе от классических планов обмена 1С — это потеря контроля над доставкой. В планах обмена источник хранит регистрацию изменений до тех пор, пока получатель не пришлет подтверждение (квитанцию). Как реализовать аналогичную надежность с брокером сообщений?

Для этого применяется классический архитектурный паттерн — Transactional Outbox (Локальная таблица исходящих) на стороне отправителя и Idempotent Consumer (Идемпотентный получатель / Локальная таблица входящих) на стороне получателя. Разберем эту схему по шагам:

  1. Запись объекта и сообщения в одной транзакции СУБД: При изменении или проведении документа в 1С (базе-источнике) мы сериализуем этот объект в легковесный JSON-пакет, описывающий состояние только этого конкретного объекта (атомарное сообщение). Данный JSON-пакет записывается в специальную локальную таблицу (например, служебный регистр сведений ЛокальнаяОчередьИсходящих) внутри той же транзакции, в которой записывается сам документ.
  2. Асинхронная отправка: Отдельное фоновое задание (демон/регламентное задание) считывает записи из регистра ЛокальнаяОчередьИсходящих и пытается отправить их в брокер сообщений.
  3. Фиксация отправки: Только после того, как брокер прислал подтверждение успешного приема (ACK), фоновое задание удаляет сообщение из регистра ЛокальнаяОчередьИсходящих. Если брокер недоступен или произошел сбой сети, транзакция отправки не завершается, данные остаются в 1С и попытка повторится через интервал времени.
  4. Прием на стороне получателя: База-получатель (другая информационная система 1С) вычитывает сообщения из своей очереди в брокере и сразу же сохраняет их в свой локальный регистр ЛокальнаяОчередьВходящих, подтверждая брокеру прием. С этого момента брокер считает сообщение доставленным.
  5. Асинхронная обработка получателем: Отдельное фоновое задание в базе-получателе поочередно обрабатывает сообщения из регистра ЛокальнаяОчередьВходящих, создавая или обновляя соответствующие объекты 1С. После успешной записи объекта сообщение удаляется из входящей очереди.

Рассмотрим пример реализации записи в локальную исходящую очередь на встроенном языке 1С внутри транзакции проведения документа:


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    // Выполняем стандартные действия по проведению документа
    // ...
    
    // Начинаем подготовку сообщения для брокера
    ДанныеДокумента = Новый Структура;
    ДанныеДокумента.Вставить("Идентификатор", Строка(Ссылка.УникальныйИдентификатор()));
    ДанныеДокумента.Вставить("Номер", ЭтотОбъект.Номер);
    ДанныеДокумента.Вставить("Дата", Формат(ЭтотОбъект.Дата, "ДФ=yyyy-MM-ddTHH:mm:ss"));
    ДанныеДокумента.Вставить("ОрганизацияИНН", ЭтотОбъект.Организация.ИНН);
    ДанныеДокумента.Вставить("КонтрагентИНН", ЭтотОбъект.Контрагент.ИНН);
    ДанныеДокумента.Вставить("Сумма", ЭтотОбъект.СуммаДокумента);
    
    // Сериализуем данные в формат JSON
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, ДанныеДокумента);
    ТелоJSON = ЗаписьJSON.Закрыть();
    
    // Записываем сообщение в транзакции в таблицу Outbox (регистр сведений)
    МенеджерЗаписи = РегистрыСведений.ЛокальнаяОчередьИсходящих.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.ИдентификаторСообщения = Строка(Новый УникальныйИдентификатор());
    МенеджерЗаписи.ТипСобытия = "Документ_РеализацияТоваровУслуг";
    МенеджерЗаписи.ТелоСообщения = ТелоJSON;
    МенеджерЗаписи.ДатаРегистрации = ТекущаяДатаСеанса();
    
    // Метод Записать() выполнится в рамках общей транзакции проведения.
    // Если проведение откатится, сообщение не попадет в таблицу отправки.
    МенеджерЗаписи.Записать(Истина);
    
КонецПроцедуры

Преимущества событийного подхода перед планами обмена БСП

Переход на точечную отправку JSON-сообщений дает колоссальные преимущества для крупных корпоративных систем:

"Мотоцикл от вендора": платформа 1С и современные инструменты интеграции

В конце обсуждения участники форума упоминают "мотоцикл от вендора", который должен решить проблему написания собственных велосипедов для работы с очередями. Речь идет о продукте "1С:Шина" (1C:Enterprise Service Bus), который фирма 1С выпустила как раз для решения задач асинхронной интеграции.

"1С:Шина" представляет собой отдельное серверное ПО, построенное на новой технологии "1С:Предприятие 8" (на базе среды разработки "1С:Элемент"). Она решает следующие задачи:

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

Выводы и рекомендации

Проанализировав развитие технологий интеграции в 1С, мы можем сформулировать следующие рекомендации:

  1. Забудьте про NATS Streaming (STAN) в новых проектах — эта технология мертва. Если вам необходима экосистема NATS, используйте исключительно встроенный движок NATS JetStream с Durable-консьюмерами.
  2. При проектировании архитектуры обмена на больших объемах данных уходите от пакетных обменов БСП в сторону событийных (Event-Driven) обменов на базе JSON/Protocol Buffers.
  3. Всегда используйте паттерн Transactional Outbox. Никогда не отправляйте запросы к внешнему брокеру напрямую из кода транзакции записи объекта 1С, всегда делайте это через промежуточную таблицу буферизации или встроенные СервисыИнтеграции платформы.
  4. Для построения сложных ландшафтов интеграции обратите внимание на готовый программный продукт "1С:Шина", который позволяет минимизировать затраты на написание собственного транспортного слоя и администрирование внешних брокеров.
← На главную