Загрузка данных


&НаСервере
Функция ЗаполнитьДеревоМаршрутов()
	
	КвалификаторЧисла  = Новый КвалификаторыЧисла(15,2);
	КвалификаторСтроки = Новый КвалификаторыСтроки(500);
	
	ДанныеПоМаршрутам = Новый ТаблицаЗначений;
	
	ТипыТочекМаршрута = Новый Массив;
	ТипыТочекМаршрута.Добавить(Перечисления.уатТипыТочекМаршрута.Разгрузка);
	ТипыТочекМаршрута.Добавить(Перечисления.уатТипыТочекМаршрута.ДополнительнаяРазгрузка);
	ТипыТочекМаршрута.Добавить(Перечисления.уатТипыТочекМаршрута.ПромежуточныйПункт);
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("ДатаДоставки"     , НачалоДня(Дата));
	Запрос.УстановитьПараметр("ДатаДоставкиМинус30"     , НачалоДня(Дата)-30*24*3600);
	Запрос.УстановитьПараметр("ТипыТочекМаршрута", ТипыТочекМаршрута);
	Запрос.УстановитьПараметр("Подразделение"    , Подразделение);
	Запрос.УстановитьПараметр("ТипСкладаХолодный", врнОбщегоНазначенияПовтИсп.ПолучитьЗначениеПоКлючу("КонстантыИнфор", "ТипСкладаХолодный",, Истина));
	
	ТекстЗапросаВыгруженныеМЛ = "ВЫБРАТЬ РАЗЛИЧНЫЕ
								|	МаршрутныйЛист
								|ПОМЕСТИТЬ ВыгруженныеМЛ
								|	ИЗ РегистрСведений.врнВыгрузкаДанныхВИнфор.СрезПоследних(
								|				,  ДатаДоставки > &ДатаДоставкиМинус30
								|				 И Подразделение В ИЕРАРХИИ (&Подразделение)) КАК ВыгруженныеМЛ
								| ;
								| ";

	Запрос.Текст =
		"ВЫБРАТЬ
		|	ЕСТЬNULL(Выборка.ЗаказГрузоотправителя.НомерПоУчетуЗаказчика, ВыгруженныеДанные.НомерЗаказаИнфор) КАК НомерЗаказаИнфор,
		|	ЕСТЬNULL(Выборка.Ссылка, ВыгруженныеДанные.МаршрутныйЛист) КАК МаршрутныйЛист,
		|	Выборка.ЗаказГрузоотправителя КАК Заказ,
		|	Выборка.ЗаказГрузоотправителя.АдресНазначения КАК ПунктНазначения,
		|	Выборка.ЗаказГрузоотправителя.НаправлениеПеревозки КАК НаправлениеПеревозки,
		|	Выборка.ПрибытиеПлан КАК ПрибытиеПлан,
		|	Выборка.ЗаказГрузоотправителя.ДоставкаС КАК ДоставкаС,
		|	Выборка.ЗаказГрузоотправителя.ДоставкаПо КАК ДоставкаПо,
		|	Выборка.Объем КАК Объем,
		|	Выборка.ВесБрутто КАК ВесБрутто,
		|	Выборка.НомерСтроки КАК НомерСтроки,
		|	ЕстьNULL(врнИсправляемыеМаршрутыИнфор.Порядок,ВыгруженныеДанные.Порядок) КАК Порядок,
		|	ВыгруженныеДанные.Порядок КАК ПорядокИсх,
		|	ВыгруженныеДанные.ПорядокДляТипа КАК ПорядокДляТипа,
		|	ВыгруженныеДанные.Ворота КАК Ворота,
		|	ЕстьNULL(врнИсправляемыеМаршрутыИнфор.Маршрут,ВыгруженныеДанные.Маршрут) КАК НомерМаршрутаИнфор,
		|	ЕстьNULL(врнИсправляемыеМаршрутыИнфор.ТребуемаяДатаОтгрузки,ВыгруженныеДанные.ТребуемаяДатаОтгрузки) КАК ТребуемаяДатаОтгрузки,
		|	ВыгруженныеДанные.Остановка КАК Остановка,
		|	ВыгруженныеДанные.ТипМаршрута КАК ТипМаршрута,
		|	ВЫБОР
		|		КОГДА ВыгруженныеДанные.ЗаказГрузоотправителя ЕСТЬ NULL
		|				И врнИсправляемыеМаршрутыИнфор.МаршрутныйЛист ЕСТЬ NULL
		|			ТОГДА ЛОЖЬ
		|		ИНАЧЕ ИСТИНА
		|	КОНЕЦ КАК ЗаказБылВыгруженВИнфор,
		|	ВЫБОР
		|		КОГДА врнИсправляемыеМаршрутыИнфор.МаршрутныйЛист ЕСТЬ NULL
		|			ТОГДА ЛОЖЬ
		|		ИНАЧЕ ИСТИНА
		|	КОНЕЦ КАК ИсправляемыйМЛ,
		|	ВЫБОР
		|		КОГДА ДопРеквизитыЗаказа.Значение = &ТипСкладаХолодный
		|			ТОГДА ЗНАЧЕНИЕ(Перечисление.врнТипыМаршрутов.Холодный)
		|		ИНАЧЕ ЗНАЧЕНИЕ(Перечисление.врнТипыМаршрутов.Сухой)
		|	КОНЕЦ КАК ТипНоменклатуры
		|ИЗ
		|	Документ.уатМаршрутныйЛист.Заказы КАК Выборка
		|		ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.врнВыгрузкаДанныхВИнфор.СрезПоследних(
		|				,
		|				ДатаДоставки = &ДатаДоставки
		|					И Подразделение В ИЕРАРХИИ (&Подразделение)) КАК ВыгруженныеДанные
		|		ПО Выборка.ЗаказГрузоотправителя = ВыгруженныеДанные.ЗаказГрузоотправителя
        |			И Выборка.Ссылка = ВыгруженныеДанные.МаршрутныйЛист
		|		ЛЕВОЕ СОЕДИНЕНИЕ ВыгруженныеМЛ КАК ВыгруженныеМЛ
		|		ПО  Выборка.Ссылка = ВыгруженныеМЛ.МаршрутныйЛист
		|		ЛЕВОЕ СОЕДИНЕНИЕ Документ.уатЗаказГрузоотправителя.ДополнительныеРеквизиты КАК ДопРеквизитыЗаказа
		|		ПО (ДопРеквизитыЗаказа.Свойство.Имя = ""ТипНоменклатуры_bf908711e18e49a7a4b6e3bf04124bad"")
		|			И Выборка.ЗаказГрузоотправителя = ДопРеквизитыЗаказа.Ссылка 
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.врнИсправляемыеМаршрутыИнфор как врнИсправляемыеМаршрутыИнфор
		|		ПО врнИсправляемыеМаршрутыИнфор.Подразделение В ИЕРАРХИИ (&Подразделение)
		|			И врнИсправляемыеМаршрутыИнфор.МаршрутныйЛист = Выборка.Ссылка
		//|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.врнПовторныеЗаказы.СрезПоследних() как врнПовторныеЗаказы
		//|		ПО врнПовторныеЗаказы.Подразделение В ИЕРАРХИИ (&Подразделение)
	//	|			И врнПовторныеЗаказы.МаршрутныйЛист = Выборка.Ссылка   
//		|			И Выборка.ЗаказГрузоотправителя = врнПовторныеЗаказы.Заказ
		|ГДЕ
		|	НАЧАЛОПЕРИОДА(ВыгруженныеДанные.ДатаДоставки, ДЕНЬ) = &ДатаДоставки
		|	И ЕСТЬNULL(Выборка.ЗаказГрузоотправителя.Подразделение, ВыгруженныеДанные.ЗаказГрузоотправителя.Подразделение) В ИЕРАРХИИ (&Подразделение)
		|	И ВЫБОР
		|			КОГДА Выборка.ТипТочкиМаршрута ЕСТЬ NULL
		|				ТОГДА ИСТИНА
		|			ИНАЧЕ Выборка.ТипТочкиМаршрута В (&ТипыТочекМаршрута)
		|		КОНЕЦ
		|	И НЕ Выборка.Ссылка.СозданАвтоматически";
	
	Запрос.Текст = ТекстЗапросаВыгруженныеМЛ + Запрос.Текст + "
		|Объединить ВСЕ 
		|" + СтрЗаменить(Запрос.Текст, "НАЧАЛОПЕРИОДА(ВыгруженныеДанные.ДатаДоставки, ДЕНЬ) = &ДатаДоставки",
		"ВыгруженныеДанные.ДатаДоставки есть Null И НАЧАЛОПЕРИОДА(Выборка.ЗаказГрузоотправителя.ДоставкаПо, ДЕНЬ) = &ДатаДоставки");
		//"ВыгруженныеМЛ.МаршрутныйЛист есть Null 
		//|И ВыгруженныеДанные.ДатаДоставки есть Null 
		//|И НАЧАЛОПЕРИОДА(естьnull(врнПовторныеЗаказы.НоваяДата,Выборка.ЗаказГрузоотправителя.ДоставкаПо), ДЕНЬ) = &ДатаДоставки");
	
	Результат       = Запрос.Выполнить();
	МаршрутыИЗаказы = Результат.Выгрузить();
	
	// Формируем структуру с типами маршрутов 
	
	МаршрутныеЛистыТЗ = МаршрутыИЗаказы.Скопировать(, "МаршрутныйЛист, ТипМаршрута");
	МаршрутныеЛистыТЗ.Свернуть("МаршрутныйЛист, ТипМаршрута");
	
	Если РежимПереходаСоСтаройСистемыВПитере Тогда 
		ТипыМаршрутов = ПоместитьВоВременноеХранилище(Новый Соответствие, УникальныйИдентификатор);
	Иначе
		ТипыМаршрутов = ПоместитьВоВременноеХранилище(ТипыМаршрутовПоТЗ(МаршрутныеЛистыТЗ), УникальныйИдентификатор);
	КонецЕсли;
	
	// Формируем дерево значений
	
	СхемаКомпоновкиДанных = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ДеревоМаршрутовМакет");
	КомпоновщикМакета     = Новый КомпоновщикМакетаКомпоновкиДанных;

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

	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, Новый Структура("МаршрутыИЗаказы", МаршрутыИЗаказы));

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