Как передавать произвольные данные (JSON, XML) между базами 1С с контролем, очередями и мониторингом без «велосипедов»?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции различных конфигураций 1С (особенно самописных или значительно измененных) разработчики часто сталкиваются с задачей передачи произвольных пакетов данных. Это может быть плоский JSON-файл, сложная структура XML или бинарные данные. При этом к системе интеграции предъявляются жесткие требования: наличие очереди сообщений, гарантированная доставка, автоматические повторные попытки при сбоях связи и удобный мониторинг для администратора.

Многие программисты начинают изобретать собственные механизмы: создавать регистры сведений для хранения очередей, писать фоновые задания для отправки через HTTP-соединение и разрабатывать самодельные отчеты для отслеживания ошибок. Однако в Библиотеке стандартных подсистем (БСП) и на уровне платформы 1С «Предприятие» уже есть мощные готовые инструменты, которые позволяют решить эту задачу быстро, надежно и стандартными средствами. Давайте подробно разберем, какие архитектурные варианты у нас есть.

Решение 1. Подсистема БСП «Обмен сообщениями»

Если вам требуется организовать асинхронный обмен произвольными данными между базами 1С, в первую очередь стоит обратить внимание на встроенную подсистему БСП «Обмен сообщениями». Исторически она создавалась для работы в модели сервиса (1С:Фреш), однако ее архитектура отлично подходит для интеграции любых распределенных приложений (например, для связи с «1С:Документооборот» или кастомными базами).

В основе этой подсистемы лежат следующие концепции:

  1. Конечные точки (Endpoints): Каждая информационная база регистрируется как конечная точка обмена.
  2. Каналы сообщений (Message Channels): Логические маршруты, по которым передаются данные определенного типа. Вы можете создать собственный канал для передачи произвольного JSON.
  3. Очередь сообщений: Все отправляемые данные помещаются в специализированную очередь в базе-отправителе. Подсистема гарантирует, что если база-приемник временно недоступна, БСП будет повторять попытки отправки по расписанию.
  4. Интерфейс мониторинга: Администратору доступно рабочее место, где видны все отправленные, доставленные и зависшие в очереди пакеты. Ошибки обработки регистрируются детально, позволяя перезапустить отправку вручную.

Для реализации обмена через эту подсистему мы регистрируем свой канал обмена и описываем обработчик получения сообщения в модуле менеджера. Пример отправки произвольной структуры данных в канал выглядит следующим образом:


// Подготовим произвольные данные для отправки в формате JSON
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Идентификатор", Строка(Новый УникальныйИдентификатор()));
СтруктураДанных.Вставить("ДатаСоздания", ТекущаяДата());
СтруктураДанных.Вставить("Содержимое", "Произвольный текст или параметры");

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

// Отправка через подсистему ОбменСообщениями
ПараметрыСообщения = ОбменСообщениями.ПараметрыСообщения();
ПараметрыСообщения.Тело = СтрокаJSON;
ПараметрыСообщения.Канал = "НашКаналПередачиДанных";
ПараметрыСообщения.Получатель = КонечнаяТочкаПолучатель;

ОбменСообщениями.ОтправитьСообщение(ПараметрыСообщения);

Решение 2. Использование транспорта БСП «Обмен данными» для произвольного формата

Еще один недооцененный способ — использование стандартной подсистемы «Обмен данными» БСП в качестве готовой административной и транспортной обвязки. Разработчики часто думают, что этот механизм жестко завязан на правила конвертации (КД2 или КД3) и обмен ссылочными объектами. На самом деле это не так.

Мы можем использовать транспортный контур БСП для передачи файлов любого формата (JSON, CSV, ZIP-архивы), получив при этом «из коробки» готовые настройки транспорта (FTP, SFTP, каталоги, электронная почта или Web/HTTP-сервисы), расписание запусков и логирование ошибок.

Рассмотрим по шагам, как это реализовать:

  1. Создаем в конфигурации новый **План обмена**. Назовем его, например, _ДемоОбменПроизвольнымиДанными. В свойствах плана обмена **не указываем** состав регистрируемых объектов — он останется пустым.
  2. Включаем этот план обмена в состав подсистемы БСП «Обмен данными» согласно руководству интегратора.
  3. В модуле менеджера плана обмена переопределяем процедуры выгрузки и загрузки данных. Вместо стандартного чтения правил мы пишем свою логику работы с JSON.

