Имя: Пароль:
1C
 
УПП при попытке восстановить объект из истории сыпется ошибка при "ПрочитатьXML"
0 Бешеный заяц
 
08.01.21
10:06
в регистре "ВерсииОбъектов" храниться xml с версией объекта, при попытке восстановиться из неё возникает ошибка, скорее всего связано с тем что состав реквизитов поменялся, подскажите, есть ли возможность принудительно
восстановить по принципу что есть то восстанавливаем, ошибки игнорируем?

ниже процедура восстановления для наглядности.

Процедура КоманднаяПанель1ВосстановитьВерисию(Кнопка)
    
    Если ЭлементыФормы.СписокВерсий.ТекущиеДанные = Неопределено Тогда
        Предупреждение("Необходимо выбрать версию обьъекта!");
        Возврат;
    КонецЕсли;
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Объект",СсылкаНаОбъект);
    Запрос.УстановитьПараметр("НомерВерсии", Число(ЭлементыФормы.СписокВерсий.ТекущиеДанные.НомерВерсии));
    Запрос.Текст =
            "ВЫБРАТЬ ПЕРВЫЕ 1
            |    ВерсииОбъектов.Объект,
            |    ВерсииОбъектов.НомерВерсии,
            |    ВерсииОбъектов.ВерсияОбъекта
            |ИЗ
            |    РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
            |ГДЕ
            |    ВерсииОбъектов.Объект = &Объект
            |    И ВерсииОбъектов.НомерВерсии = &НомерВерсии";
    
    Результат = Запрос.Выполнить().Выгрузить();
    ХранилищеДокумента= Результат[0].ВерсияОбъекта;
    ДвоичныеДанные=ХранилищеДокумента.Получить();
    
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
    ДвоичныеДанные.Записать(ИмяВременногоФайла);
    
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл(ИмяВременногоФайла);
    Объектик = ПрочитатьXML(ЧтениеXML);
    ЧтениеXML.Закрыть();
    Объектик.Записать();
    
    УдалитьФайлы(ИмяВременногоФайла);
    
КонецПроцедуры
1 ДенисЧ
 
08.01.21
10:11
Объектик = ПрочитатьXML(ЧтениеXML);

Это замени на ручной парсер
2 Бешеный заяц
 
08.01.21
10:12
(1) в ручную каждый реквизит обрабатывать?
3 Бешеный заяц
 
08.01.21
10:15
хотя можно цикл по метаданным устроить + по имени метаданных пытаться значение получать
4 Вафель
 
08.01.21
10:19
в типовой бсп как раз таки ручной обход
5 Бешеный заяц
 
08.01.21
10:22
(4) где это можно найти? может мне имеет смысл его использовать? в УПП шной бсп уже было такое?
6 Вафель
 
08.01.21
10:24
в уппшной наверное нет.
скачай прследнюю бсп и посмотри
7 RomanYS
 
08.01.21
10:27
(0) >>скорее всего связано с тем что состав реквизитов поменялся
сомнительное предположение, вроде в версии не пишется объект целиком. Может метаданные переименовали ("Удалить...").
Посмотрел бы глазами XML для начала
8 Вафель
 
08.01.21
10:32
(7) а смысл смотреть?
хмл все равно не начнет читаться
9 RomanYS
 
08.01.21
10:38
(8) может там и не XML совсем, а ты время тратишь на парсинг.
(7) посмотрел УПП, реально объект пишется :(
ЗаписатьXML(ЗаписьXML, Источник, НазначениеТипаXML.Явное);
10 Бешеный заяц
 
08.01.21
10:47
(6) не нашел ручного в БСП, вот каким способом восстановление идет, правда используют "ЧтениеFastInfoSet" с ним не работал не знаю что за зверь

Функция ВосстановитьОбъектПоXML(ДанныеОбъекта, ТекстСообщенияОбОшибке = "")
    
    УстановитьПривилегированныйРежим(Истина);
    
    ДвоичныеДанные = ДанныеОбъекта;
    Если ТипЗнч(ДанныеОбъекта) = Тип("Структура") Тогда
        ДвоичныеДанные = ДанныеОбъекта.Объект;
    КонецЕсли;
    
    ЧтениеFastInfoSet = Новый ЧтениеFastInfoSet;
    ЧтениеFastInfoSet.УстановитьДвоичныеДанные(ДвоичныеДанные);
    
    Попытка
        Объект = ПрочитатьXML(ЧтениеFastInfoSet);
    Исключение
        ЗаписьЖурналаРегистрации(НСтр("ru = 'Версионирование'", ОбщегоНазначения.КодОсновногоЯзыка()),
            УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
        ТекстСообщенияОбОшибке = НСтр("ru = 'Не удалось перейти на выбранную версию.
                                            |Возможная причина: версия объекта была записана в другой версии программы.
                                            |Техническая информация об ошибке: %1'");
        ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщенияОбОшибке, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
        Возврат Неопределено;
    КонецПопытки;
    
    Возврат Объект;
    
КонецФункции