Вход | Регистрация
 

Версонифицирование объектов

↓ [Волшебник, 03.07.20 - 12:41]
Версонифицирование объектов
Я
   lamme
 
03.07.20 - 11:51
УТ11.1
версонифицирование - урезанное.или в зачаточном состоянии
если в документ добавляется реквизит - то восстановится на версиб\ю объекта ДО  ввода этого реквизита - уже не реально.
падает тут


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


Я понимаю = что ДвоичныеДанные в данному случае - это хмл
кто-ниб делал переделку этого вот штатного метода в обработку через ЧтениеХМЛ
или иное ?

те есть версия документа. ввели реквизит в документ
а вернуть не получается
   PLUT
 
1 - 03.07.20 - 12:02
Знакомая фигня. При изменении метаданных объекта "ломается" платформенное чтение "предыдущей до изменений" версии объекта из двоичных данных.

Переделывал механизьм в УТ10 на чтение/запись сжатого xml. по размерам версия в пожатом xml чуть больше места занимает, чем FastInfoSet, но зато не валится при добавлении/изменении реквизитов метаданных объекта.
   lamme
 
2 - 03.07.20 - 12:04
есть пример как вытащить информацию из таких данных ?
   PLUT
 
3 - 03.07.20 - 12:05
(2) канешн есть
   lamme
 
4 - 03.07.20 - 12:06
Если не критчино - поделись
   lamme
 
5 - 03.07.20 - 12:06
*если не критично
   PLUT
 
6 - 03.07.20 - 12:12
давно это было... поищу, поделюсь
   lamme
 
7 - 03.07.20 - 12:41
ждать или нет ?
   Волшебник
 
Модератор
8 - 03.07.20 - 12:41
нет такого слова "версонифицирование"
   PLUT
 
9 - 22.07.20 - 17:29
(7) для УТ10.3 лет пять назад

общий модуль ВерсионированиеОбъектов, добавил попытку не пытку:

Функция ВосстановитьОбъектПоXML() 
    
    УстановитьПривилегированныйРежим(Истина);
    
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВоВременномХранилище);
    
    ЧтениеFastInfoSet = Новый ЧтениеFastInfoSet;

    Попытка
        ЧтениеFastInfoSet.УстановитьДвоичныеДанные(ДвоичныеДанные);    
        ЧтениеFastInfoSet.Прочитать();
        ЧтениеFastInfoSet.УстановитьДвоичныеДанные(ДвоичныеДанные);
    Исключение
        ИмяЗИП = КаталогВременныхФайлов() + Лев(Новый УникальныйИдентификатор(), 8) + ".zip";
        ДвоичныеДанные.Записать(ИмяЗИП);
        ФайлАрхива = Новый ЧтениеZIPФайла(ИмяЗИП); 
        ИмяФайлаXML = КаталогВременныхФайлов() + ФайлАрхива.Элементы[0].ПолноеИмя;
        ФайлАрхива.Извлечь(ФайлАрхива.Элементы[0], КаталогВременныхФайлов(), РежимВосстановленияПутейФайловZIP.НеВосстанавливать); 
                ФайлАрхива.Закрыть();
        Текст = Новый ТекстовыйДокумент;
        Текст.Прочитать(ИмяФайлаXML);
        
        ЧтениеFastInfoSet = Новый ЧтениеXML;
        ЧтениеFastInfoSet.УстановитьСтроку(Текст.ПолучитьТекст());
        
        Текст = "";
        УдалитьФайлы(ИмяФайлаXML);
        УдалитьФайлы(ИмяЗИП);
    КонецПопытки;
    ФлагИсключение = Ложь;
    
    Попытка
        Объект = ПрочитатьXML(ЧтениеFastInfoSet);
    Исключение 
        ФлагИсключение = Истина;
    КонецПопытки;
    
    Если ФлагИсключение Тогда
        ФлагИсключение = Ложь;
        Попытка
            Результат = РазборПредставленияОбъектаXML(ДвоичныеДанные, Ссылка);
                
            Объект=Ссылка.ПолучитьОбъект();
            //Шапка

            Для Каждого Реквизит из Результат.Реквизиты Цикл
                ИмяРеквизита = Реквизит.НаименованиеРеквизита;
                Если ИмяРеквизита = "Ref" Тогда
                    Продолжить;
                КонецЕсли;
                Если ИмяРеквизита = "DeletionMark" Тогда
                    Объект.ПометкаУдаления = Реквизит.ЗначениеРеквизита;
                КонецЕсли;
                Если ИмяРеквизита = "Date" Тогда
                    Объект.Дата = Реквизит.ЗначениеРеквизита;
                КонецЕсли;
                Если ИмяРеквизита = "Number" Тогда
                    Объект.Номер = Реквизит.ЗначениеРеквизита;
                КонецЕсли;
                Если ИмяРеквизита = "Posted" Тогда
                    Объект.Проведен = Реквизит.ЗначениеРеквизита;
                КонецЕсли;
                Если  Объект.Метаданные().Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
                Иначе
                    Объект[ИмяРеквизита] = Реквизит.ЗначениеРеквизита;
                КонецЕсли;
            КонецЦикла;
            //ТабличныеЧасти

            Для Каждого ТабЧастьСоответствие Из Результат.ТабличныеЧасти Цикл
                ИмяТЧ = ТабЧастьСоответствие.Ключ;
                ТЗ = ТабЧастьСоответствие.Значение;
                Если ТЗ <> Неопределено и ТЗ.Количество() > 0 Тогда
                    Если ОбщегоНазначения.ЕстьТабЧастьДокумента(ИмяТЧ, Объект.Метаданные()) Тогда
                        Объект[ИмяТЧ].Очистить(); 
                                                    
                        Для Каждого СтрокаТЗ Из ТЗ Цикл
                            НоваяСтрока = Объект[ИмяТЧ].Добавить();
                            ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЗ);
                        КонецЦикла;
                    КонецЕсли;
                КонецЕсли;
            КонецЦикла;
        Исключение
            ФлагИсключение = Истина;
        КонецПопытки;
    КонецЕсли;
    
    Если ФлагИсключение Тогда
        ТекстСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
        Возврат Неопределено;
    КонецЕсли;
        
    Возврат Объект;
    
