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

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

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

#Область УсловияПродаж

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

КонецФункции

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

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

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

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

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

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

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

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

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

#КонецЕсли

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