Код 1C v 8.х ИмяФайла= ПолучитьИмяВременногоФайла( "XML" ) ;
Результат. Очистить( ) ;
Фильтр= Новый Структура;
Фильтр. Вставить( "ДатаНачала" , НачалоПериода) ;
Фильтр. Вставить( "ДатаОкончания" , ОкончаниеПериода) ;
Фильтр. Вставить( "Событие" , "_$Data$_.Post" ) ;
Состояние( "Выгрузка журнала..." ) ;
ВыгрузитьЖурналРегистрации( ИмяФайла, Фильтр, "Дата, Метаданные, Данные, ПредставлениеДанных, ИмяПользователя" ) ;
Состояние( "Обработка журнала..." ) ;
ЧтениеXML= Новый ЧтениеXML;
ЧтениеXML. ОткрытьФайл( ИмяФайла) ;
ПостроительDOM= Новый ПостроительDOM;
ДокументDOM= ПостроительDOM. Прочитать( ЧтениеXML) ;
Event= ДокументDOM. ПолучитьЭлементыПоИмени( "v8e:Event" ) ;
Для й= 0 По Event. Количество( ) - 1 Цикл
ДочерниеУзлы= Event[й]. ДочерниеУзлы;
Для Каждого Узел Из ДочерниеУзлы Цикл
Если Узел. ИмяУзла= "v8e:Date" Тогда
ДатаСобытия= СтрЗаменить( Узел. ТекстовоеСодержимое, "T" , "" ) ;
ДатаСобытия= СтрЗаменить( ДатаСобытия, ":" , "" ) ;
ДатаСобытия= Дата( СтрЗаменить( ДатаСобытия, "-" , "" ) ) ;
ИначеЕсли Узел. ИмяУзла= "v8e:MetadataName" Тогда
МетаданныеДокумента= СтрЗаменить( Узел. ТекстовоеСодержимое, "Document." , "" ) ;
ИначеЕсли Узел. ИмяУзла= "v8e:Data" Тогда
УИД= Узел. ТекстовоеСодержимое;
ИначеЕсли Узел. ИмяУзла= "v8e:DataPresentation" Тогда
ПредставлениеДанных= Узел. ТекстовоеСодержимое;
ИначеЕсли Узел. ИмяУзла= "v8e:UserName" Тогда
Пользователь= Узел. ТекстовоеСодержимое;
КонецЕсли ;
КонецЦикла ;
Ссылка= Документы[МетаданныеДокумента]. ПолучитьСсылку( Новый УникальныйИдентификатор( УИД) ) ;
ДатаОбъекта= Ссылка. Дата;
НоваяСтрока= Результат. Добавить( ) ;
НоваяСтрока. ДатаСобытия= ДатаСобытия;
НоваяСтрока. ДатаОбъекта= ДатаОбъекта;
НоваяСтрока. ПредставлениеДанных= ПредставлениеДанных;
НоваяСтрока. Пользователь= Пользователь;
НоваяСтрока. РазностьДат= Окр( ( ДатаСобытия- ДатаОбъекта) / 86400 ) ;
НоваяСтрока. Ссылка= Ссылка;
КонецЦикла ;
Сохранение производится процедурой СохранитьРеквизитыИТабличныеЧасти. В качестве параметров она принимает сохраняемый объект и имя файла. Ссылочные реквизиты сохраняются в виде GUID.
Код 1C v 8.х Процедура СохранитьРеквизитыИТабличныеЧасти (Объект, ИмяФайлаXML=Неопределено) Экспорт
ФайлXML = Новый ЗаписьXML;
ФайлXML. ОткрытьФайл( ИмяФайлаXML) ;
ФайлXML. ЗаписатьОбъявлениеXML( ) ;
ФайлXML. ЗаписатьНачалоЭлемента( "Root" ) ;
ФайлXML. ЗаписатьАтрибут( "Объект" , Объект. Метаданные( ) . Имя) ;
Для Каждого Реквизит Из Объект. Метаданные( ) . Реквизиты Цикл
ФайлXML. ЗаписатьНачалоЭлемента( "Реквизит" ) ;
ФайлXML. ЗаписатьАтрибут( "Имя" , Реквизит. Имя) ;
ТипЗначения = ТипЗнч( Объект[Реквизит. Имя]) ;
Если Не ТипЗначения = Тип( "Неопределено" ) Тогда
ФайлXML. ЗаписатьАтрибут( "ИмяТипа" , XMLТип( ТипЗначения) . ИмяТипа) ;
ФайлXML. ЗаписатьАтрибут( "URI" , XMLТип( ТипЗначения) . URIПространстваИмен) ;
КонецЕсли ;
ФайлXML. ЗаписатьТекст( XMLСтрока( Объект[Реквизит. Имя]) ) ;
ФайлXML. ЗаписатьКонецЭлемента( ) ;
КонецЦикла ;
Для Каждого ТЧ из Объект. Метаданные( ) . ТабличныеЧасти Цикл
ФайлXML. ЗаписатьНачалоЭлемента( "ТабличнаяЧасть" ) ;
ФайлXML. ЗаписатьАтрибут( "Имя" , ТЧ. Имя) ;
Для Каждого СтрокаТЧ из Объект[ТЧ. Имя] Цикл
ФайлXML. ЗаписатьНачалоЭлемента( "ЭлементКоллекции" ) ;
Для Каждого РеквизитТЧ Из ТЧ. Реквизиты Цикл
ФайлXML. ЗаписатьНачалоЭлемента( "Реквизит" ) ;
ФайлXML. ЗаписатьАтрибут( "Имя" , РеквизитТЧ. Имя) ;
ТипЗначения = ТипЗнч( СтрокаТЧ[РеквизитТЧ. Имя]) ;
Если Не ТипЗначения = Тип( "Неопределено" ) Тогда
ФайлXML. ЗаписатьАтрибут( "ИмяТипа" , XMLТип( ТипЗначения) . ИмяТипа) ;
ФайлXML. ЗаписатьАтрибут( "URI" , XMLТип( ТипЗначения) . URIПространстваИмен) ;
КонецЕсли ;
ФайлXML. ЗаписатьТекст( XMLСтрока( СтрокаТЧ[РеквизитТЧ. Имя]) ) ;
ФайлXML. ЗаписатьКонецЭлемента( ) ;
КонецЦикла ;
ФайлXML. ЗаписатьКонецЭлемента( ) ;
КонецЦикла ;
ФайлXML. ЗаписатьКонецЭлемента( ) ;
КонецЦикла ;
Если Не ФайлXML= Null Тогда
ФайлXML. ЗаписатьКонецЭлемента( ) ;
ФайлXML. Закрыть( ) ;
КонецЕсли ;
КонецПроцедуры
За чтение объекта отвечают процедуры ЗагрузитьРеквизитыИТабличныеЧасти и ЗагрузитьОбъектРекурсивно. Чтобы прочитать объект вызывается первая, ей передаются объект, который необходимо заполнить, и имя файла. Вторая является вспомогательной.
Код 1C v 8.х Процедура ЗагрузитьРеквизитыИТабличныеЧасти(Объект, ИмяФайлаXML=Неопределено) Экспорт
Если Не ИмяФайлаXML = Неопределено Тогда
ФайлXML = Новый ЧтениеXML;
ФайлXML. ОткрытьФайл( ИмяФайлаXML) ;
Пока ФайлXML. Прочитать( ) Цикл
Если ФайлXML. ТипУзла = ТипУзлаXML. НачалоЭлемента Тогда
ЗагрузитьОбъектРекурсивно( ФайлXML, Объект, ФайлXML. Имя) ;
КонецЕсли
КонецЦикла ;
КонецЕсли ;
КонецПроцедуры
Процедура ЗагрузитьОбъектРекурсивно(ФайлXML, Объект, знач ИмяУзла)
ИмяТипа = "" ;
ПространствоИмен = "" ;
Пока ФайлXML. ПрочитатьАтрибут( ) Цикл
Если ФайлXML. Имя = "ИмяТипа" Тогда
ИмяТипа = ФайлXML. Значение;
ИначеЕсли ФайлXML. Имя = "URI" Тогда
ПространствоИмен = ФайлXML. Значение;
КонецЕсли ;
КонецЦикла ;
Пока ФайлXML. Прочитать( ) Цикл
Если ФайлXML. ТипУзла = ТипУзлаXML. КонецЭлемента И ФайлXML. Имя = ИмяУзла Тогда
Возврат ;
ИначеЕсли ФайлXML. ТипУзла = ТипУзлаXML. Текст Тогда
ТипОбъекта = ИзXMLТипа( ИмяТипа, ПространствоИмен) ;
Если НЕ ТипОбъекта = Неопределено тогда
Объект = XMLЗначение( ТипОбъекта, ФайлXML. Значение) ;
КонецЕсли ;
ИначеЕсли ФайлXML. ТипУзла = ТипУзлаXML. НачалоЭлемента Тогда
ИмяТекУзла = ФайлXML. Имя;
Если ФайлXML. Имя = "ЭлементКоллекции" Тогда
ЗагрузитьОбъектРекурсивно( ФайлXML, Объект. Добавить( ) , ИмяТекУзла) ;
Иначе
Если ФайлXML. ПрочитатьАтрибут( ) Тогда
ЗагрузитьОбъектРекурсивно( ФайлXML, Объект[ФайлXML. Значение], ИмяТекУзла) ;
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
В приложенном файле -
Скачивать файлы может только зарегистрированный пользователь! - демонстрационная обработка, позволяющая сохранить ссылочный объект БД в файл и заполнить объект из файла. Заполняемый объект должен быть того же типа, что и сохраненный, а также он должен быть предварительно создан, сохранен в ИБ и выбран в поле "Ссылка".