Подбор товаров по заказам/ордерам / Модуль

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	ОтметитьСтроки(Истина);

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

&НаКлиенте
Процедура ИсключитьСтроки(Команда)

	ОтметитьСтроки(Ложь);

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

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

	ПеренестиСтрокиВДокумент();

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

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

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

&НаСервере
Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();

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

	//

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

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

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

	//

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветаСтиля.ЦветФонаПолностьюОбеспечен);

	//

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветаСтиля.ЦветФонаПолностьюОбеспечен);

	//

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

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<удалить>'"));

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

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

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

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

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

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

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

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

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

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

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

	Закрыть();

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

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

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

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

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

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

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

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

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

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