Подписчики
Подписчик — это внешняя система или сервис, получающий сообщения из исходящего потока данных.
Типы подписчиков
Подсистема поддерживает несколько типов подписчиков, реализованных как отдельные справочники:
| Тип | Справочник | Протокол | Статус |
|---|---|---|---|
| HTTP произвольный | инт_ПодписчикиHTTP | HTTP/HTTPS REST | ✅ Готов |
| Подсистема интеграции | инт_ПодписчикиПодсистемаИнтеграции | HTTP (специальный формат) | ✅ Готов |
| Kafka | инт_ПодписчикиKafka | Kafka Protocol | ✅ Готов |
| JRPC 2.0 | инт_ПодписчикиJRPC | JSON-RPC 2.0 over HTTP | ✅ Готов |
| RabbitMQ | инт_ПодписчикиRabbitMQ | AMQP | 🚧 В разработке |
Общие параметры всех подписчиков
Каждый тип подписчика имеет следующие общие настройки:
| Реквизит | Тип | Описание | По умолчанию |
|---|---|---|---|
Активен | Булево | Включён ли подписчик | Истина |
КоличествоПопытокОтправки | Число | Максимум попыток при ошибке | 3 |
ПаузаМеждуПопыткамиОбработки | Число | Интервал повтора (сек.) | 60 |
Эндпоинт | СправочникСсылка.инт_Эндпоинты | Настройки подключения | — |
HTTP-подписчик (Произвольный)
Отправка сообщений на произвольный REST API endpoint. Самый гибкий тип подписчика.
Реквизиты
| Реквизит | Тип | Описание |
|---|---|---|
Эндпоинт | СправочникСсылка.инт_Эндпоинты | Базовый URL и параметры авторизации |
СпособПередачиИдентификатораСообщения | Перечисление | Где передавать message_id |
СпособПередачиИдентификатораПотока | Перечисление | Где передавать flow_id |
Способы передачи идентификаторов
Идентификаторы сообщения и потока можно передавать тремя способами:
| Способ | Описание | Пример |
|---|---|---|
| В заголовке | HTTP-заголовок | flow_id: ПотокЗаказов |
| В параметре пути | Подстановка в URL | /api/{flow_id}/messages/{message_id} |
| В параметре запроса | Query string | /api/messages?flow_id=ПотокЗаказов |
Шаблоны URL
При использовании "В параметре пути" в URL эндпоинта используются плейсхолдеры:
https://api.example.com/v1/{flow_id}/messages/{message_id}Плейсхолдеры {flow_id} и {message_id} заменяются реальными значениями при отправке.
Табличная часть "Пост-процессинг"
Позволяет настроить обработчики для разных HTTP-кодов ответа:
| Колонка | Тип | Описание |
|---|---|---|
КодСостояния | Число(3) | HTTP-код (200, 201, 400, 500...) |
Обработчик | Строка | BSL-код обработчика |
Пример настройки с пост-процессингом
┌─────────────────────────────────────────────────────────────────┐
│ Подписчик HTTP: "Отправка заказов в WMS" │
├─────────────────────────────────────────────────────────────────┤
│ Эндпоинт: WMS Production (https://wms.example.com) │
│ Способ flow_id: В заголовке │
│ Способ message_id: В параметре пути │
├─────────────────────────────────────────────────────────────────┤
│ Пост-процессинг: │
│ ┌───────────┬────────────────────────────────────────────────┐ │
│ │ Код │ Обработчик │ │
│ ├───────────┼────────────────────────────────────────────────┤ │
│ │ 200 │ // Сохраняем внешний ID из ответа │ │
│ │ 400 │ // Логируем ошибку валидации │ │
│ │ 500 │ // Отправляем alert в мониторинг │ │
│ └───────────┴────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘Обработчик ответа
После отправки сообщения выполняется BSL-код из табличной части:
// Доступные переменные:
// - ОтветHTTP - Структура с полями: КодСостояния, Тело, Заголовки
// - ИсходныеДанные - Ссылка на исходный объект
Если ОтветHTTP.КодСостояния = 200 Тогда
ТелоОтвета = ОтветHTTP.Тело;
// Парсинг JSON-ответа
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
// Сохранение внешнего ID
ВнешнийID = ДанныеОтвета.Получить("externalId");
РегистрыСведений.инт_ИдентификаторыВнешнихСистем.Записать(
ИсходныеДанные,
"WMS",
ВнешнийID
);
КонецЕсли;Особенности и рекомендации
Гибкость URL
Комбинируйте способы передачи: например, flow_id в заголовке для роутинга на стороне API Gateway, а message_id в пути для REST-совместимости.
Таймауты
Настраивайте разумные таймауты в эндпоинте. При большом количестве сообщений длинные таймауты могут блокировать очередь.
Kafka-подписчик
Публикация сообщений в топики Apache Kafka. Поддерживает сжатие и пакетную отправку.
Реквизиты
| Реквизит | Тип | Описание |
|---|---|---|
Эндпоинт | СправочникСсылка.инт_Эндпоинты | Bootstrap servers (брокеры) |
ИмяТопика | Строка(255) | Имя топика в Kafka |
ПакетнаяОбработка | Булево | Отправлять сообщения пакетом |
ТипСжатия | Перечисление.инт_ТипыСжатияKafka | Алгоритм сжатия |
Типы сжатия
Подсистема поддерживает все основные алгоритмы сжатия Kafka:
| Значение | Описание | Использование |
|---|---|---|
БезСжатия | Без сжатия (none) | Минимальная задержка |
Gzip | Gzip сжатие | Высокая степень сжатия, медленнее |
Snappy | Google Snappy | Баланс скорости и сжатия |
Lz4 | LZ4 | Очень быстрое сжатие |
Zstd | Zstandard | Лучшее соотношение сжатие/скорость |
Пакетная обработка
При включении ПакетнаяОбработка = Истина:
- Сообщения накапливаются до завершения обработки потока
- Отправляются одним batch-запросом
- Снижает нагрузку на сеть и брокеры
- Требует памяти для буферизации
Схема работы
┌─────────────┐ ┌────────────────┐ ┌─────────────┐
│ 1C │ │ Kafka │ │ Consumer │
│ Producer │─────▶│ Topic │─────▶│ Group │
│ (VK) │ │ (partition) │ │ │
└─────────────┘ └────────────────┘ └─────────────┘
│ │
│ Внешняя компонента │ librdkafka
└──────────────────────┘Программный API (модуль инт_РаботаСКафка)
// Отправка одного сообщения
инт_РаботаСКафка.ОтправитьСообщение(
Сообщение, // Строка - тело сообщения
"broker1:9092", // Строка - bootstrap servers
"my-topic", // Строка - имя топика
-1, // Число - партиция (-1 = авто)
"", // Строка - ключ сообщения
"", // Строка - заголовки (JSON)
Перечисления.инт_ТипыСжатияKafka.Lz4
);
// Проверка доступности брокера
Результат = инт_РаботаСКафка.ПроверитьДоступностьБрокера("broker:9092", 5000);
Если Результат.Успех Тогда
// Брокер доступен
ИнфоКластера = Результат.ИнформацияОКластере;
КонецЕсли;
// Проверка существования топика
Результат = инт_РаботаСКафка.ТопикСуществует("broker:9092", "my-topic");
// Создание топика
Результат = инт_РаботаСКафка.СоздатьТопик(
"broker:9092",
"new-topic",
3, // количество партиций
1 // фактор репликации
);
// Получение метаданных топика
Метаданные = инт_РаботаСКафка.ПолучитьИнформациюОТопике("broker:9092", "my-topic");
// Получение настроек топика (retention.ms, cleanup.policy и др.)
Настройки = инт_РаботаСКафка.ПолучитьНастройкиТопика("broker:9092", "my-topic");Особенности и рекомендации
Сжатие для больших сообщений
При передаче больших JSON-документов используйте Zstd или Lz4 — они дают хорошее сжатие при минимальной задержке.
Пакетная отправка
Включайте ПакетнаяОбработка для потоков с большим количеством мелких сообщений — это значительно снижает нагрузку на брокеры.
Требования
Для работы требуется внешняя компонента SimpleKafka1C, использующая библиотеку librdkafka.
RabbitMQ-подписчик
Публикация сообщений в очередь RabbitMQ по протоколу AMQP.
Статус: В разработке
Данный тип подписчика находится в стадии разработки. Интерфейс определён, но отправка сообщений пока не реализована.
Реквизиты
| Реквизит | Тип | Описание |
|---|---|---|
Эндпоинт | СправочникСсылка.инт_Эндпоинты | AMQP-подключение к RabbitMQ |
ИмяОбменника | Строка(255) | Exchange name |
КлючМаршрутизации | Строка(255) | Routing key |
Схема работы
┌─────────────┐ ┌────────────────┐ ┌─────────────┐
│ 1C │ │ RabbitMQ │ │ Consumer │
│ Publisher │─────▶│ Exchange │─────▶│ Service │
│ │ │ + Queue │ │ │
└─────────────┘ └────────────────┘ └─────────────┘Планируемые возможности
- Публикация в Direct, Topic, Fanout exchanges
- Настройка TTL сообщений
- Подтверждения доставки (publisher confirms)
- Персистентность сообщений
Подсистема интеграции (Межбазовая)
Специализированный подписчик для обмена между базами 1С с установленной подсистемой интеграции.
Назначение
- Обмен данными между базами 1С
- Использование единого формата сообщений
- Автоматическая десериализация на стороне получателя
- Стандартизированный URL-формат
Реквизиты
| Реквизит | Тип | Описание |
|---|---|---|
Эндпоинт | СправочникСсылка.инт_Эндпоинты | HTTP-сервис подсистемы интеграции |
ИдентификаторПотокаПриёмника | Строка(36) | UUID потока в базе-приёмнике |
Формат URL
Сообщения отправляются по стандартному пути HTTP-сервиса:
{АдресЭндпоинта}/hs/api/v1/{КодПотока}/{ИдентификаторСообщения}Пример:
https://erp.example.com/integration/hs/api/v1/OrdersFlow/550e8400-e29b-41d4-a716-446655440000Табличная часть "Пост-процессинг"
Аналогично HTTP-подписчику, позволяет настроить обработчики по кодам ответа.
Схема работы
┌──────────────────────────┐ ┌──────────────────────────┐
│ База 1С #1 │ │ База 1С #2 │
│ (Подсистема интеграции) │ │ (Подсистема интеграции) │
│ │ HTTP │ │
│ Исходящий поток │────────▶│ Входящий поток │
│ + ПодписчикПодсистемы │ POST │ HTTP-сервис /hs/api/v1 │
└──────────────────────────┘ └──────────────────────────┘Особенности и рекомендации
Идентификаторы потоков
Идентификатор потока приёмника должен соответствовать коду входящего потока в целевой базе. Это обеспечивает корректную маршрутизацию.
Единая среда
Используйте этот тип подписчика для интеграции баз 1С в рамках одной инфраструктуры. Это упрощает мониторинг и отладку.
JRPC 2.0-подписчик
Отправка сообщений по протоколу JSON-RPC 2.0 over HTTP.
Назначение
- Интеграция с системами, использующими JSON-RPC 2.0
- Стандартизированный формат запросов/ответов
- Встроенная идентификация запросов
Реквизиты
| Реквизит | Тип | Описание |
|---|---|---|
Эндпоинт | СправочникСсылка.инт_Эндпоинты | URL JSON-RPC сервера |
Формат сообщения
Подсистема автоматически формирует JSON-RPC 2.0 конверт:
{
"jsonrpc": "2.0",
"method": "КодПотокаДанных",
"params": {
"orderNumber": "00001",
"date": "2026-01-27",
"items": [...]
},
"id": "550e8400-e29b-41d4-a716-446655440000"
}Где:
method— берётся из кода потока данныхparams— данные сообщенияid— идентификатор сообщения (UUID)
Табличная часть "Пост-процессинг"
Позволяет обрабатывать ответы по HTTP-кодам (аналогично HTTP-подписчику).
Обработка ответов
JSON-RPC 2.0 ответ содержит либо result, либо error:
// Успех
{
"jsonrpc": "2.0",
"result": {"status": "created", "id": 12345},
"id": "550e8400-e29b-41d4-a716-446655440000"
}
// Ошибка
{
"jsonrpc": "2.0",
"error": {"code": -32600, "message": "Invalid Request"},
"id": "550e8400-e29b-41d4-a716-446655440000"
}Особенности и рекомендации
Именование методов
Код потока данных используется как имя RPC-метода. Используйте понятные коды: CreateOrder, UpdateCustomer, SyncInventory.
Совместимость
Убедитесь, что целевой сервер поддерживает JSON-RPC 2.0. Некоторые серверы могут требовать строгого соответствия спецификации.
Сравнение типов подписчиков
| Критерий | HTTP | Kafka | RabbitMQ | Подсистема инт. | JRPC 2.0 |
|---|---|---|---|---|---|
| Синхронность | Синхронный | Асинхронный | Асинхронный | Синхронный | Синхронный |
| Гарантия доставки | При успешном ответе | At-least-once | Настраивается | При успешном ответе | При успешном ответе |
| Пакетная отправка | ❌ | ✅ | Планируется | ❌ | ❌ |
| Сжатие | Зависит от сервера | ✅ Встроенное | ❌ | ❌ | ❌ |
| Пост-процессинг | ✅ | ❌ | ❌ | ✅ | ✅ |
| Гибкость URL | ✅ Высокая | — | — | ❌ Фиксированный | ❌ Фиксированный |
Когда какой использовать
| Сценарий | Рекомендуемый тип |
|---|---|
| REST API внешней системы | HTTP произвольный |
| Высоконагруженная интеграция | Kafka |
| Обмен между базами 1С | Подсистема интеграции |
| Legacy-системы с JSON-RPC | JRPC 2.0 |
| Микросервисная архитектура | Kafka или RabbitMQ |
Привязка подписчиков к потоку
Подписчики добавляются в табличную часть ПодписчикиПотока справочника инт_ПотокиДанных:
// Программное добавление подписчика к потоку
ПотокОбъект = ПотокДанных.ПолучитьОбъект();
НоваяСтрока = ПотокОбъект.ПодписчикиПотока.Добавить();
НоваяСтрока.Подписчик = Справочники.инт_ПодписчикиHTTP.НайтиПоНаименованию("WMS API");
ПотокОбъект.Записать();Получение подписчиков потока
МассивПодписчиков = Справочники.инт_ПотокиДанных.ПолучитьПодписчиковПоПотоку(ПотокДанных);
// Возвращает: Массив ссылок на подписчиков разных типовСтатусы рассылки
Для каждой пары "сообщение + подписчик" ведётся отдельный статус в регистре инт_ТекущийСтатусРассылкиСообщений:
| Статус | Описание |
|---|---|
Новый | Ожидает отправки |
ВПроцессеОтправки | Отправляется фоновым заданием |
Отправлено | Успешно доставлено |
ОшибкаОтправки | Ошибка, будет повторная попытка |
Рекомендации
Разделение эндпоинтов
Выносите настройки подключения (URL, порт, учётные данные) в справочник инт_Эндпоинты. Это упрощает переключение между средами (dev/test/prod).
Обработка ответов
Используйте табличную часть "Пост-процессинг" для:
- Сохранения внешних идентификаторов
- Логирования результатов
- Обновления статусов в связанных объектах
- Отправки уведомлений при ошибках
Таймауты
Настраивайте разумные таймауты подключения в эндпоинтах. Слишком большие таймауты могут блокировать фоновые задания.
Мониторинг
Все ошибки отправки логируются в журнал регистрации с событием ПодсистемаИнтеграции.*. Настройте мониторинг этих событий.
Следующие шаги
- Валидация — проверка сообщений перед отправкой
- Очереди сообщений — как работают очереди
- Настройка подписчиков (практика)