Передача товаров / Модуль объекта

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ЗаполнитьДокументПоОтбору(Знач ДанныеЗаполнения)

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

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

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

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

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

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

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

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

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

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

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

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

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

Функция ПараметрыЗаполненияВидовЗапасов()
	
	Обработчик = Документы.ПередачаТоваровХранителю.ОбработчикДействий(ХозяйственнаяОперация);
	
	Возврат Обработчик.ПараметрыЗаполненияВидовЗапасов(ЭтотОбъект);
	
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

#КонецЕсли

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