﻿
// ag_ВыгрузкаЗапроса.ЗаписатьЗапросыВФайлXML(Запрос)
///////////////////////////////////////////////////////////////////////////
// ФУНКЦИИ РАБОТЫ С XML-ФАЙЛАМИ

// Записывает Запросы(текст и параметры запроса) в файл XML.
//
// Параметры:
//	ИмяФайла - имя файла XML.
//	Объект - передаваемый объект обработки.
//
Функция ЗаписатьЗапросыВФайлXML(знач ОбъектЗапроса, ИмяФайла = "C:\Запросы\TekZapros.q1c") Экспорт
	ФайлXML = Новый ЗаписьXML;
	ФайлXML.ОткрытьФайл(ИмяФайла);
	ФайлXML.ЗаписатьОбъявлениеXML();
	ФайлXML.ЗаписатьНачалоЭлемента("querylist");
	// выгрузка запроса.
	Для Сч =1 По 2 Цикл
		ФайлXML.ЗаписатьНачалоЭлемента("query");
		Если Сч = 1 Тогда
			ФайлXML.ЗаписатьАтрибут("name", "Запрос");
		Иначе	
			ФайлXML.ЗаписатьАтрибут("name", "ИсходныйЗапрос");
		КонецЕсли; 
		
			ФайлXML.ЗаписатьНачалоЭлемента("text");
			ТекстЗапроса = ОбъектЗапроса.Текст;
			Для Счетчик = 1 По СтрЧислоСтрок(ТекстЗапроса) Цикл
				ПереносСтр	= Символы.ВК + Символы.ПС;
				ТекСтрока 	= СтрПолучитьСтроку(ТекстЗапроса, Счетчик);
				ФайлXML.ЗаписатьТекст(ТекСтрока);
				ФайлXML.ЗаписатьБезОбработки(ПереносСтр);
			КонецЦикла;
			ФайлXML.ЗаписатьКонецЭлемента();
			// Запись параметров в XML-файл.
			Если ОбъектЗапроса.Параметры.Количество() > 0 Тогда 
				ФайлXML.ЗаписатьНачалоЭлемента("parameters");
				Для каждого ТекПараметр из ОбъектЗапроса.Параметры Цикл 
						ИмяПараметра		= ТекПараметр.Ключ;
						ТипПараметра		= СтрЗаменить(Строка(ТипЗнч(ТекПараметр.Значение))," ","");//ТекПараметр.Тип;   !!!
						ЗначениеПараметра			= ТекПараметр.Значение;
						
						ФайлXML.ЗаписатьНачалоЭлемента("parameter");
						ФайлXML.ЗаписатьАтрибут("name", ИмяПараметра);
						Если ТипПараметра = "Списокзначений" Тогда 
							
							ТЗ = Новый ТаблицаЗначений;
							тз.Колонки.Добавить("Значения");
							
							Для каждого ТекЗнач Из ЗначениеПараметра Цикл
								НовСтрТЗ = тз.Добавить();
								НовСтрТЗ.Значения = ТекЗнач.Значение;						
							КонецЦикла; 

							
							ФайлXML.ЗаписатьАтрибут("type", "ТаблицаЗначений");
							ЗаписатьТаблицуЗначенийВXML(ФайлXML, ТЗ);  //!!!

						ИначеЕсли ТипПараметра = "Массив" Тогда              //!!!
							
							ТЗ = Новый ТаблицаЗначений;
							тз.Колонки.Добавить("Значения");
							
							Для каждого ТекЗнач Из ЗначениеПараметра Цикл
								НовСтрТЗ = тз.Добавить();
								НовСтрТЗ.Значения = ТекЗнач;						
							КонецЦикла; 
							
							
							ФайлXML.ЗаписатьАтрибут("type", "ТаблицаЗначений");   //!!!
							ЗаписатьТаблицуЗначенийВXML(ФайлXML, ТЗ);  //!!!
						ИначеЕсли ТипПараметра = "Таблицазначений" Тогда
							ФайлXML.ЗаписатьАтрибут("type", "ТаблицаЗначений");
		
							ЗаписатьТаблицуЗначенийВXML(ФайлXML, ЗначениеПараметра);
						ИначеЕсли ТипПараметра = "Моментвремени" Тогда
							ФайлXML.ЗаписатьАтрибут("type", "МоментВремени");
							ЗаписатьМоментВремениВXML(ФайлXML, ЗначениеПараметра);
						ИначеЕсли ТипПараметра = "Граница" Тогда
							ФайлXML.ЗаписатьАтрибут("type", ТипПараметра);
							ЗаписатьГраницуВXML(ФайлXML, ЗначениеПараметра);
						Иначе
							ИмяТипа = ИмяТипаИзЗначения(ЗначениеПараметра); 
							ФайлXML.ЗаписатьАтрибут("type", ИмяТипа);
							ФайлXML.ЗаписатьАтрибут("value", XMLСтрока(ЗначениеПараметра));
						КонецЕсли;	
						ФайлXML.ЗаписатьКонецЭлемента();
				КонецЦикла;	
				ФайлXML.ЗаписатьКонецЭлемента();
			КонецЕсли;	
		ФайлXML.ЗаписатьКонецЭлемента();
    КонецЦикла;
	ФайлXML.ЗаписатьКонецЭлемента();
	ФайлXML.Закрыть();
	
	вСохранитьЗапросыВФайл(ОбъектЗапроса,СтрЗаменить(ИмяФайла,"q1c","sel"));
	
	Возврат Истина;
