При интеграции с системой Честный ЗНАК (СУЗ) через механизм XDTO в 1С часто возникают ошибки валидации XML на стороне сервера. Это происходит из-за строгих требований к структуре документа, заданных в XSD-схемах. Давайте разберем, как проанализировать и исправить подобные ошибки, чтобы ваш файл успешно проходил проверку.
Основная проблема заключается в том, что валидаторы СУЗ крайне чувствительны к порядку следования элементов, типам данных и метаинформации (пространствам имен). Рассмотрим ключевые факторы, которые влияют на корректность формирования XML.
1. Соблюдение порядка элементов
В схемах XSD часто используется модель sequence. Это означает, что дочерние элементы должны располагаться в строго определенной последовательности. Если при формировании объекта XDTO вы добавляете свойства в произвольном порядке, итоговый XML может не соответствовать схеме. 1С на выходе ориентируется на порядок свойств в типе объекта XDTO.
2. Соответствие типов данных (Типизация)
Важно убедиться, что вы используете правильные типы для всех вложенных структур. Ошибка в типе, например, использование OrderProduct вместо OrderProductMilk, приведет к отказу в загрузке, даже если структура полей кажется верной. Проверьте через отладчик тип свойства products и его соответствие схеме.
3. Пространства имен и заголовки
Метод ЗаписатьОбъявлениеXML часто бывает избыточным, если ФабрикаXDTO уже самостоятельно формирует заголовок. Также часто возникает вопрос с атрибутами xsi:schemaLocation. Если фабрика их не добавляет, убедитесь, что структура корневого элемента содержит корректные определения xmlns.
Для успешной отправки документа, выполним следующие шаги:
ФабрикаXDTO.XSD-схеме.Посмотрим на пример правильного формирования структуры в коде:
// Инициализация пакета и определение корневого элемента
ПакетЗаказКодовСУЗ = Фабрика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, если ФабрикаXDTO делает это автоматически. Рассмотрим вариант записи:
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("c:\test.xml", "UTF-8");
// Запись объявления не требуется, так как ФабрикаXDTO делает это при вызове метода ЗаписатьXML
ФабрикаXDTO.ЗаписатьXML(Запись, ГлавныйПакетXDTO, "order");
Запись.Закрыть();
Если после правок XML все еще не загружается, проанализируйте следующее:
XML. Это самый быстрый способ найти конкретную строку с ошибкой.Честного ЗНАКа. Обратите особое внимание на все атрибуты в корневом теге, такие как xmlns:xsi и xsi:schemaLocation.UTF-8 без BOM, чтобы парсер системы не воспринимал невидимые символы как ошибку формата.Помните, что интеграция с СУЗ требует высокой точности в соблюдении структуры XSD. В случае возникновения проблем, последовательно проверяйте тип каждого узла и порядок следования дочерних элементов в коллекции products.