Коротко про 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 не будет опубликован. Обязательные поля помечены *