| 
    
        
     
     | 
    
    
  | 
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 
 | 
||||
| 
    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(ПутьКМоемуФайлуСхемы);
     | 
|||
| 
    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С Выдает ошибку несоответствия формата.  | 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |