При работе с механизмами интеграции в среде 1С:Предприятие специалисты часто сталкиваются с ситуацией, когда стандартная обработка УниверсальныйОбменДаннымиXML (широко известная как обработка для работы с Конвертацией данных 2.1) отказывается корректно считывать файл, выдавая предупреждение или ошибку на тег ДанныеПоОбмену. Рассмотрим подробнее, почему это происходит, в чем заключается техническая разница между форматами файлов и как правильно решить эту проблему, чтобы процесс загрузки данных прошел успешно.
Проанализируем ситуацию: когда мы пытаемся загрузить файл через «Универсальный обмен данными XML», система ожидает строго определенную структуру XML-документа. Эта структура продиктована правилами конвертации (КД 2.1). Основным корневым элементом в таком файле должен быть тег ФайлОбмена. Внутри него располагаются секции с правилами обмена (если они выгружены в файл) и непосредственно сами данные (объекты платформы).
Однако, если файл был сформирован не вручную через обработку выгрузки, а автоматически через механизм Планов обмена (например, при нажатии кнопки «Выполнить обмен» в типовой конфигурации), 1С формирует так называемое «Сообщение обмена». Это сообщение имеет структуру транспортного конверта.
Разберем, из чего состоит этот конверт. Он начинается с заголовка v8msg:Message, внутри которого находится секция ДанныеПоОбмену. Этот узел содержит служебную информацию, необходимую для синхронизации:
Проблема заключается в том, что парсер обработки УниверсальныйОбменДаннымиXML не обучен игнорировать этот транспортный заголовок. Встречая тег ДанныеПоОбмену вместо ожидаемого ФайлОбмена, обработка воспринимает его как некорректные данные или неизвестный формат, что приводит к остановке процесса или невозможности запустить режим отладки.
Первое, что мы должны сделать, — это определить, каким инструментом был создан файл. Если файл является частью регулярной синхронизации данных между базами, то загружать его следует не через универсальную обработку, а через штатный механизм обмена данными в самой конфигурации.
Посмотрим на алгоритм действий в этом случае:
В этом случае система задействует программный код, который сначала «вскрывает» транспортный конверт, анализирует содержимое узла ДанныеПоОбмену, проверяет номера сообщений и только потом передает внутреннее содержимое (тело сообщения) механизму загрузки. Это позволяет избежать конфликта форматов.
Если наша задача — перенести данные разово или выполнить отладку правил конвертации, нам нужно изменить способ формирования файла на стороне источника. Попробуем выгрузить данные так, чтобы в файле не создавался лишний транспортный заголовок.
Для этого выполним следующие шаги:
УниверсальныйОбменДаннымиXML.Сформированный таким образом файл будет начинаться непосредственно с тега ФайлОбмена. Такой файл будет идеально «понят» обработкой в базе-приемнике без каких-либо ошибок на наличие узла ДанныеПоОбмену.
Рассмотрим ситуацию, когда у нас уже есть готовый файл сообщения обмена, а перевыгрузить его из источника нет возможности. В этом случае нам придется «очистить» XML от транспортных заголовков.
Самый простой (но пригодный только для небольших файлов) способ — открыть файл в текстовом редакторе (например, Notepad++ или встроенный редактор 1С) и вручную удалить всё, что находится до тега ФайлОбмена, а также закрывающие теги транспортного конверта в самом конце файла.
Если же файл большой или нам нужно автоматизировать этот процесс, мы можем написать небольшую процедуру на языке 1С, которая будет считывать данные, пропуская заголовок. Проанализируем пример логики программного обхода этой проблемы:
// Пример программного чтения файла с пропуском транспортного заголовка
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьКФайлу);
// Читаем до тех пор, пока не встретим начало нужного нам узла
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "ФайлОбмена" Тогда
// Мы нашли начало данных конвертации, теперь можем передать ЧтениеXML в обработку
Прервать;
КонецЕсли;
КонецЦикла;
// Далее можно инициализировать обработку загрузки
ОбработкаЗагрузки = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаЗагрузки.ЧтениеXML = ЧтениеXML;
// Настройка параметров и выполнение загрузки...
Проанализируем еще один важный момент, упомянутый в обсуждении: невозможность запустить отладку. При включении режима «Отладка загрузки» в обработке УниверсальныйОбменДаннымиXML, система создает временные файлы и перестраивает алгоритм чтения. Наличие узла ДанныеПоОбмену сбивает позиционирование курсора чтения XMLReader.
Важный совет: Если вам критически важна отладка именно на этом файле, используйте метод предварительной очистки (Способ 3). Удаление узла ДанныеПоОбмену и внешнего конверта v8msg:Message превратит «Сообщение обмена» в обычный «Файл данных», который штатно обрабатывается во всех режимах, включая отладку выгруженных обработчиков (перед загрузкой, при загрузке и т.д.).
Подводя итог, отметим, что ошибка имяузла="ДанныеПоОбмену" — это не баг обработки, а следствие смешивания двух разных технологий обмена. Инструмент УниверсальныйОбменДаннымиXML предназначен для работы с «чистыми» данными КД 2.1, а тег ДанныеПоОбмену — это принадлежность инфраструктуры Планов обмена. Выбирая правильный инструмент или предварительно подготавливая файл, мы обеспечиваем стабильную и предсказуемую работу механизмов интеграции.