Коротко про XML

Это даже не статья, а заметки по поводу. Для тех, кто совсем не разбирался с XML, может помочь начать. Попытался изложить самое основное про выгрузку-загрузку объектов…

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

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

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

  1. «Продвинутый» вариант выгрузки предполагает, что помимо основного объекта (в нашем примере Документ.РеализацияТоваровУслуг) выгружаются еще и объекты, являющиеся атрибутами ссылочного типа. В нижеследующем примере выгружается  еще и Контрагент из шапки документа.
    Объект = ВыгружаемыйДокумент. ПолучитьОбъект();

Запись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) Простейший вариант загрузки выглядит следующим образом:

    Файл = Новый ЧтениеXML;
Файл.ОткрытьФайл(Путь + "doc_xml.xml");
// Позиционируемся на начале элемента, содержащего документ

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

Объект.Записать();
Исключение
Сообщить(" не могуууу: " + Строка(Объект));                                                                                                                              КонецПопытки;
КонецПопытки;
Сообщить(Строка(Объект));
КонецЕсли;
КонецЦикла;

Файл.Закрыть();

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

5 Comments

  1. daho

    Спасибо, начнем… давно искал что-то подобное

    Reply
  2. mnikol

    Полезная информация. Спасибо.

    Reply
  3. awk

    (0)Жуть, а не статья.

    1. Оформи нормально (в едином стиле).

    2.

    1)При написании XML-выгрузки нужно думать о том, каким образом должны загружаться данные.

    Скорее 1С предусматривает стратегию обмена данными: «Выгрузка в формате приемника». Есть другая стратегия: «Выгрузка как есть.» — Разбор XML проблема принимающей стороны.

    3. Простейшая выгрузка:

    Запись = Новый ЗаписьXML();
    Запись.ОткрытьФайл(Путь + «doc_xml.xml»);
    ЗаписатьXML(Запись, Объект);
    Запись.Закрыть();

    Эта выгрузка подойдет только при идентичных базах. Если базы различны, то придется поплясать с бубном (СериализаторXDTO).

    Только в этом случае, получится простейший код загрузки:

    Чтение = Новый ЧтениеXML;
    Чтение.ПерейтиКСодержимому();
    Объект = ПрочитатьXML(Чтение);
    Объект.Записать();

    4.

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

    Если не будет в базе объекта на который мы ссылаемся, то будет «Объект не найден». При загрузке этого объекта или тестирования и исправления, с выбором «создавать объекты» — отсутствующие объекты будут созданы.

    Reply
  4. dumal

    Спасибо Вам. Такую бы заметочку хотя бы лет пять назад прочитать. Так ведь нет. Сейчас уже неактуально, но начинающим, наверное, поможет

    Reply
  5. ia57

    Спасибо. Немного посветлело.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *