Skip to content

Brightontik/1C-RabbitMQ-Integration

Repository files navigation

1C-RabbitMQ-Integration

Production-ready интеграция платформы 1С:Предприятие с брокером сообщений RabbitMQ через Native-компоненту PinkRabbitMQ.

🚀 Особенности

✅ Надёжность

  • Idempotent-обработка — каждое сообщение имеет уникальный идентификатор, предотвращает дублирование
  • Retry-механизм — до 5 автоматических попыток отправки при сетевых сбоях
  • Транзакционная целостность — обработка входящих сообщений с откатом при ошибках бизнес-логики
  • Асинхронная очередь — отложенная отправка через регистр RMQ_ОчередьИсходящих для толстого клиента и фоновых заданий

⚡ Производительность

  • Пакетная обработка — настраиваемый размер пакета (по умолчанию 20 сообщений)
  • Сжатие данных — встроенное сжатие JSON (уровень 9) через ХранилищеЗначения
  • Кэширование соединений — переиспользование соединения в рамках одного подключения
  • Оптимизированные запросы — использование ВТ и индексов для пакетной выгрузки

🔧 Архитектура

  • Мультиподключения — поддержка нескольких подключений к RabbitMQ с разными настройками
  • Разделение ответственности — чёткое разделение модулей: интеграция, логирование, бизнес-логика
  • Магазин настроек — все настройки подключения хранятся в регистре сведений
  • Синхронизация очередей — автоматическая синхронизация с брокером через HTTP Management API

📝 Качество кода

  • Документирующие комментарии — все экспортные функции полностью документированы
  • Структурированная логика — понятная и поддерживаемая архитектура
  • Логирование — 4 уровня (Информация, Предупреждение, Ошибка, КритическаяОшибка) с асинхронной записью
  • Нативная сериализация JSON — использование стандартных средств платформы без COM-объектов

💻 Публичный программный интерфейс (API модуля)

Все технические детали интеграции скрыты внутри сервисного слоя. Разработчику прикладных решений доступен программный интерфейс общего модуля ИнтеграцияRabbitMQСервер:

1. Отправка сообщений

📥 Прямая синхронная отправка (экспресс-тест канала)

// Параметры: ИмяПодключения, ИмяОчереди, Данные
ИнтеграцияRabbitMQСервер.ОтправитьСообщение(
	"Продуктив", 
	"orders", 
	Новый Структура("СтатусЗаказа, Сумма, Менеджер", "Новый", 1000, "Иоанн")
);

⏳ Отложенная асинхронная отправка (Паттерн Outbox)

// Данные автоматически сериализуются в JSON и сжимаются алгоритмом ZIP в локальную СУБД
ИнтеграцияRabbitMQСервер.ЗарегистрироватьКВыгрузке(
	"Продуктив", 
	"orders", 
	Новый Структура("СтатусЗаказа, Сумма, Менеджер", "Новый", 1000, "Иоанн")
);

2. Выгрузка в RabbitMQ

📦 Пакетный экспорт исходящей очереди

// Вызывается регламентным заданием. Выгребает пачки оконным SQL-запросом
ИнтеграцияRabbitMQСервер.ВыполнитьВыгрузкуПакетовВRabbitMQ();

3. Получение и обработка сообщений

📥 Пакетный забор данных из шины в СУБД

// Пакетное извлечение сообщений из активных очередей через НаборЗаписей
ИнтеграцияRabbitMQСервер.ВыполнитьЗагрузкуПакетовИзRabbitMQ_Регламент();

⚙️ Потоковый парсинг входящей очереди

// Нативная десериализация JSON-потока в изолированных бизнес-транзакциях
ИнтеграцияRabbitMQСервер.ВыполнитьОбработкуВходящихПакетов();

4. Синхронизация инфраструктуры

🔄 REST API синхронизация очередей

// Автоматический опрос веб-админки брокера и актуализация справочников очередей
ИнтеграцияRabbitMQСервер.СинхронизироватьОчередиСRabbitMQ();

🏗️ Архитектура обработки данных и Бизнес-логика

Внутренняя архитектура модуля строго разделяет сервисный слой (транспорт) и прикладной слой (бизнес-логику). Потоковый разбор входящих пакетов из RabbitMQ изолирован от механизмов СУБД-приемки.

🛡️ Слой валидации и обработки бизнес-объектов

После успешной десериализации JSON-потока в нативную структуру 1С, управление передается специализированному процессору бизнес-логики. Функция ОбработатьБизнесОбъект выступает в роли точки входа для интеграции с прикладными объектами конфигурации:

// Проверяет соответствие бизнес-объекта требованиям обработки
Функция ОбработатьБизнесОбъект(Знач Данные)
	
	// Строгая валидация входящей структуры на соответствие ожидаемому типу и маркерам формата
	Если ТипЗнч(Данные) <> Тип("Структура") Или Не Данные.Свойство("СтатусЗаказа") Тогда
		Возврат Ложь; 
	КонецЕсли;
	
	// [Точка расширения]: Здесь инкапсулируется реальная логика создания прикладных объектов 1С.
	// Модуль спроектирован так, что разработчику достаточно прописать в этом блоке 
	// вызов создания/обновления документов (например, ЗаказКлиента, ПоступлениеТоваровУслуг),
	// при этом ядро транспортного механизма и логика СУБД-очередей остаются неизменными.
	
	Возврат Истина;
	
КонецФункции

🔒 Гарантии транзакционности (ACID)

Вызов процессора бизнес-логики принудительно обернут в безопасную локальную транзакцию на стороне 1С:

  1. Изоляция сбоев: Если в процессе создания или проведения реального документа в 1С произойдет любая прикладная ошибка (сработает проверка заполнения реквизитов, контроль остатков, запрет редактирования периода), транзакция полностью откатится. База данных останется в консистентном состоянии.
  2. Защита от потери данных: При аварийном отказе прикладного слоя запись во входящей очереди РС остается со статусом Обработано = Ложь. Фоновый робот не потеряет это сообщение и автоматически предпримет повторную попытку обработки на следующем цикле расписания, дав время администраторам исправить прикладную ошибку (например, завести отсутствующую номенклатуру).

🗺️ Карта метаданных и Архитектура системы

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

📊 Объекты метаданных и их назначение

Тип объекта Имя объекта Архитектурная роль и назначение
Общий модуль ИнтеграцияRabbitMQСервер Сервисный слой подсистемы. Инкапсулирует нативную инициализацию, оконные запросы, пакетную запись и REST API Discovery.
Общий модуль ЛогированиеПриложений Слой аудита (БСП). Отвечает за структурированную запись информационных событий и критических ошибок в Журнал регистрации.
Регистр сведений RMQ_НастройкиПодключения Независимый РС. Хранит параметры авторизации, адреса хостов, vhost, а также регулирует динамический размер пакета выгрузки (Лимит пачки СУБД).
Регистр сведений RMQ_ОчередьИсходящих Независимый РС (Паттерн Outbox). Буфер для мгновенной фиксации исходящих JSON-пакетов, сжатых в ZIP-BLOB (ХранилищеЗначений).
Регистр сведений RMQ_ОчередьВходящих Независимый РС (Паттерн Inbox). Служит накопителем для входящих пакетов. Наполнение происходит пакетно через НаборЗаписей в одной транзакции.
Регистр сведений RMQ_ОчередиКЗагрузке Независимый РС. Динамический реестр активных очередей на стороне RabbitMQ. Управляет автоматическим фоновым опросом брокера.
Общий макет PinkRabbitMQ Двоичные данные. Содержит кроссплатформенный bundle (пакет) Native API внешней компоненты (.dll / .so) под разные разрядности (x32/x64).
Обработка ОбработкаRabbitMQ Тестовый интерактивный полигон. Предоставляет графический интерфейс (6 кнопок) для пошаговой эмуляции и мониторинга каждого этапа шины.

🔄 Жизненный цикл сообщения (Сквозной проход данных)

Опираясь на структуру метаданных, стек обмена работает по строгому регламенту:

  1. Регистрация изменений (Слой бизнес-приложений): Прикладной объект (например, документ) передает структуру данных в метод ЗарегистрироватьКВыгрузке. Платформа упаковывает данные в ХранилищеЗначений и пишет строку в RMQ_ОчередьИсходящих с состоянием "Новое". Транзакция документа закрывается за миллисекунды. Сеть не задействуется.
  2. Асинхронный экспорт (Регламентное задание №1): Оконный запрос собирает записи из RMQ_ОчередьИсходящих, ограничивая пачки индивидуальным лимитом из RMQ_НастройкиПодключения. Native-компонента открывает сокет, выталкивает пачку JSON в RabbitMQ и одной командой очищает РС исходящих.
  3. Автоматическое обнаружение (Регламентное задание №2): Система выполняет REST-запросы к HTTP Management API брокера, актуализируя статусы очередей в RMQ_ОчередиКЗагрузке.
  4. Асинхронный импорт (Регламентное задание №3): Код опрашивает только активные очереди. Данные выкачиваются в оперативную память 1С, подтверждаются брокеру пачкой (BasicAck), сжимаются и одним выстрелом через НаборЗаписей сохраняются в RMQ_ОчередьВходящих.
  5. Десериализация и процессинг (Регламентное задание №4): Входящий процессор берет пакеты из RMQ_ОчередьВходящих, разжимает ZIP-хэш, выполняет нативный потоковый парсинг JSON в транзакциях 1С и передает готовые структуры прикладному коду.

