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

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

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

#Область Заполнение

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

// Заполняет условия закупок по торговому соглашению с поставщиком
//
Процедура ЗаполнитьУсловияЗакупокПоУмолчанию() Экспорт
	Документы.ЗаказПереработчику.ЗаполнитьУсловияЗакупокПоУмолчанию(ЭтотОбъект);
КонецПроцедуры

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

#Область Статус

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

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

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

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

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

// Рассчитывает количество неотмененных строк заявки
//
// Возвращаемое значение:
// 		Число - Количество строк, у которых флаг "Отменено" равен "Ложь".
//
Функция ПолучитьКоличествоЗаказанныхСтрок() Экспорт
	
	НайденныеСтроки = Продукция.НайтиСтроки(Новый Структура("Отменено", Ложь));
	Возврат НайденныеСтроки.Количество();
	
КонецФункции

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

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

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

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

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

			ПартнерыИКонтрагенты.ЗаполнитьКонтрагентаПартнераПоУмолчанию(Партнер, Контрагент);

		КонецЕсли;

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

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

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

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

#Область Доставка
	ДоставкаТоваров.ПроверитьЗаполнениеРеквизитовДоставки(ЭтотОбъект, МассивНепроверяемыхРеквизитов, Отказ);
#КонецОбласти

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

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

#Область ТЧ____Количество

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

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

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

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

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

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

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	
	ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
	

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

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

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

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

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

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

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

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


Процедура ИнициализироватьДокументПослеДобавленияПродукции()

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

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

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

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

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

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


Процедура ПроверитьУказаниеНоменклатурыКакМатериалаИКакПродукции(ТабличнаяЧасть, Отказ)

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

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

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

	УстановитьПривилегированныйРежим(Истина);
	МассивРезультатов = Запрос.ВыполнитьПакет();
	УстановитьПривилегированныйРежим(Ложь);
	
	ВыборкаПоСделке = МассивРезультатов[0].Выбрать();
	// МассивРезультатов[1] - Временная таблица ЗаказыКлиентов
	// МассивРезультатов[2] - Временная таблица ЗаказыПоставщикам.
	ВыборкаПоТоварам = МассивРезультатов[3].Выбрать();
	
	Если ВыборкаПоСделке.Следующий() Тогда
		Сделка = ВыборкаПоСделке.Сделка;
	КонецЕсли;
	
	Пока ВыборкаПоТоварам.Следующий() Цикл
		НоваяСтрока = Продукция.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаПоТоварам);
	КонецЦикла;
	
	ГруппировкаЗатрат = Перечисления.ГруппировкиЗатратВЗаказеПереработчику.ПоПродукции;
	
	ИнициализироватьДокументПослеДобавленияПродукции();
	
КонецПроцедуры

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

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


	//-- Устарело_Производство21
	
	Для Каждого Строка Из Материалы Цикл
		
		Если Строка.Обособленно Тогда
			НайденноеНазначение = СоответствиеНазначений.Получить(Строка.НомерГруппыЗатрат);
			
			Если Не ЗначениеЗаполнено(НайденноеНазначение) Тогда
				НайденноеНазначение = Назначение;
			КонецЕсли;
			
			//++ Устарело_Производство21


			//-- Устарело_Производство21
			
			Строка.Назначение = НайденноеНазначение;
		Иначе
			Строка.Назначение = Неопределено;
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

Функция МаксимальноВозможнаяДатаОтгрузкиМатериалов()
	
	Если ПоступлениеОднойДатой Тогда
		Возврат ДатаПоступления;
	КонецЕсли;
	
	// Когда дата производства указывется в табличных частях продукции и возвратных отходов
	// отгрузка всех материалов не может быть больше минимальной даты из максимальных дат производства каждой группировки.
	Результат = Дата(2999, 1, 1, 0, 0, 0);
	МаксимальныеДаты = МаксимальныеДатыПроизводстваГруппЗатрат();
	Для Каждого КлючИЗначение Из МаксимальныеДаты Цикл
		Результат = Мин(КлючИЗначение.Значение, Результат);
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

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

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

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

#КонецЕсли

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