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