Доставка товаров / Форма / Модуль формы

файл
// @strict-types

#Область ОписаниеПеременных

&НаКлиенте
Перем КэшированныеЗначения; //используется механизмом обработки изменения реквизитов ТЧ

&НаКлиенте
Перем КоличествоВыделенныхСтрокРаспоряжений; // Число

#КонецОбласти

#Область ОбработчикиСобытийФормы

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	РаспоряженияРазвернуть();
	ЗаданияПланируемыеРазвернуть();
	КоличествоВыделенныхСтрокРаспоряжений = 0;
	Если Элементы.ГлавныеСтраницы.ТекущаяСтраница = Элементы.СтраницаФормированиеЗаданийНаПеревозку Тогда
		ПодключитьОбработчикОжидания("ПроверкаНеобходимостиПересчитатьИтогиПоРаспоряжениямНаДоставкуОбработчикОжидания",1.3,Ложь);
	КонецЕсли;
	
	ЗаданияНаПеревозкуПланируемыеПриАктивизацииСтрокиОбработчикОжидания();
	
	МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПриОткрытииФормы(Неопределено, ЭтотОбъект, "СканерШтрихкода");
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	Если ИсточникВыбора.ИмяФормы = ОбработкаПолноеИмя + ".Форма.ФормаВыбораРаспоряжений" Тогда
		РазбитьПунктДоставкиСервер(ВыбранноеЗначение);
	ИначеЕсли ИсточникВыбора.ИмяФормы = "Справочник.ТранспортныеСредства.Форма.ФормаВыбора"
		Или ИсточникВыбора.ИмяФормы = "Справочник.ТипыТранспортныхСредств.Форма.ФормаВыбора" Тогда
		ТекущиеДанные = Элементы.ЗаданияНаПеревозкуПланируемые.ТекущиеДанные;
		ТекущиеДанные.Транспорт = ВыбранноеЗначение;
		ЗаполнитьЗначенияСвойств(ТекущиеДанные, РеквизитыТС(ВыбранноеЗначение));
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	
	Если Не ЗавершениеРаботы Тогда
		СохранитьНастройкиИЗаданияНаПеревозкуСервер();
		ОповеститьОСозданныхЗаданиях();
	КонецЕсли;
	
	МенеджерОборудованияКлиент.НачатьОтключениеОборудованиеПриЗакрытииФормы(Неопределено, ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ИмяСобытия = "Запись_ПоручениеЭкспедитору" Тогда
		ОбновитьСписокРаспоряженийНаДоставку(Источник);
	ИначеЕсли ИмяСобытия = "Запись_ЗаданиеНаПеревозку" Тогда
		ОбновитьСпискиДляТекущейСтраницы();
	ИначеЕсли ИмяСобытия = "ОтменаИсключенияИзДоставки" Тогда
		ОбновитьСписокРаспоряженийНаДоставку(Параметр.АдресРаспоряжений);
	КонецЕсли;
	
	// ПодключаемоеОборудование
	Если Источник = "ПодключаемоеОборудование" И ВводДоступен() Тогда
		Если ИмяСобытия = "ScanData" И МенеджерОборудованияУТКлиент.ЕстьНеобработанноеСобытие() Тогда
			ОбработатьШтрихкоды(МенеджерОборудованияУТКлиент.ПреобразоватьДанныеСоСканераВСтруктуру(Параметр));
		КонецЕсли;
	КонецЕсли;
	// Конец ПодключаемоеОборудование
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ВидДоставкиПриИзменении(Элемент)
	
	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
		"Обработка.РабочееМестоМенеджераПоДоставке.Форма.Элемент.ВидДоставки.ПриИзменении");
	
	ВидДоставкиПриИзмененииСервер();
	ОповеститьОСозданныхЗаданиях();
	
КонецПроцедуры

&НаКлиенте
Процедура ДатаРаспоряженийПриИзменении(Элемент)
	
	ДатаРаспоряженийПриИзмененииСервер();
	
КонецПроцедуры

&НаКлиенте
Процедура СкладПриИзменении(Элемент)
	
	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
		"Обработка.РабочееМестоМенеджераПоДоставке.Форма.Элемент.Склад.ПриИзменении");
	
	Если Склад <> СкладБыл Тогда
		
		ТекстОшибки = "";
		СкладПриИзмененииСервер(ТекстОшибки);
		Если Не ПустаяСтрока(ТекстОшибки) Тогда
			ПоказатьПредупреждение(, ТекстОшибки);
			Возврат;
		КонецЕсли;
		
		ОповеститьОСозданныхЗаданиях();
		СкладБыл = Склад;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗонаПриИзменении(Элемент)
	
	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
		"Обработка.РабочееМестоМенеджераПоДоставке.Форма.Элемент.Зона.ПриИзменении");
	
	ЗонаПриИзмененииСервер();
	
КонецПроцедуры

&НаКлиенте
Процедура ГлавныеСтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)
	
	ПодключитьОбработчикОжидания("ОбновитьСпискиДляТекущейСтраницы", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура СтатусПриИзменении(Элемент)
	
	СтатусПриИзмененииСервер();
	
КонецПроцедуры

&НаКлиенте
Процедура ДатаРаспоряженийРегулирование(Элемент, Направление, СтандартнаяОбработка)
	
	Если НЕ ЗначениеЗаполнено(ДатаРаспоряжений) Тогда
		ДатаРаспоряжений = ТекущаяДатаСеанса;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ДатаРаспоряженийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	Если НЕ ЗначениеЗаполнено(ДатаРаспоряжений) Тогда
		ДатаРаспоряжений = ТекущаяДатаСеанса;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПеревозчикПриИзменении(Элемент)
	
	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
		"Обработка.РабочееМестоМенеджераПоДоставке.Форма.Элемент.ПеревозчикПартнер.ПриИзменении");
	
	ПеревозчикПриИзмененииСервер();
КонецПроцедуры

&НаКлиенте
Процедура ПериодДокументовДляПеревозчиковПриИзменении(Элемент)
	
	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
		"Обработка.РабочееМестоМенеджераПоДоставке.Форма.Элемент.ПериодДокументовДляПеревозчиков.ПриИзменении");
	
	ОбновитьДокументыДляПеревозчиковСервер();
КонецПроцедуры

&НаКлиенте
Процедура ОтборПоТипуИсполнителейПриИзменении(Элемент)
	
	СохранитьЗаданияОбновитьСписки();
	
КонецПроцедуры

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

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыРаспоряженияНаДоставку

&НаКлиенте
Процедура РаспоряженияНаДоставкуВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	ВыбраннаяСтрокаЭлементДерева = РаспоряженияНаДоставку.НайтиПоИдентификатору(ВыбраннаяСтрока);
	Если ВыбраннаяСтрокаЭлементДерева.ПолучитьЭлементы().Количество() = 0 Тогда
		ПоказатьЗначение(Неопределено, ВыбраннаяСтрокаЭлементДерева.Распоряжение);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура РаспоряженияНаДоставкуНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение)
	
	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
		"Обработка.РабочееМестоМенеджераПоДоставке.Форма.Элемент.РаспоряженияНаДоставку.НачалоПеретаскивания");
	
	НачалиПеретаскивание = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура РаспоряженияНаДоставкуОкончаниеПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
	
	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
		"Обработка.РабочееМестоМенеджераПоДоставке.Форма.Элемент.РаспоряженияНаДоставку.ОкончаниеПеретаскивания");
	
	НачалиПеретаскивание = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура РаспоряженияНаДоставкуПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	
	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
		"Обработка.РабочееМестоМенеджераПоДоставке.Форма.Элемент.РаспоряженияНаДоставку.ПроверкаПеретаскивания");
	
	СтандартнаяОбработка = Ложь;
	ПроверитьУстановитьДопустимостьПеретаскивания(Элемент, ПараметрыПеретаскивания);
	
КонецПроцедуры

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

&НаКлиенте
Процедура РаспоряженияНаДоставкуПриАктивизацииСтроки(Элемент)
	
	ПодключитьОбработчикОжидания("РаспоряженияНаДоставкуПриАктивизацииСтрокиОбработчикОжидания", 0.1, Истина);
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыЗаданияНаПеревозкуПланируемые

&НаКлиенте
Процедура ЗаданияНаПеревозкуПланируемыеПриАктивизацииСтроки(Элемент)
	
	ПодключитьОбработчикОжидания("ЗаданияНаПеревозкуПланируемыеПриАктивизацииСтрокиОбработчикОжидания", 0.1, Истина);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ЗаданияНаПеревозкуПланируемыеВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	Строка = ЗаданияНаПеревозкуПланируемые.НайтиПоИдентификатору(ВыбраннаяСтрока);
	ЭтоГруппировка = (Строка.ПолучитьРодителя() = Неопределено);
	Если ЭтоГруппировка Тогда
		Если Поле.ТолькоПросмотр ИЛИ Поле.Имя = "ЗаданияНаПеревозкуПланируемыеЗона" Тогда
			СтандартнаяОбработка = Ложь;
			ОткрытьФормуЗадания(Строка);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаданияНаПеревозкуПланируемыеПередУдалением(Элемент, Отказ)
	
	Отказ = Истина;
	КоличествоЗаписанныхЗаданий = 0;
	Для Каждого ИД Из Элементы.ЗаданияНаПеревозкуПланируемые.ВыделенныеСтроки Цикл
		Стр = ЗаданияНаПеревозкуПланируемые.НайтиПоИдентификатору(ИД);
		Если Стр.ПолучитьРодителя() = Неопределено И ЗначениеЗаполнено(Стр.Ссылка) Тогда
			КоличествоЗаписанныхЗаданий = КоличествоЗаписанныхЗаданий + 1;
		КонецЕсли;
	КонецЦикла;
	Если КоличествоЗаписанныхЗаданий > 0 Тогда
		
		Режим = Новый СписокЗначений; // СписокЗначений из КодВозвратаДиалога
		Режим.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Пометить'"));
		Режим.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Не помечать, только очистить маршруты'"));
		Режим.Добавить(КодВозвратаДиалога.Отмена);
		Текст = НСтр("ru = 'Пометить на удаление выделенные задания на перевозку?';");
		
		ПоказатьВопрос(Новый ОписаниеОповещения("ЗаданияНаПеревозкуПланируемыеПередУдалениемЗавершение", ЭтотОбъект), Текст, Режим);
		Возврат;
		
	Иначе
		
		УбратьСтрокиИзЗаданийКлиент();
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаданияНаПеревозкуПланируемыеПередУдалениемЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
	
	Если РезультатВопроса = КодВозвратаДиалога.Отмена Тогда
		Возврат;
	КонецЕсли;
	
	ПометитьЗаданияНаУдаление = Ложь;
	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		ПометитьЗаданияНаУдаление = Истина;
	КонецЕсли;
	
	УбратьСтрокиИзЗаданийКлиент(Ложь, ПометитьЗаданияНаУдаление);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаданияНаПеревозкуПланируемыеПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	
	ТекущиеДанные = Элемент.ТекущиеДанные;
	Если Не ЗначениеЗаполнено(КэшированныеЗначения) Тогда
		КэшированныеЗначения = Новый Структура("Адрес,АдресЗначенияПолей,Зона,ВремяС,ВремяПо,ДополнительнаяИнформация");
	КонецЕсли;
	ЗаполнитьЗначенияСвойств(КэшированныеЗначения, ТекущиеДанные);
	
	Если РедактироватьАдресаДоставкиТолькоВДиалоге
		Или ТекущиеДанные.ПолучитьРодителя() = Неопределено Тогда
		Элементы.ЗаданияНаПеревозкуПланируемыеАдрес.РедактированиеТекста = Ложь;
	Иначе
		Элементы.ЗаданияНаПеревозкуПланируемыеАдрес.РедактированиеТекста = Истина;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаданияНаПеревозкуПланируемыеПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
	ТекущиеДанные = Элемент.ТекущиеДанные;
	Если Не (ТекущиеДанные = Неопределено)
		И Не ОбщегоНазначенияУТКлиентСервер.СтруктурыРавны(КэшированныеЗначения, Элемент.ТекущиеДанные,
		"Адрес,АдресЗначенияПолей,Зона,ВремяС,ВремяПо,ДополнительнаяИнформация") Тогда
		УстановитьМодифицированность(ТекущиеДанные,ЗаданияМодифицированы);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗаданияНаПеревозкуПланируемыеНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение)
	
	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
		"Обработка.РабочееМестоМенеджераПоДоставке.Форма.Элемент.ЗаданияНаПеревозкуПланируемые.НачалоПеретаскивания");
	
	НачалиПеретаскивание = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаданияНаПеревозкуПланируемыеОкончаниеПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
	
	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
		"Обработка.РабочееМестоМенеджераПоДоставке.Форма.Элемент.ЗаданияНаПеревозкуПланируемые.ОкончаниеПеретаскивания");
	
	НачалиПеретаскивание = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаданияНаПеревозкуПланируемыеПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	
	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
		"Обработка.РабочееМестоМенеджераПоДоставке.Форма.Элемент.ЗаданияНаПеревозкуПланируемые.ПроверкаПеретаскивания");
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаданияНаПеревозкуПланируемыеВремяПриИзменении(Элемент)
	
	Если Элемент = Элементы.ЗаданияНаПеревозкуПланируемыеВремяС
		ИЛИ Элемент = Элементы.ЗаданияНаПеревозкуПланируемыеДатаС Тогда
		ВремяСВремяПо        = "ВремяС";
		ВремяСВремяПоБезДаты = "ВремяСБезДаты"
	Иначе
		ВремяСВремяПо        = "ВремяПо";
		ВремяСВремяПоБезДаты = "ВремяПоБезДаты";
	КонецЕсли;
	ТекСтрока = Элементы.ЗаданияНаПеревозкуПланируемые.ТекущиеДанные;
	ТекСтрока[ВремяСВремяПо] = НачалоДня(ТекСтрока[ВремяСВремяПо])
		+ Час(ТекСтрока[ВремяСВремяПоБезДаты])*60*60 + Минута(ТекСтрока[ВремяСВремяПоБезДаты])*60;
	
	ПроверитьСоответствиеВремени(ВремяСВремяПо);
	Родитель = ТекСтрока.ПолучитьРодителя();
	Если Родитель = Неопределено Тогда
		ЗаданияПроверитьОтсортироватьЗаполнитьПризнакиПерехода();
	Иначе
		ТекВетка = Родитель.ПолучитьЭлементы();
		ТекИндекс = ТекВетка.Индекс(ТекСтрока);
		Если (ТекИндекс > 0 И ТекСтрока.ВремяС <= ТекВетка[ТекИндекс-1].ВремяС)
			ИЛИ (ТекИндекс < ТекВетка.Количество()-1 И ТекСтрока.ВремяС >= ТекВетка[ТекИндекс+1].ВремяС) Тогда
			ЗаданияОтсортироватьПеренумероватьЗаполнитьПризнакиПереходаДат();
		Иначе
			ИДСтрокиНазначения = ТекСтрока.ПолучитьИдентификатор();
			ЗаполнитьПризнакиПереходаДат(ИДСтрокиНазначения);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаданияНаПеревозкуПланируемыеАдресНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ИменаРеквизитовАдресовДоставки = ДоставкаТоваровКлиентСервер.ИменаРеквизитовАдресовДоставки("Адрес");
	
	ДоставкаТоваровКлиент.ОткрытьФормуВыбораАдресаИОбработатьРезультат(
		Элемент,
		Элементы.ЗаданияНаПеревозкуПланируемые.ТекущиеДанные,
		ИменаРеквизитовАдресовДоставки,
		СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаданияНаПеревозкуПланируемыеАдресОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	Если ТипЗнч(ВыбранноеЗначение) = Тип("ЭлементСпискаЗначений") Тогда
		СтандартнаяОбработка = Ложь;
		Элементы.ЗаданияНаПеревозкуПланируемые.ТекущиеДанные.Адрес = ВыбранноеЗначение.Представление;
		Элементы.ЗаданияНаПеревозкуПланируемые.ТекущиеДанные.АдресЗначенияПолей = ВыбранноеЗначение.ЗначенияПолей;
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ЗаданияНаПеревозкуПланируемыеТранспортНачалоВыбораЗавершение(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
	
	ВыбранныйТип = ВыбранныйЭлемент;
	
	Если ВыбранныйТип = Неопределено Тогда
		Возврат;
	ИначеЕсли ВыбранныйТип.Значение = НСтр("ru = 'Транспортное средство'") Тогда
		ОткрытьФорму("Справочник.ТранспортныеСредства.Форма.ФормаВыбора",, ЭтотОбъект,,,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	Иначе
		ОткрытьФорму("Справочник.ТипыТранспортныхСредств.Форма.ФормаВыбора",, ЭтотОбъект,,,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаданияНаПеревозкуПланируемыеТранспортПриИзменении(Элемент)
	
	ТекущиеДанные = Элементы.ЗаданияНаПеревозкуПланируемые.ТекущиеДанные;
	
	Если ТекущиеДанные.Транспорт <> Неопределено Тогда
		ЗаполнитьЗначенияСвойств(ТекущиеДанные, РеквизитыТС(ТекущиеДанные.Транспорт));
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаданияНаПеревозкуПланируемыеТранспортОчистка(Элемент, СтандартнаяОбработка)
	
	Если Элементы.ЗаданияНаПеревозкуПланируемые.ТекущиеДанные.ПолучитьРодителя() = Неопределено Тогда
		СтандартнаяОбработка = Ложь;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаданияНаПеревозкуПланируемыеДополнительнаяИнформацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

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

КонецПроцедуры

&НаКлиенте
Процедура ЗаданияНаПеревозкуПланируемыеДополнительнаяИнформацияНачалоВыбораЗавершение(РезультатЗакрытия, ДополнительныеПараметры) Экспорт
	
	Если РезультатЗакрытия <> Неопределено Тогда
		ТекущиеДанные = Элементы.ЗаданияНаПеревозкуПланируемые.ТекущиеДанные;
		ТекущиеДанные.ДополнительнаяИнформация = РезультатЗакрытия;
	КонецЕсли; 
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

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

&НаКлиенте
Процедура ОбновитьСпискиДоставки(Команда)
	
	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
		"Обработка.РабочееМестоМенеджераПоДоставке.Форма.Команда.ОбновитьСпискиДоставки");
	
	ОбновитьСпискиДляТекущейСтраницы();
	
КонецПроцедуры

&НаКлиенте
Процедура ПеренестиСтрокиВЗадание(Команда)
	
	ПеренестиСтроки();
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьЗадание(Команда)
	
	ТекущиеДанные = Элементы.ЗаданияНаПеревозкуПланируемые.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат
	КонецЕсли;
	ОткрытьФормуЗадания(СтрокаЗаданиеПоСтрокеПункта(Элементы.ЗаданияНаПеревозкуПланируемые.ТекущиеДанные));
	
КонецПроцедуры

&НаКлиенте
Процедура УбратьСтрокиИзЗаданий(Команда)
	
	ОчиститьСообщения();
	
	Если Элементы.ЗаданияНаПеревозкуПланируемые.ВыделенныеСтроки.Количество() > 0 Тогда
		УбратьСтрокиИзЗаданийКлиент();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаданияВверх(Команда)
	
	ТекущиеДанные = Элементы.ЗаданияНаПеревозкуПланируемые.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат
	КонецЕсли;
	Родитель = ТекущиеДанные.ПолучитьРодителя();
	Если Родитель = Неопределено Тогда
		Возврат
	КонецЕсли;
	Индекс = Родитель.ПолучитьЭлементы().Индекс(ТекущиеДанные);
	Ветка = Родитель.ПолучитьЭлементы();
	Если Индекс <> 0 Тогда
		Ветка.Сдвинуть(Индекс, -1);
		Ветка[Индекс-1].ПорядокВМаршруте = Индекс;
		Ветка[Индекс].ПорядокВМаршруте	 = Индекс+1;
		Ветка[Индекс-1].ВремяС			 = Ветка[Индекс].ВремяС;
		Ветка[Индекс-1].ВремяСБезДаты	 = ДоставкаТоваровКлиентСервер.ВремяБезДаты(Ветка[Индекс].ВремяС);
		Ветка[Индекс-1].ВремяПо			 = Ветка[Индекс].ВремяС;
		Ветка[Индекс-1].ВремяПоБезДаты	 = ДоставкаТоваровКлиентСервер.ВремяБезДаты(Ветка[Индекс].ВремяС);
		
		Если Ветка[Индекс].ПереходДаты = 1 Тогда
			Ветка[Индекс-1].ПереходДаты = 1;
		Иначе
			Ветка[Индекс-1].ПереходДаты = 0;
		КонецЕсли;
		
		Если Ветка[Индекс].ПереходДаты > 1 Тогда
			Ветка[Индекс].ПереходДаты = 2;
		Иначе
			Ветка[Индекс].ПереходДаты = 0;
		КонецЕсли;
		
		Если Ветка.Количество() > Индекс + 1 Тогда
			Ветка[Индекс+1].ПереходДаты = 0;
			Если НачалоДня(Ветка[Индекс+1].ВремяС) <> НачалоДня(Ветка[Индекс].ВремяС) Тогда
				Ветка[Индекс+1].ПереходДаты = 1;
			КонецЕсли;
			Если НачалоДня(Ветка[Индекс+1].ВремяС) <> НачалоДня(Ветка[Индекс+1].ВремяПо) Тогда
				Ветка[Индекс+1].ПереходДаты = Ветка[Индекс+1].ПереходДаты + 2;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	УстановитьМодифицированность(Родитель, ЗаданияМодифицированы);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаданияВниз(Команда)
	
	ТекущиеДанные = Элементы.ЗаданияНаПеревозкуПланируемые.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат
	КонецЕсли;
	Родитель = ТекущиеДанные.ПолучитьРодителя();
	Если Родитель = Неопределено Тогда
		Возврат
	КонецЕсли;
	Индекс = Родитель.ПолучитьЭлементы().Индекс(ТекущиеДанные);
	Ветка = Родитель.ПолучитьЭлементы();
	Если Индекс <> Ветка.Количество()-1 Тогда
		Ветка.Сдвинуть(Индекс, 1);
		Ветка[Индекс+1].ПорядокВМаршруте = Индекс+2;
		Ветка[Индекс].ПорядокВМаршруте	 = Индекс+1;
		Ветка[Индекс+1].ВремяС			 = Ветка[Индекс].ВремяПо;
		Ветка[Индекс+1].ВремяСБезДаты	 = ДоставкаТоваровКлиентСервер.ВремяБезДаты(Ветка[Индекс+1].ВремяС);
		Ветка[Индекс+1].ВремяПо			 = Ветка[Индекс].ВремяПо;
		Ветка[Индекс+1].ВремяПоБезДаты	 = ДоставкаТоваровКлиентСервер.ВремяБезДаты(Ветка[Индекс+1].ВремяПо);
		
		Если Ветка[Индекс+1].ПереходДаты = 1 Тогда
			Ветка[Индекс].ПереходДаты = 1;
		КонецЕсли;
		Ветка[Индекс+1].ПереходДаты = 0;
		
		Если НачалоДня(Ветка[Индекс].ВремяС) <> НачалоДня(Ветка[Индекс].ВремяПо) Тогда
			Ветка[Индекс].ПереходДаты	 = 2;
		КонецЕсли;
	КонецЕсли;
	УстановитьМодифицированность(Родитель, ЗаданияМодифицированы);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьВчерашнимиРейсами(Команда)
	
	ОчиститьСообщения();
	
	ЗаполнитьПрошлымиРейсамиСервер();
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьРейсамиНаДату(Команда)
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Заголовок",НСтр("ru='Выберите дату формирования эаданий на перевозку'"));
	ПараметрыФормы.Вставить("ПоясняющийТекст",НСтр("ru='Задания на выбранную дату будут использованы в качестве шаблона для заполнения списка.'"));
	
	ОчиститьСообщения();
	
	ОткрытьФорму("ОбщаяФорма.ВыборДаты",ПараметрыФормы,,,,, Новый ОписаниеОповещения("ЗаполнитьРейсамиНаДатуЗавершение", ЭтотОбъект), РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьРейсамиНаДатуЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	ВыбраннаяДата = Результат;
	
	Если ЗначениеЗаполнено(ВыбраннаяДата) Тогда
		ЗаполнитьПрошлымиРейсамиСервер(ВыбраннаяДата);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура СоздатьЗаданияНаПеревозку(Команда)
	
	ОткрытьПодборТранспорта();
	
КонецПроцедуры

&НаКлиенте
Процедура РазнестиРаспоряженияПоВремени(Команда)
	
	ОчиститьСообщения();
	
	ТекущиеДанные = Элементы.ЗаданияНаПеревозкуПланируемые.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат
	КонецЕсли;
	Если ТекущиеДанные.ПолучитьРодителя() = Неопределено Тогда
		Текст = НСтр("ru = 'Разбиение строки возможно только для строк-адресов'");
		ОбщегоНазначенияКлиент.СообщитьПользователю(Текст);
		Возврат;
	КонецЕсли;
	Если НЕ ПроверитьРазбитьПунктДоставкиСервер() Тогда
		АдресРаспоряжений = ПоместитьВХранилищеРаспоряжения(ТекущиеДанные.КлючСвязи);
		ПараметрыФормы = Новый Структура("АдресРаспоряжений", АдресРаспоряжений);
		ОткрытьФорму(ОбработкаПолноеИмя + ".Форма.ФормаВыбораРаспоряжений", ПараметрыФормы, ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбъединитьПоВремени(Команда)
	
	ОчиститьСообщения();
	
	Если Элементы.ЗаданияНаПеревозкуПланируемые.ВыделенныеСтроки.Количество() < 2 Тогда
		ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'Для объединения необходимо выделить хотя бы 2 строки.'"));
	ИначеЕсли НЕ ОбъединитьПоВремениСервер() Тогда
		ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'Не удалось объединить выделенные строки: выберите строки с одинаковыми адресами.'"));
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СоздатьЗаданиеНаПеревозку(Команда)
	
	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
		"Обработка.РабочееМестоМенеджераПоДоставке.Форма.Команда.СоздатьЗаданиеНаПеревозку");
	
	СтруктураЗначенияЗаполнения = Новый Структура;
	СтруктураЗначенияЗаполнения.Вставить("Склад", Склад);
	СтруктураЗначенияЗаполнения.Вставить("Операция", ВидДоставки);
	
	ОткрытьФорму("Документ.ЗаданиеНаПеревозку.ФормаОбъекта", Новый Структура("ЗначенияЗаполнения", СтруктураЗначенияЗаполнения));
	
КонецПроцедуры

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	
	Если Элементы.ГлавныеСтраницы.ТекущаяСтраница = Элементы.СтраницаЗаданияНаПеревозкуВРаботе Тогда
		Список = Элементы.ЗаданияНаПеревозкуВРаботе;
	ИначеЕсли Элементы.ГлавныеСтраницы.ТекущаяСтраница = Элементы.СтраницаДокументыДляПеревозчиков Тогда
		Список = Элементы.ДокументыДляПеревозчиков;
	КонецЕсли;
	
	ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Список);
	
КонецПроцедуры

&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат) Экспорт
	
	Если Элементы.ГлавныеСтраницы.ТекущаяСтраница = Элементы.СтраницаЗаданияНаПеревозкуВРаботе Тогда
		Список = Элементы.ЗаданияНаПеревозкуВРаботе;
	ИначеЕсли Элементы.ГлавныеСтраницы.ТекущаяСтраница = Элементы.СтраницаДокументыДляПеревозчиков Тогда
		Список = Элементы.ДокументыДляПеревозчиков;
	КонецЕсли; 
	
	ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Список, Результат);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	
	Список = Неопределено;
	Если Элементы.ГлавныеСтраницы.ТекущаяСтраница = Элементы.СтраницаЗаданияНаПеревозкуВРаботе Тогда
		Список = Элементы.ЗаданияНаПеревозкуВРаботе;
	ИначеЕсли Элементы.ГлавныеСтраницы.ТекущаяСтраница = Элементы.СтраницаДокументыДляПеревозчиков Тогда
		Список = Элементы.ДокументыДляПеревозчиков;
	КонецЕсли;
	
	Если Список <> Неопределено Тогда
		ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Список);
	КонецЕсли;
	
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
	
	СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтотОбъект, Команда);
	
КонецПроцедуры

&НаКлиенте
Процедура СоздатьПоручениеЭкспедитору(Команда)
	
	ПараметрыФормы = Новый Структура("Склад", Склад);
	ОткрытьФорму("Документ.ПоручениеЭкспедитору.Форма.ФормаДокумента", ПараметрыФормы, ЭтотОбъект,,,,, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

&НаКлиенте
Процедура ИсключитьИзДоставки(Команда)
	
	ИсключитьИзДоставкиНаСервере();
	ОбновитьСпискиДляТекущейСтраницы();
	
КонецПроцедуры

&НаКлиенте
Процедура ВернутьИсключенныеВДоставку(Команда)
	
	ПараметрыФормы = Новый Структура("Склад", Склад);
	ОткрытьФорму(ОбработкаПолноеИмя + ".Форма.ФормаОтменыИсключенияИзДоставки", ПараметрыФормы, ЭтотОбъект);

КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура УстановитьУсловноеОформление()
	
	УсловноеОформление.Элементы.Очистить();
	
#Область РаспоряженияНаДоставку
	
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.РаспоряженияНаДоставкуАдрес.Имя);
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("РаспоряженияНаДоставку.Зона");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Справочники.ЗоныДоставки.ПустаяСсылка();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("РаспоряженияНаДоставку.ОформлениеСтроки");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = 5;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(, , , Истина));
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<зона не указана>'"));
	
	//
	
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.РаспоряженияНаДоставкуКартинка.Имя);
	
	ГруппаИЛИ = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаИЛИ.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
	
	ОтборЭлемента = ГруппаИЛИ.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("РаспоряженияНаДоставку.КартинкаТипаИсполнителя");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = 1;
	
	ОтборЭлемента = ГруппаИЛИ.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("РаспоряженияНаДоставку.ОформлениеСтроки");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = 5;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
	Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	
	//
	
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.РаспоряженияНаДоставку.Имя);
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("РаспоряженияНаДоставку.ОформлениеСтроки");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = 5;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветаСтиля.ЦветФонаШапкиОтчета);
	Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(, , Истина));
	
	//
	
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.РаспоряженияНаДоставку.Имя);
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("РаспоряженияНаДоставку.ОформлениеСтроки");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = 1;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветаСтиля.ЦветФонаГруппировкиОтчета1);
	
#КонецОбласти

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

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

#Область ШтрихкодыИТорговоеОборудование

&НаСервере
Функция СсылкаНаЭлементСпискаПоШтрихкоду(Штрихкод)
	
	Возврат ШтрихкодированиеПечатныхФорм.ПолучитьСсылкуПоШтрихкодуТабличногоДокумента(Штрихкод);
	
КонецФункции

&НаКлиенте
Процедура ОбработатьШтрихкоды(Данные)
	
	МассивСсылок = СсылкаНаЭлементСпискаПоШтрихкоду(Данные.Штрихкод);
	Если МассивСсылок.Количество() > 0 Тогда
		Если ТипЗнч(МассивСсылок[0]) = Тип("ДокументСсылка.ЗаданиеНаПеревозку") Тогда
			Если Элементы.ГлавныеСтраницы.ТекущаяСтраница <> Элементы.СтраницаЗаданияНаПеревозкуВРаботе Тогда
				Элементы.ГлавныеСтраницы.ТекущаяСтраница = Элементы.СтраницаЗаданияНаПеревозкуВРаботе;
				ОбновитьСпискиДляТекущейСтраницы();
			КонецЕсли;
			Элементы.ЗаданияНаПеревозкуВРаботе.ТекущаяСтрока = МассивСсылок[0];
		ИначеЕсли ЗначениеЗаполнено(Склад)
			И Элементы.СтраницаДокументыДляПеревозчиков.Видимость = Истина Тогда
			Если Элементы.ГлавныеСтраницы.ТекущаяСтраница <> Элементы.СтраницаДокументыДляПеревозчиков Тогда
				Элементы.ГлавныеСтраницы.ТекущаяСтраница = Элементы.СтраницаДокументыДляПеревозчиков;
				ОбновитьСпискиДляТекущейСтраницы();
			КонецЕсли;
			НайденныеСтроки = ДокументыДляПеревозчиков.НайтиСтроки(Новый Структура("Ссылка",МассивСсылок[0]));
			Если НайденныеСтроки.Количество() > 0 Тогда
				Элементы.ДокументыДляПеревозчиков.ТекущаяСтрока = НайденныеСтроки[0].ПолучитьИдентификатор();
			КонецЕсли;
		КонецЕсли;
		ПоказатьЗначение(Неопределено, МассивСсылок[0]);
	Иначе
		ШтрихкодированиеПечатныхФормКлиент.ОбъектНеНайден(Данные.Штрихкод);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьСпискиВыбора()
	
	ЗначенияПеречисления = Метаданные.Перечисления.СтатусыЗаданийНаПеревозку.ЗначенияПеречисления;
	
	СписокВыбора = Элементы.Статус.СписокВыбора;
	СписокВыбора.Очистить();
	СписокВыбора.Добавить("ВсеВРаботе", НСтр("ru = 'Все в работе'"));
	СписокВыбора.Добавить(ЗначенияПеречисления.Формируется.Имя, ЗначенияПеречисления.Формируется.Синоним);
	СписокВыбора.Добавить(ЗначенияПеречисления.КПогрузке.Имя, ЗначенияПеречисления.КПогрузке.Синоним);
	СписокВыбора.Добавить(ЗначенияПеречисления.Отправлено.Имя, ЗначенияПеречисления.Отправлено.Синоним);
	СписокВыбора.Добавить(ЗначенияПеречисления.Закрыто.Имя, ЗначенияПеречисления.Закрыто.Синоним);
	СписокВыбора.Добавить("", НСтр("ru = 'Все'"));
	
КонецПроцедуры

#КонецОбласти

#Область Прочее

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

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьМодифицированность(СтрокаДерева, ЗаданияМодифицированы, УстанавливаемоеЗначение = Истина)
	
	СтрокаДерева.Модифицирован = УстанавливаемоеЗначение;
	Родитель = СтрокаДерева.ПолучитьРодителя();
	Если Родитель <> Неопределено Тогда
		Родитель.Модифицирован = УстанавливаемоеЗначение;
	КонецЕсли;
	
	// Хотя бы одно задание модифицировано.
	ЗаданияМодифицированы = Истина;
	
КонецПроцедуры

&НаСервере
Процедура СохранитьНастройкиИЗаданияНаПеревозкуСервер()
	
	Настройки = Новый Соответствие;
	Настройки.Вставить("Склад",                           Склад);
	Настройки.Вставить("ДатаСохранения",                  ТекущаяДатаСеанса());
	Настройки.Вставить("ДатаРаспоряжений",                ДатаРаспоряжений);
	Настройки.Вставить("Зона",                            Зона);
	Настройки.Вставить("Статус",                          Статус);
	Настройки.Вставить("Перевозчик",                      Перевозчик);
	Настройки.Вставить("ПериодДокументовДляПеревозчиков", ПериодДокументовДляПеревозчиков);
	Настройки.Вставить("ИмяТекущейСтраницы",              Элементы.ГлавныеСтраницы.ТекущаяСтраница.Имя);
	Настройки.Вставить("ВидДоставки",                     ВидДоставки);
	Настройки.Вставить("ОтборПоТипуИсполнителей",         ОтборПоТипуИсполнителей);
	
	ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("Обработка.РабочееМестоМенеджераПоДоставке", "Настройки", Настройки);
	
	СохранитьЗаданияНаПеревозкуСервер();

КонецПроцедуры

&НаСервере
Процедура ВосстановитьНастройки()
	
	ЗначениеНастроек = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("Обработка.РабочееМестоМенеджераПоДоставке", "Настройки");
	
	Если ТипЗнч(ЗначениеНастроек) = Тип("Соответствие") Тогда

		Склад                           = ЗначениеНастроек.Получить("Склад");
		ДатаСохранения                  = ЗначениеНастроек.Получить("ДатаСохранения");
		ДатаРаспоряжений                = ЗначениеНастроек.Получить("ДатаРаспоряжений");
		Зона                            = ЗначениеНастроек.Получить("Зона");
		Статус                          = ЗначениеНастроек.Получить("Статус");
		Перевозчик                      = ЗначениеНастроек.Получить("Перевозчик");
		ПериодДокументовДляПеревозчиков = ЗначениеНастроек.Получить("ПериодДокументовДляПеревозчиков");
		ИмяТекущейСтраницы              = ЗначениеНастроек.Получить("ИмяТекущейСтраницы");
		ВидДоставки                     = ЗначениеНастроек.Получить("ВидДоставки");
		ОтборПоТипуИсполнителей         = ЗначениеНастроек.Получить("ОтборПоТипуИсполнителей");
		
		Если Не ЗначениеЗаполнено(ПериодДокументовДляПеревозчиков.ДатаНачала) Тогда
			ПериодДокументовДляПеревозчиков.Вариант = ВариантСтандартногоПериода.Последние7Дней;
		ИначеЕсли ПериодДокументовДляПеревозчиков.Вариант = ВариантСтандартногоПериода.ПроизвольныйПериод Тогда
			ПериодДокументовДляПеревозчиков.ДатаОкончания = Дата(1,1,1);
		КонецЕсли;
		
		// Если в прошлые дни планировали на будущие, тогда подставляем будущий день
		Если (НачалоДня(ДатаСохранения) < НачалоДня(ДатаРаспоряжений)) Тогда
			ДатаРаспоряжений = Макс(ТекущаяДатаСеанса + 60*60*24, ДатаРаспоряжений)
		ИначеЕсли ЗначениеЗаполнено(ДатаРаспоряжений) Тогда
			ДатаРаспоряжений = ТекущаяДатаСеанса
		КонецЕсли;
		
		Если ЗначениеЗаполнено(ИмяТекущейСтраницы)
			И Элементы.Найти(ИмяТекущейСтраницы) <> Неопределено Тогда
			Элементы.ГлавныеСтраницы.ТекущаяСтраница = Элементы[ИмяТекущейСтраницы];
		КонецЕсли;
		
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(ВидДоставки) Тогда
		ВидДоставки = Перечисления.ВидыДоставки.СоСклада;
	КонецЕсли;
	
	НастроитьФормуПоВидуДоставки();
	
	Склад = ЗначениеНастроекПовтИсп.ПолучитьСкладПоУмолчанию(Склад, Истина, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура РаспоряженияРазвернуть()
	Если Не ЗонаГруппаИлиПустая Тогда
		Возврат;
	КонецЕсли;
	
	Для каждого СтрокаДерева Из РаспоряженияНаДоставку.ПолучитьЭлементы() Цикл
		Элементы.РаспоряженияНаДоставку.Развернуть(СтрокаДерева.ПолучитьИдентификатор());
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаданияПланируемыеРазвернуть()
	
	Для каждого СтрокаДерева Из ЗаданияНаПеревозкуПланируемые.ПолучитьЭлементы() Цикл
		Элементы.ЗаданияНаПеревозкуПланируемые.Развернуть(СтрокаДерева.ПолучитьИдентификатор());
	КонецЦикла;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ПослеВопросаОСозданииЗаданий(РезультатВопроса, ДополнительныеПараметры) Экспорт
	
	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		
		ОткрытьПодборТранспорта(Истина);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьПодборТранспорта(ПеренестиРаспоряженияВНовоеЗадание = Ложь)
	
	ОчиститьСообщения();
	
	АдресЗаданийФормируемых = ПоместитьЗаданияВХранилище();
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ДатаОтбор", ДатаРаспоряжений);
	ПараметрыФормы.Вставить("АдресЗаданийФормируемых", АдресЗаданийФормируемых);
	ПараметрыФормы.Вставить("Склад", Склад);
	ПараметрыФормы.Вставить("ИтогоВес", ИтогоВес);
	ПараметрыФормы.Вставить("ИтогоОбъем", ИтогоОбъем);
	ПараметрыФормы.Вставить("ЗаданиеБудетВыполнять", ОтборПоТипуИсполнителей);
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПодбораТранспорта",
		ЭтотОбъект, Новый Структура("ПеренестиРаспоряженияВНовоеЗадание",ПеренестиРаспоряженияВНовоеЗадание));
	ОткрытьФорму(ОбработкаПолноеИмя + ".Форма.ФормаВыбораТранспорта", ПараметрыФормы, ЭтотОбъект,,,,
		ОписаниеОповещения, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеПодбораТранспорта(Результат, ДополнительныеПараметры) Экспорт
	
	Если Не ЗначениеЗаполнено(Результат) Тогда
		Возврат;
	КонецЕсли;
	
	ДобавитьНовыеЗаданияСервер(Результат);
	
	Если ДополнительныеПараметры.ПеренестиРаспоряженияВНовоеЗадание
		И ЗаданияНаПеревозкуПланируемые.ПолучитьЭлементы().Количество() > 0 Тогда
		ПеренестиСтрокиЗавершение(ЗаданияНаПеревозкуПланируемые.ПолучитьЭлементы()[0].ПолучитьИдентификатор());
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ПеренестиСтрокиЗавершение(ИДСтрокиНазначения)
	
	Если ЗаданияНаПеревозкуПланируемые.ПолучитьЭлементы().Количество() = 1 Тогда
		ИДСтрокиНазначения = ЗаданияНаПеревозкуПланируемые.ПолучитьЭлементы()[0].ПолучитьИдентификатор();
	КонецЕсли;
	Если ИДСтрокиНазначения = Неопределено Тогда
		ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Не выбрана строка назначения в списке заданий на перевозку.'"));
		Возврат
	КонецЕсли;
	
	РаспоряженияСОсобымиУсловиями = ПеренестиСтрокиСервер(ИДСтрокиНазначения);
	ОповеститьОСозданныхЗаданиях();
	Элементы.ЗаданияНаПеревозкуПланируемые.Развернуть(ИДСтрокиНазначения);
	
	Если РаспоряженияСОсобымиУсловиями.Количество() > 0 Тогда
		ПараметрыФормы = Новый Структура("Распоряжения", РаспоряженияСОсобымиУсловиями);
		ОткрытьФорму(ОбработкаПолноеИмя + ".Форма.ФормаПредупреждения",	ПараметрыФормы, ЭтотОбъект);
	КонецЕсли;
	
	ЗаданияНаПеревозкуПланируемыеПриАктивизацииСтрокиОбработчикОжидания();
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьДокументыДляПеревозчиковСервер()
	
	ДокументыДляПеревозчиков.Очистить();
	Если НЕ ЗначениеЗаполнено(Склад) Тогда
		Возврат;
	КонецЕсли;
	
	Запрос = Новый Запрос(ТекстЗапросаДокументыДляПеревозчиков());
	Запрос.УстановитьПараметр("Склад", Склад);
	Запрос.УстановитьПараметр("Перевозчик", Перевозчик);
	Запрос.УстановитьПараметр("ПеревозчикНеЗаполнен", Не ЗначениеЗаполнено(Перевозчик));
	Запрос.УстановитьПараметр("ДатаНачала", ПериодДокументовДляПеревозчиков.ДатаНачала);
	Запрос.УстановитьПараметр("ДатаОкончания", ПериодДокументовДляПеревозчиков.ДатаОкончания);
	Запрос.УстановитьПараметр("БезДатыНачала", Не ЗначениеЗаполнено(ПериодДокументовДляПеревозчиков.ДатаНачала));
	Запрос.УстановитьПараметр("БезДатыОкончания", Не ЗначениеЗаполнено(ПериодДокументовДляПеревозчиков.ДатаОкончания));
	Запрос.УстановитьПараметр("СиламиПеревозчикаСоСклада", Перечисления.СпособыДоставки.СиламиПеревозчика);
	
	Результат = Запрос.Выполнить().Выгрузить();
	ДокументыДляПеревозчиков.Загрузить(Результат);
	
КонецПроцедуры

&НаСервере
Функция ТекстЗапросаДокументыДляПеревозчиков()
	
	ТекстЗапроса =
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
	|	ТИПЗНАЧЕНИЯ(РаспоряженияНаДоставку.Распоряжение) КАК ВидДокумента,
	|	РаспоряженияНаДоставку.Распоряжение КАК Ссылка,
	|	РаспоряженияНаДоставку.Дата КАК Дата,
	|	РаспоряженияНаДоставку.ПолучательОтправитель,
	|	РаспоряженияНаДоставку.Адрес КАК АдресДоставки,
	|	РаспоряженияНаДоставку.Перевозчик КАК Перевозчик,
	|	РаспоряженияНаДоставку.Номер КАК Номер,
	|	РаспоряженияНаДоставку.Склад КАК Склад,
	|	ВЫРАЗИТЬ(РаспоряженияНаДоставку.ДополнительнаяИнформация КАК СТРОКА(1000)) КАК ДополнительнаяИнформация
	|ИЗ
	|	РегистрСведений.СостоянияИРеквизитыДоставки КАК РаспоряженияНаДоставку
	|ГДЕ
	|	(РаспоряженияНаДоставку.Перевозчик = &Перевозчик
	|			ИЛИ &ПеревозчикНеЗаполнен)
	|	И РаспоряженияНаДоставку.СпособДоставки = &СиламиПеревозчикаСоСклада
	|	И РаспоряженияНаДоставку.Склад В ИЕРАРХИИ(&Склад)
	|	И (РаспоряженияНаДоставку.Дата <= &ДатаОкончания ИЛИ &БезДатыОкончания)
	|	И (РаспоряженияНаДоставку.Дата >= &ДатаНачала ИЛИ &БезДатыНачала)
	| УПОРЯДОЧИТЬ ПО РаспоряженияНаДоставку.Дата";
	
	Возврат ТекстЗапроса;
	
КонецФункции

&НаСервере
Процедура УстановитьЗаголовкиКолонокВесОбъемСервер()
	
	ТекстВес = НСтр("ru = 'Вес,'") + " " + ЕдиницаИзмеренияВеса;
	ТекстОбъем = НСтр("ru = 'Объем,'") + " " + ЕдиницаИзмеренияОбъема;
	Элементы.РаспоряженияНаДоставкуВес.Заголовок = ТекстВес;
	Элементы.РаспоряженияНаДоставкуОбъем.Заголовок = ТекстОбъем;
	
	Элементы.ЗаданияНаПеревозкуПланируемыеВес.Заголовок = ТекстВес;
	Элементы.ЗаданияНаПеревозкуПланируемыеОбъем.Заголовок = ТекстОбъем;
	
КонецПроцедуры

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

&НаСервере
Функция ПроверитьСообщитьЗаданиеИзменено(СтрокаЗадание)
	
	НовоеЗадание = Не ЗначениеЗаполнено(СтрокаЗадание.Ссылка)
		Или Не ОбщегоНазначения.СсылкаСуществует(СтрокаЗадание.Ссылка);
	Если Не НовоеЗадание Тогда
		ВерсияДанныхДокумента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаЗадание.Ссылка, "ВерсияДанных");
		Если ВерсияДанныхДокумента <> СтрокаЗадание.ВерсияДанных Тогда
			Текст = НСтр("ru = 'Не удалось внести изменения в %Задание%, т.к. версия документа отличается от ожидаемой. Рекомендуется обновить список.'");
			Текст = СтрЗаменить(Текст,"%Задание%", СтрокаЗадание.Ссылка);
			ОбщегоНазначения.СообщитьПользователю(Текст, СтрокаЗадание.Ссылка);
			Возврат Истина;
		КонецЕсли;
	КонецЕсли;
	
	Возврат Ложь;
	
