//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирПривилегированный Экспорт;

Перем мПоследнийПрочитанныйОбъект Экспорт;

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

Функция ВыполнитьВыгрузку() Экспорт 

	РезультатОбработки.Очистить();
	ПараметрыОбработки = Новый Структура;
	ПередВыгрузкойВсех(ПараметрыОбработки);
	//ИмяВременногоКаталога = ПолучитьИмяВременногоФайла();
	//СоздатьКаталог(ИмяВременногоКаталога);
	//ФайлДанных = Новый файл(ИмяВременногоКаталога + "\Data.xml");
	//ЗаписьXML = Новый ЗаписьXML;
	//ЗаписьXML.ОткрытьФайл(ФайлДанных.ПолноеИмя);
	//ЗаписьXML.ЗаписатьНачалоЭлемента("IRData");
	//СчетчикВыгруженныхОбъектов = 0;
	КоличествоОбъектов = ирОбщий.ПолучитьКоличествоИзмененийПоУзлуЛкс(УзелВыборкиДанных);
	Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоличествоОбъектов, "Выборка");
	ВыборкаОбъектов = ПланыОбмена.ВыбратьИзменения(УзелВыборкиДанных, УзелВыборкиДанных.НомерОтправленного + 1);
	Пока ВыборкаОбъектов.Следующий() Цикл
		ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
		ОбъектБД = ВыборкаОбъектов.Получить();
		ВыгрузитьОбъектБД(ПараметрыОбработки.ЗаписьXML, ОбъектБД, ПараметрыОбработки.СчетчикВыгруженныхОбъектов);
		Если ВыгружатьДвиженияВместеСДокументами Тогда
			ОбъектМД = ОбъектБД.Метаданные();
			Если ирОбщий.ЛиКорневойТипДокументаЛкс(ирОбщий.ПолучитьПервыйФрагментЛкс(ОбъектМД.ПолноеИмя())) Тогда
				ОбъектыМД = ирОбщий.ПолучитьМетаданныеНаборовЗаписейПоРегистраторуЛкс(ОбъектМД);
				Для Каждого МетаРегистр из ОбъектыМД Цикл
					ПолноеИмяМД = МетаРегистр.ПолноеИмя();
					НаборЗаписей = Новый (СтрЗаменить(ПолноеИмяМД, ".", "НаборЗаписей."));
					НаборЗаписей.Отбор.Регистратор.Установить(ОбъектБД.Ссылка);
					НаборЗаписей.Прочитать();
					ВыгрузитьОбъектБД(ПараметрыОбработки.ЗаписьXML, НаборЗаписей, ПараметрыОбработки.СчетчикВыгруженныхОбъектов);
				КонецЦикла;
			КонецЕсли; 
		КонецЕсли;
	КонецЦикла; 
	ирОбщий.ОсвободитьИндикаторПроцессаЛкс(, Истина);
	//ИнфоДанных = Новый Структура;
	//ИнфоДанных.Вставить("КоличествоОбъектов", СчетчикВыгруженныхОбъектов);
	//ИнфоДанных.Вставить("ИспользоватьXDTO", ИспользоватьXDTO);
	//Сообщить("Выгружено объектов " + XMLСтрока(СчетчикВыгруженныхОбъектов));
	//ЗаписьXML.ЗаписатьКонецЭлемента();
	//ЗаписьXML.Закрыть();
	//ФайлИнфо = Новый файл(ИмяВременногоКаталога + "\Info.xml");
	//ЗаписьXML = Новый ЗаписьXML;
	//ЗаписьXML.ОткрытьФайл(ФайлИнфо.ПолноеИмя);
	//СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ИнфоДанных);
	//ЗаписьXML.Закрыть();
	//ЗаписьZIP = Новый ЗаписьZipФайла(ИмяФайла);
	//ЗаписьZIP.Добавить(ФайлДанных.ПолноеИмя);
	//ЗаписьZIP.Добавить(ФайлИнфо.ПолноеИмя);
	//ЗаписьZIP.Записать();
	//УдалитьФайлы(ИмяВременногоКаталога);
	ПослеВыгрузкиВсех(ПараметрыОбработки);
	Возврат Истина;

КонецФункции

