Если 2 базы идентичны по конфигурации, то все работает без проблем в журнале документов. В копировании данных через встроенную в конфигурацию обработку (а не журнал) есть недочет. Если создать новый документ, а реквизит Автор (тип данных Справочник.Пользователи) создать из окна нового документа Счет, то нужно перенести сначала Пользователя, а потом документ Счет копированием через буфер Windows. Иначе будет строчка <Объект не найден> в Счете в базе-приемнике. В копировании группы документов через журнал (выделяем через shift + стрелочка и нажимаем кнопку "Копировать") эта проблема решена, однако механизм заточен под Счет и не универсален. Поэтому пример можно рассматривать как учебный.
Теперь немного о технологии. Все просто для одного элемента, однако с сериализацией и десериализацией нескольких документов были технологические сложности. Я так и не смог сделать это через XDTO быстро, поэтому пошел на хитрость. Я создаю массив XML-строк сериализованных документов (и новых пользователей) в журнале, а потом помещаю этот массив в JSON. Так я получаю JSON-файл, содержащий массив XML-строк сериализованных элементов.
Пример сериализации одного элемента:
&НаСервере
Функция СериализоватьЭкземплярОбъектаОбъектВXML(ОбъектДанных)
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписатьXML(ЗаписьXML, ОбъектДанных);
Возврат ЗаписьXML.Закрыть();
КонецФункции
Пример сериализации нескольких элементов с помещением их в JSON:
&НаКлиенте
Процедура КопироватьДокументы(Команда)
ВыбранныеСтроки = Элементы.Список.ВыделенныеСтроки;
СериализованныйМассивЭкземпляровОбъектов = КопироватьДокументыНаСервере(ВыбранныеСтроки);
РаботаСБуферомОбмена.УстановитьТекстВБуферОбмена(СериализованныйМассивЭкземпляровОбъектов);
КонецПроцедуры
&НаСервере
Функция КопироватьДокументыНаСервере(ВыбранныеСтроки)
МассивЭкземплярыОбъектов = Новый Массив;
Для Каждого ЭлементМассива Из ВыбранныеСтроки Цикл
// Если создать пользователя из окна открытого документа счет, то он не перенесется. Документ Заказ таких проблем лишен.
// Фрагмент кода лишен универсальности и нужен для примера
// Разработка универсального механизма - длинная история
Если ТипЗнч(ЭлементМассива) = Тип("ДокументСсылка.Счет") Тогда
Для Каждого СтрокаТЧ Из ЭлементМассива.Товары Цикл
МассивЭкземплярыОбъектов.Добавить(СтрокаТЧ.Автор.ПолучитьОбъект());
КонецЦикла;
КонецЕсли;
МассивЭкземплярыОбъектов.Добавить(ЭлементМассива.ПолучитьОбъект());
//Сообщить(ЭлементМассива);
КонецЦикла;
СериализованныйМассив = СериализоватьМассивВXML(МассивЭкземплярыОбъектов);
Возврат СериализованныйМассив;
КонецФункции
&НаСервере
Функция СериализоватьМассивВXML(МассивЭкземплярыОбъектов)
// !!!Сериализация XDTO в XML коротким кодом работает только в сторону сериализации,
// но есть вероятность, что я просто не разобался с xsi
//Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
//ОбъектXDTO = Сериализатор.ЗаписатьXDTO(МассивСсылкиНаОбъекты);
//
//ЗаписьXML = Новый ЗаписьXML;
//ЗаписьXML.УстановитьСтроку("UTF-8");
//ЗаписьXML.ЗаписатьОбъявлениеXML();
//ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO,,,,НазначениеТипаXML.Явное);
//Возврат ЗаписьXML.Закрыть();
МассивXMLСтрокСериализованныхЭкземпляровОбъектов = Новый Массив;
Для Каждого ОбъектДанных Из МассивЭкземплярыОбъектов Цикл
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписатьXML(ЗаписьXML, ОбъектДанных);
XMLСтрокаСериализованногоЭкземпляраОбъекта = ЗаписьXML.Закрыть();
МассивXMLСтрокСериализованныхЭкземпляровОбъектов.Добавить(XMLСтрокаСериализованногоЭкземпляраОбъекта);
КонецЦикла;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, МассивXMLСтрокСериализованныхЭкземпляровОбъектов);
Возврат ЗаписьJSON.Закрыть();
КонецФункции
Пример десериализации одного элемента и восстановления в экземпляр объекта:
&НаСервере
Функция ВставитьИзБуфераНаСервере(СериализованныйЭкземплярОбъекта)
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.УстановитьСтроку(СериализованныйЭкземплярОбъекта);
ВосcтановленыйОбъект = ПрочитатьXML(ЧтениеXML);
ВосcтановленыйОбъект.Записать();
КонецФункции
Пример десериализации JSON и восстановления группы экземпляров объектов:
&НаКлиенте
Процедура ВставитьДокументы(Команда)
СериализованныйМассивЭкземпляровОбъектов = РаботаСБуферомОбмена.ПолучитьТекстБуфераОбмена();
ВставитьДокументыНаСервере(СериализованныйМассивЭкземпляровОбъектов);
Элементы.Список.Обновить();
ЭтаФорма.ОбновитьОтображениеДанных();
КонецПроцедуры
&НаСервере
Процедура ВставитьДокументыНаСервере(СериализованныйМассивЭкземпляровОбъектов)
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СериализованныйМассивЭкземпляровОбъектов);
МассивСериализованныхВXMLЭкземпляровОбъектов = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Для Каждого XMLСтрокаСериализованногоЭкземпляраОбъекта Из МассивСериализованныхВXMLЭкземпляровОбъектов Цикл
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.УстановитьСтроку(XMLСтрокаСериализованногоЭкземпляраОбъекта);
ВосcтановленыйОбъект = ПрочитатьXML(ЧтениеXML);
ВосcтановленыйОбъект.Записать();
КонецЦикла;
КонецПроцедуры
Про встроенную в базу обработку я объяснять не буду - там все просто. Выкладываю dt-файл. Платформа 8.3.13.1690.