HelpF.pro

Выгрузка / Загрузка данных посредством XML файлов?

В основе работы с XML-файлами лежит технология доступа SAX, которая осуществляет считывание по одному тегу. Для этого существует два типа данных – ЗаписьXML и ЧтениеXML.
Запись данных справочника в XML-файл:
Код 1C v 8.х
 Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ПутьКФайлу);
Запись.ЗаписатьОбъявление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
        Субсчет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.Записать();
      КонецЦикла;
    КонецЕсли;
  КонецЦикла;

Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq/view/547.html