Имя: Пароль:
1C
1С v8
Ошибка преобразования данных XML
0 Xamio
 
06.11.14
15:08
Пытаюсь получить Объект первой версии документа, сохранённой в справочнике ВерсииОбъектов
код следующий:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ВерсииОбъектов.Объект КАК Документ,
                   |    ВерсииОбъектов.ВерсияОбъекта,
                   |    ВерсииОбъектов.АвторВерсии
                   |ИЗ
                   |    РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
                   |ГДЕ
                   |    ВерсииОбъектов.Объект = &Ссылка
                   |    И ВерсииОбъектов.НомерВерсии = 1";
    Запрос.УстановитьПараметр("Ссылка", Документ);        // где Документ имеет тип ДокументСсылка.РеализацияТоваровУслуг           
    
    Результат = Запрос.Выполнить().Выбрать();
    
    Пока Результат.Следующий() Цикл
        
        ВерсияОбъекта = Результат.ВерсияОбъекта.Получить();
        
        ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
        ВерсияОбъекта.Записать(ИмяВременногоФайла);
        ТекстовыйДокумент = Новый ТекстовыйДокумент;
        ТекстовыйДокумент.Прочитать(ИмяВременногоФайла, КодировкаТекста.UTF8);
        СтрокаXML = ТекстовыйДокумент.ПолучитьТекст();
        УдалитьФайлы(ИмяВременногоФайла);        
        
        ИскОбъект = ПолучитьОбъектИзXML(СтрокаXML);
         КонецЦикла;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
при выполнении последней строки "ИскОбъект = ПолучитьОбъектИзXML(СтрокаXML)" вылетает ошибка:
{Форма.Форма.Форма(626)}: Ошибка при вызове метода контекста (ПрочитатьXML)
            Объект = ПрочитатьXML(ЧтениеXML);
по причине:
Ошибка преобразования данных XML: [32,64]

Странность в том, что уже после выполнения строки "ВерсияОбъекта.Записать(ИмяВременногоФайла);" для разных документов, в переменную "ИмяВременногоФайла" записывается разная структура документа, а именно меняются местами несколько реквизитов. Всего вариаций две, одна из которых обрабатывается нормально и создаётся объект, а другая отличающаяся от первой порядком следования пары реквизитов - выдаёт ошибку. Выгрузил xsd файл конфигурации, в которой присутствует структура документа РеализацияТоваровУслуг именно та, которая читается. Т.е. метод ПрочитатьXML читает по схеме правильно, но тогда вопрос, почему строка "ВерсияОбъекта.Записать(ИмяВременногоФайла);" записывает в "ИмяВременногоФайла" иногда какую-то левую структуру документа, откуда она берётся? кто может пояснить?
1 olegves
 
06.11.14
15:10
поменялась структура твоего объекта (убрали реквизиты или поменяли типы)
2 Maxus43
 
06.11.14
15:11
когда-то меняли структуру документа, в версия старая хранится, которая уже не сериализуется
3 Xamio
 
06.11.14
15:16
кусок структуры которая не читается:
    <Сделка xsi:type="DocumentRef.ЗаказПокупателя">d65b47ad-506b-11e4-b8dd-0025908683b4</Сделка>
    <СуммаДокумента>6388.26</СуммаДокумента>
    <СуммаВключаетНДС>true</СуммаВключаетНДС>
    <Склад>5a6de8df-e106-11df-bfc8-7071bc0bad3d</Склад>
    <СчетУчетаДоходовПоТареБУ>00000000-0000-0000-0000-000000000000</СчетУчетаДоходовПоТареБУ>

кусок структуры которая читается:
    <Сделка xsi:type="DocumentRef.ЗаказПокупателя">cd0d94ad-5f64-11e4-8627-0025908683b4</Сделка>
    <Склад>5a6de8df-e106-11df-bfc8-7071bc0bad3d</Склад>
    <СуммаВключаетНДС>true</СуммаВключаетНДС>
    <СуммаДокумента>9809.14</СуммаДокумента>
    <СчетУчетаДоходовПоТареБУ>00000000-0000-0000-0000-000000000000</СчетУчетаДоходовПоТареБУ>

как можно исправить это? писать костыль который будет менять местами строки в СтрокаXML? или может где старую структуру подправить можно?
4 Xamio
 
