Отбор (размещение) товаров / Модуль объекта

файл
#Если НЕ МобильныйАвтономныйСервер Тогда
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

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

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

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

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

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

		Если Не СкладыСервер.ИспользоватьАдресноеХранение(РеквизитыОснования.Склад, РеквизитыОснования.Помещение, РеквизитыОснования.Дата) Тогда
			ТекстСообщения = НСтр("ru='На складе ""%Склад%"" не используется адресное хранение остатков'");
			ТекстСообщения = СтрЗаменить(ТекстСообщения,"%Склад%", СкладыСервер.ПолучитьПредставлениеСклада(РеквизитыОснования.Склад, РеквизитыОснования.Помещение));
			ВызватьИсключение ТекстСообщения;
		КонецЕсли;
		
		ВидОперации = Перечисления.ВидыОперацийОтбораРазмещенияТоваров.Размещение;
		
		ЗаполнитьЗначенияСвойств(ЭтотОбъект,РеквизитыОснования, "ЗонаПриемки, Склад, Помещение");
		
		Запрос = Новый Запрос;
		ТекстЗапроса =
		"ВЫБРАТЬ
		|	ТаблицаТовары.НомерСтроки КАК НомерСтроки,
		|	ТаблицаТовары.Номенклатура КАК Номенклатура,
		|	ТаблицаТовары.Характеристика КАК Характеристика,
		|	ТаблицаТовары.Назначение КАК Назначение,
		|	ТаблицаТовары.Упаковка КАК Упаковка,
		|	ТаблицаТовары.КоличествоУпаковок КАК КоличествоУпаковок,
		|	ТаблицаТовары.Количество КАК Количество,
		|	ТаблицаТовары.СтатусУказанияСерий КАК СтатусУказанияСерий,
		|	ВЫБОР
		|		КОГДА ТаблицаТовары.СтатусУказанияСерий В (4, 6, 8, 10, 14)
		|			ТОГДА ТаблицаТовары.Серия
		|		ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
		|	КОНЕЦ КАК Серия,
		|	ТаблицаТовары.Номенклатура.Наименование КАК НоменклатураНаименование,
		|	ТаблицаТовары.Характеристика.Наименование КАК ХарактеристикаНаименование
		|ПОМЕСТИТЬ ВтТаблицаТовары
		|ИЗ
		|	Документ.ПриходныйОрдерНаТовары.Товары КАК ТаблицаТовары
		|ГДЕ
		|	ТаблицаТовары.Ссылка = &Ссылка
		|	И ТаблицаТовары.Количество <> 0
		|	И НЕ ТаблицаТовары.ЭтоУпаковочныйЛист
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ВтТаблицаТовары.Номенклатура КАК Номенклатура,
		|	ВтТаблицаТовары.Характеристика КАК Характеристика,
		|	ВтТаблицаТовары.Назначение КАК Назначение,
		|	ВтТаблицаТовары.Упаковка КАК Упаковка,
		|	СУММА(ВтТаблицаТовары.КоличествоУпаковок) КАК КоличествоУпаковок,
		|	СУММА(ВтТаблицаТовары.Количество) КАК Количество,
		|	ВтТаблицаТовары.СтатусУказанияСерий КАК СтатусУказанияСерий,
		|	ВтТаблицаТовары.Серия КАК Серия,
		|	&ТекстЗапросаВес КАК Вес,
		|	&ТекстЗапросаОбъем КАК Объем,
		|	ВтТаблицаТовары.НоменклатураНаименование КАК НоменклатураНаименование,
		|	ВтТаблицаТовары.ХарактеристикаНаименование КАК ХарактеристикаНаименование
		|ИЗ
		|	ВтТаблицаТовары КАК ВтТаблицаТовары
		|
		|СГРУППИРОВАТЬ ПО
		|	ВтТаблицаТовары.Серия,
		|	ВтТаблицаТовары.НоменклатураНаименование,
		|	ВтТаблицаТовары.ХарактеристикаНаименование,
		|	ВтТаблицаТовары.Номенклатура,
		|	ВтТаблицаТовары.Характеристика,
		|	ВтТаблицаТовары.Назначение,
		|	ВтТаблицаТовары.Упаковка,
		|	ВтТаблицаТовары.СтатусУказанияСерий,
		|	&ТекстЗапросаВес,
		|	&ТекстЗапросаОбъем
		|УПОРЯДОЧИТЬ ПО
		|	НоменклатураНаименование,
		|	ХарактеристикаНаименование";
		
		ТекстЗапроса = СтрЗаменить(
			ТекстЗапроса, 
			"&ТекстЗапросаВес", 
			Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаВесУпаковки("ВтТаблицаТовары.Упаковка", "ВтТаблицаТовары.Номенклатура", Ложь));
			
		ТекстЗапроса = СтрЗаменить(
			ТекстЗапроса, 
			"&ТекстЗапросаОбъем", 
			Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаОбъемУпаковки("ВтТаблицаТовары.Упаковка", "ВтТаблицаТовары.Номенклатура", Ложь));
		
		Запрос.Текст = ТекстЗапроса;
		
		Запрос.УстановитьПараметр("Ссылка",ДанныеЗаполнения);
		
		ТоварыРазмещение.Загрузить(Запрос.Выполнить().Выгрузить());
			
		ПараметрыУказанияСерий = НоменклатураСервер.ПараметрыУказанияСерий(ЭтотОбъект, Документы.ОтборРазмещениеТоваров);
		НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ЭтотОбъект,ПараметрыУказанияСерий.Размещение);
		
		РазместитьТовары("ТоварыРазмещение");
		
		НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ЭтотОбъект,ПараметрыУказанияСерий.Размещение);
	ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.РасходныйОрдерНаТовары") Тогда
		
		РеквизитыОснования = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДанныеЗаполнения,
			"Статус, Склад, Помещение, ЗонаОтгрузки, ДатаОтгрузки");
		
		Если СкладыСервер.ИспользоватьАдресноеХранение(РеквизитыОснования.Склад, РеквизитыОснования.Помещение, РеквизитыОснования.ДатаОтгрузки) Тогда
		
			ВидОперации = Перечисления.ВидыОперацийОтбораРазмещенияТоваров.Отбор;
			Распоряжение = ДанныеЗаполнения; 
			
			ЗаполнитьЗначенияСвойств(ЭтотОбъект,РеквизитыОснования, "ЗонаОтгрузки, Склад, Помещение");
			
			ЗаполнитьТоварыОтборПоРаспоряжению();
			
			ПараметрыУказанияСерий = НоменклатураСервер.ПараметрыУказанияСерий(ЭтотОбъект, Документы.ОтборРазмещениеТоваров);
			НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ЭтотОбъект,ПараметрыУказанияСерий.Отбор);
			
			ОтобратьТовары("ТоварыОтбор");
			
			НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ЭтотОбъект,ПараметрыУказанияСерий.Отбор);
		Иначе
			
			ТекстСообщения = НСтр("ru='На складе ""%Склад%"" не используется адресное хранение остатков'");
			ТекстСообщения = СтрЗаменить(ТекстСообщения,"%Склад%", СкладыСервер.ПолучитьПредставлениеСклада(РеквизитыОснования.Склад, РеквизитыОснования.Помещение));
			ВызватьИсключение ТекстСообщения;
			
		КонецЕсли;
		
	ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ОрдерНаПеремещениеТоваров") Тогда 
		
		РеквизитыОснования = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДанныеЗаполнения,
			"Статус, Склад, ПомещениеОтправитель, ПомещениеПолучатель, ЗонаОтгрузки, ЗонаПриемки, ДатаОтгрузки");
		
		Если РеквизитыОснования.Статус = Перечисления.СтатусыОрдеровНаПеремещение.КОтбору Тогда
			
			Если СкладыСервер.ИспользоватьАдресноеХранение(РеквизитыОснования.Склад, РеквизитыОснования.ПомещениеОтправитель, РеквизитыОснования.ДатаОтгрузки) Тогда
				
				ВидОперации = Перечисления.ВидыОперацийОтбораРазмещенияТоваров.Отбор;
				Распоряжение = ДанныеЗаполнения; 
				Помещение = РеквизитыОснования.ПомещениеОтправитель;
				
				ЗаполнитьЗначенияСвойств(ЭтотОбъект,РеквизитыОснования, "ЗонаОтгрузки, Склад");
				
				ЗаполнитьТоварыОтборПоРаспоряжению();
				
				ПараметрыУказанияСерий = НоменклатураСервер.ПараметрыУказанияСерий(ЭтотОбъект, Документы.ОтборРазмещениеТоваров);
				НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ЭтотОбъект,ПараметрыУказанияСерий.Отбор);
				
				ОтобратьТовары("ТоварыОтбор");
				
				НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ЭтотОбъект,ПараметрыУказанияСерий.Отбор);
			Иначе
				
				ТекстСообщения = НСтр("ru='На складе ""%Склад%"" не используется адресное хранение остатков'");
				ТекстСообщения = СтрЗаменить(ТекстСообщения,"%Склад%", СкладыСервер.ПолучитьПредставлениеСклада(РеквизитыОснования.Склад, РеквизитыОснования.ПомещениеОтправитель));
				ВызватьИсключение ТекстСообщения;
				
			КонецЕсли;
			
		ИначеЕсли РеквизитыОснования.Статус = Перечисления.СтатусыОрдеровНаПеремещение.Принят Тогда
			
			Если СкладыСервер.ИспользоватьАдресноеХранение(РеквизитыОснования.Склад, РеквизитыОснования.ПомещениеПолучатель, РеквизитыОснования.ДатаОтгрузки) Тогда
				ВидОперации = Перечисления.ВидыОперацийОтбораРазмещенияТоваров.Размещение;
				Помещение = РеквизитыОснования.ПомещениеПолучатель;
				
				ЗаполнитьЗначенияСвойств(ЭтотОбъект,РеквизитыОснования, "ЗонаПриемки, Склад");
				
				Запрос = Новый Запрос;
				Запрос.Текст =
				"ВЫБРАТЬ
				|	ТаблицаТовары.Номенклатура,
				|	ТаблицаТовары.Характеристика,
				|	ТаблицаТовары.Назначение,
				|	ТаблицаТовары.Упаковка,
				|	ТаблицаТовары.Серия КАК Серия,
				|	СУММА(ТаблицаТовары.Количество) КАК Количество,
				|	СУММА(ТаблицаТовары.КоличествоУпаковок) КАК КоличествоУпаковок
				|ИЗ
				|	Документ.ОрдерНаПеремещениеТоваров.ОтгружаемыеТовары КАК ТаблицаТовары
				|ГДЕ
				|	ТаблицаТовары.Ссылка = &Ссылка
				|
				|СГРУППИРОВАТЬ ПО
				|	ТаблицаТовары.Упаковка,
				|	ТаблицаТовары.Номенклатура,
				|	ТаблицаТовары.Назначение,
				|	ТаблицаТовары.Серия,
				|	ТаблицаТовары.Характеристика
				|
				|УПОРЯДОЧИТЬ ПО
				|	ТаблицаТовары.Номенклатура.Наименование,
				|	ТаблицаТовары.Характеристика.Наименование";
				
				Запрос.УстановитьПараметр("Ссылка",ДанныеЗаполнения);
				
				ТоварыРазмещение.Загрузить(Запрос.Выполнить().Выгрузить());
								
				ПараметрыУказанияСерий = НоменклатураСервер.ПараметрыУказанияСерий(ЭтотОбъект, Документы.ОтборРазмещениеТоваров);
				НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ЭтотОбъект,ПараметрыУказанияСерий.Размещение);
				
				РазместитьТовары("ТоварыРазмещение");
				
				НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ЭтотОбъект,ПараметрыУказанияСерий.Размещение);				
			Иначе
				
				ТекстСообщения = НСтр("ru='На складе ""%Склад%"" не используется адресное хранение остатков'");
				ТекстСообщения = СтрЗаменить(ТекстСообщения,"%Склад%", СкладыСервер.ПолучитьПредставлениеСклада(РеквизитыОснования.Склад, РеквизитыОснования.ПомещениеПолучатель));
				ВызватьИсключение ТекстСообщения;
				
			КонецЕсли;
			
		Иначе
			
			ТекстСообщения = НСтр("ru='Ввод заданий на отбор (размещение) товаров возможен, когда документ находится
			|статусах ""К отбору"" или ""Принят""'");
			ВызватьИсключение ТекстСообщения;
			
		КонецЕсли;
		
	ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ОтборРазмещениеТоваров") Тогда 
		
		// Если внутрискладское перемещение, то копируем из ТЧ размещение источника в ТЧ Отбор приемника
		// для вида операции "Отбор" источника вызываем исключение
		// источник должен быть в статусе "Выполнено".
		РеквизитыОснования = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДанныеЗаполнения,
			"Статус, ВидОперации, Склад, Помещение, ЗонаОтгрузки, ЗонаПриемки");
		
		Если РеквизитыОснования.ВидОперации = Перечисления.ВидыОперацийОтбораРазмещенияТоваров.Отбор Тогда
			ТекстСообщения = НСтр("ru='Для вида операции %ВидОперации% ввод на основании внутрискладского перемещения не предусмотрен.'");
			ТекстСообщения = СтрЗаменить(ТекстСообщения,"%ВидОперации%", РеквизитыОснования.ВидОперации);
			ВызватьИсключение ТекстСообщения;
		ИначеЕсли РеквизитыОснования.Статус <> Перечисления.СтатусыОтборовРазмещенийТоваров.ВыполненоБезОшибок
			И РеквизитыОснования.Статус <> Перечисления.СтатусыОтборовРазмещенийТоваров.ВыполненоСОшибками Тогда
			ТекстСообщения = НСтр("ru='Для статуса документа %СтатусДокумента% ввод на основании внутрискладского перемещения не предусмотрен.'");
			ТекстСообщения = СтрЗаменить(ТекстСообщения,"%СтатусДокумента%", РеквизитыОснования.Статус);
			ВызватьИсключение ТекстСообщения;
		Иначе
			
			ВидОперации = Перечисления.ВидыОперацийОтбораРазмещенияТоваров.Перемещение;
			
			ЗаполнитьЗначенияСвойств(ЭтотОбъект, РеквизитыОснования, "Склад, Помещение");
			
			ТоварыКРазмещению = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДанныеЗаполнения, "ТоварыРазмещение").Выгрузить(); // ТаблицаЗначений
			Для Каждого СтрТабл Из ТоварыКРазмещению Цикл
				
				НоваяСтрока = ТоварыОтбор.Добавить();
				
				ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрТабл,
					"Номенклатура, Характеристика, Назначение, Ячейка, Упаковка, Серия");
				
				НоваяСтрока.Количество = СтрТабл.КоличествоРазмещено;
				НоваяСтрока.КоличествоУпаковок = СтрТабл.КоличествоУпаковокРазмещено;
				
			КонецЦикла;
			
			ПараметрыУказанияСерий = НоменклатураСервер.ПараметрыУказанияСерий(ЭтотОбъект, Документы.ОтборРазмещениеТоваров);
			
			НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ЭтотОбъект,ПараметрыУказанияСерий.Отбор);
			
			РазместитьТовары("ТоварыОтбор");
			
			НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ЭтотОбъект,ПараметрыУказанияСерий.Отбор);
			НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ЭтотОбъект,ПараметрыУказанияСерий.Размещение);
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(ЭтотОбъект);
	
	ПроведениеДокументов.ПередЗаписьюДокумента(ЭтотОбъект, РежимЗаписи, РежимПроведения);
	
	Если ВидОперации = Перечисления.ВидыОперацийОтбораРазмещенияТоваров.Отбор Тогда
		
		ТоварыРазмещение.Очистить();
		
		ЗонаПриемки = Справочники.СкладскиеЯчейки.ПустаяСсылка();
		
	ИначеЕсли ВидОперации = Перечисления.ВидыОперацийОтбораРазмещенияТоваров.Размещение Тогда
		
		ТоварыОтбор.Очистить();
		
		Распоряжение = Неопределено;
		ЗонаОтгрузки = Справочники.СкладскиеЯчейки.ПустаяСсылка();
		
	ИначеЕсли ВидОперации = Перечисления.ВидыОперацийОтбораРазмещенияТоваров.Перемещение Тогда
		
		Распоряжение	= Неопределено;
		ЗонаПриемки		= Справочники.СкладскиеЯчейки.ПустаяСсылка();
		ЗонаОтгрузки	= Справочники.СкладскиеЯчейки.ПустаяСсылка();
		
	КонецЕсли;
	
	Выполнено = (Статус = Перечисления.СтатусыОтборовРазмещенийТоваров.ВыполненоБезОшибок
				Или Статус = Перечисления.СтатусыОтборовРазмещенийТоваров.ВыполненоСОшибками);
	
	Если ЗначениеЗаполнено(Ссылка) Тогда
		
		СтатусДоЗаписи = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Статус");
		
		Если Статус = Перечисления.СтатусыОтборовРазмещенийТоваров.ВРаботе
			И СтатусДоЗаписи <> Перечисления.СтатусыОтборовРазмещенийТоваров.ВРаботе Тогда
			
			Если Не ЗначениеЗаполнено(ДатаНачалаВыполнения) Тогда
				ДатаНачалаВыполнения = ТекущаяДатаСеанса();
			КонецЕсли;
			
			Если ЗначениеЗаполнено(ДатаОкончанияВыполнения)
				И ДатаНачалаВыполнения > ДатаОкончанияВыполнения Тогда
				
				ДатаОкончанияВыполнения = ДатаНачалаВыполнения + 1;
				
			КонецЕсли;
			
		ИначеЕсли Выполнено
			И (Не ЗначениеЗаполнено(СтатусДоЗаписи)
				Или СтатусДоЗаписи = Перечисления.СтатусыОтборовРазмещенийТоваров.Подготовлено
				Или СтатусДоЗаписи = Перечисления.СтатусыОтборовРазмещенийТоваров.ВРаботе) Тогда
			
			Если Не ЗначениеЗаполнено(ДатаНачалаВыполнения) Тогда
				ДатаНачалаВыполнения = ТекущаяДатаСеанса();
			КонецЕсли;
			
			ДатаОкончанияВыполнения = ТекущаяДатаСеанса();
			
			Если ДатаНачалаВыполнения > ДатаОкончанияВыполнения Тогда
				ДатаНачалаВыполнения = ДатаОкончанияВыполнения - 1;
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
	ПараметрыУказанияСерий = НоменклатураСервер.ПараметрыУказанияСерий(ЭтотОбъект, Документы.ОтборРазмещениеТоваров);
	
	НоменклатураСервер.ОчиститьНеиспользуемыеСерии(ЭтотОбъект, ПараметрыУказанияСерий.Отбор);
	НоменклатураСервер.ОчиститьНеиспользуемыеСерии(ЭтотОбъект, ПараметрыУказанияСерий.Размещение);
	
	ВесРазмещение	= 0;
	ОбъемРазмещение	= 0;
	
	Для Каждого СтрТабл Из ТоварыРазмещение Цикл
		
		Если Статус = Перечисления.СтатусыОтборовРазмещенийТоваров.ВыполненоБезОшибок Тогда
			
			СтрТабл.КоличествоРазмещено			= СтрТабл.Количество;
			СтрТабл.КоличествоУпаковокРазмещено	= СтрТабл.КоличествоУпаковок;
			
		ИначеЕсли Статус = Перечисления.СтатусыОтборовРазмещенийТоваров.ВРаботе
			Или Статус = Перечисления.СтатусыОтборовРазмещенийТоваров.Подготовлено Тогда
			
			СтрТабл.КоличествоРазмещено			= 0;
			СтрТабл.КоличествоУпаковокРазмещено	= 0;
			
		КонецЕсли;
		
		КоличествоКРазмещению = ?(Выполнено, СтрТабл.КоличествоУпаковокРазмещено, СтрТабл.КоличествоУпаковок);
		
		ВесРазмещение	= ВесРазмещение + СтрТабл.ВесУпаковки * КоличествоКРазмещению;
		ОбъемРазмещение	= ОбъемРазмещение + СтрТабл.ОбъемУпаковки * КоличествоКРазмещению;
		
		Если СтрТабл.СтатусУказанияСерий = 0 Тогда
			СтрТабл.Серия = Справочники.СерииНоменклатуры.ПустаяСсылка();
		КонецЕсли;
		
	КонецЦикла;
	
	ВесОтбор	= 0;
	ОбъемОтбор	= 0;
	
	Для Каждого СтрТабл Из ТоварыОтбор Цикл
		
		Если Статус = Перечисления.СтатусыОтборовРазмещенийТоваров.ВыполненоБезОшибок Тогда
			
			СтрТабл.КоличествоОтобрано			= СтрТабл.Количество;
			СтрТабл.КоличествоУпаковокОтобрано	= СтрТабл.КоличествоУпаковок;
			
		ИначеЕсли Статус = Перечисления.СтатусыОтборовРазмещенийТоваров.ВРаботе
			Или Статус = Перечисления.СтатусыОтборовРазмещенийТоваров.Подготовлено Тогда
			
			СтрТабл.КоличествоОтобрано			= 0;
			СтрТабл.КоличествоУпаковокОтобрано	= 0;
			
		КонецЕсли;
		
		КоличествоКОтбору = ?(Выполнено, СтрТабл.КоличествоУпаковокОтобрано, СтрТабл.КоличествоУпаковок);
		
		ВесОтбор	= ВесОтбор + СтрТабл.ВесУпаковки * КоличествоКОтбору;
		ОбъемОтбор	= ОбъемОтбор + СтрТабл.ОбъемУпаковки * КоличествоКОтбору;
		
		Если СтрТабл.СтатусУказанияСерий = 0 Тогда
			СтрТабл.Серия = Справочники.СерииНоменклатуры.ПустаяСсылка();
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