КонецФункции

// Записывает строки списка значений в Файл XML.
//
// Параметры:
//	ФайлXML - записьXML.
//	Значение - список значений.
//
Процедура ЗаписатьСписокЗначенийВXML(ФайлXML, Значение)
	Если ТипЗнч(Значение) <> Тип("СписокЗначений") Тогда 
		Возврат;
	КонецЕсли;	
	
	Для каждого СтрСписка из Значение Цикл
		ЗначениеЭлементаСписка	= СтрСписка.Значение;
		// Определение имени типа.
		ИмяТипа = ИмяТипаИзЗначения(ЗначениеЭлементаСписка); 
		
		ФайлXML.ЗаписатьНачалоЭлемента("item");
			ФайлXML.ЗаписатьАтрибут("type", ИмяТипа);
			ФайлXML.ЗаписатьАтрибут("value", XMLСтрока(ЗначениеЭлементаСписка));
		ФайлXML.ЗаписатьКонецЭлемента();
	КонецЦикла;	
КонецПроцедуры	



// Записывает строки списка значений в Файл XML.
//
// Параметры:
//	ФайлXML - записьXML.
//	Значение - список значений.
//
Процедура ЗаписатьМассивВXML(ФайлXML, Значение)
	Если ТипЗнч(Значение) <> Тип("Массив") Тогда 
		Возврат;
	КонецЕсли;	
	
	Для каждого СтрСписка из Значение Цикл
		ЗначениеЭлементаСписка	= СтрСписка;
		// Определение имени типа.
		ИмяТипа = ИмяТипаИзЗначения(ЗначениеЭлементаСписка); 
		
		ФайлXML.ЗаписатьНачалоЭлемента("item");
			ФайлXML.ЗаписатьАтрибут("type", ИмяТипа);
			ФайлXML.ЗаписатьАтрибут("value", XMLСтрока(ЗначениеЭлементаСписка));
		ФайлXML.ЗаписатьКонецЭлемента();
	КонецЦикла;	
КонецПроцедуры	



