Что такое 1С:Шина и как устроен асинхронный обмен данными в 1С:Предприятии?

Программист 1С:Элемент IT и автоматизация бизнеса
← На главную

Введение: Что такое 1С:Шина и зачем она появилась?

В мире современных корпоративных информационных систем ручной или файловый обмен данными давно стал пережитком прошлого. Ранее разработчикам на платформе 1С:Предприятие приходилось самостоятельно конструировать «велосипеды» для связывания баз данных: использовать FTP-серверы, обмениваться XML-файлами через электронную почту или интегрировать сторонние брокеры сообщений, такие как RabbitMQ и Apache Kafka. Каждый такой проект требовал написания сотен строк кода и постоянной поддержки со стороны системных администраторов.

С выходом нового решения «1С:Шина» экосистема получила собственный промышленный класс систем интеграции уровня предприятия (Enterprise Service Bus — ESB). Мы подробно разберем, что представляет собой этот продукт, как он взаимодействует с классическими механизмами платформы и решает ли он проблемы, озвученные разработчиками на форумах.

Архитектурные основы: На каких технологиях построена 1С:Шина?

Проанализируем технологический стек нового решения. Вопреки распространенному мнению, что «1С:Шина» — это просто очередная конфигурация, написанная на встроенном языке 1С, архитектура продукта принципиально иная:

Как устроен процесс передачи сообщений: Разбираемся по шагам

Рассмотрим детально, как сообщение проходит путь от базы-источника до базы-получателя через «1С:Шину». Выясним причину, почему этот механизм называют гарантированной доставкой.

  1. Формирование сообщения в источнике: В информационной базе 1С:Предприятие (например, 1С:ERP) при проведении документа срабатывает событие. Платформа формирует сообщение обмена.
  2. Буферизация в локальной ИБ: Перед отправкой сообщение сохраняется в специальной служебной таблице ИБ источника. Платформа пытается отправить его на сервер шины. Если сервер шины в этот момент недоступен (упал канал связи, проводятся техработы), сообщение будет храниться в базе-источнике неограниченно долго (или пока не истечет его срок годности).
  3. Подтверждение получения шиной: Как только связь восстанавливается, платформа передает сообщение в «1С:Шину». Сервер шины сохраняет сообщение в своей внутренней базе данных и отправляет ИБ-источнику подтверждение: «Сообщение принято». Только после этого сообщение удаляется из локального буфера ИБ-источника.
  4. Маршрутизация и трансформация: Сервер шины анализирует заголовок сообщения, при необходимости преобразует его формат (например, из XML в JSON) с помощью написанных скриптов-трансляторов и помещает в нужную очередь для получателей.
  5. Доставка получателю: Шина пытается доставить сообщение получателю. Если получатель временно отключен, шина хранит данные у себя. Как только база-получатель подтверждает успешную запись сообщения в свою буферную таблицу, шина удаляет сообщение из своей очереди.

Взаимодействие с планами обмена: Замена или партнерство?

В процессе обсуждения на форумах часто возникает вопрос: заменяет ли «1С:Шина» классический механизм планов обмена с их таблицами регистрации изменений? Разберем эту ситуацию подробно.

План обмена и Интеграционная шина выполняют абсолютно разные, но взаимодополняющие задачи:

Таким образом, мы не отказываемся от планов обмена. Мы используем их для фиксации изменений, но саму отправку делегируем встроенному в платформу объекту СервисИнтеграции, который передает пакеты напрямую в шину.

Пример реализации отправки сообщений

Давайте посмотрим на практический пример того, как программист может программно отправить сообщение в настроенный канал интеграции. Для этого в платформу версии 8.3.17 был добавлен объект СервисыИнтеграции.

Рассмотрим пример кода для отправки произвольного сообщения:


// Инициализируем соединение с сервисом интеграции
ИмяСервиса = "УправлениеПродажами";
Сервис = СервисыИнтеграции[ИмяСервиса];

