Имя: Пароль:
1C
 
XDTO. Переносы строк в xml файле.
,
0 SuKaS
 
06.11.18
10:36
Добрый день всем.

Создаю xml файл используя пакеты XDTO. Схемы были предоставлены  гос. конторой, поэтому XDTO казалось использовать проще... Но не тут то было.
Файл сформировался отлично, данные в него загружены, но выявилось 2 беды:

1. Файл, при открытии его в notepad++ не имеет переносов строк. Т.е. он в одну строку. В принципе, при открытии через XML Explorer или Edge проблем никаких и нормально парсится, но на принимающей стороне ругаются. При создании файла через ЗаписьXML такой проблемы нет.

2. Вторая беда в том, что необходимо задать псевдонимы пространства имен (задаются в начале файла), а потом используются в теле документа уже псевдонимы.
Например, в корневом каталоге прописаны NS
xmlns:УТ="http://url.url/UT/2017-08-21"; - здесь УТ есть имя
Оно уже используется в самом документе
<Реквизиты>
    <УТ:Дата>2017-03-31</УТ:Дата>
    <УТ:Номер>654684</УТ:Номер>
</Реквизиты>

Но в XDTO я не нашел как задать такой параметр.

Если что сможет чем помочь, буду благодарен (+97 в карму)
1 asady
 
06.11.18
10:41
(0) что-то типа этого

типУТ = ФабрикаXDTO.Тип("http://url.url/UT/2017-08-21","УТ";);
2 DmitrO
 
06.11.18
10:59
В объекте ЗаписьXML настраивается и 1 и 2.

>>Создаю xml файл используя пакеты XDTO
Как так формируется xml файл с использованием XDTO, и не используя ЗаписьXML, не понятно. Это даже как-то постараться надо. :)
3 SuKaS
 
06.11.18
12:11
(1) Так тип не получить. Получить надо тип конкретного объекта пространства имен.
Например: типУТ_ФИО = ФабрикаXDTO.Тип("http://url.url/UT/2017-08-21","УТ";, "ТипФИО");

(2) Не совсем правильно выразился. Имеется ввиду, что запись формируется механизмами XDTO и указанными схемами. Без использования методов ЗаписьXML.ЗаписатьНачалоЭлемента ЗаписьXML.ЗаписатьАтрибут и ЗаписьXML.ЗаписатьКонецЭлемента
4 DmitrO
 
06.11.18
12:20
по пунктам:
1. Смотри в СП объект ПараметрыЗаписиXML отступы настраиваются там и по умолчанию они вроде итак заданы.
2. Смотри метод ЗаписатьСоответствиеПространстваИмен у объекта ЗаписьXML. Все используемые пространства имен можно объявить в корневом элементе.
5 arsik
 
гуру
06.11.18
12:29
(0) xsd схема то есть у вас? Если ест то, например делаете так:
Фабрика = СоздатьФабрикуXDTO(ПутьКМоемуФайлуСхемы);
ПростанствоИмен = "http://url.url/UT/2017-08-21";;
ТипУТ = Фабрика.Тип(ПростанствоИмен,"УТ");
ОбъектУТ = Фабрика.Создать(ТипУТ);
ОбъектУТ.Дата = '20170331';
ОбъектУТ.Номер = '654684';
6 SuKaS
 
06.11.18
13:47
(4) ЗаписатьСоответствиеПространстваИмен используется при использовании ЗаписьXML.ЗаписатьНачалоЭлемента и вызывается после него. Я же не использую ЗаписатьНачалоЭлемента, все элементы записываются автоматически механизмом XDTO.
7 SuKaS
 
06.11.18
13:52
(4) ПараметрыЗаписиXML помогли, большое спасибо!
Смутило по началу, что свойства не доступны для записи.
Так работает:
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина, Истина);

Так не работает:
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML();
ПараметрыЗаписиXML.Отступ = Истина;
8 DmitrO
 
06.11.18
14:02
(6)да, а вот чтобы объявить префиксы пространств имен один раз, корневой элемент надо делать ручками (ЗаписатьНачалоЭлемента), потом нахлобучивать префиксы пространств имен, потом уже вдувать в файл объекты XDTO сериализатором или фабрикой, ну и в конце ручками закрыть корневой элемент.
9 SuKaS
 
06.11.18
14:45
(8) Большое спасибо, попробую.
Еще вопросик небольшой, может сталкивались. В схеме прописан тип данных "ТипДеньгиКоп". Подразумевается, что формат будет с копейками, т.е. число 5 должно записаться как 5.00.
Бился пару дней с этой проблемой, по итогу исправил тип в схеме на строку и пишу строку "5.00". 1С настырно отбрасывает лишние по ее мнению нули.
Хотя образец в схеме прописан "\-?[0-9]+\.\d{2}"
10 SuKaS
 
06.11.18
15:10
(8) Спасибо, это помогло. Правда немного увеличило код. Ранее вся запись в файл была в одну строку - это запись корневого элемента. Теперь немного увеличилось, но вроде работает.
Но теперь не ясно, как сделать запись о пространстве имен без префикса... Т.е. самое первое пространство имен, основное так сказать.
11 DmitrO
 
06.11.18
15:16
(9)Если у типа задан образец, то базовый тип у него string, а мы туда число пихаем. Объект XDTO не преобразовывает числа к строке по образцу, вместо этого 1С по своему обыкновению просто не явно преобразует число к строке.

Выдерживать образец это задача самого программиста. Т.е. сам форматируй функцией Формат и пихай строку.

Это разработчики схемы надурили, им надо было взять базовый тип decimal, и ограничить его как надо. Тогда бы работало с присвоением числа.
12 DmitrO
 
06.11.18
15:22
(10)пространство имен без префикса это тоже определенное пространство имен и задается так: ЗаписатьСоответствиеПространстваИмен("", "тут uri ПИ").

Имя элемента, в котором объявляется префикс пространства имен, уже может содержать этот префикс.
13 DmitrO
 
06.11.18
15:33
С точки зрения xml парсеров это два совершенно одинаковых квалифицированных элемента:

<n1:data xmlns:n1="uri_test" />
<data xmlns="uri_test" />

Для них это одно и тоже, читаться и соответствовать схеме будет и то и это.
14 SuKaS
 
06.11.18
16:05
(12) Да, это я сам допер. С именами. А вот по типам не до конца.
Есть такая структура:
<СВ>
  <Сумма>6975.49</Сумма>
  <Доход>2480.48</Доход>
</СВ>
"Сумма" и "Доход" имеют тип "ТипДеньги", который описан в другом пространстве имен как ТипыЗначений.

А уже во втором пространстве имен есть описание ТипаЗначений "ТипДеньги" как атомарного типа. И в нем базовый тип decimal.

Если в это поле мы пытаемся положить число 5.20, то оно автоматически обрезается до 5.2, а это уже не удовлетворяет формату схемы. 1С Выдает ошибку несоответствия формата.