1С: Сохраняем структуру в XML

Пример сохранения и загрузки структуры в XML.
Продолжение старой темы с сохранением ТаблицЗначений XML. Но зачастую хранить структуру более интересней. Особенно если в этой структуре может быть несколько ТаблицыЗначений.
Основные функции СохранитьСтруктуруXML и ЗагрузитьСтруктуруИзXML.

Обновление от 16.02.2012
Если таблица значения содержит ссылку, то во время загрузки будет происходить поиск значения по GUID. Формат XML изменен.

Обновление от 17.08.2012
Поддержка вложенных структрур.
Поддержка типа МоментВремени, ОбъектМетаданных

Перем тзОбщееОписаниеТипов экспорт; // Таблица значений с описанием типов. Создается через ПолучитьОписаниеТипов()

// ============= Сохранения и загрузка структуры в XML  === НАЧАЛО ======

// Заполняет переменную тзОбщееОписаниеТипов
// Таблица значений с описанием типов.
Функция ПолучитьОписаниеТипов() 
	// Массив с менеджерами объектов
	мМенеджеров =  Новый СписокЗначений();
	мМенеджеров.Добавить(Справочники);
	мМенеджеров.Добавить(Документы);
	мМенеджеров.Добавить(ПланыСчетов);
	мМенеджеров.Добавить(ПланыВидовРасчета);	
	мМенеджеров.Добавить(ПланыВидовХарактеристик);	
	мМенеджеров.Добавить(ПланыОбмена);
	мМенеджеров.Добавить(Перечисления);
	
	// Массив с примитивными типами
	мТипов = Новый Массив;	
	мТипов.Добавить("NULL");
	мТипов.Добавить("Неопределено");
	мТипов.Добавить("Строка");	
	мТипов.Добавить("Число");
	мТипов.Добавить("СписокЗначений");
	мТипов.Добавить("ТаблицаЗначений");
	мТипов.Добавить("Структура");
	мТипов.Добавить("Соответствие");
	мТипов.Добавить("Массив");
	мТипов.Добавить("Дата");
	мТипов.Добавить("МоментВремени");	
	мТипов.Добавить("Булево");	
	мТипов.Добавить("ВидДвиженияНакопления");		
		
	тзОбщееОписаниеТипов = Новый ТаблицаЗначений();
	тзОбщееОписаниеТипов.Колонки.Добавить("Менеджер"); // равно НЕОПРЕДЕЛЕННО для примитивных типов
	тзОбщееОписаниеТипов.Колонки.Добавить("Имя");
	тзОбщееОписаниеТипов.Колонки.Добавить("Тип");	
	тзОбщееОписаниеТипов.Колонки.Добавить("ОписаниеТипа");
	тзОбщееОписаниеТипов.Колонки.Добавить("ОбъектМетаданных");
	
	масТипа = Новый Массив;	
	
	// Прописываем примитивные типы
	Для Каждого ИмяТипа Из мТипов Цикл 			
		СтрДанные = тзОбщееОписаниеТипов.Добавить();
		СтрДанные.ОбъектМетаданных = Неопределено;
		СтрДанные.Менеджер = Неопределено;
		СтрДанные.Имя = ИмяТипа;		
		
		СтрДанные.Тип = Тип(ИмяТипа);		
		
		масТипа.Очистить();
		масТипа.Добавить(СтрДанные.Тип);
		ОписаниеТипа = Новый ОписаниеТипов(масТипа);		
		СтрДанные.ОписаниеТипа = ОписаниеТипа;		
	КонецЦикла;		
	
	// Прописываем объекты с менеджерами	
	Для Каждого Менеджер Из мМенеджеров Цикл 				
		Для каждого ОбъМенеджера из Менеджер.Значение цикл
			метОбъекта = Метаданные.НайтиПоТипу(Тип(ОбъМенеджера));
			СтрОбъМенеджера = метОбъекта.ПолноеИмя();
			
			// Добавляем данные по типу метаданнх
			СтрДанные = тзОбщееОписаниеТипов.Добавить();			
			СтрДанные.Менеджер = ОбъМенеджера;			
			СтрДанные.ОбъектМетаданных = метОбъекта;
			СтрДанные.Имя = "ОбъектМетаданных." + СтрОбъМенеджера;
			СтрДанные.Тип = ТипЗнч(метОбъекта);				
			
			масТипа.Очистить();
			масТипа.Добавить(СтрДанные.Тип);
			ОписаниеТипа = Новый ОписаниеТипов(масТипа);
			СтрДанные.ОписаниеТипа = ОписаниеТипа;			
			
			// Добавляем данные по типу конкретного объекта
			СтрДанные = тзОбщееОписаниеТипов.Добавить();			
			СтрДанные.Менеджер = ОбъМенеджера;			
			СтрДанные.ОбъектМетаданных = метОбъекта;
			СтрДанные.Имя = СтрОбъМенеджера;
			СтрДанные.Тип = ТипЗнч(ОбъМенеджера.ПустаяСсылка());
			
			масТипа.Очистить();
			масТипа.Добавить(СтрДанные.Тип);
			ОписаниеТипа = Новый ОписаниеТипов(масТипа);
			СтрДанные.ОписаниеТипа = ОписаниеТипа;
		КонецЦикла;			
	КонецЦикла;			