КонецФункции

&НаСервере
Функция СтрокаПунктМаршрутаПоКлючу(ТекущаяСтрока, КлючСвязи)
	СтрокаЗадание = СтрокаЗаданиеПоСтрокеПункта(ТекущаяСтрока);
	Для Каждого Стр Из СтрокаЗадание.ПолучитьЭлементы() Цикл
		Если Стр.КлючСвязи = КлючСвязи Тогда
			Возврат Стр;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Неопределено;
	
КонецФункции

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

&НаСервере
Процедура ЗаполнитьПризнакиПереходаДат(ИДСтрокиНазначения = Неопределено)
	
	ТекВетка		= Неопределено;
	ТекущееЗадание	= Неопределено;
	
	Если ЗначениеЗаполнено(ИДСтрокиНазначения) Тогда
		ТекСтрока = ЗаданияНаПеревозкуПланируемые.НайтиПоИдентификатору(ИДСтрокиНазначения);
		ТекущееЗадание = ?(ТекСтрока.ПолучитьРодителя() = Неопределено, ТекСтрока, ТекСтрока.ПолучитьРодителя());
	КонецЕсли;
	
	СтрокиЗаданияНаПеревозку = ЗаданияНаПеревозкуПланируемые.ПолучитьЭлементы();	
	
	Если СтрокиЗаданияНаПеревозку.Количество() = 0 Тогда
		Возврат
	КонецЕсли;
	
	ПредДатаС = СтрокиЗаданияНаПеревозку[0].ВремяС + 60 * 60 * 24;
	
	Для Каждого Стр Из СтрокиЗаданияНаПеревозку Цикл
		
		Если ТекущееЗадание <> Неопределено И ТекущееЗадание <> Стр Тогда	
			Продолжить;		
		КонецЕсли;
		
		Если НачалоДня(Стр.ВремяС) <> НачалоДня(ПредДатаС) Тогда
			
			Если НачалоДня(Стр.ВремяС) <> НачалоДня(Стр.ВремяПо) Тогда
				Стр.ПереходДаты = 3;
			Иначе
				Стр.ПереходДаты = 1;
			КонецЕсли;
				
		Иначе
			
			Если НачалоДня(Стр.ВремяС) <> НачалоДня(Стр.ВремяПо) Тогда
				Стр.ПереходДаты = 2;
			Иначе
				Стр.ПереходДаты = 0;
			КонецЕсли;
			
		КонецЕсли;
		
		ПредДатаС = Стр.ВремяС;
		
		Для Каждого ВложеннаяСтрока Из Стр.ПолучитьЭлементы() Цикл
			
			Если НачалоДня(ВложеннаяСтрока.ВремяС) <> НачалоДня(ПредДатаС) Тогда
				
				Если НачалоДня(ВложеннаяСтрока.ВремяС) <> НачалоДня(ВложеннаяСтрока.ВремяПо) Тогда
					ВложеннаяСтрока.ПереходДаты = 3;
				Иначе
					ВложеннаяСтрока.ПереходДаты = 1;
				КонецЕсли;
				
			Иначе
				
				Если НачалоДня(ВложеннаяСтрока.ВремяС) <> НачалоДня(ВложеннаяСтрока.ВремяПо) Тогда
					ВложеннаяСтрока.ПереходДаты = 2;
				Иначе
					ВложеннаяСтрока.ПереходДаты = 0;
				КонецЕсли;
				
			КонецЕсли;
			
			ПредДатаС = ВложеннаяСтрока.ВремяС;
			
		КонецЦикла;
		
	КонецЦикла;
	
КонецПроцедуры

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

&НаСервере
Процедура СохранитьЗаданияНаПеревозкуСервер(ПомечаемыеНаУдалениеСтрокиЗадания = Неопределено)
	
	Если ЗаданияМодифицированы Тогда
		Для Каждого Стр Из ЗаданияНаПеревозкуПланируемые.ПолучитьЭлементы() Цикл
			ПометитьНаУдаление = Ложь;
			Если Стр.Модифицирован Тогда
				НовоеЗадание = НЕ ЗначениеЗаполнено(Стр.Ссылка);
				Если ПомечаемыеНаУдалениеСтрокиЗадания <> Неопределено
					И ПомечаемыеНаУдалениеСтрокиЗадания.Найти(Стр) <> Неопределено Тогда
					ПометитьНаУдаление = Истина;
				КонецЕсли;
				СохранитьЗаданиеВСтроке(Стр, ПометитьНаУдаление);
				Если НовоеЗадание И ЗначениеЗаполнено(Стр.Ссылка) Тогда
					НовыеЗадания.Добавить(Стр.Ссылка);
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
		ЗаданияМодифицированы = Ложь;
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ЗаданияНаПеревозкуПланируемыеПриАктивизацииСтрокиОбработчикОжидания()
	
	СтрокаПункта = Элементы.ЗаданияНаПеревозкуПланируемые.ТекущиеДанные;
	
	Если СтрокаПункта = Неопределено Тогда
		ДоставкаТоваровКлиентСервер.ОтобразитьНедогрузПерегруз(ЭтотОбъект, Неопределено);
	Иначе
		ДоставкаТоваровКлиентСервер.ОтобразитьНедогрузПерегруз(ЭтотОбъект, СтрокаЗаданиеПоСтрокеПункта(СтрокаПункта));
	КонецЕсли;
	
	Если СтрокаПункта = Неопределено
		Или СтрокаПункта.КоличествоРаспоряжений = 0 Тогда
		Элементы.СтраницыРаспоряжения.ТекущаяСтраница = Элементы.СтраницаРаспоряженийНет;
	Иначе
		Элементы.СтраницыРаспоряжения.ТекущаяСтраница = Элементы.СтраницаРаспоряженияЕсть;
		Текст = НСтр("ru = 'Распоряжения (%количество%)'");
		НадписьРаспоряжения = СтрЗаменить(Текст, "%количество%", СтрокаПункта.КоличествоРаспоряжений);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура УстановитьВидимостьСкладов()
	
	ФлагВидимости = Склад.Пустая() ИЛИ ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Склад,"ЭтоГруппа");
	Элементы.РаспоряженияНаДоставкуСклад.Видимость			 = ФлагВидимости;
	Элементы.ЗаданияНаПеревозкуВРаботеСклад.Видимость		 = ФлагВидимости;
	Элементы.ДокументыДляПеревозчиковСклад.Видимость		 = ФлагВидимости;
	
КонецПроцедуры	

&НаСервере
Процедура УстановитьОтборЗаданияНаПеревозкуВРаботе()
	
	Если Статус = "ВсеВРаботе" Тогда
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(ЗаданияНаПеревозкуВРаботе,
			"Статус", Перечисления.СтатусыЗаданийНаПеревозку.Закрыто, ВидСравненияКомпоновкиДанных.НеРавно,,Истина);
	ИначеЕсли ЗначениеЗаполнено(Статус) Тогда
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(ЗаданияНаПеревозкуВРаботе,
			"Статус", Перечисления.СтатусыЗаданийНаПеревозку[Статус], ВидСравненияКомпоновкиДанных.Равно,,Истина);
	ИначеЕсли Не ЗначениеЗаполнено(Статус) Тогда
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(ЗаданияНаПеревозкуВРаботе,
			"Статус",,,,Ложь);
	КонецЕсли;
	
	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(ЗаданияНаПеревозкуВРаботе,
		"Проведен", Истина, ВидСравненияКомпоновкиДанных.Равно,,ЗначениеЗаполнено(Статус));
	
	Если ЗначениеЗаполнено(Склад) Тогда
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(ЗаданияНаПеревозкуВРаботе,
			"Склад", Склад, ВидСравненияКомпоновкиДанных.ВИерархии,,Истина);
	Иначе
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(ЗаданияНаПеревозкуВРаботе,
			"Склад", Склад, ВидСравненияКомпоновкиДанных.Равно,,Истина);
	КонецЕсли;
	
	Если ЗонаГруппаИлиПустая Тогда
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(ЗаданияНаПеревозкуВРаботе,
			"Зона", Зона, ВидСравненияКомпоновкиДанных.ВИерархии,,ЗначениеЗаполнено(Зона));
	Иначе
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(ЗаданияНаПеревозкуВРаботе,
			"Зона", Зона, ВидСравненияКомпоновкиДанных.Равно,,Истина);
	КонецЕсли;
	
	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(ЗаданияНаПеревозкуВРаботе,
			"ЗаданиеВыполняет", ОтборПоТипуИсполнителей, ВидСравненияКомпоновкиДанных.Равно,,ЗначениеЗаполнено(ОтборПоТипуИсполнителей));
	
	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(ЗаданияНаПеревозкуВРаботе,
		"Операция", ВидДоставки, ВидСравненияКомпоновкиДанных.Равно,,Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура УбратьСтрокиИзЗаданийКлиент(ИсточникНакладные = Ложь, ПометитьЗаданияНаУдаление = Ложь)
	УбратьСтрокиИзЗаданийСервер(ИсточникНакладные, ПометитьЗаданияНаУдаление);
	ЗаданияНаПеревозкуПланируемыеПриАктивизацииСтрокиОбработчикОжидания();
	РаспоряженияНаДоставкуПриАктивизацииСтрокиОбработчикОжидания();
КонецПроцедуры

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

&НаСервереБезКонтекста
Функция ТаблицаОбновляемыеРаспоряжения(СтрокаРаспоряжение = Неопределено)
	
	ОбновляемыеРаспоряжения = Новый ТаблицаЗначений;
	ОбновляемыеРаспоряжения.Колонки.Добавить("Распоряжение", Метаданные.ОпределяемыеТипы.РаспоряжениеНаДоставку.Тип);
	ОбновляемыеРаспоряжения.Колонки.Добавить("Склад", Новый ОписаниеТипов("СправочникСсылка.Склады"));
	Если СтрокаРаспоряжение <> Неопределено Тогда
		НоваяСтрока = ОбновляемыеРаспоряжения.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаРаспоряжение);
	КонецЕсли;
	
	Возврат ОбновляемыеРаспоряжения;
	
КонецФункции

// Возвращаемое значение:
// 	ТаблицаЗначений - где:
// 		* Ссылка - ДокументСсылка.ЗаданиеНаПеревозку
// 		* Транспорт - СправочникСсылка.ТранспортныеСредства
// 		* Статус - ПеречислениеСсылка.СтатусыЗаданийНаПеревозку
// 		* ВремяС - Дата
// 		* ВремяПо - Дата
&НаСервере
Функция НоваяТаблицаПланируемыхЗаданий()
	
	Результат = Новый ТаблицаЗначений();
	Результат.Колонки.Добавить("Ссылка", Новый ОписаниеТипов("ДокументСсылка.ЗаданиеНаПеревозку"));
	Результат.Колонки.Добавить("Транспорт", Новый ОписаниеТипов("СправочникСсылка.ТранспортныеСредства"));
	Результат.Колонки.Добавить("Статус", Новый ОписаниеТипов("ПеречислениеСсылка.СтатусыЗаданийНаПеревозку"));
	Результат.Колонки.Добавить("ВремяС", Новый ОписаниеТипов("Дата"));
	Результат.Колонки.Добавить("ВремяПо", Новый ОписаниеТипов("Дата"));
	
	Возврат Результат;
	
КонецФункции

&НаСервере
Функция ПоместитьЗаданияВХранилище()
	
	ТаблицаЗаданийПланируемых = НоваяТаблицаПланируемыхЗаданий();
	
	Для Каждого Задание Из ЗаданияНаПеревозкуПланируемые.ПолучитьЭлементы() Цикл
		Если ТипЗнч(Задание.Транспорт) = Тип("СправочникСсылка.ТранспортныеСредства") Тогда
			Стр = ТаблицаЗаданийПланируемых.Добавить();
			ЗаполнитьЗначенияСвойств(Стр, Задание);
		КонецЕсли;
	КонецЦикла;
	ТаблицаЗаданийПланируемых.ЗаполнитьЗначения(Перечисления.СтатусыЗаданийНаПеревозку.Формируется,"Статус");
	ТаблицаЗаданийПланируемых.Колонки.Транспорт.Имя = "ТранспортноеСредство";
	Возврат ПоместитьВоВременноеХранилище(ТаблицаЗаданийПланируемых, УникальныйИдентификатор);

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

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

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

&НаКлиенте
Процедура ПроверитьУстановитьДопустимостьПеретаскивания(Элемент, ПараметрыПеретаскивания)
	
	ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;
	Если НачалиПеретаскивание
			И ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив")
			И ПараметрыПеретаскивания.Значение.Количество() > 0 Тогда
		Если Элемент = Элементы.ЗаданияНаПеревозкуПланируемые 
			И ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("Число") Тогда
			ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Перемещение;
		ИначеЕсли ((ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("ДанныеФормыЭлементКоллекции")
					ИЛИ ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("ДанныеФормыЭлементДерева"))) Тогда
			ИсточникЗадания = ПараметрыПеретаскивания.Значение[0].Свойство("ПереходДаты");
			ИсточникНакладныеВЗаданиях = ПараметрыПеретаскивания.Значение[0].Свойство("КлючСвязи");
			ИсточникРаспоряжения = ((НЕ ПараметрыПеретаскивания.Значение[0].Свойство("ПереходДаты"))
								И (НЕ ПараметрыПеретаскивания.Значение[0].Свойство("КлючСвязи")));
			Если (Элемент = Элементы.РаспоряженияНаДоставку И (ИсточникЗадания ИЛИ ИсточникНакладныеВЗаданиях))
				ИЛИ (Элемент = Элементы.ЗаданияНаПеревозкуПланируемые И ИсточникРаспоряжения)
				ИЛИ (Элемент = Элементы.ЗаданияНаПеревозкуПланируемые И ИсточникЗадания)
				Тогда
				ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Перемещение;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьСпискиДляТекущейСтраницы()
	
	ОтключитьОбработчикОжидания("ПроверкаНеобходимостиПересчитатьИтогиПоРаспоряжениямНаДоставкуОбработчикОжидания");
	
	СохранитьЗаданияОбновитьСписки();
	Если Элементы.ГлавныеСтраницы.ТекущаяСтраница = Элементы.СтраницаФормированиеЗаданийНаПеревозку Тогда
		РаспоряженияРазвернуть();
		ЗаданияПланируемыеРазвернуть();
		ПодключитьОбработчикОжидания("ПроверкаНеобходимостиПересчитатьИтогиПоРаспоряжениямНаДоставкуОбработчикОжидания",1.3,Ложь);
	КонецЕсли;
	ОповеститьОСозданныхЗаданиях();
	
КонецПроцедуры

&НаСервере
Процедура СохранитьЗаданияОбновитьСписки()
	
	СохранитьЗаданияНаПеревозкуСервер();
	
	Если Элементы.ГлавныеСтраницы.ТекущаяСтраница = Элементы.СтраницаФормированиеЗаданийНаПеревозку Тогда
		ОбновитьСтраницуФормированияЗаданий();
	ИначеЕсли Элементы.ГлавныеСтраницы.ТекущаяСтраница = Элементы.СтраницаДокументыДляПеревозчиков Тогда
		ОбновитьДокументыДляПеревозчиковСервер();
	Иначе
		ОбновитьЗаданияВРаботеСервер();
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура УстановитьДоступностьЭлементов()
	
	ЗаданияЗаполнены = ЗаданияНаПеревозкуПланируемые.ПолучитьЭлементы().Количество() > 0;
	Элементы.ЗаданияНаПеревозкуПланируемыеЗаданияВверх.Доступность     = ЗаданияЗаполнены;
	Элементы.ЗаданияНаПеревозкуПланируемыеЗаданияВниз.Доступность      = ЗаданияЗаполнены;
	Элементы.ДеревоФормированиеДоставкиРазбить.Доступность             = ЗаданияЗаполнены;
	Элементы.ДеревоФормированиеДоставкиОбъединить.Доступность          = ЗаданияЗаполнены;
	Элементы.ЗаданияНаПеревозкуПланируемыеОткрытьЗадание.Доступность   = ЗаданияЗаполнены;
	Элементы.УбратьСтрокиИзРейса.Доступность                           = ЗаданияЗаполнены;
	
	РаспоряженияЗаполнены = РаспоряженияНаДоставку.ПолучитьЭлементы().Количество() > 0;
	Элементы.ПеренестиСтрокиВРейс.Доступность = РаспоряженияЗаполнены;
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьЗаданияВРаботеСервер()
	
	УстановитьВидимостьСкладов();
	УстановитьОтборЗаданияНаПеревозкуВРаботе();
	
КонецПроцедуры

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

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

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

&НаСервере
Процедура ЗаполнитьПрошлымиРейсамиСервер(ДатаЗаданий = Неопределено)
	
	ТекущаяДатаСеанса = ТекущаяДатаСеанса();
	
	ТекстЗапроса =
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
	|	НАЧАЛОПЕРИОДА(ЗаданиеНаПеревозку.Дата, ДЕНЬ) КАК МаксДень
	|ПОМЕСТИТЬ ВТМаксДень
	|ИЗ
	|	Документ.ЗаданиеНаПеревозку КАК ЗаданиеНаПеревозку
	|ГДЕ
	|	ЗаданиеНаПеревозку.Проведен
	|	И ЗаданиеНаПеревозку.Дата < НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ)
	|
	|УПОРЯДОЧИТЬ ПО
	|	ЗаданиеНаПеревозку.Дата УБЫВ
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ЗаданиеНаПеревозку.ТранспортноеСредство КАК Транспорт,
	|	ЗаданиеНаПеревозку.ТранспортноеСредство.ВместимостьПредставление КАК ВместимостьПредставление,
	|	ЗаданиеНаПеревозку.ДатаВремяРейсаПланС КАК ДатаВремяРейсаПланС,
	|	ЗаданиеНаПеревозку.Дата КАК Дата,
	|	ЗаданиеНаПеревозку.ЗаданиеВыполняет КАК ЗаданиеВыполняет,
	|	ЗаданиеНаПеревозку.Перевозчик КАК Перевозчик,
	|	ЗаданиеНаПеревозку.Контрагент КАК Контрагент,
	|	ЗаданиеНаПеревозку.БанковскийСчетПеревозчика КАК БанковскийСчетПеревозчика
	|ИЗ
	|	Документ.ЗаданиеНаПеревозку КАК ЗаданиеНаПеревозку
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВТМаксДень КАК ВТМаксДень
	|		ПО (ВТМаксДень.МаксДень = НАЧАЛОПЕРИОДА(ЗаданиеНаПеревозку.Дата, ДЕНЬ))
	|ГДЕ
	|	ЗаданиеНаПеревозку.Склад В ИЕРАРХИИ(&Склад)
	|	И (ЗаданиеНаПеревозку.ЗаданиеВыполняет = &ТипИсполнителей
	|			ИЛИ &ТипИсполнителей = ЗНАЧЕНИЕ(Перечисление.ТипыИсполнителейЗаданийНаПеревозку.ПустаяСсылка))
	|	И ЗаданиеНаПеревозку.Операция = &ВидДоставки
	|	И ЗаданиеНаПеревозку.Проведен
	|	И НАЧАЛОПЕРИОДА(ЗаданиеНаПеревозку.Дата, ДЕНЬ) = &ДатаЗаданий";
	
	Если ДатаЗаданий = Неопределено Тогда
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ЛЕВОЕ СОЕДИНЕНИЕ", "ВНУТРЕННЕЕ СОЕДИНЕНИЕ");
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "НАЧАЛОПЕРИОДА(ЗаданиеНаПеревозку.Дата, ДЕНЬ)", "&ДатаЗаданий");
	КонецЕсли;
	Запрос = Новый Запрос(ТекстЗапроса);
	Запрос.УстановитьПараметр("ДатаЗаданий", ДатаЗаданий);
	Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса);
	Запрос.УстановитьПараметр("Склад", Склад);
	Запрос.УстановитьПараметр("ВидДоставки", ВидДоставки);
	Запрос.УстановитьПараметр("ТипИсполнителей", ОтборПоТипуИсполнителей);
	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();
	Если Результат.Пустой() Тогда
		Текст = НСтр("ru = 'На указанную дату нет проведенных заданий на перевозку'");
		ОбщегоНазначения.СообщитьПользователю(Текст);
		Возврат;
	КонецЕсли;
	Пока Выборка.Следующий() Цикл
		НоваяСтрока = ЗаданияНаПеревозкуПланируемые.ПолучитьЭлементы().Добавить();
		НоваяСтрока.Транспорт = Выборка.Транспорт;
		Если НачалоДня(Выборка.ДатаВремяРейсаПланС) > НачалоДня(Выборка.Дата) Тогда
			// Если планировали на будущие дни, тогда в планах на будущее используем время отправки рейсов из истории.
			НоваяСтрока.ВремяС = НачалоДня(ТекущаяДатаСеанса) + (Выборка.ДатаВремяРейсаПланС - НачалоДня(Выборка.Дата));
		ИначеЕсли Выборка.ДатаВремяРейсаПланС - НачалоДня(Выборка.Дата) > ТекущаяДатаСеанса - НачалоДня(ТекущаяДатаСеанса) + 60*60 Тогда
			// Если планируем отправку сегодня и время еще не прошло - используем время отправки из истории.
			НоваяСтрока.ВремяС = НачалоДня(ТекущаяДатаСеанса) + (Выборка.ДатаВремяРейсаПланС - НачалоДня(Выборка.ДатаВремяРейсаПланС));
		Иначе
			// Если планируем отправку сегодня и время уже прошло - считаем, что рейс можно отправить через час после формирования.
			НоваяСтрока.ВремяС = ТекущаяДатаСеанса + 60*60;
		КонецЕсли;
		НоваяСтрока.ВремяПо = НоваяСтрока.ВремяС;
		НоваяСтрока.ВремяСБезДаты  = ДоставкаТоваровКлиентСервер.ВремяБезДаты(НоваяСтрока.ВремяС);
		НоваяСтрока.ВремяПоБезДаты = ДоставкаТоваровКлиентСервер.ВремяБезДаты(НоваяСтрока.ВремяПо);
		НоваяСтрока.Склад = Склад;
		НоваяСтрока.ВидДоставки = ВидДоставки;
		ЗаполнитьЗначенияСвойств(НоваяСтрока, РеквизитыТС(Выборка.Транспорт));
		НоваяСтрока.ЗаданиеВыполняет = Выборка.ЗаданиеВыполняет;
		НоваяСтрока.Перевозчик       = Выборка.Перевозчик;
		НоваяСтрока.Контрагент                = Выборка.Контрагент;
		НоваяСтрока.БанковскийСчетПеревозчика = Выборка.БанковскийСчетПеревозчика;
		НоваяСтрока.ЭтоНашаДоставка           =
			(Выборка.ЗаданиеВыполняет = Перечисления.ТипыИсполнителейЗаданийНаПеревозку.НашаТранспортнаяСлужба);
		
		УстановитьМодифицированность(НоваяСтрока, ЗаданияМодифицированы);
	КонецЦикла;
	УстановитьДоступностьЭлементов();
	
КонецПроцедуры

&НаСервере
Процедура ПеренумероватьИЗаполнитьПризнакиПереходаДатВСпискеЗаданий(ИДСтрокиНазначения = Неопределено)
	
	ПеренумероватьПунктыЗаданий(ИДСтрокиНазначения);
	ЗаполнитьПризнакиПереходаДат(ИДСтрокиНазначения);
	
КонецПроцедуры

&НаСервере
Процедура ПеренумероватьПунктыЗаданий(ИДСтрокиНазначения = Неопределено)
	
	ТекВетка		= Неопределено; 
	ТекущееЗадание	= Неопределено;
	
	Если ЗначениеЗаполнено(ИДСтрокиНазначения) Тогда
		ТекСтрока = ЗаданияНаПеревозкуПланируемые.НайтиПоИдентификатору(ИДСтрокиНазначения);
		ТекущееЗадание = ?(ТекСтрока.ПолучитьРодителя() = Неопределено, ТекСтрока, ТекСтрока.ПолучитьРодителя());
	КонецЕсли;
		
	ТекВетка = ЗаданияНаПеревозкуПланируемые.ПолучитьЭлементы();
	
	Для Каждого СтрЗадание Из ТекВетка Цикл
		
		Если ТекущееЗадание <> Неопределено И ТекущееЗадание <> СтрЗадание Тогда
			Продолжить;
		КонецЕсли;
		
		Если СтрЗадание.Модифицирован Тогда
			Для Каждого СтрПункт Из СтрЗадание.ПолучитьЭлементы() Цикл
				СтрПункт.ПорядокВМаршруте = СтрЗадание.ПолучитьЭлементы().Индекс(СтрПункт)+1;
			КонецЦикла;
		КонецЕсли;
		
	КонецЦикла;

КонецПроцедуры

&НаСервере
Процедура ЗаданияОтсортироватьПеренумероватьЗаполнитьПризнакиПереходаДат();
	
	ТекСтрока = ЗаданияНаПеревозкуПланируемые.НайтиПоИдентификатору(Элементы.ЗаданияНаПеревозкуПланируемые.ТекущаяСтрока);
	Родитель = ТекСтрока.ПолучитьРодителя();
	Если Родитель = Неопределено Тогда
		ТекВетка = ЗаданияНаПеревозкуПланируемые.ПолучитьЭлементы();
	Иначе
		ТекВетка = Родитель.ПолучитьЭлементы();
	КонецЕсли;
	ТекИндекс = ТекВетка.Индекс(ТекСтрока);
	
	Позиция = 0;
	Пока Позиция < ТекВетка.Количество()
		И (Позиция = ТекИндекс
			ИЛИ (ТекСтрока.ВремяС > ТекВетка[Позиция].ВремяС
			ИЛИ (ТекСтрока.ВремяС = ТекВетка[Позиция].ВремяС
				И ТекСтрока.ВремяПо > ТекВетка[Позиция].ВремяПо))) Цикл
		Позиция = Позиция + 1;
	КонецЦикла;
	
	Если Позиция > ТекИндекс Тогда
		ТекВетка.Сдвинуть(ТекИндекс,Позиция-ТекИндекс-1);
	Иначе
		ТекВетка.Сдвинуть(ТекИндекс,Позиция-ТекИндекс);
	КонецЕсли;
	
	Если Родитель <> Неопределено Тогда
		ПеренумероватьПунктыЗаданий();
	КонецЕсли;
	ЗаполнитьПризнакиПереходаДат();
	
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСоответствиеВремени(Источник);
	
	ТекСтрока = Элементы.ЗаданияНаПеревозкуПланируемые.ТекущиеДанные;
	Родитель = ТекСтрока.ПолучитьРодителя();
	Если (ТекСтрока.ВремяС > ТекСтрока.ВремяПо) Тогда
		Если Источник = "ВремяС" Тогда
			ТекСтрока.ВремяПо = ТекСтрока.ВремяС;
			ТекСтрока.ВремяПоБезДаты  = ДоставкаТоваровКлиентСервер.ВремяБезДаты(ТекСтрока.ВремяПо);
		Иначе
			ТекСтрока.ВремяС = ТекСтрока.ВремяПо;
			ТекСтрока.ВремяСБезДаты = ДоставкаТоваровКлиентСервер.ВремяБезДаты(ТекСтрока.ВремяС);
		КонецЕсли;
	КонецЕсли;
	
	Если Родитель <> Неопределено
		И (ТекСтрока.ВремяС < Родитель.ВремяС
			ИЛИ ТекСтрока.ВремяПо > Родитель.ВремяПо) Тогда
		Родитель.ВремяС = Мин(ТекСтрока.ВремяС,Родитель.ВремяС);
		Родитель.ВремяПо = Макс(ТекСтрока.ВремяПо,Родитель.ВремяПо);
		Родитель.ВремяСБезДаты  = ДоставкаТоваровКлиентСервер.ВремяБезДаты(Родитель.ВремяС);
		Родитель.ВремяПоБезДаты = ДоставкаТоваровКлиентСервер.ВремяБезДаты(Родитель.ВремяПо);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ЗаданияПроверитьОтсортироватьЗаполнитьПризнакиПерехода();
	
	ТекСтрока = ЗаданияНаПеревозкуПланируемые.НайтиПоИдентификатору(Элементы.ЗаданияНаПеревозкуПланируемые.ТекущаяСтрока);
	ТекИндекс = ЗаданияНаПеревозкуПланируемые.ПолучитьЭлементы().Индекс(ТекСтрока);
	Для Каждого Стр Из ТекСтрока.ПолучитьЭлементы() Цикл
		Если Стр.ВремяС < ТекСтрока.ВремяС Тогда
			Стр.ВремяС = ТекСтрока.ВремяС;
		КонецЕсли;
		Если Стр.ВремяПо < ТекСтрока.ВремяС Тогда
			Стр.ВремяПо = ТекСтрока.ВремяС;
		КонецЕсли;
		Если Стр.ВремяС > ТекСтрока.ВремяПо Тогда
			Стр.ВремяС = ТекСтрока.ВремяПо;
		КонецЕсли;
		Стр.ВремяСБезДаты  = ДоставкаТоваровКлиентСервер.ВремяБезДаты(Стр.ВремяС);
		Стр.ВремяПоБезДаты = ДоставкаТоваровКлиентСервер.ВремяБезДаты(Стр.ВремяПо);
	КонецЦикла;
	
	ЗаданияОтсортироватьПеренумероватьЗаполнитьПризнакиПереходаДат();
	
КонецПроцедуры

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

&НаСервере
Процедура СтатусПриИзмененииСервер()
	
	УстановитьОтборЗаданияНаПеревозкуВРаботе();
	
	Если Статус = "ВсеВРаботе" ИЛИ НЕ ЗначениеЗаполнено(Статус) Тогда
		Элементы.ЗаданияНаПеревозкуВРаботеСтатус.Видимость = Истина;
	Иначе
		Элементы.ЗаданияНаПеревозкуВРаботеСтатус.Видимость = Ложь;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ДокументыДляПеревозчиковПриАктивизацииСтроки(Элемент)
	
	ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ДокументыДляПеревозчиковВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ТекущиеДанные = Элементы.ДокументыДляПеревозчиков.ТекущиеДанные;
	
	Если ТекущиеДанные <> Неопределено И ТипЗнч(ТекущиеДанные) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда
		ПоказатьЗначение(Неопределено, ТекущиеДанные.Ссылка);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФормуЗадания(СтрокаЗадание)
	
	Если ЗаданияМодифицированы Тогда
		СохранитьЗаданияНаПеревозкуСервер();
		ОповеститьОСозданныхЗаданиях();
	КонецЕсли;
	ПоказатьЗначение(Неопределено, СтрокаЗадание.Ссылка);
	
КонецПроцедуры

&НаКлиенте
Процедура ОповеститьОСозданныхЗаданиях()
	
	Если НовыеЗадания.Количество() > 0 Тогда
		Если НовыеЗадания.Количество() > 1 Тогда
			ТекстСообщения = НСтр("ru='Создано %КоличествоЗаданий% на перевозку'");
			ТекстСообщения = СтрЗаменить(ТекстСообщения,"%КоличествоЗаданий%",
				СтроковыеФункцииКлиентСервер.ЧислоЦифрамиПредметИсчисленияПрописью(НовыеЗадания.Количество(),
					"задание,задания,заданий"));
			ПоказатьОповещениеПользователя(,, ТекстСообщения, БиблиотекаКартинок.Информация32);
		Иначе
			ТекстЗаголовка = НСтр("ru = 'Создание:'");
			НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(НовыеЗадания[0].Значение);
			ПоказатьОповещениеПользователя(
				ТекстЗаголовка,
				НавигационнаяСсылка,
				Строка(НовыеЗадания[0].Значение),
				БиблиотекаКартинок.Информация32);
			КонецЕсли;
			НовыеЗадания.Очистить();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаданияНаПеревозкуПланируемыеПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
	
	Отказ = Истина;
	
КонецПроцедуры

&НаСервере
Процедура ДатаРаспоряженийПриИзмененииСервер()
	
	ДоставкаТоваров.ОбновитьСписокРаспоряженийНаДоставку(ЭтотОбъект);
	УстановитьДоступностьЭлементов();
	
КонецПроцедуры

&НаСервере
Процедура ЗонаПриИзмененииСервер()
	
	ЗонаГруппаИлиПустая = (НЕ ЗначениеЗаполнено(Зона)
		ИЛИ ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Зона,"ЭтоГруппа"));
	
	СохранитьЗаданияОбновитьСписки();
	
	Если ЗонаГруппаИлиПустая Тогда
		Элементы.РаспоряженияНаДоставкуАдрес.Заголовок = НСтр("ru = 'Зона/Адрес'");
	Иначе
		Элементы.РаспоряженияНаДоставкуАдрес.Заголовок = НСтр("ru = 'Адрес'");
	КонецЕсли;
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция СтрокаЗаданиеПоСтрокеПункта(СтрокаМаршрута)
	
	РодительСтрокиМаршрута = СтрокаМаршрута.ПолучитьРодителя();
	Если РодительСтрокиМаршрута <> Неопределено Тогда
		Возврат РодительСтрокиМаршрута;
	Иначе
		Возврат СтрокаМаршрута;
	КонецЕсли;
	
КонецФункции

&НаСервере
Функция ПоместитьВХранилищеТоварыКДоставке(ЗаданиеНаПеревозку)
	
	Возврат ПоместитьВоВременноеХранилище(ТоварыКДоставке.Выгрузить(Новый Структура("ЗаданиеНаПеревозку",ЗаданиеНаПеревозку)),УникальныйИдентификатор);
	
КонецФункции

&НаСервере
Функция ПопытатьсяЗаблокироватьПолучитьСсылкуПоСтрокеЗадания(СтрокаЗадание)
	
	Если Не ЗначениеЗаполнено(СтрокаЗадание.Ссылка) Тогда
		СтрокаЗадание.Ссылка = Документы.ЗаданиеНаПеревозку.ПолучитьСсылку();
		НовыеЗадания.Добавить(СтрокаЗадание.Ссылка);
		Возврат Истина;
	КонецЕсли;
	
	Попытка
		ДокОбъект = СтрокаЗадание.Ссылка.ПолучитьОбъект();
		ДокОбъект.Заблокировать();
		ДокОбъект.Разблокировать();
		Возврат Истина;
	Исключение
		Текст = НСтр("ru = 'Не удалось заблокировать %Задание% для изменений.'");
		Текст = СтрЗаменить(Текст,"%Задание%", СтрокаЗадание.Ссылка);
		ОбщегоНазначения.СообщитьПользователю(Текст, СтрокаЗадание.Ссылка);
		Возврат Ложь;
	КонецПопытки;
	
КонецФункции

&НаСервере
Процедура ВидДоставкиПриИзмененииСервер()
	
	НастроитьФормуПоВидуДоставки();
	СохранитьЗаданияОбновитьСписки();
	УстановитьДоступностьЭлементов();
	
КонецПроцедуры

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

&НаСервере
Процедура ПеревозчикПриИзмененииСервер()
	
	ОбновитьДокументыДляПеревозчиковСервер();
	Элементы.ДокументыДляПеревозчиковПеревозчик.Видимость = Не ЗначениеЗаполнено(Перевозчик);
	
КонецПроцедуры

&НаСервере
Процедура ИсключитьИзДоставкиНаСервере()
	
	РежимыФормированияРасходныхОрдеровАвтоматически = Константы.РежимФормированияРасходныхОрдеров.Получить() = Перечисления.РежимыФормированияРасходныхОрдеров.Автоматически;
	РаспоряжениеНаОтгрузкуТип = Метаданные.ОпределяемыеТипы.РаспоряжениеНаОтгрузку.Тип;
	
	МассивИДВыбранныхСтрок = Элементы.РаспоряженияНаДоставку.ВыделенныеСтроки;
	
	РаспоряженияКорневыеСтроки = РаспоряженияНаДоставку.ПолучитьЭлементы();
	
	ИзмененныеДобавленныеСтрокиРаспоряжений = Новый Массив;
	
	Для каждого ИДСтроки Из МассивИДВыбранныхСтрок Цикл
		
		ТекущаяСтрокаРаспоряжений = РаспоряженияНаДоставку.НайтиПоИдентификатору(ИДСтроки);
		
		// Если текущую строку уже удалили вместе с родителем
		Если ТекущаяСтрокаРаспоряжений = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		ВершинаТекущейВеткиРаспоряжений = ТекущаяСтрокаРаспоряжений.ПолучитьРодителя();
		
		// Если в выбранных строках есть родитель этой строки, ничего не делаем, строка будет обработана вместе с родителем.
		Если ВершинаТекущейВеткиРаспоряжений <> Неопределено
				И МассивИДВыбранныхСтрок.Найти(ВершинаТекущейВеткиРаспоряжений.ПолучитьИдентификатор())<>Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		Если ВершинаТекущейВеткиРаспоряжений = Неопределено Тогда
			ТекущаяВеткаРаспоряжений = ТекущаяСтрокаРаспоряжений.ПолучитьЭлементы();
			ВершинаТекущейВеткиРаспоряжений = ТекущаяСтрокаРаспоряжений;
		Иначе
			ТекущаяВеткаРаспоряжений = ВершинаТекущейВеткиРаспоряжений.ПолучитьЭлементы();
		КонецЕсли;
			
		КоллекцияПодчиненныхСтрок = ТекущаяСтрокаРаспоряжений.ПолучитьЭлементы();
		
		Если КоллекцияПодчиненныхСтрок.Количество() = 0 Тогда
			КоллекцияПодчиненныхСтрок = Новый Массив(1);
			КоллекцияПодчиненныхСтрок[0] = ТекущаяСтрокаРаспоряжений;
			Если ЗонаГруппаИлиПустая Тогда
				ТекущаяСтрокаРаспоряжений.ПолучитьРодителя().Вес = ТекущаяСтрокаРаспоряжений.ПолучитьРодителя().Вес - ТекущаяСтрокаРаспоряжений.Вес;
				ТекущаяСтрокаРаспоряжений.ПолучитьРодителя().Объем = ТекущаяСтрокаРаспоряжений.ПолучитьРодителя().Объем - ТекущаяСтрокаРаспоряжений.Объем;
			КонецЕсли;
		КонецЕсли;
		
		ИтогоВес = ИтогоВес - ТекущаяСтрокаРаспоряжений.Вес;
		ИтогоОбъем = ИтогоОбъем - ТекущаяСтрокаРаспоряжений.Объем;
		
		Для Каждого СтрокаРаспоряжений Из КоллекцияПодчиненныхСтрок Цикл
			
			СтруктураПоиска = Новый Структура("ИдентификаторВДеревеРаспоряжений", СтрокаРаспоряжений.ПолучитьИдентификатор());
			СтрокиРаспоряженийСТоварами = ТоварыРаспоряженийКДоставке.НайтиСтроки(СтруктураПоиска);
			
			ПоляРегистра = "Распоряжение, Склад, Номенклатура, Характеристика, Назначение, Серия, ПолучательОтправитель";
			ЧисловыеПоляРегистра = "Количество, Вес, Объем";
			СвернутыеТоварыРаспоряженийНаДоставку = ТоварыРаспоряженийКДоставке.Выгрузить(
				СтрокиРаспоряженийСТоварами,
				ПоляРегистра + ", " + ЧисловыеПоляРегистра);
			СвернутыеТоварыРаспоряженийНаДоставку.Свернуть(ПоляРегистра, ЧисловыеПоляРегистра);
			
			НачатьТранзакцию();
			
			Попытка
				
				Для Каждого СтрокаИсключение Из СвернутыеТоварыРаспоряженийНаДоставку Цикл
				
					НоваяЗапись = РегистрыСведений.ТоварыКДоставке.СоздатьМенеджерЗаписи();
					ЗаполнитьЗначенияСвойств(НоваяЗапись, СтрокаИсключение);
					НоваяЗапись.Записать();
				
				КонецЦикла;
				
				Если РежимыФормированияРасходныхОрдеровАвтоматически
					И РаспоряжениеНаОтгрузкуТип.СодержитТип(ТипЗнч(СтрокаРаспоряжений.Распоряжение)) Тогда
					Если СкладыСервер.ТребуетсяПереоформитьРасходныеОрдера(СтрокаРаспоряжений.Склад, СтрокаРаспоряжений.ПолучательОтправитель) Тогда
						СкладыСервер.ДобавитьВОчередьФормированияРасходныхОрдеров(СтрокаРаспоряжений.Склад, СтрокаРаспоряжений.ПолучательОтправитель);
					КонецЕсли;
				КонецЕсли;
				
				ЗафиксироватьТранзакцию();
				
			Исключение
				
				ОтменитьТранзакцию();
				
				ТекстСообщения = НСтр("ru = 'Не удалось исключить %Распоряжение% из доставки.'");
				ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Распоряжение%", Строка(СтрокаРаспоряжений.Распоряжение));
				ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
				
				КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); // Для записи события в журнал регистрации.
				ЗаписьЖурналаРегистрации(НСтр("ru = 'Не удалось исключить распоряжение из доставки.'", КодОсновногоЯзыка),
					УровеньЖурналаРегистрации.Ошибка, , ,
					ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
				
			КонецПопытки;
			
		КонецЦикла;
		
		Если ВершинаТекущейВеткиРаспоряжений = ТекущаяСтрокаРаспоряжений Тогда
			РаспоряженияКорневыеСтроки.Удалить(ТекущаяСтрокаРаспоряжений);
		Иначе
			ТекущаяВеткаРаспоряжений.Удалить(ТекущаяСтрокаРаспоряжений);
			// Если удалили последний элемент в ветке, удалим родителя
			Если ТекущаяВеткаРаспоряжений.Количество() = 0 Тогда
				РаспоряженияКорневыеСтроки.Удалить(ВершинаТекущейВеткиРаспоряжений);
			КонецЕсли;
		КонецЕсли;
		
	КонецЦикла;
	
	ПеренумероватьИЗаполнитьПризнакиПереходаДатВСпискеЗаданий();
	ДоставкаТоваров.ЗаполнитьПризнакиОформленияРаспоряжений(РаспоряженияНаДоставку, ЗонаГруппаИлиПустая);
	УстановитьДоступностьЭлементов();
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьСписокРаспоряженийНаДоставку(РаспоряжениеАдресИлиСсылка = Неопределено)
	
	ОбновляемыеРаспоряжения = Неопределено;
	Если РаспоряжениеАдресИлиСсылка <> Неопределено Тогда
		
		Если ТипЗнч(РаспоряжениеАдресИлиСсылка) = Тип("Строка") Тогда
			ОбновляемыеРаспоряжения = ПолучитьИзВременногоХранилища(РаспоряжениеАдресИлиСсылка);
		Иначе
			ОбновляемыеРаспоряжения = ТаблицаОбновляемыеРаспоряжения();
			НоваяСтрока = ОбновляемыеРаспоряжения.Добавить();
			НоваяСтрока.Распоряжение = РаспоряжениеАдресИлиСсылка;
			НоваяСтрока.Склад = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(РаспоряжениеАдресИлиСсылка,"Склад");
		КонецЕсли;
		
	КонецЕсли;
	
	ДоставкаТоваров.ОбновитьСписокРаспоряженийНаДоставку(ЭтотОбъект, ОбновляемыеРаспоряжения);
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеРедактированияРаспоряжений(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ПослеРедактированияРаспоряженийСервер(Результат);
	ЗаданияНаПеревозкуПланируемыеПриАктивизацииСтрокиОбработчикОжидания();
	
КонецПроцедуры

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

&НаКлиенте
Процедура ПроверкаНеобходимостиПересчитатьИтогиПоРаспоряжениямНаДоставкуОбработчикОжидания()
	// Обработчик ожидания для перехвата выделения всех строк дерева РаспоряженияНаДоставку,
	// т.к. в платформе нет обработчика события выделения всех строк.
	КоличествоВыделенных = Элементы.РаспоряженияНаДоставку.ВыделенныеСтроки.Количество();
	Если КоличествоВыделенныхСтрокРаспоряжений <> КоличествоВыделенных Тогда
		ПересчитатьИтогиПоРаспоряжениямНаДоставку();
		КоличествоВыделенныхСтрокРаспоряжений = КоличествоВыделенных;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура РаспоряженияНаДоставкуПриАктивизацииСтрокиОбработчикОжидания()
	
	ПересчитатьИтогиПоРаспоряжениямНаДоставку();
	КоличествоВыделенныхСтрокРаспоряжений = Элементы.РаспоряженияНаДоставку.ВыделенныеСтроки.Количество();
	
КонецПроцедуры

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

&НаСервереБезКонтекста
Функция РеквизитыТС(ТранспортноеСредство)
	
	Возврат ДоставкаТоваров.РеквизитыТС(ТранспортноеСредство);
	
КонецФункции

&НаКлиенте
Процедура ЗаданияНаПеревозкуВРаботеПриАктивизацииСтроки(Элемент)
	
	ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Функция СоответствиеКомандСтатусам()
	
	СоответствиеКомандСтатусам = Новый Соответствие();
	СоответствиеКомандСтатусам.Вставить("УстановитьСтатусЗакрыто", "Закрыто");
	СоответствиеКомандСтатусам.Вставить("УстановитьСтатусЗакрытоПолностьюДоставленныхЗаданий", "Закрыто");
	СоответствиеКомандСтатусам.Вставить("УстановитьСтатусКПогрузке", "КПогрузке");
	СоответствиеКомандСтатусам.Вставить("УстановитьСтатусОтправлено", "Отправлено");
	СоответствиеКомандСтатусам.Вставить("УстановитьСтатусФормируется", "Формируется");
	
	Возврат СоответствиеКомандСтатусам;
	
КонецФункции

#КонецОбласти

#Область Локализация

&НаСервере
Процедура НастроитьФормуПоВидуДоставкиЛокализация()
	
	//++ Локализация
	Если ВидДоставки = Перечисления.ВидыДоставки.СоСклада Тогда
		Элементы.ДокументТранспортнаяНакладнаяОформитьТранспортныеНакладныеПоЗаданиямНаПеревозку.Видимость = Истина;
	Иначе
		Элементы.ДокументТранспортнаяНакладнаяОформитьТранспортныеНакладныеПоЗаданиямНаПеревозку.Видимость = Ложь;
	КонецЕсли;
	//-- Локализация
	
	Возврат;
	
КонецПроцедуры

#КонецОбласти

#КонецОбласти

Связанные материалы