Копирование нескольких документов в базах с идентичной конфигурацией через буфер Windows из одной базы в другую (учебный пример)
Версия 8.3.13.1690. Конфигурация позволяет выделить в журнале документов несколько документов и скопировать их через буфер MS Windows из базы-источника в базу-приемник при условии, что конфигурации идентичны. Перенос данных написан под конкретный документ — счет и заказ, поэтому пример можно скорее рассматривать, как учебный. Универсальный механизм обмена для документа с любой структурой — следующий этап для решения этой задачи, который в этой конфигурации не решен. Также можно копировать элементы справочника Пользователи через обработку.
- Описание
- Подробнее
Описание
Если 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.
Копирование нескольких документов в базах с идентичной конфигурацией через буфер Windows из одной базы в другую (учебный пример)
Версия 8.3.13.1690. Конфигурация позволяет выделить в журнале документов несколько документов и скопировать их через буфер MS Windows из базы-источника в базу-приемник при условии, что конфигурации идентичны. Перенос данных написан под конкретный документ — счет и заказ, поэтому пример можно скорее рассматривать, как учебный. Универсальный механизм обмена для документа с любой структурой — следующий этап для решения этой задачи, который в этой конфигурации не решен. Также можно копировать элементы справочника Пользователи через обработку.
- Описание
- Подробнее
Описание
Если 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.
Копирование нескольких документов в базах с идентичной конфигурацией через буфер Windows из одной базы в другую (учебный пример)
Версия 8.3.13.1690. Конфигурация позволяет выделить в журнале документов несколько документов и скопировать их через буфер MS Windows из базы-источника в базу-приемник при условии, что конфигурации идентичны. Перенос данных написан под конкретный документ — счет и заказ, поэтому пример можно скорее рассматривать, как учебный. Универсальный механизм обмена для документа с любой структурой — следующий этап для решения этой задачи, который в этой конфигурации не решен. Также можно копировать элементы справочника Пользователи через обработку.
- Описание
- Подробнее
Описание
Если 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.
Копирование нескольких документов в базах с идентичной конфигурацией через буфер Windows из одной базы в другую (учебный пример)
Версия 8.3.13.1690. Конфигурация позволяет выделить в журнале документов несколько документов и скопировать их через буфер MS Windows из базы-источника в базу-приемник при условии, что конфигурации идентичны. Перенос данных написан под конкретный документ — счет и заказ, поэтому пример можно скорее рассматривать, как учебный. Универсальный механизм обмена для документа с любой структурой — следующий этап для решения этой задачи, который в этой конфигурации не решен. Также можно копировать элементы справочника Пользователи через обработку.
- Описание
- Подробнее
Описание
Если 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.
Копирование нескольких документов в базах с идентичной конфигурацией через буфер Windows из одной базы в другую (учебный пример)
Версия 8.3.13.1690. Конфигурация позволяет выделить в журнале документов несколько документов и скопировать их через буфер MS Windows из базы-источника в базу-приемник при условии, что конфигурации идентичны. Перенос данных написан под конкретный документ — счет и заказ, поэтому пример можно скорее рассматривать, как учебный. Универсальный механизм обмена для документа с любой структурой — следующий этап для решения этой задачи, который в этой конфигурации не решен. Также можно копировать элементы справочника Пользователи через обработку.
- Описание
- Подробнее
Описание
Если 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.
