Production-ready интеграция платформы 1С:Предприятие с брокером сообщений RabbitMQ через Native-компоненту PinkRabbitMQ.
- Idempotent-обработка — каждое сообщение имеет уникальный идентификатор, предотвращает дублирование
- Retry-механизм — до 5 автоматических попыток отправки при сетевых сбоях
- Транзакционная целостность — обработка входящих сообщений с откатом при ошибках бизнес-логики
- Асинхронная очередь — отложенная отправка через регистр
RMQ_ОчередьИсходящихдля толстого клиента и фоновых заданий
- Пакетная обработка — настраиваемый размер пакета (по умолчанию 20 сообщений)
- Сжатие данных — встроенное сжатие JSON (уровень 9) через
ХранилищеЗначения - Кэширование соединений — переиспользование соединения в рамках одного подключения
- Оптимизированные запросы — использование ВТ и индексов для пакетной выгрузки
- Мультиподключения — поддержка нескольких подключений к RabbitMQ с разными настройками
- Разделение ответственности — чёткое разделение модулей: интеграция, логирование, бизнес-логика
- Магазин настроек — все настройки подключения хранятся в регистре сведений
- Синхронизация очередей — автоматическая синхронизация с брокером через HTTP Management API
- Документирующие комментарии — все экспортные функции полностью документированы
- Структурированная логика — понятная и поддерживаемая архитектура
- Логирование — 4 уровня (Информация, Предупреждение, Ошибка, КритическаяОшибка) с асинхронной записью
- Нативная сериализация JSON — использование стандартных средств платформы без COM-объектов
Все технические детали интеграции скрыты внутри сервисного слоя. Разработчику прикладных решений доступен программный интерфейс общего модуля ИнтеграцияRabbitMQСервер:
// Параметры: ИмяПодключения, ИмяОчереди, Данные
ИнтеграцияRabbitMQСервер.ОтправитьСообщение(
"Продуктив",
"orders",
Новый Структура("СтатусЗаказа, Сумма, Менеджер", "Новый", 1000, "Иоанн")
);// Данные автоматически сериализуются в JSON и сжимаются алгоритмом ZIP в локальную СУБД
ИнтеграцияRabbitMQСервер.ЗарегистрироватьКВыгрузке(
"Продуктив",
"orders",
Новый Структура("СтатусЗаказа, Сумма, Менеджер", "Новый", 1000, "Иоанн")
);// Вызывается регламентным заданием. Выгребает пачки оконным SQL-запросом
ИнтеграцияRabbitMQСервер.ВыполнитьВыгрузкуПакетовВRabbitMQ();// Пакетное извлечение сообщений из активных очередей через НаборЗаписей
ИнтеграцияRabbitMQСервер.ВыполнитьЗагрузкуПакетовИзRabbitMQ_Регламент();// Нативная десериализация JSON-потока в изолированных бизнес-транзакциях
ИнтеграцияRabbitMQСервер.ВыполнитьОбработкуВходящихПакетов();// Автоматический опрос веб-админки брокера и актуализация справочников очередей
ИнтеграцияRabbitMQСервер.СинхронизироватьОчередиСRabbitMQ();Внутренняя архитектура модуля строго разделяет сервисный слой (транспорт) и прикладной слой (бизнес-логику). Потоковый разбор входящих пакетов из RabbitMQ изолирован от механизмов СУБД-приемки.
После успешной десериализации JSON-потока в нативную структуру 1С, управление передается специализированному процессору бизнес-логики. Функция ОбработатьБизнесОбъект выступает в роли точки входа для интеграции с прикладными объектами конфигурации:
// Проверяет соответствие бизнес-объекта требованиям обработки
Функция ОбработатьБизнесОбъект(Знач Данные)
// Строгая валидация входящей структуры на соответствие ожидаемому типу и маркерам формата
Если ТипЗнч(Данные) <> Тип("Структура") Или Не Данные.Свойство("СтатусЗаказа") Тогда
Возврат Ложь;
КонецЕсли;
// [Точка расширения]: Здесь инкапсулируется реальная логика создания прикладных объектов 1С.
// Модуль спроектирован так, что разработчику достаточно прописать в этом блоке
// вызов создания/обновления документов (например, ЗаказКлиента, ПоступлениеТоваровУслуг),
// при этом ядро транспортного механизма и логика СУБД-очередей остаются неизменными.
Возврат Истина;
КонецФункцииВызов процессора бизнес-логики принудительно обернут в безопасную локальную транзакцию на стороне 1С:
- Изоляция сбоев: Если в процессе создания или проведения реального документа в 1С произойдет любая прикладная ошибка (сработает проверка заполнения реквизитов, контроль остатков, запрет редактирования периода), транзакция полностью откатится. База данных останется в консистентном состоянии.
- Защита от потери данных: При аварийном отказе прикладного слоя запись во входящей очереди РС остается со статусом
Обработано = Ложь. Фоновый робот не потеряет это сообщение и автоматически предпримет повторную попытку обработки на следующем цикле расписания, дав время администраторам исправить прикладную ошибку (например, завести отсутствующую номенклатуру).
Вся подсистема спроектирована как независимый, изолированный интеграционный контур. Ниже представлена схема взаимодействия компонентов и детальная структура метаданных архитектурного стенда:
| Тип объекта | Имя объекта | Архитектурная роль и назначение |
|---|---|---|
| Общий модуль | Интеграция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 кнопок) для пошаговой эмуляции и мониторинга каждого этапа шины. |
Опираясь на структуру метаданных, стек обмена работает по строгому регламенту:
- Регистрация изменений (Слой бизнес-приложений): Прикладной объект (например, документ) передает структуру данных в метод
ЗарегистрироватьКВыгрузке. Платформа упаковывает данные вХранилищеЗначенийи пишет строку вRMQ_ОчередьИсходящихс состоянием"Новое". Транзакция документа закрывается за миллисекунды. Сеть не задействуется. - Асинхронный экспорт (Регламентное задание №1): Оконный запрос собирает записи из
RMQ_ОчередьИсходящих, ограничивая пачки индивидуальным лимитом изRMQ_НастройкиПодключения. Native-компонента открывает сокет, выталкивает пачку JSON в RabbitMQ и одной командой очищает РС исходящих. - Автоматическое обнаружение (Регламентное задание №2): Система выполняет REST-запросы к HTTP Management API брокера, актуализируя статусы очередей в
RMQ_ОчередиКЗагрузке. - Асинхронный импорт (Регламентное задание №3): Код опрашивает только активные очереди. Данные выкачиваются в оперативную память 1С, подтверждаются брокеру пачкой (
BasicAck), сжимаются и одним выстрелом черезНаборЗаписейсохраняются вRMQ_ОчередьВходящих. - Десериализация и процессинг (Регламентное задание №4): Входящий процессор берет пакеты из
RMQ_ОчередьВходящих, разжимает ZIP-хэш, выполняет нативный потоковый парсинг JSON в транзакциях 1С и передает готовые структуры прикладному коду.
Для ввода интеграционного стенда в эксплуатацию необходимо выполнить три последовательных шага настройки в режиме 1С:Предприятие:
Заполните записи независимого регистра сведений RMQ_НастройкиПодключения:
| Реквизит | Назначение и Описание |
|---|---|
| ИмяПодключения | Уникальное имя для идентификации интеграционного контура. |
| АдресХоста | IP-адрес или DNS-имя сервера RabbitMQ. |
| Порт | Сетевой порт AMQP-протокола (по умолчанию: 5672). |
| Пользователь | Логин учетной записи для аутентификации. |
| Пароль | Пароль учетной записи для аутентификации. |
| ВиртуальныйХост | Изолированная комната брокера (по умолчанию: /). |
| РазмерПакетаВыгрузки | Лимит пачки СУБД для одного прохода робота (если 0, то по умолчанию 20). |
Заполните записи независимого регистра сведений RMQ_ОчередиКЗагрузке с помощью вызова СинхронизироватьОчередиСRabbitMQ():
| Реквизит | Назначение и Описание |
|---|---|
| ИмяПодключения | Имя интеграционного контура из регистра настроек. |
| ИмяОчереди | Физическое имя целевой очереди на сервере RabbitMQ. |
| Активно | Признак включения/отключения автоматической загрузки роботом. |
Для проверки транспортного сокета достаточно выполнить экспресс-метод общего модуля в одну строку:
ИнтеграцияRabbitMQСервер.ОтправитьСообщение("Продуктив", "test_queue", "Hello, RabbitMQ!");В процедуре автоматического обнаружения инфраструктуры СинхронизироватьОчередиС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С и сетевой активности брокера разработан интерактивный тестовый полигон. Ниже представлены скриншоты ключевых узлов системы в момент пиковой пакетной нагрузки:
-
Регистр сведений
RMQ_НастройкиПодключения: Центральное хранилище авторизационных данных и индивидуальных лимитов СУБД-пакетов.
-
Регистр сведений
RMQ_ОчередиКЗагрузке: Динамический реестр очередей, автоматически синхронизированный с брокером через REST HTTP API.
-
Регистр сведений
RMQ_ОчередьИсходящих(Outbox): Содержит зарегистрированные пакеты.
-
Регистр сведений
RMQ_ОчередьВходящих(Inbox): Результат пакетного забора из шины за одну транзакциюНабораЗаписей. Время фиксации строк совпадает секунда в секунду.
-
Метрики RabbitMQ Management Console: Пики на графиках активности (Queued messages / Message rates), фиксирующие сквозной пакетный проход данных и своевременные подтверждения
BasicAck.
-
Журнал регистрации (
ЛогированиеПриложений): Финальная точка интеграции. Успешный транзакционный разбор нативного JSON-потока процессором бизнес-логики.
Если у вас возникли вопросы по архитектуре стенда, оптимизации СУБД-запросов или вы хотите обсудить коммерческое внедрение данного интеграционного модуля, свяжитесь со мной:
- GitHub: @Brightontik 🚀
- Telegram: @brighontik 💬