Отгрузка товаров с хранения / Модуль объекта

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

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

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

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

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

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

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

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

// Заполняет аналитики учета номенклатуры. Используется в отчете ОстаткиТоваровОрганизаций.
//
Процедура ЗаполнитьАналитикиУчетаНоменклатуры() Экспорт
	
	ЗаполнитьАналитикиУчетаНоменклатурыВТабличныхЧастяхТоваров();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


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

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

#КонецЕсли

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