Как передать дополнительные данные при обмене через Конвертацию данных 2.0 и избежать ошибки "Неверный формат файла"?

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

При настройке обмена данными между конфигурациями, например, между ЗУП 3.1 и УПП 1.3, разработчики часто сталкиваются с необходимостью передать информацию, которой нет в типовых правилах или которая требует предварительного расчета. Одной из типичных проблем является передача аналитики счетов учета, так как в ЗУП 3.1 она отсутствует в привычном виде. Попытка "ручного" добавления узлов в XML-файл обмена часто приводит к фатальной ошибке "Неверный формат файла" при загрузке в приемник. В этой статье мы разберем, почему это происходит и как правильно организовать передачу сложных данных с помощью механизмов Конвертации данных 2.0.

Почему возникает ошибка "Неверный формат файла"?

Рассмотрим причину возникновения этой ошибки. Структура XML-файла, формируемого обработкой УниверсальныйОбменДаннымиXML, строго детерминирована. Правила конвертации ожидают определенную последовательность тегов. Когда мы пытаемся вставить свой подчиненный узел (например, "Дополнительная информация") через ЗаписатьАтрибут или ЗаписатьТег, мы зачастую нарушаем эту последовательность.

Парсер на стороне приемника настроен так, что он ожидает увидеть либо свойства объекта, либо ссылки на подчиненные объекты в строго заданном порядке. Если в поток данных вклинивается неизвестный узел в неположенном месте, чтение прерывается. Чтобы избежать этого, следует использовать штатные механизмы платформы и КД 2.0, которые мы проанализируем ниже.

Решение 1: Использование параметров и сериализация через XDTO

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

Разберем по шагам процесс реализации этого метода. Сначала подготовим данные на стороне источника (ЗУП 3.1). В обработчике ПередВыгрузкойДанных или непосредственно в ПКО (Правила конвертации объектов) мы формируем таблицу значений и превращаем её в строку XML.

Пример кода для подготовки и сериализации данных:


// 1. Создаем и заполняем Таблицу Значений (ТЗ)
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("КодСчета");
ТЗ.Колонки.Добавить("Сумма");
ТЗ.Колонки.Добавить("Подразделение");

НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.КодСчета = "20.01";
НоваяСтрока.Сумма = 150000;
НоваяСтрока.Подразделение = "Основной цех";

// 2. Сериализуем ТЗ в строку XML
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ТЗ);
СтрокаXML = ЗаписьXML.Закрыть();

// 3. Передаем строку в приемник как параметр
ПередатьОдинПараметрВПриемник("ДопДанныеПоСчетам", СтрокаXML);

В данном примере мы использовали СериализаторXDTO. Это критически важно, так как обычный метод ЗначениеВСтрокуВнутр может работать некорректно при обмене между разными версиями платформы или при переходе с управляемого приложения на обычное. XDTO гарантирует сохранение структуры данных в универсальном формате.

На стороне приемника (УПП 1.3) в обработчике ПослеЗагрузкиДанных (глобальный обработчик конвертации) мы можем прочитать этот параметр и преобразовать его обратно в таблицу значений:


// Чтение параметра в приемнике
Если Параметры.Свойство("ДопДанныеПоСчетам") Тогда
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(Параметры.ДопДанныеПоСчетам);
    ТаблицаСчетов = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
    // Далее используем ТаблицуСчетов для дозаполнения документов
КонецЕсли;

Решение 2: Использование стандартного свойства "ДополнительнаяИнформация"

В КД 2.0 у каждого объекта в обработчиках ПослеВыгрузки и ПослеЗагрузки существует предопределенный параметр ДополнительнаяИнформация. Рассмотрим, как его задействовать.

Проанализируем ситуацию: если вам нужно передать данные, относящиеся к конкретному объекту (например, специфические реквизиты заполнения одного документа), вы можете присвоить значение этому параметру непосредственно в ПКО.

На стороне источника (После выгрузки ПКО):

ДополнительнаяИнформация = "СчетЗатрат=26;НоменклатурнаяГруппа=Администрация";

На стороне приемника (После загрузки ПКО):

В этом обработчике переменная ДополнительнаяИнформация уже будет содержать переданную строку. Вам останется только распарсить её и применить к объекту. Важно помнить: если вы передаете через этот параметр сложный объект (структуру или ТЗ), платформа попытается сериализовать его автоматически, но лучше делать это явно через XDTO, как в первом решении, чтобы избежать проблем с типами данных.

Решение 3: Метод ЗаписатьДополнительныйУзел

Существует еще один малодокументированный, но эффективный метод — ЗаписатьДополнительныйУзел(ИмяУзла, Значение). Мы можем использовать его в обработчике ПослеВыгрузки объекта.

Этот метод хорош тем, что он вставляет данные в XML-поток именно в тот момент, когда основной объект уже записан, но узел объекта еще не закрыт. Это позволяет сохранить валидность XML-схемы обмена. Однако для считывания этих данных в приемнике вам придется обращаться к ФайлОбмена в обработчике ПередЗагрузкойОбъекта и вручную позиционироваться на нужном узле, что требует определенных навыков работы с ЧтениеXML.

Нюансы передачи ссылочных данных

Проанализируем важный технический нюанс. При обмене между ЗУП 3.1 и УПП 1.3 вы передаете данные из управляемых форм в обычные. Если в вашей таблице значений (ТЗ) содержатся ссылки на элементы справочников, они могут не "подцепиться" в приемнике автоматически, если для этих типов не настроены соответствующие правила конвертации или если ГУИДы объектов различаются.

Рекомендация: при передаче данных через параметры старайтесь оперировать примитивными типами:

  1. Передавайте Код или Артикул вместо ссылки.
  2. Используйте УникальныйИдентификатор (в виде строки).
  3. На стороне приемника выполняйте поиск объекта по этим признакам.

Это гарантирует, что ваша логика не сломается, если объект в приемнике еще не создан или имеет другой внутренний идентификатор.

Выводы и лучшие практики

Для решения задачи передачи произвольной информации в КД 2.0 мы рекомендуем придерживаться следующих правил:

Применяя эти методы, мы обеспечиваем стабильность обмена и избавляемся от трудноуловимых ошибок формата XML, сохраняя при этом гибкость настройки правил конвертации.

← На главную