// Записывает ячейки таблицы значений в Файл XML.
//
// Параметры:
//	ФайлXML - записьXML.
//	Значение - таблица значений.
//
Процедура ЗаписатьТаблицуЗначенийВXML(ФайлXML, Значение)
	Если ТипЗнч(Значение) <> Тип("ТаблицаЗначений") Тогда 
		Возврат;
	КонецЕсли;	
	
	
	КолКолонок 	= Значение.Колонки.Количество();
	КолСтрок	= Значение.Количество();
	
	ФайлXML.ЗаписатьАтрибут("colcount", XMLСтрока(КолКолонок));
	ФайлXML.ЗаписатьАтрибут("rowcount", XMLСтрока(КолСтрок));

	
	Для СтрокаИндекс = 0 по КолСтрок - 1 Цикл
		Для КолонкаИндекс = 0 по КолКолонок - 1 Цикл 
			ЗначениеЭлементаСписка	= Значение.Получить(СтрокаИндекс).Получить(КолонкаИндекс);
			ИмяКолонки = Значение.Колонки.Получить(КолонкаИндекс).Имя;
			// Определение имени типа.
			ИмяТипа = ИмяТипаИзЗначения(ЗначениеЭлементаСписка); 
			
			Если ИмяТипа = "Строка" Тогда 
				Длина = Значение.Колонки.Получить(КолонкаИндекс).ТипЗначения.КвалификаторыСтроки.Длина; 	
			Иначе 
				Длина = 0;
			КонецЕсли; 
			
			ФайлXML.ЗаписатьНачалоЭлемента("item");
				ФайлXML.ЗаписатьАтрибут("nameCol", ИмяКолонки);
				ФайлXML.ЗаписатьАтрибут("row", XMLСтрока(СтрокаИндекс));
				ФайлXML.ЗаписатьАтрибут("col", XMLСтрока(КолонкаИндекс));
				ФайлXML.ЗаписатьАтрибут("type", ИмяТипа);
				ФайлXML.ЗаписатьАтрибут("length", XMLСтрока(Длина));
				ФайлXML.ЗаписатьАтрибут("value", XMLСтрока(ЗначениеЭлементаСписка));
			ФайлXML.ЗаписатьКонецЭлемента();
		КонецЦикла;
	КонецЦикла;
	
	//ag(!!!
	//если параметр не заполнен  - добавим пустую ТЗ
	Если СтрокаИндекс = 0 тогда
		Для КолонкаИндекс = 0 по КолКолонок - 1 Цикл 
			//ЗначениеЭлементаСписка	= Значение.Получить(СтрокаИндекс).Получить(КолонкаИндекс);
			ИмяКолонки = Значение.Колонки.Получить(КолонкаИндекс).Имя;
			// Определение имени типа.
			ИмяТипа = xmlТип(Значение.Колонки.Получить(КолонкаИндекс).ТипЗначения.Типы()[0]).ИмяТипа;
			
			
			//ИмяТипаИзЗначения(ЗначениеЭлементаСписка); 
			
			ФайлXML.ЗаписатьНачалоЭлемента("item");
				ФайлXML.ЗаписатьАтрибут("nameCol", ИмяКолонки);
				//ФайлXML.ЗаписатьАтрибут("row", XMLСтрока(СтрокаИндекс));
				ФайлXML.ЗаписатьАтрибут("col", XMLСтрока(КолонкаИндекс));
				ФайлXML.ЗаписатьАтрибут("type", ИмяТипа);
				//ФайлXML.ЗаписатьАтрибут("value", XMLСтрока(ЗначениеЭлементаСписка));
			ФайлXML.ЗаписатьКонецЭлемента();
		КонецЦикла;
	КонецЕсли;
	//ag)
		
КонецПроцедуры	

