Работаем с 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. НетПроверки) ) ;
ВывестиЭлем( ХМЛ, "" ) ;
ХМЛ. Закрыть( ) ;
ХМЛ= Неопределено ;
КонецПроцедуры
Категория:
JSON, XML, TXT, CSV, DBF Сохранение реквизитов и табличных частей объектов в XML Сохранение производится процедурой СохранитьРеквизитыИТабличныеЧасти. В качестве параметров она принимает сохраняемый объект и имя файла. Ссылочные реквизиты сохраняются в виде GUID.
Код 1C v 8.х Процедура СохранитьРеквизитыИТабличныеЧасти (Объект, ИмяФайлаXML=Неопределено) Экспорт
ФайлXML = Новый ЗаписьXML;
ФайлXML. ОткрытьФайл( ИмяФайлаXML) ;
ФайлXML. ЗаписатьОбъявлениеXML( ) ;
ФайлXML. ЗаписатьНачалоЭлемента( "Root" ) ;
ФайлXML. ЗаписатьАтрибут( "Объект" , Объект. Метаданные( ) . Имя) ;
Для Каждого Реквизит Из Объект. Метаданные( ) . Реквизиты Цикл
ФайлXML. ЗаписатьНачалоЭлемента( "Реквизит" ) ;
ФайлXML. ЗаписатьАтрибут( "Имя" , Реквизит. Имя) ;
ТипЗначения = ТипЗнч( Объект[Реквизит. Имя]) ;
Если Не ТипЗначения = Тип( "Неопределено" ) Тогда
ФайлXML. ЗаписатьАтрибут( "ИмяТипа" , XMLТип( ТипЗначения) . ИмяТипа) ;
ФайлXML. ЗаписатьАтрибут( "URI" , XMLТип( ТипЗначения) . URIПространстваИмен) ;
КонецЕсли ;
ФайлXML. ЗаписатьТекст( XMLСтрока( Объект[Реквизит. Имя]) ) ;
ФайлXML. ЗаписатьКонецЭлемента( ) ;
КонецЦикла ;
Для Каждого ТЧ из Объект. Метаданные( ) . ТабличныеЧасти Цикл
ФайлXML. ЗаписатьНачалоЭлемента( "ТабличнаяЧасть" ) ;
ФайлXML. ЗаписатьАтрибут( "Имя" , ТЧ. Имя) ;
Для Каждого СтрокаТЧ из Объект[ТЧ. Имя] Цикл
ФайлXML. ЗаписатьНачалоЭлемента( "ЭлементКоллекции" ) ;
Для Каждого РеквизитТЧ Из ТЧ. Реквизиты Цикл
ФайлXML. ЗаписатьНачалоЭлемента( "Реквизит" ) ;
ФайлXML. ЗаписатьАтрибут( "Имя" , РеквизитТЧ. Имя) ;
ТипЗначения = ТипЗнч( СтрокаТЧ[РеквизитТЧ. Имя]) ;
Если Не ТипЗначения = Тип( "Неопределено" ) Тогда
ФайлXML. ЗаписатьАтрибут( "ИмяТипа" , XMLТип( ТипЗначения) . ИмяТипа) ;
ФайлXML. ЗаписатьАтрибут( "URI" , XMLТип( ТипЗначения) . URIПространстваИмен) ;
КонецЕсли ;
ФайлXML. ЗаписатьТекст( XMLСтрока( СтрокаТЧ[РеквизитТЧ. Имя]) ) ;
ФайлXML. ЗаписатьКонецЭлемента( ) ;
КонецЦикла ;
ФайлXML. ЗаписатьКонецЭлемента( ) ;
КонецЦикла ;
ФайлXML. ЗаписатьКонецЭлемента( ) ;
КонецЦикла ;
Если Не ФайлXML= Null Тогда
ФайлXML. ЗаписатьКонецЭлемента( ) ;
ФайлXML. Закрыть( ) ;
КонецЕсли ;
КонецПроцедуры
За чтение объекта отвечают процедуры ЗагрузитьРеквизитыИТабличныеЧасти и ЗагрузитьОбъектРекурсивно. Чтобы прочитать объект вызывается первая, ей передаются объект, который необходимо заполнить, и имя файла. Вторая является вспомогательной.
Код 1C v 8.х Процедура ЗагрузитьРеквизитыИТабличныеЧасти(Объект, ИмяФайлаXML=Неопределено) Экспорт
Если Не ИмяФайлаXML = Неопределено Тогда
ФайлXML = Новый ЧтениеXML;
ФайлXML. ОткрытьФайл( ИмяФайлаXML) ;
Пока ФайлXML. Прочитать( ) Цикл
Если ФайлXML. ТипУзла = ТипУзлаXML. НачалоЭлемента Тогда
ЗагрузитьОбъектРекурсивно( ФайлXML, Объект, ФайлXML. Имя) ;
КонецЕсли
КонецЦикла ;
КонецЕсли ;
КонецПроцедуры
Процедура ЗагрузитьОбъектРекурсивно(ФайлXML, Объект, знач ИмяУзла)
ИмяТипа = "" ;
ПространствоИмен = "" ;
Пока ФайлXML. ПрочитатьАтрибут( ) Цикл
Если ФайлXML. Имя = "ИмяТипа" Тогда
ИмяТипа = ФайлXML. Значение;
ИначеЕсли ФайлXML. Имя = "URI" Тогда
ПространствоИмен = ФайлXML. Значение;
КонецЕсли ;
КонецЦикла ;
Пока ФайлXML. Прочитать( ) Цикл
Если ФайлXML. ТипУзла = ТипУзлаXML. КонецЭлемента И ФайлXML. Имя = ИмяУзла Тогда
Возврат ;
ИначеЕсли ФайлXML. ТипУзла = ТипУзлаXML. Текст Тогда
ТипОбъекта = ИзXMLТипа( ИмяТипа, ПространствоИмен) ;
Если НЕ ТипОбъекта = Неопределено тогда
Объект = XMLЗначение( ТипОбъекта, ФайлXML. Значение) ;
КонецЕсли ;
ИначеЕсли ФайлXML. ТипУзла = ТипУзлаXML. НачалоЭлемента Тогда
ИмяТекУзла = ФайлXML. Имя;
Если ФайлXML. Имя = "ЭлементКоллекции" Тогда
ЗагрузитьОбъектРекурсивно( ФайлXML, Объект. Добавить( ) , ИмяТекУзла) ;
Иначе
Если ФайлXML. ПрочитатьАтрибут( ) Тогда
ЗагрузитьОбъектРекурсивно( ФайлXML, Объект[ФайлXML. Значение], ИмяТекУзла) ;
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
В приложенном файле -
Скачивать файлы может только зарегистрированный пользователь! - демонстрационная обработка, позволяющая сохранить ссылочный объект БД в файл и заполнить объект из файла. Заполняемый объект должен быть того же типа, что и сохраненный, а также он должен быть предварительно создан, сохранен в ИБ и выбран в поле "Ссылка".
Категория:
Документы Выгрузка / Загрузка данных посредством XML файлов? В основе работы с XML-файлами лежит технология доступа SAX, которая осуществляет считывание по одному тегу. Для этого существует два типа данных –
ЗаписьXML и
ЧтениеXML .
Запись данных справочника в XML-файл:
Код 1C v 8.х Запись = Новый ЗаписьXML;
Запись. ОткрытьФайл( ПутьКФайлу) ;
Запись. ЗаписатьОбъявлениеXML( ) ;
Запись. ЗаписатьНачалоЭлемента( "Клиенты" ) ;
Выборка = Справочники. Клиенты. Выбрать( ) ;
Пока Выборка. Следующий( ) Цикл
Запись. ЗаписатьНачалоЭлемента( "Клиент" ) ;
Запись. ЗаписатьАтрибут( "Код" , Строка( Выборка. Код) ) ;
Запись. ЗаписатьТекст( Выборка. Наименование) ;
Запись. ЗаписатьКонецЭлемента( ) ;
КонецЦикла ;
Запись. ЗаписатьКонецЭлемента( ) ;
Запись. Закрыть( ) ;
Чтение данных из XML-файла в справочник:
Код 1C v 8.х Чтение = Новый ЧтениеXML;
Чтение. ОткрытьФайл( ПутьКФайлу) ;
Спр= "" ;
Пока Чтение. Прочитать( ) Цикл
Если Чтение. ТипУзла = ТипУзлаXML. НачалоЭлемента Тогда
Если Чтение. Имя= "Клиент" Тогда
Спр = Справочники. Клиенты. СоздатьЭлемент( ) ;
Пока Чтение. ПрочитатьАтрибут( ) Цикл
Если Чтение. Имя= "Код" Тогда
Спр. Код = Число( Чтение. Значение) ;
КонецЕсли ;
КонецЦикла ;
КонецЕсли ;
ИначеЕсли Чтение. ТипУзла = ТипУзлаXML. Текст Тогда
Спр. Наименование = Чтение. Значение;
ИначеЕсли Чтение. ТипУзла = ТипУзлаXML. КонецЭлемента Тогда
Спр. Записать( ) ;
КонецЕсли ;
КонецЦикла ;
Создадим обработку в типовой конфигурации для экспорта плана счетов. Структура xml-файла должна быть такой. Корневой элемент xml-документа соответствует плану счетов в целом. В нем располагаются подчиненные элементы с именем Счет, содержащие информацию о счетах. В качестве содержимого элементов указывается наименование счета. Остальные данные записываются в качестве атрибутов (код, признаки валютного, количественного учета и пр.). В качестве подчиненных элементов для элемента Счет задаются элементы, обозначающие его субсчета с теми же атрибутами. Приведем код процедуры экспорта плана счетов.
Код 1C v 7.x Процедура Выполнить()
Если ЗагрузитьВнешнююКомпоненту( КаталогПрограммы( ) + "v7plus.dll" ) < > 1 Тогда
Предупреждение( "Компонента не обнаружена" ) ;
Возврат ;
КонецЕсли ;
Анализатор= СоздатьОбъект( "AddIn.XMLParser" ) ;
Корень= Анализатор. СоздатьДокумент( ) ;
План= Корень. СоздатьПодчиненныйЭлемент( "ПланСчетов" ) ;
Счет= СоздатьОбъект( "Счет.Основной" ) ;
Родитель= СоздатьОбъект( "Счет.Основной" ) ;
Счет. ВыбратьСчета( ) ;
Пока Счет. ПолучитьСчет( ) = 1 Цикл
Если Счет. Уровень( ) = 1 Тогда
Родитель. НайтиПоКоду( Счет. Код) ;
СчетXML= План. СоздатьПодчиненныйЭлемент( "Счет" ) ;
СчетXML. УстановитьАтрибут( "Код" , Счет. Код) ;
СчетXML. УстановитьАтрибут( "Валютный" , Счет. Валютный) ;
СчетXML. УстановитьАтрибут( "Количественный" , Счет. Количественный) ;
СчетXML. УстановитьАтрибут( "Забалансовый" , Счет. Забалансовый) ;
Если Счет. Активный= 1 Тогда
СчетXML. УстановитьАтрибут( "вид" , "активный" ) ;
ИначеЕсли Счет. Активный= 2 Тогда
СчетXML. УстановитьАтрибут( "вид" , "пассивный" ) ;
Иначе
СчетXML. УстановитьАтрибут( "вид" , "активно-пассивный" ) ;
КонецЕсли ;
СчетXML. Значение= Счет. Наименование;
Иначе
Если Счет. ПринадлежитГруппе( Родитель) = 1 Тогда
СубсчетXML= СчетXML. СоздатьПодчиненныйЭлемент( "Субсчет" ) ;
СубсчетXML. УстановитьАтрибут( "Код" , Счет. Код) ;
СубсчетXML. Значение= Счет. Наименование;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
Корень. Записать( КаталогПрограммы( ) + "plan.xml" ) ;
КонецПроцедуры
В результате будет получен файл, вот его фрагмент:
Код
<?xml version="1.0" encoding="windows-12Sl" ?> - <ПланСчетов>
<Счет Код="00" Валютный="0" Количественный="0" Забалансовый="0" вид="активно-пассивный">Вспомогательный</Счет>
- <Счет Код="01" Валютный="0" Количественный="0" Забалансовый="0" вид="активный">
Основные средства
<Субсчет Код="01.1" Валютный="0" Количественный="0" Забалансовый="0"
вид="активный">ОС в организации</Субсчет> <Субсчет Код="01.2" Валютный="0" Количественный="0" Забалансовый="0"
вид="активный">Выбытие ОС</Субсчет> </Счет>
- <Счет Код="02" Валютный="0" Количественный="0" Забалансовый="0" вид="пассивный">
Амортизация ОС
А теперь приведем код для импорта плана счетов из xml-файла в новую конфигурацию. Код модуля соответствующей обработки должен содержать процедуру Выполнить(), которая имеет такой вид.
Код 1C v 7.x Процедура Выполнить()
Если ЗагрузитьВнешнююКомпоненту( КаталогПрограммы( ) + "v7plus.dll" ) < > 1 Тогда
Предупреждение( "Внешняя компонента не найдена" ) ;
Возврат ;
КонецЕсли ;
Анализатор= СоздатьОбъект( "AddIn.XMLParser" ) ;
Файл= Анализатор. СоздатьДокумент( ) ;
Файл. Загрузить( КаталогПрограммы( ) + "plan.xml" ) ;
План= Файл. ВыбратьУзел( "ПланСчетов" ) ;
кол= План. КоличествоПодчиненных( ) ;
Счет= СоздатьОбъект( "Счет.Основной" ) ;
Для инд= 1 по кол Цикл
СчетXML= План. ПолучитьПодчиненныйПоНомеру( инд) ;
КолСубсчетов= СчетXML. КоличествоПодчиненных( ) ;
Если КолСубсчетов> 1 Тогда
Счет. Новый( 1 ) ;
Иначе
Счет. Новый( 0 ) ;
КонецЕсли ;
Счет. Код= СчетXML. ПолучитьАтрибут( "Код" ) ;
Счет. Наименование= СчетXML. Значение;
Счет. Валютный= СчетXML. ПолучитьАтрибут( "Валютный" ) ;
Счет. Количественный= СчетXML. ПолучитьАтрибут( "Количественный" ) ;
Счет. Забалансовый= СчетXML. ПолучитьАтрибут( "Забалансовый" ) ;
Если СчетXML. ПолучитьАтрибут( "вид" ) = "активный" Тогда
Счет. Активный= 1 ;
ИначеЕсли СчетXML. ПолучитьАтрибут( "вид" ) = "пассивный" Тогда
Счет. Активный= 2 ;
Иначе
Счет. Активный= 3 ;
КонецЕсли ;
Счет. Записать( ) ;
Если КолСубсчетов> 1 Тогда
Счет1 = СоздатьОбъект( "Счет.Основной" ) ;
Для инд1 = 2 По кол_субсчетов Цикл
Субсчет= СчетXML. ПолучитьПодчиненныйПоНомеру( инд1 ) ;
Счет1 . Новый( 0 ) ;
Счет1 . Код= Субсчет. ПолучитьАтрибут( "Код" ) ;
Счет1 . Записать( ) ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
Категория:
JSON, XML, TXT, CSV, DBF Как сформировать XML-документ в строку? Требуется, чтобы запись XML-документа производилась не в файл, а в строку
Код 1C v 8.х Запись = Новый ЗаписьXML( ) ;
Запись. УстановитьСтроку( ) ;
Запись. ЗаписатьОбъявлениеXML( ) ;
Запись. ЗаписатьНачалоЭлемента( "Корневой" ) ;
Запись. ЗаписатьАтрибут( "Справочник" , "Номенклатура" ) ;
Запись. ЗаписатьКомментарий( "Краткая информация о номенклатуре" ) ;
Выборка = Справочники. Номенклатура. ВыбратьИерархически( ) ;
Пока Выборка. Следующий( ) Цикл
Если Выборка. ЭтоГруппа Тогда
Продолжить;
КонецЕсли ;
Запись. ЗаписатьНачалоЭлемента( "Элемент" ) ;
Запись. ЗаписатьАтрибут( "Код" , Строка( Выборка. Код) ) ;
Запись. ЗаписатьАтрибут( "Артикул" , Строка( Выборка. Артикул) ) ;
Запись. ЗаписатьТекст( Выборка. Наименование) ;
Запись. ЗаписатьКонецЭлемента( ) ;
КонецЦикла ;
Запись. ЗаписатьКонецЭлемента( ) ;
Стр = Запись. Закрыть( ) ;
Сообщить( Стр) ;
Для вывода XML-документа в строку после создания объекта ЗаписьXML необходимо использовать метод УстановитьСтроку(). Только в этом случае метод Закрыть() вернет строку, которая будет содержать сформированный XML-документ.
еще примеры:
Код 1C v 8.х
Функция ОбъектВXML(ДокументОбъект) Экспорт
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML. УстановитьСтроку( ) ;
ЗаписатьXML( ЗаписьXML, ДокументОбъект) ;
Возврат ЗаписьXML. Закрыть( ) ;
КонецФункции
Функция ОбъектИзXML(Стр) Экспорт
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML. УстановитьСтроку( Стр) ;
Возврат ПрочитатьXML( ЧтениеXML) ;
КонецФункции
Категория:
JSON, XML, TXT, CSV, DBF Как можно сформировать XML-документ произвольной структуры? Используется модель последовательного доступа (работа осуществляется только с одним текущим узлом):
Код 1C v 8.х Запись = Новый ЗаписьXML;
Запись. ОткрытьФайл( ПутьКФайлу) ;
Запись. ЗаписатьОбъявлениеXML( ) ;
Запись. ЗаписатьНачалоЭлемента( "Корневой" ) ;
Запись. ЗаписатьАтрибут( "Справочник" , "Номенклатура" ) ;
Запись. ЗаписатьКомментарий( "Краткая информация о номенклатуре" ) ;
Выборка = Справочники. Номенклатура. ВыбратьИерархически( ) ;
Пока Выборка. Следующий( ) Цикл
Если Выборка. ЭтоГруппа Тогда
Продолжить;
КонецЕсли ;
Запись. ЗаписатьНачалоЭлемента( "Элемент" ) ;
Запись. ЗаписатьАтрибут( "Код" , Строка( Выборка. Код) ) ;
Запись. ЗаписатьАтрибут( "Артикул" , Строка( Выборка. Артикул) ) ;
Запись. ЗаписатьТекст( Выборка. Наименование) ;
Запись. ЗаписатьКонецЭлемента( ) ;
КонецЦикла ;
Запись. ЗаписатьКонецЭлемента( ) ;
Запись. Закрыть( ) ;
В результате будет получен файл вида
Код <НачалоЭлемента
ИмяАтрибута = Значение ИмяАтрибута = Значение......>
Текст
<КонецЭлемента>
Создание XML-документа с помощью объекта ЗаписьXML производится путем помещения в строгой последовательности (иначе будет нарушена структура) «частей» узлов.
Категория:
JSON, XML, TXT, CSV, DBF