⚡ Быстрый старт и Настройка подсистемы

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

1. Настройка подключения к брокеру

Заполните записи независимого регистра сведений RMQ_НастройкиПодключения:

Реквизит Назначение и Описание
ИмяПодключения Уникальное имя для идентификации интеграционного контура.
АдресХоста IP-адрес или DNS-имя сервера RabbitMQ.
Порт Сетевой порт AMQP-протокола (по умолчанию: 5672).
Пользователь Логин учетной записи для аутентификации.
Пароль Пароль учетной записи для аутентификации.
ВиртуальныйХост Изолированная комната брокера (по умолчанию: /).
РазмерПакетаВыгрузки Лимит пачки СУБД для одного прохода робота (если 0, то по умолчанию 20).

2. Настройка очередей для загрузки

Заполните записи независимого регистра сведений RMQ_ОчередиКЗагрузке с помощью вызова СинхронизироватьОчередиСRabbitMQ():

Реквизит Назначение и Описание
ИмяПодключения Имя интеграционного контура из регистра настроек.
ИмяОчереди Физическое имя целевой очереди на сервере RabbitMQ.
Активно Признак включения/отключения автоматической загрузки роботом.

3. Отправка первого тестового сообщения

Для проверки транспортного сокета достаточно выполнить экспресс-метод общего модуля в одну строку:

ИнтеграцияRabbitMQСервер.ОтправитьСообщение("Продуктив", "test_queue", "Hello, RabbitMQ!");

🔒 Важное примечание по сетевой безопасности (HTTP vs HTTPS)

В процедуре автоматического обнаружения инфраструктуры СинхронизироватьОчередиСRabbitMQ() используется нативный механизм Base64-авторизации для взаимодействия с Management REST API брокера.

ДвоичныеДанныеСтроки = ПолучитьДвоичныеДанныеИзСтроки(ТекущийКонтур.Пользователь + ":" + ТекущийКонтур.Пароль, КодировкаТекста.UTF8, Ложь);
ЗначениеАвторизации  = Base64Строка(ДвоичныеДанныеСтроки);
ЗначениеАвторизации  = СтрЗаменить(ЗначениеАвторизации, Символы.ПС, "");
ЗначениеАвторизации  = СтрЗаменить(ЗначениеАвторизации, Символы.ВК, "");

Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Basic " + ЗначениеАвторизации);

// Локальное HTTP-соединение без шифрования трафика
HTTPСоединение = Новый HTTPСоединение(ТекущийКонтур.АдресХоста, ПортАдминки, ТекущийКонтур.Пользователь, ТекущийКонтур.Пароль);
HTTPЗапрос = Новый HTTPЗапрос(ПутьЗапроса, Заголовки);

⚠️ Архитектурное разграничение контуров:

  • Локальный стенд / Разработка: В текущей кодовой базе для локального тестирования (127.0.0.1) используется обычный протокол HTTP (порт 15672), поэтому объект ЗащищенноеСоединениеOpenSSL намеренно опущен в конструкторе HTTPСоединение.
  • Промышленный контур (Enterprise): Для работы в боевой корпоративной сети передача секретов в открытом виде запрещена. При переходе на зашифрованный протокол HTTPS (порт 15671) конструктор HTTPСоединение должен быть дополнен обязательным финальным параметром: ..., Новый ЗащищенноеСоединениеOpenSSL().

📋 Системные требования к окружению

  • Платформа 1С: Версия 1С:Предприятие 8.3.20+ (требуется для поддержки встроенных оконных функций в SQL-запросах платформы).
  • Компонента: Кроссплатформенная Native API компонента PinkRabbitMQ (поставщик BIT:ERP).
  • Брокер сообщений: RabbitMQ 3.8+ с обязательным включением плагина rabbitmq_management для работы Service Discovery.