// Записывает момент времени в Файл XML.
//
// Параметры:
//	ФайлXML - записьXML.
//	Значение - момент времени.
//
Процедура ЗаписатьМоментВремениВXML(ФайлXML, Значение)
	Если ТипЗнч(Значение) <> Тип("МоментВремени") Тогда 
		Возврат;
	КонецЕсли;	
	
	// Определение имени типа.
	ИмяТипа = ИмяТипаИзЗначения(Значение.Ссылка); 
	
	ФайлXML.ЗаписатьНачалоЭлемента("item");
		Если Значение.Ссылка <> Неопределено Тогда 
			ФайлXML.ЗаписатьАтрибут("type", ИмяТипа);
			ФайлXML.ЗаписатьАтрибут("valueRef", XMLСтрока(Значение.Ссылка));
		КонецЕсли;	
		ФайлXML.ЗаписатьАтрибут("valueDate", XMLСтрока(Значение.Дата));
	ФайлXML.ЗаписатьКонецЭлемента();
КонецПроцедуры	

// Записывает границу.
//
Процедура ЗаписатьГраницуВXML(ФайлXML, Граница)
	Если ТипЗнч(Граница) <> Тип("Граница") Тогда 
		Возврат;
	КонецЕсли;	
	
	ФайлXML.ЗаписатьНачалоЭлемента("divide");
		// Определение имени типа.
		ИмяТипа 			= ИмяТипаИзЗначения(Граница.Значение); 
		ТипЗначенияГраницы 	= ТипЗнч(Граница.Значение);
		
		// Запись в строку вида границы.
		ИмяВидаГраницы = Строка(Граница.ВидГраницы);
		
		ФайлXML.ЗаписатьАтрибут("type", ИмяТипа);
		ФайлXML.ЗаписатьАтрибут("valueDiv", ИмяВидаГраницы);
		
		Если ТипЗначенияГраницы <> Тип("МоментВремени") Тогда 
			ФайлXML.ЗаписатьАтрибут("value", XMLСтрока(Граница.Значение));
		Иначе
			ЗаписатьМоментВремениВXML(ФайлXML, Граница.Значение);
		КонецЕсли;
	ФайлXML.ЗаписатьКонецЭлемента();
КонецПроцедуры	

// Возвращает строковое представление типа по значению.
//
// Параметры:
//	Значение - передаваемое значение.
//
Функция ИмяТипаИзЗначения(Значение) Экспорт
	Если ТипЗнч(Значение) = Тип("Строка") Тогда
		ИмяТипа = "Строка";
	ИначеЕсли ТипЗнч(Значение) = Тип("Число") Тогда 	
		ИмяТипа = "Число";
	ИначеЕсли ТипЗнч(Значение) = Тип("Булево") Тогда 	
		ИмяТипа = "Булево";
	ИначеЕсли ТипЗнч(Значение) = Тип("Дата") Тогда 		
		ИмяТипа = "Дата";
	ИначеЕсли ТипЗнч(Значение) = Тип("МоментВремени") Тогда 		
		ИмяТипа = "МоментВремени";	
	ИначеЕсли ТипЗнч(Значение) = Тип("Неопределено") Тогда 		
		ИмяТипа = "Строка";		
	Иначе	
		ИмяТипа = xmlТип(ТипЗнч(Значение)).ИмяТипа;
	КонецЕсли;	
	
	Возврат ИмяТипа;
КонецФункции	

// Определяет условие конца тэга "query" или "parameters"
//
// Параметры:
//	ФайлXML - чтениеXML.
//
Функция ПроверкаКонцаТэгов(ФайлXML)
	Если (ФайлXML.ТипУзла = ТипУзлаXML.КонецЭлемента и ФайлXML.Имя = "query") 
		 или (ФайлXML.ТипУзла = ТипУзлаXML.КонецЭлемента и ФайлXML.Имя = "parameters") Тогда
		Возврат Истина;
	Иначе
		Возврат Ложь;
	КонецЕсли;	
КонецФункции	


//////////////////////////////////////////////////////////////////////////////////////////////
// для   обычной консоли 
Функция вСохранитьЗапросыВФайл(ОбъектЗапроса, ИмяФайла = "C:\Запросы\TekZapros.sel")

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

	
	ЗначениеВФайл(ИмяФайла, ДеревоЗапросов);
	
	Возврат Истина;

КонецФункции // СохранитьЗапросыВФайл()