КонецФункции


Функция РазборПредставленияОбъектаXML()
    
    // содержит имя метаданного измененного объекта

    Перем ИмяОбъекта;
    
    // Содержит положение маркера в дереве XML.

    // Требуется для идентификации текущего элемента.

    Перем УровеньЧтения;
    
    // Содержат значения реквизитов справочников / документов

    ЗначенияРеквизитов = Новый ТаблицаЗначений;
    
    ЗначенияРеквизитов.Колонки.Добавить("НаименованиеРеквизита");
    ЗначенияРеквизитов.Колонки.Добавить("ЗначениеРеквизита");
    ЗначенияРеквизитов.Колонки.Добавить("ТипРеквизита");
    ЗначенияРеквизитов.Колонки.Добавить("Тип");
    
    ТабличныеЧасти = Новый Соответствие;
    
    ЧтениеXML = Новый ЧтениеFastInfoSet;
    
    Попытка
        ЧтениеXML.УстановитьДвоичныеДанные(ДвоичныеДанные);    
        ЧтениеXML.Прочитать();
        ЧтениеXML.УстановитьДвоичныеДанные(ДвоичныеДанные);
    Исключение
        ИмяЗИП = КаталогВременныхФайлов() + Лев(Новый УникальныйИдентификатор(), 8) + ".zip";
        ДвоичныеДанные.Записать(ИмяЗИП);
        ФайлАрхива = Новый ЧтениеZIPФайла(ИмяЗИП); 
        ИмяФайлаXML = КаталогВременныхФайлов() + ФайлАрхива.Элементы[0].ПолноеИмя;
        ФайлАрхива.Извлечь(ФайлАрхива.Элементы[0], КаталогВременныхФайлов(), РежимВосстановленияПутейФайловZIP.НеВосстанавливать); 
        ФайлАрхива.Закрыть();
        Текст = Новый ТекстовыйДокумент;
        Текст.Прочитать(ИмяФайлаXML);
        
        ЧтениеXML = Новый ЧтениеXML;
        ЧтениеXML.УстановитьСтроку(Текст.ПолучитьТекст());
        
        Текст = "";
        УдалитьФайлы(ИмяФайлаXML);
        УдалитьФайлы(ИмяЗИП);
    КонецПопытки;
    
    // уровень позиции маркера в иерархии XML:

    // 0 - уровень не задан

    // 1 - первый элемент (имя объекта)

    // 2 - описание реквизита или табличной части

    // 3 - описание строки табличной части

    // 4 - описание поля строки табличной части

    УровеньЧтения = 0;


...

Список тем форума
Рекламное место пустует  Рекламное место пустует
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.