Выгрузка объекта в xml средствами 1C

  1. При написании XML-выгрузки  нужно думать о том, каким образом  должны загружаться данные.
  2. Простейшая  выгрузка, которая выгружает документ,  выглядит примерно так:
        Объект = ВыгружаемыйДокумент. ПолучитьОбъект();
        ЗаписьXML = Новый ЗаписьXML;
        ЗаписьXML.ОткрытьФайл(Путь + "doc_xml.xml");
        ЗаписьXML.ЗаписатьОбъявлениеXML();
        ЗаписьXML.ЗаписатьНачалоЭлемента("Root");   
        ЗаписьXML.ЗаписатьНачалоЭлемента("ДокументРеализацияТоваровУслуг");  
        ЗаписатьXML(ЗаписьXML,Объект, НазначениеТипаXML.Явное);       
        ЗаписьXML.ЗаписатьКонецЭлемента(); //ДокументРеализацияТоваровУслуг              
        ЗаписьXML.ЗаписатьКонецЭлемента(); //Root
        ЗаписьXML.Закрыть();

    В данном случае, выгружаются все атрибуты документа. Если атрибут имеет ссылочный тип, то «доминирующим» аспектом в выгрузке такого атрибута будет служить уникальный идентификатор. Другими словами, когда будет происходить загрузка нашей реализации, то если не будет в базе-приемнике, скажем, номенклатуры  с  уникальным идентификатором, который совпадает с уникальным идентификатором номенклатуры из базы-источника, то вместо номенклатуры будет значение (  или как-то так 🙂  ). На момент загрузки нашей реализации, все атрибуты ссылочного типа уже должны быть загружены в базу.

    1. «Продвинутый» вариант выгрузки предполагает, что помимо основного объекта (в нашем примере Документ.РеализацияТоваровУслуг) выгружаются еще и объекты, являющиеся атрибутами ссылочного типа. В нижеследующем примере выгружается  еще и Контрагент из шапки документа.
  3.     Объект = ВыгружаемыйДокумент. ПолучитьОбъект();
    
        ЗаписьXML = Новый ЗаписьXML;
        ЗаписьXML.ОткрытьФайл(Путь + "doc_xml.xml");
        ЗаписьXML.ЗаписатьОбъявлениеXML();
        ЗаписьXML.ЗаписатьНачалоЭлемента("Root");
    
        //!!!!!!
        ЗаписьXML.ЗаписатьНачалоЭлемента("СправочникКонтрагенты");
        Контрагент = Объект.Контрагент.ПолучитьОбъект();
        ЗаписатьXML(ЗаписьXML,Контрагент, НазначениеТипаXML.Явное);
        ЗаписьXML.ЗаписатьКонецЭлемента(); //СправочникКонтрагенты
        //!!!!!!
    
        ЗаписьXML.ЗаписатьНачалоЭлемента("ДокументРеализацияТоваровУслуг");               
        ЗаписатьXML(ЗаписьXML,Объект, НазначениеТипаXML.Явное); 
        ЗаписьXML.ЗаписатьКонецЭлемента(); //ДокументРеализацияТоваровУслуг          
        ЗаписьXML.ЗаписатьКонецЭлемента(); //Root
        ЗаписьXML.Закрыть();

    Теперь,  когда мы будем загружать в информационную базу-приемник нашу реализацию, то сможем создать или изменить объект  типа «Контрагент».

    Очевидно, что у объекта ссылочного типа могут быть свои атрибуты ссылочного типа, а у тех — свои. Таким образом, если мы хотим выгрузить ссылочный объект «полностью», то должны построить дерево выгрузки, например, при помощи рекурсии.

     

     Загрузка объекта в xml средствами 1C 

     

    1) Должен быть подготовленный файл с выгруженными данными, из которого, собственно и произойдет выгрузка

    2) Простейший вариант загрузки выглядит следующим образом:

  4.     Файл = Новый ЧтениеXML;
        Файл.ОткрытьФайл(Путь + "doc_xml.xml");
        // Позиционируемся на начале элемента, содержащего документ
    
        Пока Файл.Прочитать () Цикл
            // Проверка на возможность чтения значения
            Если ВозможностьЧтенияXML(Файл) Тогда
                // Получается значение ДокументОбъект.Имя.
                // если значения с таким внутренним идентификатором
                // нет, то создается новый
                Объект = ПрочитатьXML(Файл);
                Попытка
                    Если ТипЗНЧ(Объект) = Тип("СправочникОбъект.Контрагенты") Тогда
                        Объект.ГоловнойКонтрагент = Справочники.Контрагенты.ПустаяСсылка();                                                           
                    КонецЕсли;
    
                    Объект.Записать();
                Исключение
                    Сообщить(" не могуууу: " + Строка(Объект));                                                                                                                              КонецПопытки;
                КонецПопытки;
                Сообщить(Строка(Объект));
            КонецЕсли; 
        КонецЦикла;
    
        Файл.Закрыть();

    Цикл Файл.Прочитать ()… позволяет пройтись по всем ветвям  XML-графа и создать объекты,  атрибуты которых определяются «листьями» этих ветвей. В нашем примере, в том случае, если ветвь  соответствует Контрагенту, то головному контрагенту присваивается пустая ссылка.