Процедура ПриЗаписи(Отказ)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	ПроведениеДокументов.ПриЗаписиДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	
	ПроверитьБлокировкуЯчеек(Отказ);
	
	Если Отказ Тогда
		Возврат;
	КонецЕсли;
	
	ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
	
	СкладыСервер.ОтразитьСостоянияПересчетовЯчеек(ЭтотОбъект.Ссылка, ЭтотОбъект.Статус, Отказ);
	
КонецПроцедуры

Процедура ОбработкаУдаленияПроведения(Отказ)
	
	ПроверитьБлокировкуЯчеек(Отказ);
	
	Если Отказ Тогда
		Возврат;
	КонецЕсли;
	
	ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

Процедура ПриКопировании(ОбъектКопирования)
	
	ИнициализироватьДокумент();
	ОчиститьФактическоеКоличествоВТЧ();
	
КонецПроцедуры

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

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

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

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

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

#Область ИнициализацияИЗаполнение

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

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

Процедура ИнициализироватьДокумент(ДанныеЗаполнения = Неопределено)
	
	Дата					= ТекущаяДатаСеанса();
	Статус					= Метаданные().Реквизиты.Статус.ЗначениеЗаполнения;
	ДатаНачалаВыполнения	= Дата(1, 1, 1);
	ДатаОкончанияВыполнения	= Дата(1, 1, 1);
	Склад					= ЗначениеНастроекПовтИсп.ПолучитьСкладПоУмолчанию(Склад);
	Ответственный			= Пользователи.ТекущийПользователь();
	
КонецПроцедуры

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

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

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

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

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

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

Процедура ОчиститьФактическоеКоличествоВТЧ()
	
	Для Каждого СтрокаТЧ Из ТоварыОтбор Цикл
		СтрокаТЧ.КоличествоОтобрано 		= 0;
		СтрокаТЧ.КоличествоУпаковокОтобрано = 0;
	КонецЦикла;
	
	Для Каждого СтрокаТЧ Из ТоварыРазмещение Цикл
		СтрокаТЧ.КоличествоРазмещено 		 = 0;
		СтрокаТЧ.КоличествоУпаковокРазмещено = 0;
	КонецЦикла;
	
КонецПроцедуры

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

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

#КонецЕсли
#КонецЕсли

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