Выгрузка объекта в xml средствами 1C
Posted On 2020-12-18
- При написании XML-выгрузки нужно думать о том, каким образом должны загружаться данные.
- Простейшая выгрузка, которая выгружает документ, выглядит примерно так:
12345678910Объект = ВыгружаемыйДокумент. ПолучитьОбъект();ЗаписьXML = Новый ЗаписьXML;ЗаписьXML.ОткрытьФайл(Путь + "doc_xml.xml");ЗаписьXML.ЗаписатьОбъявлениеXML();ЗаписьXML.ЗаписатьНачалоЭлемента("Root");ЗаписьXML.ЗаписатьНачалоЭлемента("ДокументРеализацияТоваровУслуг");ЗаписатьXML(ЗаписьXML,Объект, НазначениеТипаXML.Явное);ЗаписьXML.ЗаписатьКонецЭлемента(); //ДокументРеализацияТоваровУслугЗаписьXML.ЗаписатьКонецЭлемента(); //RootЗаписьXML.Закрыть();
В данном случае, выгружаются все атрибуты документа. Если атрибут имеет ссылочный тип, то “доминирующим” аспектом в выгрузке такого атрибута будет служить уникальный идентификатор. Другими словами, когда будет происходить загрузка нашей реализации, то если не будет в базе-приемнике, скажем, номенклатуры с уникальным идентификатором, который совпадает с уникальным идентификатором номенклатуры из базы-источника, то вместо номенклатуры будет значение ( или как-то так 🙂 ). На момент загрузки нашей реализации, все атрибуты ссылочного типа уже должны быть загружены в базу.- “Продвинутый” вариант выгрузки предполагает, что помимо основного объекта (в нашем примере Документ.РеализацияТоваровУслуг) выгружаются еще и объекты, являющиеся атрибутами ссылочного типа. В нижеследующем примере выгружается еще и Контрагент из шапки документа.
-
12345678910111213141516171819Объект = ВыгружаемыйДокумент. ПолучитьОбъект();Запись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) Простейший вариант загрузки выглядит следующим образом:
-
12345678910111213141516171819202122232425Файл = Новый ЧтениеXML;Файл.ОткрытьФайл(Путь + "doc_xml.xml");// Позиционируемся на начале элемента, содержащего документПока Файл.Прочитать () Цикл// Проверка на возможность чтения значенияЕсли ВозможностьЧтенияXML(Файл) Тогда// Получается значение ДокументОбъект.Имя.// если значения с таким внутренним идентификатором// нет, то создается новыйОбъект = ПрочитатьXML(Файл);ПопыткаЕсли ТипЗНЧ(Объект) = Тип("СправочникОбъект.Контрагенты") ТогдаОбъект.ГоловнойКонтрагент = Справочники.Контрагенты.ПустаяСсылка();КонецЕсли;Объект.Записать();ИсключениеСообщить(" не могуууу: " + Строка(Объект)); КонецПопытки;КонецПопытки;Сообщить(Строка(Объект));КонецЕсли;КонецЦикла;Файл.Закрыть();
Цикл Файл.Прочитать ()… позволяет пройтись по всем ветвям XML-графа и создать объекты, атрибуты которых определяются “листьями” этих ветвей. В нашем примере, в том случае, если ветвь соответствует Контрагенту, то головному контрагенту присваивается пустая ссылка.