Доставка товаров / Распоряжения по пункту маршрута / Модуль формы

файл
// @strict-types

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

&НаКлиенте
Перем КэшированныеЗначения;

&НаКлиенте
Перем ВопросЗадавали; // Булево

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыТоварыКДоставке

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

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

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

&НаКлиенте
Процедура ТоварыКДоставкеКоличествоПриИзменении(Элемент)
	
	КоличествоОбъемВесПриИзменении("Количество");
	
КонецПроцедуры

&НаКлиенте
Процедура ТоварыКДоставкеВесПриИзменении(Элемент)
	
	КоличествоОбъемВесПриИзменении("Вес");
	
КонецПроцедуры

&НаКлиенте
Процедура ТоварыКДоставкеОбъемПриИзменении(Элемент)
	
	КоличествоОбъемВесПриИзменении("Объем");
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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