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

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

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

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

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

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	УстановитьУсловноеОформление();

	Если Параметры.Свойство("АвтоТест") Тогда
		Возврат;
	КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПеренестиВДокументВыполнить()
	
	ПеренестиТоварыВДокумент();
	
КонецПроцедуры

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

&НаКлиенте
Процедура ИсключитьТоварыВыполнить()
	
	ВыбратьВыделенныеСтроки(Ложь);
	
КонецПроцедуры

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

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

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

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

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

	//

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

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

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

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

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

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

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

	//

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

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

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

	//

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);

	//

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

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

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

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

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

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

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

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

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

	//

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

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

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

	//

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

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

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

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

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

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

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

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

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

	Возврат АдресТоваровВХранилище;

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

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

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

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

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

	ОповеститьОВыборе(Новый Структура("АдресТоваровВХранилище", АдресТоваровВХранилище));

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

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

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

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

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

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

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

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

&НаСервере
Процедура УстановитьЗаголовокЗаполнитьПоЗаказамОрдерам()
	
	Если НЕ ИспользоватьОрдернуюСхемуПриОтгрузке И ИспользоватьЗаказыКлиентов Тогда
		ЗаголовокЗаполнить = НСтр("ru = 'Подбор товаров по заказам'");
	ИначеЕсли ИспользоватьОрдернуюСхемуПриОтгрузке И НЕ ИспользоватьЗаказыКлиентов Тогда
		ЗаголовокЗаполнить = НСтр("ru = 'Подбор товаров по ордерам'");
	Иначе
		ЗаголовокЗаполнить = НСтр("ru = 'Подбор товаров по заказам/ордерам'");
	КонецЕсли;
	
	Заголовок = ЗаголовокЗаполнить;
	
КонецПроцедуры

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

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

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

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

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

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

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

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