Процедура ВыгрузитьОбъектБД(Знач ЗаписьXML, Знач ОбъектБД, СчетчикВыгруженныхОбъектов)
	
	Попытка
		Успех = Истина;
		ирОбщий.СохранитьОбъектВВидеСтрокиXMLЛкс(ОбъектБД, ИспользоватьXDTO,,, ЗаписьXML);
	Исключение
		Успех = Ложь;
		ОбработатьИсключениеПоОбъекту(ОбъектБД, ОписаниеОшибки());
		Если Не ПропускатьОшибки Тогда
			ВызватьИсключение;
		КонецЕсли; 
	КонецПопытки;
	Если Успех Тогда
		СчетчикВыгруженныхОбъектов = СчетчикВыгруженныхОбъектов + 1;
	КонецЕсли; 

КонецПроцедуры // ВыполнитьВыгрузку()

Функция ВыполнитьЗагрузку() Экспорт 

	РезультатОбработки.Очистить();
	ИмяВременногоКаталога = ПолучитьИмяВременногоФайла();
	СоздатьКаталог(ИмяВременногоКаталога);
	ЧтениеZip = Новый ЧтениеZipФайла(ИмяФайла);
	ЧтениеZip.ИзвлечьВсе(ИмяВременногоКаталога);
	ФайлИнфо = Новый файл(ИмяВременногоКаталога + "\Info.xml");
	Если Не ФайлИнфо.Существует() Тогда
		Возврат "Неверный формат файла данных!";
	КонецЕсли; 
	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.ОткрытьФайл(ФайлИнфо.ПолноеИмя);
	ИнфоДанных = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
	ФайлДанных = Новый файл(ИмяВременногоКаталога + "\Data.xml");
	Если Не ФайлИнфо.Существует() Тогда
		Возврат "Неверный формат файла данных!";
	КонецЕсли; 
	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.ОткрытьФайл(ФайлДанных.ПолноеИмя);
	ЧтениеXML.Прочитать();
	Если ЧтениеXML.ЛокальноеИмя <> "IRData" Тогда
		ЧтениеXML.Закрыть();
		УдалитьФайлы(ИмяВременногоКаталога);
		Возврат "Неверный формат файла данных!";
	КонецЕсли; 
	ЧтениеXML.Прочитать();
	Сообщить("В файле данных заявлено " + ИнфоДанных.КоличествоОбъектов + " объектов");
	Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(ИнфоДанных.КоличествоОбъектов, "Загрузка");
	СчетчикСчитанныхОбъектов = 0;
	Пока Истина Цикл
		ирОбщий.ОбработатьИндикаторЛкс(Индикатор, СчетчикСчитанныхОбъектов);
		Если ИнфоДанных.ИспользоватьXDTO Тогда
			Если Не СериализаторXDTO.ВозможностьЧтенияXML(ЧтениеXML) Тогда
				Прервать;
			КонецЕсли; 
			ОбъектБД = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
		Иначе 
			Если Не ВозможностьЧтенияXML(ЧтениеXML) Тогда
				Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда 
					ОписаниеОшибки = "Неизвестный тип элемента XML: " + ЧтениеXML.Имя;
					Если Не ПропускатьОшибки Тогда 
						ВызватьИсключение ОписаниеОшибки;
					Иначе
						ОбработатьИсключениеПоОбъекту(ЧтениеXML.Имя, ОписаниеОшибки);
						ЧтениеXML.Пропустить();
						Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда 
							ЧтениеXML.Прочитать();
						КонецЕсли;
						Продолжить;
					КонецЕсли;
				Иначе
					Прервать;
				КонецЕсли;
			КонецЕсли; 
			ОбъектБД = ПрочитатьXML(ЧтениеXML);
		КонецЕсли;
		СчетчикСчитанныхОбъектов = СчетчикСчитанныхОбъектов + 1;
		#Если Сервер И Не Сервер Тогда
			ОбъектБД = Справочники.ирАлгоритмы.СоздатьЭлемент();
		#КонецЕсли
		Попытка
			Отправитель = ОбъектБД.ОбменДанными.Отправитель;
		Исключение
			// Элемент плана обмена в 8.3.5+
			Отправитель = Неопределено;
		КонецПопытки;
		Если Отправитель <> Неопределено Тогда
			ОбъектБД.ОбменДанными.Отправитель = УзелОтправитель;
		КонецЕсли;
		ЭтотОбъект.мПоследнийПрочитанныйОбъект = ОбъектБД;
		Попытка
			ирОбщий.ЗаписатьОбъектЛкс(ОбъектБД,,,, Истина);
			Успех = Истина;
		Исключение
			Успех = Ложь;
			ОбработатьИсключениеПоОбъекту(ОбъектБД, ОписаниеОшибки());
			Если Не ПропускатьОшибки Тогда
				ВызватьИсключение;
			КонецЕсли; 
		КонецПопытки; 
	КонецЦикла;
	ЧтениеXML.Закрыть();
	ирОбщий.ОсвободитьИндикаторПроцессаЛкс(, Истина);
	УдалитьФайлы(ИмяВременногоКаталога);
	ЭтотОбъект.мПоследнийПрочитанныйОбъект = Неопределено;
	Если СчетчикСчитанныхОбъектов <> ИнфоДанных.КоличествоОбъектов Тогда
		Возврат "Считано объектов " + XMLСтрока(СчетчикСчитанныхОбъектов) + " из " + XMLСтрока(ИнфоДанных.КоличествоОбъектов) + " заявленных!";
	КонецЕсли; 
	Возврат Истина;

