Зачем нужны "ПравилаОбменаКорреспондента" в приемнике при синхронизации данных через БСП?

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

При настройке и кастомизации синхронизации данных между конфигурациями 1С на базе Библиотеки стандартных подсистем (БСП) разработчики часто сталкиваются с неочевидной логикой работы макетов правил. На первый взгляд структура XML-файла сообщения содержит в себе всё необходимое: и сами выгруженные данные, и правила их конвертации. Возникает логичный вопрос: зачем в базе-приемнике вообще хранить макет ПравилаОбменаКорреспондента, если теоретически система могла бы прочитать правила напрямую из входящего XML-файла?

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

Архитектура двустороннего обмена: зеркальность макетов

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

Давайте проанализируем схему взаимодействия макетов в базах при двустороннем обмене:

  1. Когда База А выполняет выгрузку в Базу Б, она использует свой макет ПравилаОбмена.
  2. Когда База Б принимает эти данные от Базы А, она использует свой макет ПравилаОбменаКорреспондента.
  3. При обратном потоке (из Базы Б в Базу А) База Б выгружает данные по своим ПравилаОбмена, а База А загружает их, опираясь на свои ПравилаОбменаКорреспондента.

Такой подход обеспечивает автономность каждой информационной базы. Но почему нельзя просто прочитать эти правила из заголовка входящего XML-файла обмена, как это делалось в старых внешних обработках типа УниверсальныйОбменДаннымиXML?

Ключевой фактор: Информационная безопасность и защита от инъекций кода

Главная причина, по которой БСП игнорирует секцию правил конвертации во входящем XML-файле — это безопасность выполнения кода (концепция Sandbox). Рассмотрим эту ситуацию подробнее.

Файл обмена XML передается по открытым или слабо защищенным каналам связи (сетевые папки, FTP-серверы, электронная почта, облачные диски). На любом из этих этапов XML-файл может быть перехвачен и модифицирован злоумышленником или вирусным ПО.

Правила обмена в формате «Конвертации данных 2.1» — это не просто разметка сопоставления полей. Они содержат в себе произвольный исполняемый код на встроенном языке 1С, который выполняется в различных обработчиках событий (например, ПередЗагрузкой, ПриЗагрузке, ПослеЗагрузки, ПослеЗагрузкиОбъекта).

Если бы база-приемник безоговорочно загружала и выполняла алгоритмы, пришедшие в XML-файле, это открыло бы критическую уязвимость:

Именно поэтому в современных конфигурациях БСП **секция XML-файла, содержащая правила обмена, полностью игнорируется при автоматическом обмене**. Приемник использует только исполняемый код обработчиков, который хранится внутри его собственного защищенного контура (в макете ПравилаОбменаКорреспондента или предварительно одобренном и записанном в безопасный регистр сведений ПравилаДляОбменаДанными).

Почему изменения в правилах источника срабатывают в приемнике? Анализ практического кейса

Рассмотрим частую ситуацию, которая вызывает путаницу у разработчиков: мы добавили новое поле (например, перенос реквизита «Комментарий» из источника в реквизит «Примечание» приемника) только в макет ПравилаОбмена на стороне источника. Приемник мы не трогали, его макет ПравилаОбменаКорреспондента остался старым. Тем не менее данные успешно перенеслись и заполнились. Почему так происходит, если правила в XML игнорируются?

Давайте разберем этот процесс по шагам:

  1. Этап выгрузки (в источнике): Источник, используя свои обновленные ПравилаОбмена, видит соответствие полей. Он берет значение из реквизита «Комментарий» и записывает его в XML-файл уже под целевым именем приемника. В XML-сообщении это выглядит так:
    
    <Свойство Имя="Примечание" Тип="Строка">
        <Значение>Важный комментарий к документу</Значение>
    </Свойство>
    
  2. Этап загрузки (в приемнике): Приемник начинает последовательно читать XML-файл. Движок загрузки БСП сопоставляет свойства «на лету». Видя тег свойства с именем "Примечание", загрузчик просто пытается записать это значение в соответствующий реквизит объекта в базе данных. Для выполнения этого стандартного платформенного действия никакие правила обмена на стороне приемника не требуются. Если реквизит с таким именем физически существует в метаданных документа базы-приемника, он будет успешно заполнен.

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

Когда макет "ПравилаОбменаКорреспондента" критически необходим в приемнике?

Локальные правила на стороне приемника вступают в работу только тогда, когда стандартного сопоставления объектов и реквизитов платформой недостаточно. Нам обязательно понадобятся актуальные ПравилаОбменаКорреспондента в приемнике в следующих случаях:

Посмотрим на пример кода, который может содержаться в локальных правилах приемника в обработчике ПослеЗагрузки:


// Данный код выполнится в приемнике только если он прописан в его локальных правилах (ПравилаОбменаКорреспондента)
Если Объект.Проведен Тогда
    // Дополнительная проверка бизнес-логики приемника
    Если Не ЗначениеЗаполнено(Объект.Склад) Тогда
        Объект.Склад = Справочники.Склады.ОсновнойСклад;
        Объект.Записать(РежимЗаписиДокумента.Проведение);
    КонецЕсли;
КонецЕсли;

Если бы мы обновили этот обработчик только в источнике, то при загрузке в приемник он бы просто проигнорировался ради безопасности всей системы.

Резюме

Подведем итоги нашего анализа:

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

← На главную