Crmgo Блог

Xdto, выгрузка в другой документ

Xdto, выгрузка в другой документ

Теперь попробуем дать ответ на практический вопрос: как с помощью механизма XDTO перенести данные из одной конфигурации в другую, причем конфигурации разные. Надо понимать, что схема "http://v8.1c.ru/8.1/data/enterprise/current-config" годится для обмена данными между идентичными конфигурациями, и позволяет выполнять преобразование ОбъектXDTO<->Объект1С. Можно…

Xdto, выгрузка в другой документ

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

Примечание: материал мог быть создан с помощью ИИ и затем отредактирован человеком. Ответственный: Dmytro Lomaka, Kaltenkirchen.

Рубрики: 1C