КонецФункции // ВыполнитьВыгрузку()

Процедура ПередВыгрузкойВсех(Параметры) Экспорт 

	#Если Сервер И Не Сервер Тогда
	    Параметры = Новый Структура;
	#КонецЕсли
	ИмяВременногоКаталога = ПолучитьИмяВременногоФайла();
	СоздатьКаталог(ИмяВременногоКаталога);
	ФайлДанных = Новый файл(ИмяВременногоКаталога + "\Data.xml");
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.ОткрытьФайл(ФайлДанных.ПолноеИмя);
	ЗаписьXML.ЗаписатьНачалоЭлемента("IRData");
	СчетчикВыгруженныхОбъектов = 0;
	Параметры.Вставить("ЗаписьXML", ЗаписьXML);
	Параметры.Вставить("ФайлДанных", ФайлДанных);
	Параметры.Вставить("ИмяВременногоКаталога", ИмяВременногоКаталога);
	Параметры.Вставить("СчетчикВыгруженныхОбъектов", СчетчикВыгруженныхОбъектов);

КонецПроцедуры // ПередГрупповойОбработкой() 

Процедура ПослеВыгрузкиВсех(Параметры) Экспорт 

	#Если Сервер И Не Сервер Тогда
	    Параметры = Новый Структура;
	#КонецЕсли
	ИнфоДанных = Новый Структура;
	ИнфоДанных.Вставить("КоличествоОбъектов", Параметры.СчетчикВыгруженныхОбъектов);
	ИнфоДанных.Вставить("ИспользоватьXDTO", ИспользоватьXDTO);
	Сообщить("Выгружено объектов " + XMLСтрока(Параметры.СчетчикВыгруженныхОбъектов));
	Параметры.ЗаписьXML.ЗаписатьКонецЭлемента();
	Параметры.ЗаписьXML.Закрыть();
	ФайлИнфо = Новый файл(Параметры.ИмяВременногоКаталога + "\Info.xml");
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.ОткрытьФайл(ФайлИнфо.ПолноеИмя);
	СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ИнфоДанных);
	ЗаписьXML.Закрыть();
	ЗаписьZIP = Новый ЗаписьZipФайла(ИмяФайла);
	ЗаписьZIP.Добавить(Параметры.ФайлДанных.ПолноеИмя);
	ЗаписьZIP.Добавить(ФайлИнфо.ПолноеИмя);
	ЗаписьZIP.Записать();
	УдалитьФайлы(Параметры.ИмяВременногоКаталога);

КонецПроцедуры // ПередГрупповойОбработкой() 

//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный 	Контейнер = Новый Структура();
//ирПортативный 	Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный 	Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный 		ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный 		ирПортативный.Открыть();
//ирПортативный 	КонецЕсли; 
//ирПортативный #Иначе
//ирПортативный 	ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");
