В рамках развития Библиотеки стандартных подсистем (БСП) и подсистемы синхронизации данных фирма 1С выводит из эксплуатации классический механизм обмена по правилам XML (технология «Конвертация данных 2.0»). Разберем, какие именно изменения происходят в типовых решениях, почему это происходит и какие практические варианты перехода существуют для действующих интеграций.
Проанализируем состав запланированных изменений в типовых релизах конфигураций 1С:
КонвертацияОбъектовИнформационныхБаз.УниверсальныйОбменДаннымиXML сохраняется вендором исключительно для выполнения разовых технологических операций (например, первичный перенос остатков или нормативно-справочной информации вручную).Выясним причины такого отказа. Главный фактор — архитектурные ограничения безопасности и контроля качества. В правилах КД 2.0 весь исполняемый код обработчиков передается в теле XML-файла и вызывается динамически с помощью конструкций Выполнить() и Вычислить(). Это нарушает политики безопасного режима платформы, работу в модели сервиса (SaaS) и делает невозможным статическую валидацию кода линтерами и системами контроля версий (CI/CD). В отличие от XML, логика обмена в EnterpriseData (КД 3) полностью содержится в коде общих модулей конфигурации.
Основным штатным направлением интеграции между современными конфигурациями 1С является формат EnterpriseData (ED). Рассмотрим особенности адаптации обменов под этот механизм:
МенеджерОбменаЧерезУниверсальныйФормат (или аналогичных отраслевых модулях интеграции).EnterpriseData ориентирован на объектные сущности (документы и справочники), движения регистров «из коробки» не передаются. Для их переноса движения упаковываются в дополнительные свойства/структуры XDTO в теле документа, а в обработчиках загрузки выполняется явная запись наборов записей.Посмотрим на пример переопределения логики выгрузки свойства объекта в менеджере обмена EnterpriseData:
Процедура ПКО_Документ_РеализацияТоваровУслуг_Реквизиты_ПередВыгрузкой(Источник, Приемник, КомпонентыОбмена)
// Заполняем кастомное свойство XDTO из реквизита документа
Если ЗначениеЗаполнено(Источник.ДоговорКонтрагента) Тогда
Приемник.Вставить("ДоговорИдентификатор", Строка(Источник.ДоговорКонтрагента.УникальныйИдентификатор()));
КонецЕсли;
КонецПроцедуры
Если в инфраструктуре предприятия эксплуатируются сложные самописные или отраслевые правила конвертации с десятками нестандартных объектов, переписывание их на EnterpriseData может быть экономически нецелесообразно. В таком случае оптимальным решением является изоляция механизмов обмена.
Разберем по шагам, как сохранить функционал КД 2.0 в обновляемой базе:
КонвертацияОбъектовИнформационныхБаз и сопутствующие процедуры работы с XML в нетиповой общий модуль конфигурации или в отдельное расширение.Выполнить(Алгоритмы.ИмяАлгоритма), если код выполняется в безопасном режиме. Для устранения ошибки убедитесь, что фоновое задание или обработчик обмена запускаются с отключенным безопасным режимом:
УстановитьБезопасныйРежим(Ложь);
// Запуск выполнения логики конвертации объектов по правилам XML
ОбработкаОбмена = Обработки.НетиповойОбменДаннымиXML.Создать();
ОбработкаОбмена.ИмяФайлаПравил = ПутьКПравилам;
ОбработкаОбмена.ВыполнитьВыгрузку();
Для задач односторонней или двусторонней репликации произвольных срезов данных (например, передача данных в моделирующую базу, витрину отчетов или аналитическую песочницу) эффективной альтернативой правилам XML является использование HTTP-сервисов и формата JSON.
Рассмотрим преимущества такого подхода:
ЗаписьJSON / ЧтениеJSON существенно быстрее.Посмотрим на пример простой отправки пакета данных через HTTP-сервис:
Функция ОтправитьДанныеВПриемник(СтруктураПакета, АдресСервиса)
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураПакета);
ТелоЗапроса = ЗаписьJSON.Закрыть();
HTTPЗапрос = Новый HTTPЗапрос("/api/v1/exchange/push");
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8);
HTTPСоединение = Новый HTTPСоединение(АдресСервиса, 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL());
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Возврат (HTTPОтвет.КодСостояния = 200);
КонецФункции
Проанализируем выбор инструмента в зависимости от сценария использования: