Статья DmitrO с itland.ru "Перенос данных из одной конфигурации в другую отличную конфигурацию."
Теперь попробуем дать ответ на практический вопрос: как с помощью механизма XDTO перенести данные из одной конфигурации в другую, причем конфигурации разные.
Надо понимать, что схема «http://v8.1c.ru/8.1/data/enterprise/current-config» годится для обмена данными между идентичными конфигурациями, и позволяет выполнять преобразование ОбъектXDTO↔Объект1С. Можно этим воспользоваться!
Далее, мы имеем разные конфигурации, поэтому при переносе нам нужно на каком-то этапе (выгрузка/загрузка) выполнять преобразование данных. Обычно это делается на этапе выгрузки - не будем отходить от традиций, кроме того, обычно это имеет ряд преимуществ.
1. Для формирования данных выгрузки нам необходима схема конфигурации-приемника. Выгрузим ее в файл: в конфигурации-примнике в дереве конфигурации правой кнопочкой по узлу «Пакеты XDTO»/Экспорт XML-схемы данных конфигурации…
2. Приступим к выгрузке. Для формирования данных выгрузки создаем фабрику на основе схемы, указав путь к файлу схемы конфигурации-приемника:
ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.ОткрытьФайл(ИмяФайла); Пути = Новый Массив(); Пути.Добавить("C:\DestinatonConf.xsd"); Фабрика = СоздатьФабрикуXDTO(Пути);
3. Создадим тип ТипОбъектаXDTO для помещения в него данных из конфигурации-источника:
ТипПриходнаяНакладная = Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentObject.ПриходнаяНакладная");
Обратите внимание, этот объект ТипОбъектаXDTO отображает тип именно конфигурации приемника, т.к. экзкмпляр объекта фабрики у нас работает по схеме загруженной из файла, а не по данным текущей конфигурации.
4. Создадим ОбъектXDTO по типу, и объект 1С конфигурации-источника:
ОбъектПриходнаяНакладная = Фабрика.Создать(ТипПриходнаяНакладная); ПосуплениеТовараОбъект = ПосуплениеТовара.ПолучитьОбъект();
5. Заполним ОбъектXDTO выполнив необходимые преобразования данных
ОбъектПриходнаяНакладная.Ref = ПосуплениеТовараОбъект.Ссылка.УникальныйИдентификатор(); ОбъектПриходнаяНакладная.DeletionMark = ПосуплениеТовараОбъект.ПометкаУдаления; ОбъектПриходнаяНакладная.Date = ПосуплениеТовараОбъект.Дата; ОбъектПриходнаяНакладная.Number = ПосуплениеТовараОбъект.Номер; ОбъектПриходнаяНакладная.Posted = ПосуплениеТовараОбъект.Проведен; ОбъектПриходнаяНакладная.Комментарий = ПосуплениеТовараОбъект.Комментарий; ОбъектПриходнаяНакладная.КраткийСоставДокумента = ПосуплениеТовараОбъект.КраткийСоставДокумента; ОбъектПриходнаяНакладная.Ответственный = ПосуплениеТовараОбъект.Ответственный.УникальныйИдентификатор(); ....
6. Выполним запись объекта в файл:
Фабрика.ЗаписатьXML(ЗаписьXML, ОбъектПриходнаяНакладная); ЗаписьXML.Закрыть();
Выгрузка закончена.
В конфигурации-приемнике код загрузки получается весьма простым:
ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ИмяФайла); ПриходнаяНакладнаяОбъект = СериализаторXDTO.ПрочитатьXML(ЧтениеXML); ПриходнаяНакладнаяОбъект.ОбменДанными.Загрузка = Истина; ПриходнаяНакладнаяОбъект.Записать(РежимЗаписиДокумента.Запись); ЧтениеXML.Закрыть();
Причем, если объект 1С с таким идентификатором будет существовать в базе к моменту прочтения его из файла, то возвращаемый методом ПрочитатьXML объект будет не новым (ЭтоНовый()=Ложь), но будет содержать данные полученные из файла; если объекта с таким идентификатором нет, то объект будет новым (ЭтоНовый()=Истина), он будет содержать данные из файла и ему будет уже назначена ссылка нового.