Посмотрим на пример кода в модуле менеджера плана обмена:


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

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

В результате мы получаем полностью управляемый обмен: пользователи могут нажимать кнопку «Выполнить обмен», настраивать расписание, видеть статусы «Успешно» или «Ошибка» в стандартных мониторах БСП, а сам файл будет гарантированно доставлен через выбранный канал связи (например, защищенный SFTP-сервер).

Решение 3. Платформенный механизм «Сервисы интеграции»

Начиная с версии платформы 1С:Предприятие 8.3.15, разработчикам доступен встроенный механизм — Сервисы интеграции. Этот инструмент решает задачу взаимодействия систем на уровне предприятия и позволяет отказаться от промежуточных костылей.

С помощью сервисов интеграции 1С может выступать в качестве полноценного клиента для внешних брокеров сообщений (Message Brokers), таких как RabbitMQ или Apache ActiveMQ, общаясь по протоколу AMQP.

Преимущества этого подхода:

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


// Отправка сообщения через встроенные сервисы интеграции
АдресНазначения = СервисыИнтеграции.НашСервисИнтеграции.Каналы.КаналВыгрузки;
НовоеСообщение = АдресНазначения.СоздатьСообщение();

// Помещаем в тело сообщения произвольный JSON или XML
НовоеСообщение.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
НовоеСообщение.Параметры.Вставить("ТипОбъекта", "Контрагенты");

// Отправляем в шину сообщений
АдресНазначения.Отправить(НовоеСообщение);

Решение 4. Система взаимодействия как транспорт данных

Еще один крайне интересный и неочевидный инструмент для интеграции между базами 1С — это Система взаимодействия. Большинство разработчиков воспринимают ее исключительно как чат для пользователей, однако у нее есть мощный программный API для неинтерактивного обмена информацией.

Мы можем программно отправлять сообщения от имени системных пользователей. Особенности использования Системы взаимодействия для обмена:

Решение 5. Многопоточная обработка больших пакетов данных в БСП

Если ваша задача интеграции связана с передачей сотен тысяч или миллионов записей в формате JSON во внешнюю систему, критически важным фактором становится скорость сериализации и отправки. Начиная с версии БСП 3.1.9, библиотека предоставляет готовые инструменты для параллельной (многопоточной) обработки данных через модуль ДлительныеОперации.

Вместо того чтобы отправлять весь объем данных в одном потоке (что может занять часы), мы можем автоматически разбить массив данных на порции и запустить их обработку параллельно в нескольких фоновых заданиях. Проанализируем пример реализации такого подхода:


// Определим параметры для многопоточной отправки
ПараметрыВызова = ДлительныеОперации.ПараметрыВыполненияВНесколькоПотоков();
ПараметрыВызова.НаименованиеФоновогоЗадания = "ПараллельныйЭкспортJSON";
ПараметрыВызова.КоличествоПотоков = 4; // Задействуем 4 параллельных потока фоновых заданий

// Подготовим порции данных (массив структур или отборов)
МассивПорцийДанных = ПодготовитьПорцииДанных();

// Запускаем многопоточную процедуру БСП
Результат = ДлительныеОперации.ВыполнитьПроцедуруВНесколькоПотоков(
    "МойОбщийМодульИнтеграции.ОтправитьПорциюДанныхФоново",
    МассивПорцийДанных,
    ПараметрыВызова
);

Если Результат.Статус = "Выполнено" Тогда
    ЗаписатьВЖурналРегистрации("Интеграция", УровеньЖурналаРегистрации.Информация, , , "Все данные успешно отправлены.");
Иначе
    // Разберем ошибки по каждому упавшему потоку
    Для Каждого ИнформацияОПотоке Из Результат.Потоки Цикл
        Если ИнформацияОПотоке.Статус = "Ошибка" Тогда
            ЗаписатьВЖурналРегистрации("Интеграция", УровеньЖурналаРегистрации.Ошибка, , , ИнформацияОПотоке.ПодробноеПредставлениеОшибки);
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

Этот подход позволяет кратно сократить время выгрузки данных во внешние базы или веб-сервисы, полностью утилизируя вычислительные мощности серверного кластера 1С.

Резюме и рекомендации по выбору инструмента

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

← На главную