Возврат сырья от переработчика / Модуль объекта

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

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

#Область ЗаполнениеУсловийПродаж

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	
	МассивНепроверяемыхРеквизитов = Новый Массив;
	
#Область Количество

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

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

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

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

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

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

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

Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
	
	Префикс = "0";
	
КонецПроцедуры

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

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

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

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

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

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

	Пока Выборка.Следующий() Цикл

		НоваяСтрока = Товары.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
		
	КонецЦикла;
	
	Выборка = Результат[2].Выбрать();
	ДанныеЗаполнения = Новый Структура("Склад, НесколькоСкладов");
	Выборка.Следующий();
	ЗаполнитьЗначенияСвойств(ДанныеЗаполнения, Выборка);
	Возврат ДанныеЗаполнения;
	
КонецФункции

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

	СтруктураПараметров = ДенежныеСредстваСервер.ПараметрыЗаполненияБанковскогоСчетаОрганизацииПоУмолчанию();
	СтруктураПараметров.Организация = Организация;
	СтруктураПараметров.БанковскийСчет = БанковскийСчетОрганизации;

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

Процедура ИнициализироватьУсловияПродаж()
	
	ЗаполнитьУсловияПродажПоУмолчанию();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

#КонецЕсли

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