Имя: Пароль:
1C
 
Версонифицирование объектов
🠗 (Волшебник 03.07.2020 12:41)
0 lamme
 
03.07.20
11:51
УТ11.1
версонифицирование - урезанное.или в зачаточном состоянии
если в документ добавляется реквизит - то восстановится на версиб\ю объекта ДО  ввода этого реквизита - уже не реально.
падает тут


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


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

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

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


...