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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#КонецЕсли
//-- Устарело_Производство21

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