Загрузка данных
&НаСервере
Функция ЗаполнитьДеревоМаршрутов()
КвалификаторЧисла = Новый КвалификаторыЧисла(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].НаправлениеПеревозки; // #Рефакторинг реализовать через СКД
КонецЦикла;
ЗначениеВРеквизитФормы(МаршрутныеЛистыДерево, "МаршрутныеЛисты");
КонецФункции // ЗаполнитьДеревоМаршрутов()