Поступление от переработчика / Модуль объекта

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

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

#Область ЗаполнениеУсловийЗакупок

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

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

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

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

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

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

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

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

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

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

Процедура ПриЗаписи(Отказ)

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

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

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

Процедура ПриКопировании(ОбъектКопирования)

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

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

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

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

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

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

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

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

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

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

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

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

Функция ДокументОснованиеПриЗаполнении(ДанныеЗаполнения)
	
	Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура")
		И ДанныеЗаполнения.Свойство("МассивЗаказов") Тогда
		
		Возврат ДанныеЗаполнения.МассивЗаказов[0];
		
	ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ОтчетПереработчика") Тогда
		
		Возврат ДанныеЗаполнения;
		
	ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказПереработчику") Тогда
		
		Возврат ДанныеЗаполнения;
		
	КонецЕсли;
	
	Возврат Неопределено;
	
КонецФункции

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

#Область ВидыЗапасов

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

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

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

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

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

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

#КонецЕсли

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