Skip to content

Подписчики

Подписчик — это внешняя система или сервис, получающий сообщения из исходящего потока данных.

Типы подписчиков

Подсистема поддерживает несколько типов подписчиков, реализованных как отдельные справочники:

ТипСправочникПротоколСтатус
HTTP произвольныйинт_ПодписчикиHTTPHTTP/HTTPS REST✅ Готов
Подсистема интеграцииинт_ПодписчикиПодсистемаИнтеграцииHTTP (специальный формат)✅ Готов
Kafkaинт_ПодписчикиKafkaKafka Protocol✅ Готов
JRPC 2.0инт_ПодписчикиJRPCJSON-RPC 2.0 over HTTP✅ Готов
RabbitMQинт_ПодписчикиRabbitMQAMQP🚧 В разработке

Общие параметры всех подписчиков

Каждый тип подписчика имеет следующие общие настройки:

РеквизитТипОписаниеПо умолчанию
АктивенБулевоВключён ли подписчикИстина
КоличествоПопытокОтправкиЧислоМаксимум попыток при ошибке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-код из табличной части:

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)Минимальная задержка
GzipGzip сжатиеВысокая степень сжатия, медленнее
SnappyGoogle SnappyБаланс скорости и сжатия
Lz4LZ4Очень быстрое сжатие
ZstdZstandardЛучшее соотношение сжатие/скорость

Пакетная обработка

При включении ПакетнаяОбработка = Истина:

  • Сообщения накапливаются до завершения обработки потока
  • Отправляются одним batch-запросом
  • Снижает нагрузку на сеть и брокеры
  • Требует памяти для буферизации

Схема работы

┌─────────────┐      ┌────────────────┐      ┌─────────────┐
│  1C         │      │   Kafka        │      │  Consumer   │
│  Producer   │─────▶│   Topic        │─────▶│  Group      │
│  (VK)       │      │   (partition)  │      │             │
└─────────────┘      └────────────────┘      └─────────────┘
     │                      │
     │   Внешняя компонента │   librdkafka
     └──────────────────────┘

Программный API (модуль инт_РаботаСКафка)

bsl
// Отправка одного сообщения
инт_РаботаСКафка.ОтправитьСообщение(
    Сообщение,           // Строка - тело сообщения
    "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 конверт:

json
{
  "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:

json
// Успех
{
  "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. Некоторые серверы могут требовать строгого соответствия спецификации.


Сравнение типов подписчиков

КритерийHTTPKafkaRabbitMQПодсистема инт.JRPC 2.0
СинхронностьСинхронныйАсинхронныйАсинхронныйСинхронныйСинхронный
Гарантия доставкиПри успешном ответеAt-least-onceНастраиваетсяПри успешном ответеПри успешном ответе
Пакетная отправкаПланируется
СжатиеЗависит от сервера✅ Встроенное
Пост-процессинг
Гибкость URL✅ Высокая❌ Фиксированный❌ Фиксированный

Когда какой использовать

СценарийРекомендуемый тип
REST API внешней системыHTTP произвольный
Высоконагруженная интеграцияKafka
Обмен между базами 1СПодсистема интеграции
Legacy-системы с JSON-RPCJRPC 2.0
Микросервисная архитектураKafka или RabbitMQ

Привязка подписчиков к потоку

Подписчики добавляются в табличную часть ПодписчикиПотока справочника инт_ПотокиДанных:

bsl
// Программное добавление подписчика к потоку
ПотокОбъект = ПотокДанных.ПолучитьОбъект();
НоваяСтрока = ПотокОбъект.ПодписчикиПотока.Добавить();
НоваяСтрока.Подписчик = Справочники.инт_ПодписчикиHTTP.НайтиПоНаименованию("WMS API");
ПотокОбъект.Записать();

Получение подписчиков потока

bsl
МассивПодписчиков = Справочники.инт_ПотокиДанных.ПолучитьПодписчиковПоПотоку(ПотокДанных);
// Возвращает: Массив ссылок на подписчиков разных типов

Статусы рассылки

Для каждой пары "сообщение + подписчик" ведётся отдельный статус в регистре инт_ТекущийСтатусРассылкиСообщений:

СтатусОписание
НовыйОжидает отправки
ВПроцессеОтправкиОтправляется фоновым заданием
ОтправленоУспешно доставлено
ОшибкаОтправкиОшибка, будет повторная попытка

Рекомендации

Разделение эндпоинтов

Выносите настройки подключения (URL, порт, учётные данные) в справочник инт_Эндпоинты. Это упрощает переключение между средами (dev/test/prod).

Обработка ответов

Используйте табличную часть "Пост-процессинг" для:

  • Сохранения внешних идентификаторов
  • Логирования результатов
  • Обновления статусов в связанных объектах
  • Отправки уведомлений при ошибках

Таймауты

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

Мониторинг

Все ошибки отправки логируются в журнал регистрации с событием ПодсистемаИнтеграции.*. Настройте мониторинг этих событий.


Следующие шаги

Документация подсистемы интеграции