#Область ОписаниеПеременных
&НаКлиенте
Перем КэшированныеЗначения;
&НаКлиенте
Перем ВопросЗадавали;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("АвтоТест") Тогда
Возврат;
КонецЕсли;
ЖирныйШрифт = ШрифтыСтиля.ЖирныйШрифт;
ЦветЗеленый = ЦветаСтиля.РезультатУспехЦвет;
ЦветКрасный = ЦветаСтиля.РезультатПроблемаЦвет;
ЕдиницаИзмеренияВеса = Строка(Константы.ЕдиницаИзмеренияВеса.Получить());
ЕдиницаИзмеренияОбъема = Строка(Константы.ЕдиницаИзмеренияОбъема.Получить());
ЗаданиеНаПеревозку = Параметры.ЗаданиеНаПеревозку;
ТранспортноеСредство = Параметры.ТранспортноеСредство;
Вес = Параметры.ВесЗадания;
Объем = Параметры.ОбъемЗадания;
РеквизитыТС = ДоставкаТоваров.РеквизитыТС(ТранспортноеСредство);
ЗаполнитьЗначенияСвойств(ЭтотОбъект, РеквизитыТС);
ЗаголовокВес = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("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, СтрокаРаспоряжение.Объем - УменьшениеОбъема);
КонецПроцедуры
&НаКлиенте
Функция НазванияЭлементовТоварыКДоставке(ИмяПараметра)
СтруктураВозврата = Новый Структура("Максимум, Единицы", "", "");
Если ИмяПараметра = "Количество" Тогда
СтруктураВозврата.Единицы = "КоличествоЕдиницы";
СтруктураВозврата.Максимум = "КоличествоМаксимум";
ИначеЕсли ИмяПараметра = "Вес" Тогда
СтруктураВозврата.Единицы = "ВесЕдиницы";
СтруктураВозврата.Максимум = "ВесМаксимум";
ИначеЕсли ИмяПараметра = "Объем" Тогда
СтруктураВозврата.Единицы = "ОбъемЕдиницы";
СтруктураВозврата.Максимум = "ОбъемМаксимум";
КонецЕсли;
Возврат СтруктураВозврата;
КонецФункции
&НаСервере
Процедура ПересчитатьВесОбъемРаспоряженийПоТоварамКДоставке()
Для Каждого Распоряжение Из Распоряжения Цикл
ПараметрыОтбора = Новый Структура("Распоряжение, Склад",
Распоряжение.Распоряжение, Распоряжение.Склад);
НайденныеСтроки = ТоварыКДоставке.НайтиСтроки(ПараметрыОтбора);
СтрокиПоРаспоряжению = ТоварыКДоставке.Выгрузить(НайденныеСтроки);
Распоряжение.Вес = СтрокиПоРаспоряжению.Итог("Вес");
Распоряжение.Объем = СтрокиПоРаспоряжению.Итог("Объем");
КонецЦикла;
Вес = Распоряжения.Итог("Вес");
Объем = Распоряжения.Итог("Объем");
КонецПроцедуры
#КонецОбласти