Сохранение производится процедурой СохранитьРеквизитыИТабличныеЧасти. В качестве параметров она принимает сохраняемый объект и имя файла. Ссылочные реквизиты сохраняются в виде 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. Значение], ИмяТекУзла) ;
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
В приложенном файле -
Скачивать файлы может только зарегистрированный пользователь! - демонстрационная обработка, позволяющая сохранить ссылочный объект БД в файл и заполнить объект из файла. Заполняемый объект должен быть того же типа, что и сохраненный, а также он должен быть предварительно создан, сохранен в ИБ и выбран в поле "Ссылка".
Код 1C v 8.х Процедура Выгрузка(Элемент)
Путь = "c:\" ;
ЗаписьXML = Новый ЗаписьXML( ) ;
ЗаписьXML. ОткрытьФайл( Путь + "выгрузка.xml" ) ;
Узел = ПланыОбмена. Поставка. НайтиПоКоду( "Маг1" ) ;
ЗапСообщения = ПланыОбмена. СоздатьЗаписьСообщения( ) ;
ЗапСообщения. НачатьЗапись( ЗаписьXML, Узел) ;
Выборка = ПланыОбмена. ВыбратьИзменения( Узел, ЗапСообщения. НомерСообщения) ;
Пока Выборка. Следующий( ) Цикл
Данные = Выборка. Получить( ) ;
Если ТипЗнч( Данные) = Тип( "ДокументОбъект.РеализацияТоваров" ) Тогда
ВыгрузкаРеализации( ЗаписьXML, Данные) ;
Иначе
ЗаписатьXML( ЗаписьXML, Данные) ;
КонецЕсли ;
КонецЦикла ;
ЗапСообщения. ЗакончитьЗапись( ) ;
ЗаписьXML. Закрыть( ) ;
КонецПроцедуры
Процедура ВыгрузкаРеализации(ЗаписьXML, Документ)
ЗаписьXML. ЗаписатьНачалоЭлемента( "DocumentObject.ПередачаТовара" ) ;
ЗаписатьXML( ЗаписьXML, Документ. Ссылка. УникальныйИдентификатор( ) , "Ref" , НазначениеТипаXML. Явное) ;
ЗаписатьXML( ЗаписьXML, Документ. ПометкаУдаления, "DeletionMark" , НазначениеТипаXML. Явное) ;
ЗаписатьXML( ЗаписьXML, Документ. ВалютаДокумента, "ВалютаДокумента" , НазначениеТипаXML. Явное) ;
ЗаписьXML. ЗаписатьНачалоЭлемента( "Товары" ) ;
Для Каждого ТекСтрока Из Документ. Товары Цикл
ЗаписьXML. ЗаписатьНачалоЭлемента( "Row" ) ;
ЗаписатьXML( ЗаписьXML, ТекСтрока. Номенклатура, "Номенклатура" , НазначениеТипаXML. Явное) ;
ЗаписатьXML( ЗаписьXML, ТекСтрока. Количество, "Количество" , НазначениеТипаXML. Явное) ;
ЗаписьXML. ЗаписатьКонецЭлемента( ) ;
КонецЦикла ;
ЗаписьXML. ЗаписатьКонецЭлемента( ) ;
ЗаписьXML. ЗаписатьКонецЭлемента( ) ;
КонецПроцедуры
Процедура Загрузка(Элемент)
Путь = "c:\" ;
ЧтениеXML = Новый ЧтениеXML( ) ;
ЧтениеXML. ОткрытьФайл( Путь + "выгрузка.xml" ) ;
ЧтСообщения = ПланыОбмена. СоздатьЧтениеСообщения( ) ;
ЧтСообщения. НачатьЧтение( ЧтениеXML) ;
ПланыОбмена. УдалитьРегистрациюИзменений( ЧтСообщения. Отправитель, ЧтСообщения. НомерСообщения) ;
Пока ВозможностьЧтенияДанных( ЧтениеXML) Цикл
Данные = ПрочитатьДанные( ЧтениеXML) ;
Если РазрешениеКоллизий( Данные) Тогда
Данные. ОбменДанными. Отправитель = ЧтСообщения. Отправитель;
Данные. ОбменДанными. Загрузка = Истина ;
Данные. Записать( ) ;
КонецЕсли ;
КонецЦикла ;
ЧтСообщения. ЗакончитьЧтение( ) ;
ЧтениеXML. Закрыть( ) ;
КонецПроцедуры
Функция ВозможностьЧтенияДанных(ЧтениеXML)
ТипXML = ПолучитьXMLТип( ЧтениеXML) ;
Если ТипXML = Неопределено Тогда
Возврат Ложь ;
КонецЕсли ;
Если ТипXML. ИмяТипа = "DocumentObject.ПередачаТовара" И ТипXML. URIПространстваИмен = "" Тогда
Возврат Истина ;
КонецЕсли ;
Возврат ВозможностьЧтенияXML( ЧтениеXML) ;
КонецФункции
Функция ПрочитатьДанные(ЧтениеXML)
ТипXML = ПолучитьXMLТип( ЧтениеXML) ;
Если ТипXML. ИмяТипа = "DocumentObject.ПередачаТовара" И ТипXML. URIПространстваИмен = "" Тогда
Возврат ЧтениеРеализации( ЧтениеXML) ;
КонецЕсли ;
Возврат ПрочитатьXML( ЧтениеXML) ;
КонецФункции
Функция ЧтениеРеализации(ЧтениеXML)
ЧтениеXML. Прочитать( ) ;
ПолученнаяСсылка = ПрочитатьXML( ЧтениеXML) ;
Док = Документы. ПоступлениеТоваров. ПолучитьСсылку( Новый УникальныйИдентификатор( ПолученнаяСсылка) ) ;
Документ = Док. ПолучитьОбъект( ) ;
Если Документ = Неопределено Тогда
Документ = Документы. ПоступлениеТоваров. СоздатьДокумент( ) ;
Документ. УстановитьСсылкуНового( Док) ;
Документ. Дата = ТекущаяДата;
Документ. УстановитьНовыйНомер( ) ;
КонецЕсли ;
Документ. ПометкаУдаления = ПрочитатьXML( ЧтениеXML) ;
Документ. ВалютаДокумента = ПрочитатьXML( ЧтениеXML) ;
ЧтениеXML. Прочитать( ) ;
Документ. Товары. Очистить( ) ;
Пока ЧтениеXML. Имя = "Row" Цикл
ЧтениеXML. Прочитать( ) ;
НоваяСтрока = Документ. Товары. Добавить( ) ;
НоваяСтрока. Номенклатура = ПрочитатьXML( ЧтениеXML) ;
НоваяСтрока. Количество = ПрочитатьXML( ЧтениеXML) ;
ЧтениеXML. Прочитать( ) ;
КонецЦикла ;
ЧтениеXML. Прочитать( ) ;
ЧтениеXML. Прочитать( ) ;
Возврат ( Документ) ;
КонецФункции
Функция РазрешениеКоллизий(Данные)
Если ТипЗнч( Данные) = Тип( "ДокументОбъект.ПоступлениеТоваров" ) Тогда
Если Не Данные. ЭтоНовый( ) Тогда
СсылкаНаУзел = ПланыОбмена. Поставка. НайтиПоКоду( "Опт" ) ;
Если ПланыОбмена. ИзменениеЗарегистрировано( СсылкаНаУзел, Данные) Тогда
Возврат ( Ложь ) ;
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
Возврат ( Истина ) ;
КонецФункции