Работаем с XML используя ЧтениеXML и ЗаписьXML Примеры кода для Записи данных в XML файл и его последующего Чтения:
Код 1C v 8.3 &НаКлиенте
Функция ВывестиЭлем(ХМЛ,Знач Смещ);
Рез=1;
Попытка
Пока ХМЛ.Прочитать() Цикл
ТипУзла=ХМЛ.ТипУзла;
Если (ТипУзла=ТипУзлаXML.НачалоЭлемента) Тогда
Смещ=Смещ+" ";
Сообщить(Смещ+"Элемент "+ХМЛ.Имя+":",СтатусСообщения.Важное);
Пока (ХМЛ.ПрочитатьАтрибут()) Цикл
Сообщить(Смещ+"Атрибут: "+ХМЛ.Имя+", значение: <"+ХМЛ.Значение+">");
КонецЦикла;
ИначеЕсли (ТипУзла=ТипУзлаXML.КонецЭлемента) Тогда
Смещ=Лев(Смещ,СтрДлина(Смещ)-4);
ИначеЕсли (ТипУзла=ТипУзлаXML.Текст) Тогда
Сообщить(Смещ+"Текст элемента: <"+ХМЛ.Значение+">");
ИначеЕсли (ТипУзла=ТипУзлаXML.СекцияCDATA) Тогда
Сообщить(Смещ+"CDATA: <"+ХМЛ.Значение+">");
ИначеЕсли (ТипУзла=ТипУзлаXML.Комментарий) Тогда
Сообщить(Смещ+"Комментарий: <"+ХМЛ.Значение+">",СтатусСообщения.Информация);
Иначе
Сообщить(Смещ+"Элемент "+ХМЛ.Имя+":");
Сообщить(Смещ+"Тип: "+ХМЛ.Значение);
КонецЕсли;
КонецЦикла;
Исключение
Сообщить(ОписаниеОшибки());
Рез=0;
КонецПопытки;
Возврат Рез;
КонецФункции
&НаКлиенте
Процедура ВыгрузитьХМЛ(ИмяФайла) Экспорт
ХМЛ=Новый ЗаписьXML;
ХМЛ.ОткрытьФайл(ИмяФайла,Новый ПараметрыЗаписиXML("windows-1251",,Ложь,Ложь));
ХМЛ.ЗаписатьОбъявлениеXML();
ХМЛ.ЗаписатьНачалоЭлемента("Файл");
ХМЛ.ЗаписатьАтрибут("Атрибут_Файл_1","Здесь содержимое Атрибут_Файл_1");
ХМЛ.ЗаписатьТекст("Здесь содержимое Файл");
ХМЛ.ЗаписатьКомментарий("Далее следует содержимое файла");
ХМЛ.ЗаписатьНачалоЭлемента("СодержимоеФайла");
ХМЛ.ЗаписатьАтрибут("Атрибут_СодержимоеФайла_1","Здесь содержимое Атрибут_СодержимоеФайла_1");
ХМЛ.ЗаписатьТекст("Здесь содержимое СодержимоеФайла");
ХМЛ.ЗаписатьСекциюCDATA("Это секция CDATA");
ХМЛ.ЗаписатьКонецЭлемента();
ХМЛ.ЗаписатьКонецЭлемента();
ХМЛ.Закрыть();
ХМЛ=Неопределено;
ХМЛ=Новый ЧтениеXML;
ХМЛ.ОткрытьФайл(ИмяФайла,Новый ПараметрыЧтенияXML(,,,ТипПроверкиXML.НетПроверки));
ВывестиЭлем(ХМЛ,"");
ХМЛ.Закрыть();
ХМЛ=Неопределено;
КонецПроцедуры
Категория:
XML, DBF, TXT, CSV Обмен между базами через XML (создается ФабрикаXDTO) В процедурах выгрузки/загрузки создается ФабрикаXDTO из схемы, которая хранится в макете как файл. Файл настроек схемы надо использовать один и тот же в обработках Загрузки/Выгрузки
Из Фабрики создается объект, его заполняю выгружаемыми данными
Фабрику сохраняю в XML. В процедуре загрузки из читаю фабрику из XML и пробегаю по объектам
Очень удобно!
Код 1C v 8.х Функция СоздатьФайлСхемы()
ФайлСхемы = Новый Файл(КаталогВременныхФайлов() + "schema.xsd");
Если ФайлСхемы.Существует() Тогда
УдалитьФайлы(ФайлСхемы.ПолноеИмя);
КонецЕсли;
Ссылка = ПолучитьМакет("schema_xsd");
Ссылка.Записать(ФайлСхемы.ПолноеИмя);
Возврат ФайлСхемы.ПолноеИмя;
КонецФункции
Функция ВыгрузитьДокументы()
ФайлыXSD = Новый Массив();
ФайлыXSD.Добавить(СоздатьФайлСхемы());
Фабрика = СоздатьФабрикуXDTO(ФайлыXSD);
ФайлОбмена = Фабрика.Создать(Фабрика.Тип("http://anton.fly7.ru", "ФайлОбмена"));
Пока Выборка.Следующий() Цикл
Документ = Фабрика.Создать(Фабрика.Тип("http://anton.fly7.ru", "Документ"));
Документ.ID = Строка(Док.УникальныйИдентификатор());
Документ.ВидДокумента = Док.Метаданные().Имя;
Документ.Дата = Док.Дата;
Документ.Номер = Док.Номер;
Документ.Статус = ?(Док.Проведен, "Проведен", ?(Док.ПометкаУдаления, "ПометкаУдаления", "НеПроведен"));
Документ.Комментарий = Док.Комментарий;
КонецЦикла
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь);
МойXML = Новый ЗаписьXML;
МойXML.ОткрытьФайл(ИмяФайла, ПараметрыЗаписиXML);
МойXML.ЗаписатьОбъявлениеXML();
Фабрика.ЗаписатьXML(МойXML, ФайлОбмена);
МойXML.Закрыть();
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Создан файл обмена " + ИмяФайла);
КонецФункции
Процедура ЗагрузитьДокументы()
ФайлыXSD = Новый Массив();
ФайлыXSD.Добавить(СоздатьФайлСхемы());
Фабрика = СоздатьФабрикуXDTO(ФайлыXSD);
ФайлОбмена = Фабрика.Создать(Фабрика.Тип("http://anton.fly7.ru", "ФайлОбмена"));
ОбменXML = Новый ЧтениеXML;
ОбменXML.ОткрытьФайл(ИмяФайла);
ФайлОбмена = Фабрика.ПрочитатьXML(ОбменXML, Фабрика.Тип("http://anton.fly7.ru", "ФайлОбмена"));
Для Каждого Документ Из ФайлОбмена.Документ Цикл
ОбработкаПрерыванияПользователя();
Если Документ.ВидДокумента = "ПоступлениеТоваров" И
ЗначениеЗаполнено(Поставщик) И
Документ.Контрагент.ИНН Поставщик.ИНН Тогда
КонецЕсли;
КонецЦикла
ФайлОбмена = "";
ОбменXML.Закрыть();
УдалитьФайлы(ИмяФайла);
КонецПроцедуры
Файл схемы примерно такой (разукрашка съела скобки, но смысл должен быть понятен ))
Код xs:schema xmlns:tns="http://anton.fly7.ru" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://anton.fly7.ru" attributeFormDefault="unqualified" elementFormDefault="qualified">
xs:complexType name="ФайлОбмена">
xs:sequence>
xs:element name="Документ" type="tns:Документ" nillable="true" maxOccurs="unbounded"/>
xs:sequence>
xs:complexType>
xs:complexType name="Документ">
xs:sequence>
xs:element name="ID" type="xs:string"/>
xs:element name="ВидДокумента" type="xs:string"/>
xs:element name="Статус" type="xs:string"/>
xs:element name="Дата" type="xs:dateTime"/>
xs:element name="Номер" type="xs:string"/>
xs:element name="Контрагент" type="tns:Контрагент"/>
xs:element name="Свойства" type="tns:ТаблицаСвойства" nillable="true" minOccurs="0"/>
xs:sequence>
xs:complexType>
xs:complexType name="Контрагент">
xs:sequence>
xs:element name="ID" type="xs:string"/>
xs:element name="Наименование" type="xs:string"/>
xs:element name="ИНН" type="xs:string"/>
xs:sequence>
xs:complexType>
xs:complexType name="ТаблицаСвойства">
xs:sequence>
xs:element name="СтрокаСвойства" type="tns:СтрокаСвойство" nillable="true" maxOccurs="unbounded"/>
xs:sequence>
xs:complexType>
xs:complexType name="СтрокаСвойство">
xs:sequence>
xs:element name="Наименование" type="xs:string" nillable="true"/>
xs:element name="Значение" type="xs:string" nillable="true"/>
xs:sequence>
xs:complexType>
xs:schema>
Автор:
Абазин Антон Категория:
WEB-сервисы, WS-ссылки, XDTO-пакеты