КонецФункции	

// Инициализируемый переменную тзОбщееОписаниеТипов
Процедура ИницилизироватьОбщееОписаниеТипов() экспорт
	Если ТипЗнч(тзОбщееОписаниеТипов) <> Тип("ТаблицаЗначений") тогда
		ПолучитьОписаниеТипов();
	КонецЕсли;		
КонецПроцедуры	

// Возвращает строку из тзОбщееОписаниеТипов с описанием типа значения
// Значение - Переменная, тип которой надо узнать
// Возвращает СтрокаТаблицыЗначений  
// Если не нашел то Неопределенно
Функция ПолноеОписаниТипа(Значение)
	ИницилизироватьОбщееОписаниеТипов();
	стрНайдено = Неопределено;
	
	ЭтоОбъектМетаданных = Тип("ОбъектМетаданных");
	ЭтоОписаниеТипов = Тип("ОписаниеТипов");
	ЭтоТип = Тип("Тип");
		
	ТипЭтогоЗначения = ТипЗнч(Значение);	
	стрНайдено = Неопределено;
	
	Если ТипЭтогоЗначения = ЭтоОписаниеТипов тогда
		стрНайдено = тзОбщееОписаниеТипов.Найти(Значение,"ОписаниеТипа");
	ИначеЕсли ТипЭтогоЗначения = ЭтоТип тогда
		стрНайдено = тзОбщееОписаниеТипов.Найти(Значение,"Тип");
	ИначеЕсли ТипЭтогоЗначения = ЭтоОбъектМетаданных тогда
		стрОтбора = Новый Структура("ОбъектМетаданных,Тип",Значение,ТипЭтогоЗначения);
		масНайдено = тзОбщееОписаниеТипов.НайтиСтроки(стрОтбора);
		Если масНайдено.Количество() > 0 тогда
			стрНайдено = масНайдено[0];
		КонецЕсли;			
	Иначе 
		стрНайдено = тзОбщееОписаниеТипов.Найти(ТипЭтогоЗначения,"Тип");
	КонецЕсли;	
	
	Возврат стрНайдено;
КонецФункции

// Возвращает строку из тзОбщееОписаниеТипов с полным описанием типа
// Возвращает СтрокаТаблицыЗначений  
Функция ПолноеОписаниТипаИзИмени(ИмяТипа)
	ИницилизироватьОбщееОписаниеТипов();	
	стрНайдено = тзОбщееОписаниеТипов.Найти(ИмяТипа,"Имя");
	Возврат стрНайдено;	
КонецФункции	

// Возвращает строчное представление типа
// Значение - Тип, ОписаниеТипа, Переменная
// Возвращает имя типа
Функция ИмяТипа(Значение)Экспорт 	
	стОписТипа = ПолноеОписаниТипа(Значение);
	Если стОписТипа = Неопределено тогда
		Возврат "";
	Иначе 
		Возврат стОписТипа.Имя;
	КонецЕсли;		
КонецФункции	

// Вовзращает тип из строчного предсталвения
// ИмяТипа - строка содержащее имя типа
// Возвращает "Тип"
Функция ТипИзИмени(ИмяТипа) Экспорт 
	стрНайдено = ПолноеОписаниТипаИзИмени(ИмяТипа);
	Возврат ?(стрНайдено = Неопределено,"", стрНайдено.Тип);
КонецФункции	

