Как исправить ошибку при заполнении XML через XDTO для СУЗ Честный ЗНАК?

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

При интеграции с системой Честный ЗНАК (СУЗ) через механизм XDTO в 1С часто возникают ошибки валидации XML на стороне сервера. Это происходит из-за строгих требований к структуре документа, заданных в XSD-схемах. Давайте разберем, как проанализировать и исправить подобные ошибки, чтобы ваш файл успешно проходил проверку.

Разбор основных причин ошибок при работе с XDTO

Основная проблема заключается в том, что валидаторы СУЗ крайне чувствительны к порядку следования элементов, типам данных и метаинформации (пространствам имен). Рассмотрим ключевые факторы, которые влияют на корректность формирования XML.

1. Соблюдение порядка элементов

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

2. Соответствие типов данных (Типизация)

Важно убедиться, что вы используете правильные типы для всех вложенных структур. Ошибка в типе, например, использование OrderProduct вместо OrderProductMilk, приведет к отказу в загрузке, даже если структура полей кажется верной. Проверьте через отладчик тип свойства products и его соответствие схеме.

3. Пространства имен и заголовки

Метод ЗаписатьОбъявлениеXML часто бывает избыточным, если ФабрикаXDTO уже самостоятельно формирует заголовок. Также часто возникает вопрос с атрибутами xsi:schemaLocation. Если фабрика их не добавляет, убедитесь, что структура корневого элемента содержит корректные определения xmlns.

Пошаговое решение проблемы формирования XML

Для успешной отправки документа, выполним следующие шаги:

  1. Проверим соответствие типов, используемых при создании объектов через ФабрикаXDTO.
  2. Убедимся, что все элементы добавлены в том порядке, который определен в исходной XSD-схеме.
  3. Проверим корректность записи файла без избыточных методов.

Посмотрим на пример правильного формирования структуры в коде:


// Инициализация пакета и определение корневого элемента
ПакетЗаказКодовСУЗ = ФабрикаXDTO.Пакеты.Получить("urn:oms.order");
СвойствоOrder = ПакетЗаказКодовСУЗ.КорневыеСвойства.Получить("order");
ГлавныйПакетXDTO = ФабрикаXDTO.Создать(СвойствоOrder.Тип);

// Создание объекта товара и заполнение свойств
ФБТИП = ФабрикаXDTO.Тип("urn:oms.order", "OrderMilkType");
ТоварМолокоXDTO = ФабрикаXDTO.Создать(ФБТИП);
ТоварМолокоXDTO.contactPerson = "Имя Фамилия";
// ... остальные поля ...

// Заполнение коллекции продуктов
ПродуктыXDTO = ФБТИП.Свойства.Получить("products").Тип;
products = ФабрикаXDTO.Создать(ПродуктыXDTO);
XDTOПродукт = ПродуктыXDTO.Свойства.Получить("product").Тип;
СписокКодовXDTO = ФабрикаXDTO.Создать(XDTOПродукт);

// Заполнение параметров маркировки
СписокКодовXDTO.cisType = "UNIT";
СписокКодовXDTO.gtin = "04607088111111";
// ... 

products.product.Добавить(СписокКодовXDTO);
ТоварМолокоXDTO.products = products;
ГлавныйПакетXDTO.milk = ТоварМолокоXDTO;

Как правильно записать файл XML

При записи файла важно не дублировать объявление XML, если ФабрикаXDTO делает это автоматически. Рассмотрим вариант записи:


Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("c:\test.xml", "UTF-8");
// Запись объявления не требуется, так как ФабрикаXDTO делает это при вызове метода ЗаписатьXML
ФабрикаXDTO.ЗаписатьXML(Запись, ГлавныйПакетXDTO, "order");
Запись.Закрыть();

Рекомендации по отладке

Если после правок XML все еще не загружается, проанализируйте следующее:

Помните, что интеграция с СУЗ требует высокой точности в соблюдении структуры XSD. В случае возникновения проблем, последовательно проверяйте тип каждого узла и порядок следования дочерних элементов в коллекции products.

← На главную