При интеграции различных конфигураций 1С (особенно самописных или значительно измененных) разработчики часто сталкиваются с задачей передачи произвольных пакетов данных. Это может быть плоский JSON-файл, сложная структура XML или бинарные данные. При этом к системе интеграции предъявляются жесткие требования: наличие очереди сообщений, гарантированная доставка, автоматические повторные попытки при сбоях связи и удобный мониторинг для администратора.
Многие программисты начинают изобретать собственные механизмы: создавать регистры сведений для хранения очередей, писать фоновые задания для отправки через HTTP-соединение и разрабатывать самодельные отчеты для отслеживания ошибок. Однако в Библиотеке стандартных подсистем (БСП) и на уровне платформы 1С «Предприятие» уже есть мощные готовые инструменты, которые позволяют решить эту задачу быстро, надежно и стандартными средствами. Давайте подробно разберем, какие архитектурные варианты у нас есть.
Если вам требуется организовать асинхронный обмен произвольными данными между базами 1С, в первую очередь стоит обратить внимание на встроенную подсистему БСП «Обмен сообщениями». Исторически она создавалась для работы в модели сервиса (1С:Фреш), однако ее архитектура отлично подходит для интеграции любых распределенных приложений (например, для связи с «1С:Документооборот» или кастомными базами).
В основе этой подсистемы лежат следующие концепции:
Для реализации обмена через эту подсистему мы регистрируем свой канал обмена и описываем обработчик получения сообщения в модуле менеджера. Пример отправки произвольной структуры данных в канал выглядит следующим образом:
// Подготовим произвольные данные для отправки в формате JSON
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Идентификатор", Строка(Новый УникальныйИдентификатор()));
СтруктураДанных.Вставить("ДатаСоздания", ТекущаяДата());
СтруктураДанных.Вставить("Содержимое", "Произвольный текст или параметры");
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураДанных);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Отправка через подсистему ОбменСообщениями
ПараметрыСообщения = ОбменСообщениями.ПараметрыСообщения();
ПараметрыСообщения.Тело = СтрокаJSON;
ПараметрыСообщения.Канал = "НашКаналПередачиДанных";
ПараметрыСообщения.Получатель = КонечнаяТочкаПолучатель;
ОбменСообщениями.ОтправитьСообщение(ПараметрыСообщения);
Еще один недооцененный способ — использование стандартной подсистемы «Обмен данными» БСП в качестве готовой административной и транспортной обвязки. Разработчики часто думают, что этот механизм жестко завязан на правила конвертации (КД2 или КД3) и обмен ссылочными объектами. На самом деле это не так.
Мы можем использовать транспортный контур БСП для передачи файлов любого формата (JSON, CSV, ZIP-архивы), получив при этом «из коробки» готовые настройки транспорта (FTP, SFTP, каталоги, электронная почта или Web/HTTP-сервисы), расписание запусков и логирование ошибок.
Рассмотрим по шагам, как это реализовать:
_ДемоОбменПроизвольнымиДанными. В свойствах плана обмена **не указываем** состав регистрируемых объектов — он останется пустым.Посмотрим на пример кода в модуле менеджера плана обмена:
Процедура ВыполнитьВыгрузкуДанных(КомпонентыОбмена) Экспорт
// Получаем имя файла, подготовленное транспортом БСП
ИмяФайлаВыгрузки = КомпонентыОбмена.ИмяФайлаВыгрузки;
// Открываем запись файла произвольного формата (например, JSON)
ЗаписьТеста = Новый ЗаписьТекста(ИмяФайлаВыгрузки, КодировкаТекста.UTF8);
// Собираем данные, подлежащие выгрузке (например, по зарегистрированным изменениям или запросом)
ДанныеДляОтправки = ПолучитьМассивДанныхДляИнтеграции();
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтправки);
СтрокаJSON = ЗаписьJSON.Закрыть();
ЗаписьТеста.ЗаписатьСтроку(СтрокаJSON);
ЗаписьТеста.Закрыть();
КонецПроцедуры
Процедура ВыполнитьЗагрузкуДанных(КомпонентыОбмена) Экспорт
ИмяФайлаЗагрузки = КомпонентыОбмена.ИмяФайлаЗагрузки;
ЧтениеТекста = Новый ЧтениеТекста(ИмяФайлаЗагрузки, КодировкаТекста.UTF8);
СтрокаJSON = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Вызываем обработку полученных данных в транзакции
ОбработатьПолученныеДанные(Данные);
КонецПроцедуры
В результате мы получаем полностью управляемый обмен: пользователи могут нажимать кнопку «Выполнить обмен», настраивать расписание, видеть статусы «Успешно» или «Ошибка» в стандартных мониторах БСП, а сам файл будет гарантированно доставлен через выбранный канал связи (например, защищенный SFTP-сервер).
Начиная с версии платформы 1С:Предприятие 8.3.15, разработчикам доступен встроенный механизм — Сервисы интеграции. Этот инструмент решает задачу взаимодействия систем на уровне предприятия и позволяет отказаться от промежуточных костылей.
С помощью сервисов интеграции 1С может выступать в качестве полноценного клиента для внешних брокеров сообщений (Message Brokers), таких как RabbitMQ или Apache ActiveMQ, общаясь по протоколу AMQP.
Преимущества этого подхода:
Для настройки достаточно объявить в конфигураторе объект метаданных СервисИнтеграции, настроить каналы и написать код отправки сообщения:
// Отправка сообщения через встроенные сервисы интеграции
АдресНазначения = СервисыИнтеграции.НашСервисИнтеграции.Каналы.КаналВыгрузки;
НовоеСообщение = АдресНазначения.СоздатьСообщение();
// Помещаем в тело сообщения произвольный JSON или XML
НовоеСообщение.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
НовоеСообщение.Параметры.Вставить("ТипОбъекта", "Контрагенты");
// Отправляем в шину сообщений
АдресНазначения.Отправить(НовоеСообщение);
Еще один крайне интересный и неочевидный инструмент для интеграции между базами 1С — это Система взаимодействия. Большинство разработчиков воспринимают ее исключительно как чат для пользователей, однако у нее есть мощный программный API для неинтерактивного обмена информацией.
Мы можем программно отправлять сообщения от имени системных пользователей. Особенности использования Системы взаимодействия для обмена:
ПриПолученииСообщения.Если ваша задача интеграции связана с передачей сотен тысяч или миллионов записей в формате JSON во внешнюю систему, критически важным фактором становится скорость сериализации и отправки. Начиная с версии БСП 3.1.9, библиотека предоставляет готовые инструменты для параллельной (многопоточной) обработки данных через модуль ДлительныеОперации.
Вместо того чтобы отправлять весь объем данных в одном потоке (что может занять часы), мы можем автоматически разбить массив данных на порции и запустить их обработку параллельно в нескольких фоновых заданиях. Проанализируем пример реализации такого подхода:
// Определим параметры для многопоточной отправки
ПараметрыВызова = ДлительныеОперации.ПараметрыВыполненияВНесколькоПотоков();
ПараметрыВызова.НаименованиеФоновогоЗадания = "ПараллельныйЭкспортJSON";
ПараметрыВызова.КоличествоПотоков = 4; // Задействуем 4 параллельных потока фоновых заданий
// Подготовим порции данных (массив структур или отборов)
МассивПорцийДанных = ПодготовитьПорцииДанных();
// Запускаем многопоточную процедуру БСП
Результат = ДлительныеОперации.ВыполнитьПроцедуруВНесколькоПотоков(
"МойОбщийМодульИнтеграции.ОтправитьПорциюДанныхФоново",
МассивПорцийДанных,
ПараметрыВызова
);
Если Результат.Статус = "Выполнено" Тогда
ЗаписатьВЖурналРегистрации("Интеграция", УровеньЖурналаРегистрации.Информация, , , "Все данные успешно отправлены.");
Иначе
// Разберем ошибки по каждому упавшему потоку
Для Каждого ИнформацияОПотоке Из Результат.Потоки Цикл
Если ИнформацияОПотоке.Статус = "Ошибка" Тогда
ЗаписатьВЖурналРегистрации("Интеграция", УровеньЖурналаРегистрации.Ошибка, , , ИнформацияОПотоке.ПодробноеПредставлениеОшибки);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Этот подход позволяет кратно сократить время выгрузки данных во внешние базы или веб-сервисы, полностью утилизируя вычислительные мощности серверного кластера 1С.
Для того чтобы выбрать оптимальный путь решения вашей задачи интеграции, воспользуйтесь следующими ориентирами: