Отгрузка товаров с хранения / Форма подбора товаров по закупке для принципала / Модуль формы

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

&НаКлиенте
Перем ВыполняетсяЗакрытие Экспорт;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура СнятьПометку(Команда)
	
	ВыбратьВыделенныеСтроки(Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура Обновить(Команда)
	
	ОбновитьНаСервере();
	
КонецПроцедуры

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

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

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

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

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

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПодобранныеТовары.КоличествоОстаток");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
	ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ПодобранныеТовары.КоличествоУпаковок");

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.FireBrick);
	
	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПодобранныеТоварыКоличествоОстаток.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПодобранныеТовары.КоличествоОстаток");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ПодобранныеТовары.КоличествоУпаковок");

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Green);
	
	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПодобранныеТоварыКоличествоОстаток.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПодобранныеТовары.КоличествоОстаток");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
	ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ПодобранныеТовары.КоличествоУпаковок");

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Синий);
	
	//
	
	Элемент = УсловноеОформление.Элементы.Добавить();
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПодобранныеТоварыКоличествоВОтчете.Имя);
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПодобранныеТовары.КоличествоВОтчете");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
	ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ПодобранныеТовары.КоличествоУпаковок");
	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.FireBrick);
	
	Элемент = УсловноеОформление.Элементы.Добавить();
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПодобранныеТоварыКоличествоВОтчете.Имя);
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПодобранныеТовары.КоличествоВОтчете");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ПодобранныеТовары.КоличествоУпаковок");
	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Green);
	
	Элемент = УсловноеОформление.Элементы.Добавить();
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПодобранныеТоварыКоличествоВОтчете.Имя);
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПодобранныеТовары.КоличествоВОтчете");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
	ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ПодобранныеТовары.КоличествоУпаковок");
	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Синий);
	
	//
	
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПодобранныеТоварыКоличествоВЗаказе.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПодобранныеТовары.КоличествоВЗаказе");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
	ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ПодобранныеТовары.КоличествоУпаковок");

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.FireBrick);
	
	Элемент = УсловноеОформление.Элементы.Добавить();

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

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПодобранныеТовары.КоличествоВЗаказе");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ПодобранныеТовары.КоличествоУпаковок");

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Green);
	
	Элемент = УсловноеОформление.Элементы.Добавить();

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

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПодобранныеТовары.КоличествоВЗаказе");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
	ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ПодобранныеТовары.КоличествоУпаковок");

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Синий);
	
	//
	
	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПодобранныеТоварыЗаказКлиента.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПодобранныеТовары.ЗаказКлиента");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ГиперссылкаЦвет);

	//
	
	Элемент = УсловноеОформление.Элементы.Добавить();

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

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

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПодобранныеТоварыКоличествоСобирается.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПодобранныеТоварыКоличествоСобрано.Имя);

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура СформироватьИнформационнуюНадписьОтборы()

	Если Не ОбщегоНазначенияУТКлиентСервер.АвторизованВнешнийПользователь() Тогда
		ИнформационнаяНадписьОтборы = НСтр("ru='Отбор по: %Организация%, %Партнер%, %Договор%, %Склад%'");
	Иначе
		ИнформационнаяНадписьОтборы = НСтр("ru='Отбор по: %Договор%, %Склад%'");
	КонецЕсли;
	
	Если Склады.Количество() > 1 Тогда
		НадписьСклад = НСтр("ru='группе складов: ""%Склад%""'");
		НадписьСклад = СтрЗаменить(НадписьСклад, "%Склад%", Склад);
	Иначе
		НадписьСклад = "";
	КонецЕсли;
		
	ИнформационнаяНадписьОтборы = СтрЗаменить(ИнформационнаяНадписьОтборы, "%Организация%", Организация);
	ИнформационнаяНадписьОтборы = СтрЗаменить(ИнформационнаяНадписьОтборы, "%Партнер%",     Партнер);
	ИнформационнаяНадписьОтборы = СтрЗаменить(ИнформационнаяНадписьОтборы, "%Договор%",     Договор);
	ИнформационнаяНадписьОтборы = СтрЗаменить(ИнформационнаяНадписьОтборы, "%Склад%",       НадписьСклад);
	
	Если Прав(ИнформационнаяНадписьОтборы, 2) = ", " Тогда
		ИнформационнаяНадписьОтборы = Лев(ИнформационнаяНадписьОтборы, СтрДлина(ИнформационнаяНадписьОтборы) - 2);
	КонецЕсли;
	
	ИнформационнаяНадписьОтборы = ИнформационнаяНадписьОтборы + ".";

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

&НаСервере
Процедура УстановитьВидимостьПоЗаказам()

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

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

&НаСервере
Процедура ОбновитьИнформациюПоЗаказам(ТоварыРеализации)

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

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

&НаКлиенте
Процедура УстановитьКоличествоПоРежиму(ТекущаяСтрока)

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

	РассчитатьСуммуИКоличествоДляТекущейСтроки(ТекущаяСтрока);

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

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

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

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

	Отбор = Новый Структура("Пометка", Истина);
	ПомеченныеСтроки = ПодобранныеТовары.НайтиСтроки(Отбор);
	
	ТоварыПодобраны = ПомеченныеСтроки.Количество() > 0;

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

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

&НаКлиенте
Процедура ИнформацияОЗаказахНажатие(Элемент, СтандартнаяОбработка)

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

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

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

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

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

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

#Область Инициализация

ВыполняетсяЗакрытие = Ложь;

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

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