Статья 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 объект будет не новым (ЭтоНовый()=Ложь), но будет содержать данные полученные из файла; если объекта с таким идентификатором нет, то объект будет новым (ЭтоНовый()=Истина), он будет содержать данные из файла и ему будет уже назначена ссылка нового.