🎯 Сценарии использования и Матрица возможностей

Подсистема спроектирована под конкретный набор интеграционных задач. Ниже приведена матрица поддерживаемых архитектурных сценариев и ограничений текущего релиза:

📊 Матрица поддерживаемых сценариев

Сценарий использования Поддерживается? Техническая реализация
Отправка сообщений напрямую в очередь 🟩 Да Метод ОтправитьСообщение с прямой адресацией (Default Exchange).
Пакетная обработка сообщений 🟩 Да Чтение через НаборЗаписей.Записать(Ложь) и оконная выгрузка пачками.
Асинхронная отправка 🟩 Да Паттерн Transactional Outbox через локальный буфер СУБД 1С.
Retry при ошибках отправки 🟩 Да Счетчик КоличествоПопыток в РС. Авто-повтор до 5 раз при сбоях сети.
Idempotent-обработка (Идемпотентность) 🟩 Да Уникальный GUID-ключ пакета исключает дублирование документов в 1С.
Мультиподключения 🟩 Да Динамическая смена сетевых сокетов в цикле по ключу из РС настроек.
Топологии Exchange (topic, fanout) 🟥 Нет Текущий релиз работает через Default Exchange (напрямую в очереди).
Routing Keys и Bindings 🟥 Нет Маршрутизация на стороне Кролика ограничена именами очередей.
Dead Letter Queue (карантин) 🟥 Нет «Ядовитые» пакеты маркируются флагом Ошибка без авто-переноса в DLX.
SSL/TLS подключение 🟥 Нет Сетевой стек Management API настроен на локальный HTTP-протокол.

⚙️ Регламентные задачи и Автоматизация (Фоновый слой)

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

Рекомендуется настроить следующие Регламентные задания со строгим соблюдением расписания:

Задача автоматизации Вызываемая процедура общего модуля Рекомендуемый период запуска
Загрузка из RabbitMQ ИнтеграцияRabbitMQСервер.ВыполнитьЗагрузкуПакетовИзRabbitMQ_Регламент Каждый день, каждые 1-5 мин.
Обработка входящих ИнтеграцияRabbitMQСервер.ВыполнитьОбработкуВходящихПакетов Каждый день, каждые 1-5 мин.
Выгрузка в RabbitMQ ИнтеграцияRabbitMQСервер.ВыполнитьВыгрузкуПакетовВRabbitMQ Каждый день, каждые 1-5 мин.
Синхронизация очередей ИнтеграцияRabbitMQСервер.СинхронизироватьОчередиСRabbitMQ Каждый день, каждые 10-30 мин.

📸 Визуализация работы стенда и Мониторинг

Для наглядного контроля транзакционных очередей СУБД 1С и сетевой активности брокера разработан интерактивный тестовый полигон. Ниже представлены скриншоты ключевых узлов системы в момент пиковой пакетной нагрузки:

1. Инфраструктурный слой и Настройки

  • Регистр сведений RMQ_НастройкиПодключения: Центральное хранилище авторизационных данных и индивидуальных лимитов СУБД-пакетов. image

  • Регистр сведений RMQ_ОчередиКЗагрузке: Динамический реестр очередей, автоматически синхронизированный с брокером через REST HTTP API. image

2. Транспортный слой (Очереди СУБД 1С)

  • Регистр сведений RMQ_ОчередьИсходящих (Outbox): Содержит зарегистрированные пакеты. image

  • Регистр сведений RMQ_ОчередьВходящих (Inbox): Результат пакетного забора из шины за одну транзакцию НабораЗаписей. Время фиксации строк совпадает секунда в секунду. image

3. Мониторинг Брокера и Логирование

  • Метрики RabbitMQ Management Console: Пики на графиках активности (Queued messages / Message rates), фиксирующие сквозной пакетный проход данных и своевременные подтверждения BasicAck. image

  • Журнал регистрации (ЛогированиеПриложений): Финальная точка интеграции. Успешный транзакционный разбор нативного JSON-потока процессором бизнес-логики. image


👨‍💻 Разработчик проекта

Если у вас возникли вопросы по архитектуре стенда, оптимизации СУБД-запросов или вы хотите обсудить коммерческое внедрение данного интеграционного модуля, свяжитесь со мной:

Releases

No releases published

Packages

 
 
 

Contributors