06.11.14
15:20
(2) как то странно она хранится только... от 12.10.2014 версия не сериализуется, от 30.10.2014 сериализуется и от 01.11.2014 опять не сериализуется
5 Xamio
 
06.11.14
15:24
в процессе отладки менял местами эти три строчки местами, продолжал выполнение и все сериализовалось..
6 13_Mult
 
06.11.14
15:41
(3) Это же разные документы, нет?
7 Xamio
 
06.11.14
15:42
(6) да, документы разные
8 13_Mult
 
06.11.14
15:45
(7) Там дело не в порядке реквизитов, а скорее в guid
9 Xamio
 
06.11.14
15:47
<СчетУчетаДоходовПоТареБУ>00000000-0000-0000-0000-000000000000</СчетУчетаДоходовПоТареБУ>
тут?
10 13_Mult
 
06.11.14
15:47
(9) DocumentRef.ЗаказПокупателя">d65b47ad-506b-11e4-b8dd-0025908683b4
11 13_Mult
 
06.11.14
15:51
(10) Не уверен, но попробуй у той структуры что читается поменять местами реквизиты и прочитать.
12 13_Mult
 
06.11.14
15:53
(11) Вообще по "Свойству" должно искать
13 Xamio
 
06.11.14
15:53
нет, очень много документов, которые не сериализуются, к примеру этот:
    <Сделка xsi:type="DocumentRef.ЗаказПокупателя">4930f239-4243-11e4-a8a1-0025908683b4</Сделка>
    <СуммаДокумента>10308</СуммаДокумента>
    <СуммаВключаетНДС>true</СуммаВключаетНДС>
    <Склад>5a6de8df-e106-11df-bfc8-7071bc0bad3d</Склад>
сделка везде разная.
дело в том что я в процессе отладки, при обработке реализации с "косячной" структурой, поставил точку останова после строки "ВерсияОбъекта.Записать(ИмяВременногоФайла);" и во временном файле поменял местами строки касающиеся реквизитов СуммаДокумента, СуммаВключаетНДС и Склад. Поменял по аналогии с "рабочей" структурой, продолжил выполнение и нормально получил объект.
14 13_Mult
 
06.11.14
16:02
(13) может не находит объекта по guid, а механизма создания нового у тебя нет.
15 Xamio
 
06.11.14
16:05
(14) у меня есть обработка по поиску объекта по ГУИД, она нормально находит ЗаказПокупателя по гуид
16 Xamio
 
06.11.14
16:47
В итоге ничего умнее не придумал как тупо поменять местами косячные строки в ТекстовомФайле. Работает, но если будут более изящные мысли было бы очень любопытно.

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ВерсииОбъектов.Объект КАК Документ,
                   |    ВерсииОбъектов.ВерсияОбъекта,
                   |    ВерсииОбъектов.АвторВерсии
                   |ИЗ
                   |    РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
                   |ГДЕ
                   |    ВерсииОбъектов.Объект = &Ссылка
                   |    И ВерсииОбъектов.НомерВерсии = 1";
    Запрос.УстановитьПараметр("Ссылка", Документ);        // где Документ имеет тип ДокументСсылка.РеализацияТоваровУслуг          

    
    Результат = Запрос.Выполнить().Выбрать();
    
    Пока Результат.Следующий() Цикл
        
        ВерсияОбъекта = Результат.ВерсияОбъекта.Получить();
        
        ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
        ВерсияОбъекта.Записать(ИмяВременногоФайла);
        ТекстовыйДокумент = Новый ТекстовыйДокумент;
        ТекстовыйДокумент.Прочитать(ИмяВременногоФайла, КодировкаТекста.UTF8);
        ****************    
        Стр = ТекстовыйДокумент.ПолучитьСтроку(29);
    Если Найти(Стр, "<СуммаДокумента>") Тогда            
        ТекстовыйДокумент.ЗаменитьСтроку(29, ТекстовыйДокумент.ПолучитьСтроку(31));
        ТекстовыйДокумент.ЗаменитьСтроку(31, Стр);
    КонецЕсли;
        ****************
        СтрокаXML = ТекстовыйДокумент.ПолучитьТекст();
        УдалитьФайлы(ИмяВременногоФайла);        
        
        ИскОбъект = ПолучитьОбъектИзXML(СтрокаXML);
    КонецЦикла;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Основная теорема систематики: Новые системы плодят новые проблемы.