// Создаем новое интеграционное сообщение
НовоеСообщение = Сервис.СоздатьСообщение();

// Заполняем тело сообщения (например, структура в формате JSON)
ДанныеДляОтправки = Новый Структура;
ДанныеДляОтправки.Вставить("КодПартнера", "П0000432");
ДанныеДляОтправки.Вставить("НовоеНаименование", "ООО Вектор-С");

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтправки);
СтрокаJSON = ЗаписьJSON.Закрыть();

НовоеСообщение.Тело.УстановитьСтроку(СтрокаJSON);

// Добавляем пользовательские параметры (заголовки) для маршрутизации в шине
НовоеСообщение.Параметры.Вставить("ТипСобытия", "ОбновлениеПартнера");
НовоеСообщение.Параметры.Вставить("ВерсияФормата", "1.0");

// Отправляем сообщение в конкретный канал сервиса интеграции
Сервис.Отправить("КаналПартнеры", НовоеСообщение);

В данном примере сообщение гарантированно попадет в локальный буфер платформы и при первой возможности будет отправлено в «1С:Шину». Обратите внимание, что мы можем задавать любые произвольные параметры сообщения, которые впоследствии помогут шине правильно направить сообщение получателям.

Обработка входящих сообщений на стороне получателя

Теперь проанализируем, как принимающая информационная база получает отправленные данные. Нам больше не нужно запускать периодические регламентные задания для опроса каталогов обмена. Получение сообщений работает по событийной модели.

В конфигурации-получателе для соответствующего СервисаИнтеграции настраивается обработчик ожидания или метод обработки. Посмотрим на шаблон такого кода:


// Данная процедура вызывается платформой автоматически при поступлении сообщения в канал
Процедура ПриПолученииСообщения(Сообщение, Отправитель) Экспорт
    
    // Получаем тип события из параметров заголовка
    ТипСобытия = "";
    Если Сообщение.Параметры.Свойство("ТипСобытия", ТипСобытия) Тогда
        
        Если ТипСобытия = "ОбновлениеПартнера" Тогда
            СтрокаДанных = Сообщение.Тело.ПолучитьСтроку();
            
            // Десериализуем и обрабатываем данные
            ЧтениеJSON = Новый ЧтениеJSON;
            ЧтениеJSON.УстановитьСтроку(СтрокаДанных);
            ДанныеПартнера = ПрочитатьJSON(ЧтениеJSON);
            ЧтениеJSON.Закрыть();
            
            // Вызываем процедуру обновления данных в базе
            ОбновитьДанныеКонтрагентаВБазе(ДанныеПартнера);
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Этот подход позволяет добиться мгновенной (on-line) синхронизации баз данных с минимальной нагрузкой на СУБД. Нам не нужно постоянно опрашивать таблицы базы данных — платформа сама разбудит фоновый процесс при получении сообщения.

Интеграция с внешними ИТ-системами и поддержка СУБД

Современный ИТ-ландшафт предприятия редко ограничивается только программными продуктами 1С. Важным преимуществом «1С:Шины» является кросс-системная интеграция. Рассмотрим, какие протоколы и интерфейсы поддерживает сервер интеграции:

Сравнение «1С:Шины» с классическими брокерами (RabbitMQ, Apache Kafka)

Выясним преимущества и недостатки использования специализированного решения от 1С по сравнению с популярными OpenSource-продуктами:

Преимущества «1С:Шины»:

Недостатки и особенности:

Выводы и рекомендации

Подводя итоги нашего детального обзора, можно с уверенностью сказать, что появление «1С:Шины» — это долгожданный качественный скачок в развитии интеграционных технологий фирмы 1С. Это решение идеально подходит для средних и крупных предприятий с разветвленной ИТ-архитектурой, где эксплуатируются десятки баз данных 1С и сторонних информационных систем.

Мы рекомендуем использовать этот инструмент для построения надежных шин данных, отказавшись от нестабильных файловых и веб-сервисных самописных интеграций в пользу гарантированной асинхронной доставки сообщений.

← На главную