1С: Cохраняем таблицу значений в XML

Приведу пример 2-х функций для сохранения 1С`кой ТаблицыЗначений в XML и последующего чтения.
Я пользовался ими для переноса данных из одной конфигурации в другую.

  • Пишем запрос
  • Результат запроса сохраняем в XML
  • Загружаем результаты запроса в другой конфигурации

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

Чтение XML в ТаблицуЗначений

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

Upd 13.09.2012
Для сохранения в строку можно использовать:
ЗначениеВСтрокуВнутр
ЗначениеИзСтрокиВнутр
Для быстрого сохранения и загрузки из файла:
ЗначениеВФайл
ЗначениеИзФайла

1С: Cохраняем таблицу значений в XML: 2 комментария

  1. Alexander Kuntashov

    А почему не при помощи СериализатораXDTO? Кода будет значительно меньше и он будет более высокоуровневым, а результат — тот же.

    Плюс, подозреваю, должно быть быстрее.

  2. Уведомление: 1С: Сохраняем структуру в XML « IT записки

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

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