Содержание
- Введение
- Архитектура
- Использование
- Команды
- Механизмы
- Описание интерфейса обработки
- Порядок компиляции go файлов
- Преимущества решения
Введение
Предлагаю вашему вниманию готовое решение для интеграции 1С с RabbitMQ, реализованное в виде внешней обработки для демонстрации и имеющее необходимые экспортные методы для простой интеграции в конфигурацию. Обработка наглядно демонстрирует все варианты взаимодействия двух систем. В основе обработки лежат исполняемые файлы, написанные на языке Go. Это сознательный архитектурный выбор, который дает:
- Максимальную производительность — статически скомпилированный бинарник.
- Кроссплатформенность — один и тот же код компилируется как для Windows, так и для Linux.
- Надежность — Go обеспечивает безопасную работу с памятью (сборщик мусора) и встроенную поддержку конкурентности.
- Простоту поддержки — код на Go читается как книга, а найти разработчика для его сопровождения не составляет труда.
Ключевая философия решения — процессный подход вместо сервисного. В отличие от распространенных HTTP-прослоек (которые требуют установки, настройки, мониторинга и постоянного поддержания в рабочем состоянии), данное решение работает «из коробки». 1С сама управляет жизненным циклом Go-компонента: запускает его, передает данные, контролирует выполнение и получает результат.
В обработке реализованы все ключевые сценарии:
Отправка сообщений — напрямую в очередь или через обменник (exchange) с гибкой маршрутизацией.
Получение сообщений — с возможностью ручного подтверждения (ack/nack) через уникальный файловый механизм.
Гарантированная доставка (Guaranteed Delivery) — через Publisher Confirms.
Параллельная отправка — до 20 потоков для максимальной производительности (если не важен порядок помещения сообщений в очередь).
Администрирование RabbitMQ — создание/удаление очередей и обменников прямо из 1С.
Архитектура
Архитектура решения построена на разделении ответственности между двумя компонентами:
Launcher — создается 1С для каждой операции. Запускает основное ядро, контролирует его жизненный цикл и удаляется после завершения. Это гарантирует, что в системе не останутся подвисшие процессы.
Core — высокопроизводительный компонент на Go, выполняющий всю логику обмена с RabbitMQ: подключение (с кешированием), отправку, получение и подтверждение сообщений.
Для отправки и административных действий:
1. 1С создает JSON-файл с параметрами операции и запускает Launcher.
2. Launcher запускает Core, передавая ему управление.
3. Core читает JSON-файл, подключается к RabbitMQ, выполняет операцию и записывает результат в ответный JSON-файл.
4. Core завершается, затем завершается Launcher.
5. 1С читает результат и завершает операцию.
Для получения сообщений:
1. 1С создает JSON-файл с параметрами операции и запускает Launcher.
2. Launcher запускает Core, передавая ему управление.
3. Core читает JSON-файл, подключается к RabbitMQ, получает сообщения и записывает их в ответный JSON-файл.
4. Core остается активным и ожидает от 1С JSON-файл с подтверждением (ack/nack) по каждому сообщению.
5. После обработки ack-файла Core завершается, затем завершается Launcher.
Процессный подход вместо сервисного: Core — это не постоянно висящий сервис, а процесс, который 1С запускает «по требованию». Это исключает необходимость внешнего мониторинга.
Единое подключение к RabbitMQ: Core кеширует TCP-соединение, переиспользуя его для всех операций. Это экономит время на установку соединения.
Параллельная отправка: Для режима parallel используется пул AMQP-каналов (до 20), что позволяет отправлять сообщения максимально быстро(при условии если порядок помещения сообщений в очередь не важен).
Атомарный Ack-механизм: Уникальная система ручного подтверждения через файлы гарантирует, что ни одно сообщение не будет потеряно даже при сбоях.
Безопасность: Встроена проверка целостности Core по хешу SHA256 (проверка на стороне 1С перед запуском). При необходимости заранее известные хеши файлов можно добавить в исключения антивируса.
Расположение файлов на диске:
Для Linux:
/var/tmp/1c_rabbitmq/core/rabExSDG_core - основной компонент
/var/tmp/1c_rabbitmq/rabExSDG_launcher_<UUID> - временный launcher
/tmp/ВременныйФайл1С.json - входные параметры
/tmp/ВременныйФайл1С.json - результат операции
/tmp/ВременныйФайл1С.json - файл подтверждения (для получения)
Для Windows:
%TEMP%\ВременныйФайл1С.exe - временный launcher
%TEMP%\rabExSdg_Core\rabExSDG_Win_Core.exe - основной компонент
%TEMP%\ВременныйФайл1С.json - входные параметры
%TEMP%\ВременныйФайл1С.json - результат операции
%TEMP%\ВременныйФайл1С.json - файл подтверждения (для получения)
Использование
Обработка может использоваться в двух режимах:
1: Внешняя обработка (демонстрация и тестирование)
Открывается через Файл - Открыть - Внешняя обработка
Предназначена для наглядной демонстрации всех возможностей
Позволяет тестировать параметры подключения и операции в интерактивном режиме
При добавлении обработки в «дополнительные отчеты и обработки» есть возможность фонового выполнения операций
2: Внутренняя обработка (программное использование)
Загружается в конфигурацию «Вставить внешнюю обработку, отчет…»
Используется через экспортные методы модуля объекта:
Отправить() — отправка сообщений
ОтправитьГруппы() — групповая отправка
НачатьПолучение() / ПодтвердитьСообщение() / ЗавершитьПолучение() — получение с подтверждением
Может вызываться из регламентных заданий для автоматического обмена.
Подходит для встраивания в бизнес-логику и фоновые процессы.
Некоторые антивирусы могут блокировать исполняемые файлы, которые 1С извлекает из макетов. Добавьте SHA256-хеши файлов (они постоянны и уникальны) в исключения антивируса.
Команды
Получение сообщений:
НачатьПолучение - Открывает сессию получения сообщений из очереди. Возвращает массив сообщений с полями uuid, deliveryTag, body
ПодтвердитьСообщение - Добавляет действие подтверждения (ack/nack) для конкретного сообщения
ЗавершитьПолучение - Отправляет все накопленные подтверждения в Core и завершает сессию получения
Отправка сообщений:
Отправить - Отправляет сообщения в очередь или обменник. Все параметры передаются явно
ОтправитьГруппы - Отправляет группы сообщений в разные очереди/обменники одним вызовом. Поддерживает до 100 групп
Администрирование RabbitMQ:
СоздатьОчередь - Создает очередь с параметрами (Долговременная, Автоудаление, Эксклюзивная, ВремяЖизниСообщений, МаксимумСообщений)
УдалитьОчередь - Удаляет очередь (с опциями УдалятьТолькоПустые, УдалятьТолькоНеиспользуемые)
ОчиститьОчередь - Удаляет все сообщения из очереди (purge)
ИнформацияОбОчереди - Получает статистику по очереди (количество сообщений, потребителей)
СоздатьТочкуОбмена - Создает обменник (ТипОбменника: direct, fanout, topic, headers)
УдалитьТочкуОбмена - Удаляет обменник (с опцией ТолькоНеиспользуемые)
ПривязатьОчередь - Привязывает очередь к обменнику с указанным КлючМаршрутизации
ОтвязатьОчередь - Отвязывает очередь от обменника
Механизмы
| Отправка | |
| Publisher Confirms | Ожидание подтверждения от RabbitMQ о получении каждого сообщения. Сообщение считается отправленным в rabbit только после получения подтверждения от брокера. В случае сбоя — ошибка возвращается в 1С. Исключает потерю сообщений. Это критически важно для любых данных, где потеря недопустима. |
| Persistent режим | Сохранение сообщений на диск RabbitMQ.Сообщения не теряются при перезапуске брокера. |
| Повторные попытки при отправке |
Автоматические повторные попытки (до 3 раз) с экспоненциальной задержкой (100/200/400 мс). |
| Получение | |
| Ручное подтверждение |
Возможность подтвердить (ack) или отклонить (nack) каждое сообщение(например, успешно ли записали сообщение в БД). |
| Управление процессами | |
| Launcher |
Создается для каждой операции и автоматически удаляется после завершения. Нет подвисших процессов. |
| Process Group (Linux) |
Гарантирует завершение процессов после операции. |
| Job Object (Windows) | Гарантирует завершение процессов после операции. |
| Проверка и принудительное завершение |
При превышении таймаута процессы завершаются принудительно. |
| Управление соединениями | |
| Кеширование соединений | Переиспользование TCP-соединений(экономия времени на операции). |
|
Автоматическое |
Переподключение при обрыве. |
| Возможность лицензировать ПО | |
| Лицензия по дате (параметр LICENSE_EXPIRY_DATE) | Лицензия действительна до установленной даты в формате "2006-01-02", если параметр = "" не применяется. |
| Лицензия по machine id (параметр ALLOWED_MACHINE_IDS_MAP) |
Лицензия действительна для данного id machine(linux) или UUID компьютера(windows) сервера(может указываться несколько) если не заполнено - не применяется. |
| Приоритет проверки | Сначала проверяется по id machine, затем по дате. В поставке указаны пустые значения(лицензирование не применяется) |
Описание интерфейса обработки
Параметры подключения:
Пользователь - имя пользователя для авторизации
Пароль - пароль для авторизации
Хост - адрес RabbitMQ (IP или доменное имя)
Порт - порт подключения (по умолчанию 5672)
Виртуальный хост - виртуальный хост (по умолчанию "/")
Параметры выполнения:
Таймаут - время ожидания операции в секундах(общий таймаут на выполнения 1С + go)
Выполнить в фоне - выполнение операций в фоне(если обработка подключена в справочник "доп. обработки и отчеты")
Параметры отправки:
В точку обмена - при активации отправка сообщения происходит через точку обмена и ключ маршрутизации. Устанавливает видимость элементов "точка обмена", "ключ маршрутизации"
В очередь напрямую - при активации отправка сообщения происходит в очередь напрямую. Устанавливает видимость элементов "очередь отправки"
Точка обмена - имя точки обмена
Ключ маршрутизации - имя ключа маршрутизации
Очередь отправки - имя очереди куда отправлять сообщения
Персистентно - признак того что отправленное в rabbit сообщение
сохраняется на диск(не удаляется при перезапуске сервера rabbit)
Добавлять message id - uuid сообщения записывается в служебное поле rabbit
"message_id" - позволяет вести дополнительный контроль за сообщениями
Отправлять параллельно - при установке позволяет параллельно отправлять сообщения в очередь(рекомендуется использовать при большом объеме отправляемых сообщений, если порядок поступления в очередь не важен)
Использовать Confirm - при установке включает механизм гарантированной доставки сообщений в Rabbit (при больших объемах отправляемых сообщений за одну операцию рекомендуется использовать вместе с "Отправлять параллельно")
Время жизни сообщения - время жизни сообщения в миллисекундах (1000 - 1 секунда)
Параметры получения:
Очередь получения - очередь из которой необходимо получить сообщение
Подтверждать сообщения - при установке все полученные на форму сообщения удаляются из очереди
Получить все сообщения - при установке получает все сообщения из очереди но не более 1000
Количество получаемых сообщений - количество получаемых сообщений(не более 999)
Создание очереди:
Очередь - имя очереди
Время жизни сообщений в очереди - время жизни сообщений в очереди в миллисекундах (1000 - 1 секунда)
Максимум сообщений - максимум сообщений в очереди
Удаление очереди:
Очередь - имя очереди
Удалять только пустые - удалять только пустую очередь
Удалять только неиспользуемые - удалять только без потребителей
Очистка очереди:
Очередь - имя очереди
Информация об очереди:
Очередь - имя очереди
Создание обменника:
Точка обмена - имя обменника
Тип обменника - тип обменника(direct, fanout, topic, headers)
Удаление обменника:
Точка обмена - имя обменника
Удалять только неиспользуемые - удалять только без потребителей
Привязка очереди:
Очередь - имя очереди
Точка обмена - имя обменника
Ключ маршрутизации - ключ маршрутизации
Отвязка очереди:
Очередь - имя очереди
Точка обмена - имя обменника
Ключ маршрутизации - ключ маршрутизации
Порядок компиляции go файлов
Для корректной компиляции go файлов необходимо выполнить следующие действия
(например в VSC):
1. Создать файл с расширением GO main.go
2. Создать файл описания модуля с зависимостями
"go mod init MODULENAME"
3. Скачать и установить драйвер для работы с RabbitMQ
"go get github.com/rabbitmq/amqp091-go"
4. Скачать и установить библиотеку для генерации UUID
"go get github.com/google/uuid"
5. Добавить все недостающие зависимости, создать файл go.sum
"go mod tidy"
6. Скомпилировать код в исполняемый файл
для Windows: "go build -o FILENAME.exe main.go"
для linux: "go build -o FILENAME main.go"
Преимущества решения
1. Готовое решение "из коробки"
Не требует установки, настройки или обслуживания.
Загрузил и работает.
2. Гарантированная доставка (Publisher Confirms)
Уникальный механизм, которого нет у конкурентов.
Сообщение считается отправленным только после подтверждения RabbitMQ.
3. Кроссплатформенность
Windows и Linux в одной обработке.
4. Гибкие сценарии отправки
В очередь напрямую или через обменник.
С подтверждением или без.
Последовательно или параллельно.
5. Простота интеграции
Экспортные методы модуля объекта.
Встраивается в регламентные задания и фоновые процессы.
Подробная документация, код golang, описание всех функций golang находятся в макетах обработки.
Проверено на следующих конфигурациях и релизах:
- Управление торговлей, редакция 11, релизы 11.5.8.232
Вступайте в нашу телеграмм-группу Инфостарт