Отчет переработчика (2.4) / Модуль объекта

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

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

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

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

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

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

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

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

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

	Если Не ЗначениеЗаполнено(Автор) И ЭтоНовый() Тогда
		Автор = Пользователи.ТекущийПользователь();
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

#Область ПроверкаСтатейИАналитик

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

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

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	
	ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
	
	ПараметрыРегистрации = Документы.ОтчетПереработчика.ПараметрыРегистрацииСчетовФактурПолученных(ЭтотОбъект);
	УчетНДСУП.АктуализироватьСчетаФактурыПолученныеПриПроведении(ПараметрыРегистрации);
	
	ОтчетПереработчикаЛокализация.ОбработкаПроведения(ЭтотОбъект, Отказ, РежимПроведения);
	
КонецПроцедуры

Процедура ОбработкаУдаленияПроведения(Отказ)
	
	ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);
	
	ПараметрыРегистрации = Документы.ОтчетПереработчика.ПараметрыРегистрацииСчетовФактурПолученных(ЭтотОбъект);
	УчетНДСУП.АктуализироватьСчетаФактурыПолученныеПриУдаленииПроведения(ПараметрыРегистрации);
	
	ОтчетПереработчикаЛокализация.ОбработкаУдаленияПроведения(ЭтотОбъект, Отказ);
	
КонецПроцедуры

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

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

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

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

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

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

Процедура ЗаполнитьНаОснованииПоступленияОтПереработчикаПартионныйУчет22(ДокументОснование)
	
	ПоЗаказам = Ложь;
	УслугиПоПереработке = Перечисления.ВариантыОформленияУслугДокументовПереработки.УказываютсяВЗаказеОтчете;
	ГруппировкаЗатрат   = Перечисления.ГруппировкиЗатратВЗаказеПереработчику.БезГруппировки;
	
	ТекстТоварыПоступления = Документы.ПоступлениеОтПереработчика.ТабличныеЧастиДляОформленияОтчетаПереработчика().Товары;
	
	ТекстПродукция =
		"ВЫБРАТЬ
		|	ТоварыПоступления.Номенклатура       КАК Номенклатура,
		|	ТоварыПоступления.Характеристика     КАК Характеристика,
		|	ТоварыПоступления.Назначение         КАК Назначение,
		|	ТоварыПоступления.Упаковка           КАК Упаковка,
		|	ТоварыПоступления.КоличествоУпаковок КАК КоличествоУпаковок,
		|	ТоварыПоступления.Количество         КАК Количество
		|ИЗ
		|	&ТоварыПоступления КАК ТоварыПоступления";
	
	ТекстПродукция = СтрЗаменить(ТекстПродукция, "&ТоварыПоступления", СтрШаблон("(%1)", ТекстТоварыПоступления));
	
	Запрос = Новый Запрос(ТекстПродукция);
	Запрос.УстановитьПараметр("Поступления", ДокументОснование);
	
	// 1. Заполнить материалы и услуги по продукции.
	Продукция.Загрузить(Запрос.Выполнить().Выгрузить());
	
	// 2. Заполнить материалы и услуги по продукции.
	ЗаполнитьТабличнуюЧастьУслугиИМатериалыПоСпецификацииПродукции();
	
КонецПроцедуры

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

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

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

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


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

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

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

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

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

#Область РаспределениеМатериаловНаВыпускПродукции

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

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

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

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

	РезультатЗапрос = Запрос.Выполнить();
	
	Возврат (Не РезультатЗапрос.Пустой());
	
КонецФункции

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

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

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

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

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

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

Процедура ПроверитьЗаполнениеТЧПродукция(Отказ, МассивНепроверяемыхРеквизитов)
	
	
КонецПроцедуры


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

Функция ПараметрыСинхронизацииКлючей()
	
	Результат = Новый Соответствие;
	
	Результат.Вставить("Справочник.ПартииПроизводства", "ПометкаУдаления");
	
	Возврат Результат;
	
КонецФункции

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

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

#КонецЕсли

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