Как исправить ошибку XDTO-преобразования Header и свойства NewFrom при обмене между УТ и БП?

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

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

Симптомы проблемы и анализ ошибки

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


{ОбщийМодуль.ОбменДаннымиXDTOСервер.Модуль(1933)}: Ошибка при вызове метода контекста (ПрочитатьXML)
Header = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ФабрикаXDTO.Тип(XMLБазоваяСхема(), "Header"));
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://www.1c.ru/SSL/Exchange/Message}Header - [20,11]
Проверка дополнительного свойства:
    форма: Элемент
    имя: {http://www.1c.ru/SSL/Exchange/Message}NewFrom по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {http://www.1c.ru/SSL/Exchange/Message}Header

Разберем структуру выгруженного XML-файла сообщения. В заголовке формата http://www.1c.ru/SSL/Exchange/Message присутствуют служебные теги:


<?xml version="1.0" encoding="UTF-8"?>
<Message xmlns:msg="http://www.1c.ru/SSL/Exchange/Message" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <msg:Header>
        <msg:Format>http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.3</msg:Format>
        <msg:CreationDate>2017-10-27T07:08:15</msg:CreationDate>
        <msg:Confirmation>
            <msg:ExchangePlan>СинхронизацияДанныхЧерезУниверсальныйФормат</msg:ExchangePlan>
            <msg:To>00</msg:To>
            <msg:From>БП</msg:From>
            <msg:MessageNo>22</msg:MessageNo>
            <msg:ReceivedNo>10</msg:ReceivedNo>
        </msg:Confirmation>
        <msg:AvailableVersion>1.5</msg:AvailableVersion>
        <msg:AvailableVersion>1.4</msg:AvailableVersion>
        <msg:AvailableVersion>1.3</msg:AvailableVersion>
        <msg:AvailableVersion>1.2</msg:AvailableVersion>
        <msg:NewFrom>БП</msg:NewFrom>
    </msg:Header>
    <Body xmlns="http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.3"/>
</Message>

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

Способ 1. Обновление конфигурации-приемника (Рекомендуемый)

Самым корректным решением является обновление конфигурации «1С:Управление торговлей» до актуального релиза. Рассмотрим преимущества этого варианта:

  1. Вместе с обновлением конфигурации обновляются версии XDTO-пакетов подсистемы БСП, включая пакет ExchangeMessage.
  2. Платформа получает валидное описание типа Header, поддерживающее элемент NewFrom.
  3. Устраняются риски возникновения несовместимости при дальнейших изменениях формата обмена EnterpriseData.

Способ 2. Доработка XDTO-пакета в конфигурации-приемнике

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

  1. Найдем в базе-приемнике XDTO-пакет ExchangeMessage (пространство имен http://www.1c.ru/SSL/Exchange/Message).
  2. Перейдем к типу объекта Header.
  3. Добавим новое свойство со следующими параметрами:
    • Имя: NewFrom
    • Тип: string (пространство имен XMLSchema)
    • Форма: Элемент
    • Минимальное количество: 0 (чтобы свойство оставалось необязательным)
  4. Сохраним изменения. Теперь ФабрикаXDTO сможет считывать XML-сообщения, содержащие этот элемент.

Способ 3. Очистка или предварительная обработка файла обмена

Рассмотрим вариант быстрого обхода ошибки без модификации структур данных конфигурации. Так как тег NewFrom является служебным и не критичен для передачи самих бизнес-данных (документов и справочников), его можно удалить из файла перед считыванием.

Проанализируем ручной и автоматический варианты очистки:

  1. Ручной вариант: откроем выгруженный из БП XML-файл в текстовом редакторе и удалим строку <msg:NewFrom>БП</msg:NewFrom>, после чего повторно запустим загрузку в УТ.
  2. Программный вариант: с помощью расширения перехватим процедуру чтения XML в общем модуле ОбменДаннымиXDTOСервер и реализуем удаление ненужного тега из текста файла до вызова метода ФабрикаXDTO.ПрочитатьXML().
← На главную