Использование очередей IBM MQ в 1С для высоконадежной доставки транзакций
При интеграции 1С с банковскими и enterprise-системами на базе IBM MQ возникают сбои:
- Ошибки подключения к Queue Manager:
MQRC 2035 (MQRC_NOT_AUTHORIZED)илиMQRC 2059 (MQRC_Q_MGR_NOT_AVAILABLE). - Потеря сообщений при аварийном разрыве сессии во время обработки пакета.
- Зависание очереди при переполнении Dead Letter Queue (DLQ).
- Ошибки кодовых страниц EBCDIC/ASCII при передаче кириллических строк.
1. Архитектура интеграции IBM MQ с 1С
Взаимодействие с IBM MQ может осуществляться двумя путями:
- IBM MQ REST API (Рекомендуемый современный стандарт): Отправка сообщений через HTTPS-шлюз брокера (порт 9443) без установки C-клиентов.
- IBM MQ C Client / Java Bridge: Подключение через внешнюю Native-компоненту 1С.
2. Отправка сообщения в очередь IBM MQ через REST API
&НаСервере
Функция ОтправитьСообщениеВ_IBMMQ(ИмяОчереди, ТекстСообщенияJSON, QM_Name)
ПараметрыTLS = Новый ПараметрыЗащищенногоСоединенияOpenSSL();
HTTPСоединение = Новый HTTPСоединение(
"ibmmq.bank.corp",
9443,
"mq_user",
"mq_secret_pass",
,
30,
Новый ЗащищенноеСоединениеOpenSSL(ПараметрыTLS)
);
Путь = СтрШаблон("/ibmmq/rest/v1/messaging/qmgr/%1/queue/%2/message", QM_Name, ИмяОчереди);
HTTPЗапрос = Новый HTTPЗапрос(Путь);
HTTPЗапрос.Заголовки.Вставить("ibm-mq-rest-csrf-token", "csrf_token_val");
HTTPЗапрос.Заголовки.Вставить("Content-Type", "text/plain;charset=utf-8");
HTTPЗапрос.УстановитьТелоИзСтроки(ТекстСообщенияJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Попытка
HTTPОтвет = HTTPСоединение.ВызватьHTTPМетод("POST", HTTPЗапрос);
Если HTTPОтвет.КодСостояния <> 201 Тогда
ВызватьИсключение СтрШаблон("Ошибка IBM MQ (%1): %2",
HTTPОтвет.КодСостояния, HTTPОтвет.ПолучитьТелоКакСтроку());
КонецЕсли;
Возврат Истина;
Исключение
ЗаписьЖурналаРегистрации("IBM_MQ", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
ВызватьИсключение;
КонецПопытки;
КонецФункции3. Чтение и удаление сообщения из очереди (Destructive Read)
&НаСервере
Функция ВычитатьСообщениеИз_IBMMQ(ИмяОчереди, QM_Name)
ПараметрыTLS = Новый ПараметрыЗащищенногоСоединенияOpenSSL();
HTTPСоединение = Новый HTTPСоединение("ibmmq.bank.corp", 9443, "mq_user", "mq_secret_pass",, 30, Новый ЗащищенноеСоединениеOpenSSL(ПараметрыTLS));
Путь = СтрШаблон("/ibmmq/rest/v1/messaging/qmgr/%1/queue/%2/message", QM_Name, ИмяОчереди);
HTTPЗапрос = Новый HTTPЗапрос(Путь);
HTTPЗапрос.Заголовки.Вставить("ibm-mq-rest-csrf-token", "csrf_token_val");
// DELETE запрос извлекает и удаляет сообщение из очереди в одной операции
HTTPОтвет = HTTPСоединение.ВызватьHTTPМетод("DELETE", HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
Возврат HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
ИначеЕсли HTTPОтвет.КодСостояния = 204 Тогда
Возврат Неопределено; // Очередь пуста
Иначе
ВызватьИсключение "Ошибка чтения IBM MQ: " + HTTPОтвет.ПолучитьТелоКакСтроку();
КонецЕсли;
КонецФункции Частые вопросы (FAQ)
Что означает код ошибки MQRC 2035?
MQRC 2035 (MQRC_NOT_AUTHORIZED) указывает, что учетная запись, под которой подключается 1С, не имеет прав на подключение к каналу (CHLAUTH) или прав PUT/GET на целевую очередь.
Что такое Dead Letter Queue (DLQ) в IBM MQ?
Это специальная системная очередь недоставленных сообщений, куда брокер перемещает сообщения, которые не могут быть помещены в целевую очередь (например, при ее переполнении или отсутствии прав).
Зачем передавать заголовок ibm-mq-rest-csrf-token?
IBM MQ REST API требует обязательной защиты от Cross-Site Request Forgery (CSRF). Заголовок должен присутствовать во всех POST/DELETE запросах (значение может быть любым непустым при базовой аутентификации).
Как гарантировать транзакционность обработки пакета?
Используйте режим синхроточек (Syncpoint / 2PC). Сообщение подтверждается и удаляется из брокера только после успешной фиксации транзакции СУБД в базе 1С.