// Вовзращает Описание Типа из строчного предсталвения
// ИмяТипа - строка содержащее имя типа
Функция ОписаниеТипаИзИмени(ИмяТипа)
	стрНайдено = ПолноеОписаниТипаИзИмени(ИмяТипа);
	Возврат ?(стрНайдено = Неопределено,"", стрНайдено.ОписаниеТипа);
КонецФункции	

// Возвращает стуктура с описанием типа 
// 
Функция ПустаяСтурктуруОписанияЗначения()
	ОписаниеТипа = Новый Структура();
	ОписаниеТипа.Вставить("String", "");		//	Значение в строке
	ОписаниеТипа.Вставить("Type", "Строка");	//	Тип
	ОписаниеТипа.Вставить("UID", "");			//	УИД	
	ОписаниеТипа.Вставить("Cod", "");			//	КОД	
	Возврат ОписаниеТипа;
КонецФункции	

// Вовзращает стуктуру описавающая значение
// Значение - Значение данные которых надо поместить в стурктура
// стОпсианиеЗначения - структура с описанием значения
// Вовзращает сруктуру стОпсианиеЗначения с заполненными полями
Функция Значение2Описание(Значение, стОпсианиеЗначения = Неопределено) Экспорт 
	Если стОпсианиеЗначения = Неопределено тогда
		стОпсианиеЗначения = ПустаяСтурктуруОписанияЗначения();
	КонецЕсли;
	
	ОписаниеТипа = ПолноеОписаниТипа(Значение); 	
	ЭтоМетоданные = ОписаниеТипа.Тип = Тип("ОбъектМетаданных");
	
	Попытка
		стОпсианиеЗначения["String"] = Строка(Значение);
		стОпсианиеЗначения["Type"] = ОписаниеТипа.Имя;
	Исключение			
		Сообщить("Проверьте """ + Значение + """; Тип:" + ТипЗнч(Значение));
	КонецПопытки;		
	
	Если ЭтоМетоданные тогда
		стОпсианиеЗначения["String"] = Значение.ПолноеИмя();
	ИначеЕсли ОписаниеТипа.Менеджер <> Неопределено и не ЭтоМетоданные тогда		
		ЭтоДокумент = Метаданные.Документы.Найти(ОписаниеТипа.ОбъектМетаданных.Имя) <> Неопределено;		
		стОпсианиеЗначения["UID"] = Строка(Значение.УникальныйИдентификатор());				
		стОпсианиеЗначения["Cod"] = ?(ЭтоДокумент, Значение.Номер, Значение.Код);
	КонецЕсли;	
	
	Возврат стОпсианиеЗначения
КонецФункции

// Ищет по данным из стурктуры (стОпсианиеЗначения) значение
// стОпсианиеЗначения - структура содержащая описание значение 
// Возращает значение которое было описанно в стурктуре
Функция Описания2Значение(стОпсианиеЗначения) Экспорт 
	СтрЗнач	 	= стОпсианиеЗначения["String"];
	ИмяТипа		= стОпсианиеЗначения["Type"];
	ПолныйТип 	= ПолноеОписаниТипаИзИмени(ИмяТипа); // строка из описания типа
	Значение 	= Неопределено;
	
	Если ПолныйТип = Неопределено тогда
		Возврат Неопределено;
	КонецЕсли;		
		
	Если ПолныйТип.Менеджер = Неопределено тогда
		Значение = ПолныйТип.ОписаниеТипа.ПривестиЗначение(СтрЗнач)
	ИначеЕсли ПолныйТип.Тип = Тип("ОбъектМетаданных") тогда
		Значение = Метаданные.НайтиПоПолномуИмени(СтрЗнач);
	Иначе 
		Код = стОпсианиеЗначения["Cod"];
		УИД = стОпсианиеЗначения["UID"];
		
		Если Не ПустаяСтрока(УИД) тогда // Ищем по ссыле
			UID = Новый УникальныйИдентификатор(УИД);
			Значение = ПолныйТип.Менеджер.ПолучитьСсылку(UID);
			Если Лев(СокрЛП(Значение),18) = "<Объект не найден>" Тогда
				Значение = Неопределено;
			КонецЕсли;
		Иначе // Ищем по коду
			Значение = ПолныйТип.Менеджер.НайтиПоКоду(Код);
		КонецЕсли;			
	КонецЕсли;
	
	Возврат Значение;
КонецФункции	

// Записывает стурктуру (ОписаниеЗначение) как атрибут в XML записи
// ЗаписьXML - XML запись
// ОписаниеЗначение - структура с описанием значения
Процедура ЗаписатьОписаниеКакАтрибутXML(ЗаписьXML,ОписаниеЗначение);		
	Для каждого ПараметрЗначения из ОписаниеЗначение цикл
		Если ПараметрЗначения.Ключ = "String" тогда
			Продолжить;	
		КонецЕсли;
		
		Если НЕ ПустаяСтрока(ПараметрЗначения.Значение) тогда
			ЗаписьXML.ЗаписатьАтрибут(ПараметрЗначения.Ключ, ПараметрЗначения.Значение);					
		КонецЕсли;			
	КонецЦикла;		
КонецПроцедуры

// Сохраням структуру в XML файл
// Данные - переменная типа Структра
// ФайлXML - Путь до сохраняемого файла. Строка.
// ФормаИндикатор - Форма "ХодВыполненияОбработкиДанных" из общих форм
Функция СохранитьСтруктуруXML(Данные, ФайлXML, ФормаИндикатор = Неопределено) Экспорт
	Попытка
		Запись = Новый ЗаписьXML(); 
		Запись.ОткрытьФайл(ФайлXML);	
	Исключение
		Сообщить("Ошибка при создание XML файла! " + Символы.ПС + ОписаниеОшибки());
		Возврат Ложь;
	КонецПопытки;		
	
	// --- выводим данные в форму прогресса ---
	Если ФормаИндикатор <> Неопределено тогда
		ФормаИндикатор.НаименованиеОбработкиДанных = "Сохраняем таблицу значений в XML";		
	КонецЕсли;
	// ---
		
	Запись.ЗаписатьОбъявлениеXML();	
	Запись.ЗаписатьНачалоЭлемента("root");	
	СтукктураВXML(Запись,Данные,ФормаИндикатор);
	Запись.ЗаписатьКонецЭлемента(); // root
	
	Запись.Закрыть(); 	
	Возврат Истина;
КонецФункции

// Производим запись структуры в XML
// Запись - переменная типа ЗаписьXML
// стДанные - стуктура
Функция СтукктураВXML(Запись, стДанные, ФормаИндикатор = Неопределено)
	Для каждого стрДанные из стДанные цикл 
		Если ФормаИндикатор <> Неопределено тогда
			ФормаИндикатор.КомментарийОбработкиДанных = "Сохраняем..." + стрДанные.Ключ;
		КонецЕсли;
		
		Запись.ЗаписатьНачалоЭлемента("KeyValue");
		
		ОписаниеЗначения = Значение2Описание(стрДанные.Значение);
		ОписаниеЗначения.Вставить("Name", стрДанные.Ключ);
		ЗаписатьОписаниеКакАтрибутXML(Запись,ОписаниеЗначения);
						
		Если ОписаниеЗначения["Type"] = "ТаблицаЗначений" тогда			
			ТаблицаЗначенийВXML(Запись,стрДанные.Значение,ФормаИндикатор);
		ИначеЕсли ОписаниеЗначения["Type"] = "Структура" тогда			
			СтукктураВXML(Запись,стрДанные.Значение,ФормаИндикатор);			
		Иначе
			Значение = ОписаниеЗначения["String"];
			Запись.ЗаписатьСекциюCDATA(Значение);			
		КонецЕсли;
		
		Запись.ЗаписатьКонецЭлемента(); // KeyValue
	КонецЦикла;
КонецФункции

// Производим запись таблицы значения в XML
// Запись - переменная типа ЗаписьXML
// Таблица - Таблица значений
Функция ТаблицаЗначенийВXML(Запись, Таблица, ФормаИндикатор = Неопределено)
	ИндМакс = Таблица.Количество();
	ИндПозиция = 0;
		
	Если ФормаИндикатор <> Неопределено тогда
		ФормаИндикатор.МаксимальноеЗначение = ИндМакс;
	КонецЕсли;		
	
	// --- Данные по колонкам таблицы значений
	
	МасКолонки = Новый Массив();
	Запись.ЗаписатьНачалоЭлемента("columns");	
	Для Ном = 0 по Таблица.Колонки.Количество()-1 цикл					
		Колонка = Таблица.Колонки[Ном];		
		МасКолонки.Добавить(Колонка.Имя);	
		ТипВСтроку = ИмяТипа(Колонка.ТипЗначения);
		
		Запись.ЗаписатьНачалоЭлемента("colum");
		Запись.ЗаписатьАтрибут("Name",Колонка.Имя);
		Запись.ЗаписатьАтрибут("Type",ТипВСтроку);
		Запись.ЗаписатьКонецЭлемента();  // colum		
	КонецЦикла;		
	Запись.ЗаписатьКонецЭлемента();  // columns	
	
	// --- Строки из таблицы значений
	
	Запись.ЗаписатьНачалоЭлемента("records");		
	Для Каждого СтрТаблицы из Таблица цикл
		
		Если ФормаИндикатор <> Неопределено тогда
			ИндПозиция = ИндПозиция + 1;			
			ФормаИндикатор.КомментарийЗначения = "(" + ИндПозиция + " из " + ИндМакс + ")";			
			ФормаИндикатор.Значение = ИндПозиция;
		КонецЕсли;			
				
		Запись.ЗаписатьНачалоЭлемента("record");
		Для каждого ИмяКолонки из МасКолонки цикл
			Запись.ЗаписатьНачалоЭлемента(ИмяКолонки);
			
		 	Значение = СтрТаблицы[ИмяКолонки];			
			
			ОписаниеЗначения = Значение2Описание(Значение);
			СтрЗначение = ОписаниеЗначения["String"];
			ЗаписатьОписаниеКакАтрибутXML(Запись,ОписаниеЗначения);
						
			Запись.ЗаписатьСекциюCDATA(СтрЗначение);			
			Запись.ЗаписатьКонецЭлемента();
		КонецЦикла;			
		Запись.ЗаписатьКонецЭлемента();
	КонецЦикла;		
	
	Запись.ЗаписатьКонецЭлемента();  // records					
КонецФункции

Функция XMLВСтруктуру(Чтение, ФормаИндикатор = Неопределено)
	СтруктураДанные = Новый Структура;
		
	Пока Чтение.Прочитать() Цикл		
		// Что бы выйти из свойе структуры
		Если (Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента и Чтение.Имя = "KeyValue") тогда
			Прервать;
		КонецЕсли;			
		
		Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента и Чтение.Имя = "KeyValue" тогда
			АтрибутУзла = Новый Соответствие;	
			Пока Чтение.ПрочитатьАтрибут() цикл
				АтрибутУзла[Чтение.Имя] = Чтение.Значение;				
			КонецЦикла;				
			
			ТипКлюча = АтрибутУзла["Type"];
			ИмяКлюча = АтрибутУзла["Name"];
			
			Если ТипКлюча = "ТаблицаЗначений" тогда				
				СтруктураДанные.Вставить(ИмяКлюча, XMLВТаблицуЗначений(Чтение));			
			ИначеЕсли ТипКлюча = "Структура" тогда
				СтруктураДанные.Вставить(ИмяКлюча, XMLВСтруктуру(Чтение));
			Иначе 
				ТекстовоеЗначениеДанных = "";				
				Чтение.Прочитать();
				Если Чтение.ТипУзла = ТипУзлаXML.Текст тогда
					ТекстовоеЗначениеДанных = СокрЛП(Чтение.Значение)			
				КонецЕсли;					
				АтрибутУзла.Вставить("String",ТекстовоеЗначениеДанных);
				
				ЗначениеДанных = Описания2Значение(АтрибутУзла);
				СтруктураДанные.Вставить(ИмяКлюча, ЗначениеДанных); 																									
				
				// Пропускаем закрывающийся тег
				Если НЕ(Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента и Чтение.Имя = "KeyValue") тогда
					Чтение.Прочитать();
				КонецЕсли;							
			КонецЕсли;
		КонецЕсли;					
	КонецЦикла;	
	
	Возврат СтруктураДанные;
КонецФункции	

// Возвращает структру прочитанную из файла XML
// ФайлXML  - Строка с путем до XML
// ФормаИндикатор - диалог индикатор
// Возвращает стурктуру
Функция ЗагрузитьСтруктуруИзXML(ФайлXML, ФормаИндикатор = Неопределено) Экспорт 
	Попытка
		Чтение = Новый ЧтениеXML(); 
		Чтение.ОткрытьФайл(ФайлXML);	
	Исключение
		Сообщить("Ощибка при чтение данных из XML!" + Символы.ПС + ОписаниеОшибки());
	КонецПопытки;
	
	// --- выводим данные в форму прогресса ---
	Если ФормаИндикатор <> Неопределено тогда
		ФормаИндикатор.НаименованиеОбработкиДанных = "Загружаем таблицу значений из XML";
		ФормаИндикатор.КомментарийОбработкиДанных = "Загружаем...";
		ФормаИндикатор.МаксимальноеЗначение = 100;		
		ИндПозиция = 0;
	КонецЕсли;
	// ---	
	
	СтруктураДанные = XMLВСтруктуру(Чтение);	
	Возврат СтруктураДанные;
КонецФункции

// Разбирает XML содержащая таблицу значений
// Возвращает таблицу значений
// Чтение - переменная типа ЧтениеXML
Функция XMLВТаблицуЗначений(Чтение, ФормаИндикатор = Неопределено);
	
	ТЗ = Новый ТаблицаЗначений;		
	МассивКолонок = Новый Массив;	
	ТаблицаПостроена = Ложь;
	
	Если ФормаИндикатор <> Неопределено тогда
		
	КонецЕсли;		
		
	Пока Чтение.Прочитать() Цикл		
		
		Если ФормаИндикатор <> Неопределено тогда
			ИндПозиция = ИндПозиция + 1;						
			ФормаИндикатор.Значение = ИндПозиция - Цел(ИндПозиция / 100)*100;
			ФормаИндикатор.КомментарийЗначения = Строка(ИндПозиция);			
		КонецЕсли;			
		
		// ЗАвершили работсу с таблицей значения
		Если Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента и Чтение.Имя = "KeyValue" тогда
			Прервать;
		КонецЕсли;			
		
		
		// Данные по колонке пошли
		Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента и Чтение.Имя = "colum" и Не ТаблицаПостроена тогда
			АтрибутУзла = Новый Соответствие;
			Пока Чтение.ПрочитатьАтрибут() цикл
				АтрибутУзла[Чтение.Имя] = Чтение.Значение;				
			КонецЦикла;	
			
			ИмяТипКолонки = АтрибутУзла["Type"];
			ОписаниеТипа = ОписаниеТипаИзИмени(ИмяТипКолонки);			
			Если ОписаниеТипа = "" тогда
				ТЗ.Колонки.Добавить(АтрибутУзла["Name"]);
			Иначе				
				ТЗ.Колонки.Добавить(АтрибутУзла["Name"], ОписаниеТипа);
			КонецЕсли;				
			МассивКолонок.Добавить(АтрибутУзла["Name"]);
		КонецЕсли;			
		
		// Данные по колонке закончились
		Если Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента и Чтение.Имя = "columns" тогда		
			ТаблицаПостроена = Истина;
		КонецЕсли;
		
		Если Не ТаблицаПостроена тогда
			Продолжить;
		КонецЕсли;			
		
		// Началась запись в таблице значений
		Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента и Чтение.Имя = "record" тогда						
			ЗаписьТЗ = ТЗ.Добавить();			
			Пока Чтение.Прочитать() цикл							
				// Конец данных по записи
				Если Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента и Чтение.Имя = "record" тогда
					Прервать;
				КонецЕсли;	
				
				// Есть такая колонка в нашей ТаблицеЗначений
				Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента и 
					МассивКолонок.Найти(Чтение.Имя) <> Неопределено тогда
					 
					ИмяКолонки = Чтение.Имя;
					АтрибутУзла = Новый Соответствие;
					Пока Чтение.ПрочитатьАтрибут() цикл
						АтрибутУзла[Чтение.Имя] = Чтение.Значение;				
					КонецЦикла;						
					
					Чтение.Прочитать();
					Если Чтение.ТипУзла = ТипУзлаXML.Текст тогда
						АтрибутУзла["String"] = СокрЛП(Чтение.Значение); 
					КонецЕсли;						
					
					ЗаписьТЗ[ИмяКолонки] = Описания2Значение(АтрибутУзла);
				КонецЕсли;												
			КонецЦикла;								
		КонецЕсли; // Данные в таблице
		
	КонецЦикла;
	Возврат ТЗ;	
КонецФункции
// ============= Сохранения и загрузка структуры в XML  === КОНЕЦ ======

1С: Сохраняем структуру в XML: 1 комментарий

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *