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

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

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

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

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

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

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

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

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

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

КонецПроцедуры // ОбработкаЗаполнения()

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

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

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

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

	ОтчетОРозничныхВозвратахЛокализация.ПриЗаписи(ЭтотОбъект, Отказ);

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

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

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

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

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

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

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

	ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, МассивНепроверяемыхРеквизитов);
	
	ОтчетОРозничныхВозвратахЛокализация.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);

КонецПроцедуры // ОбработкаПроверкиЗаполнения()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

			Если СтрокаЗапасов.Количество = 0 Тогда
				Продолжить;
			КонецЕсли;
			
			Количество = Мин(КоличествоТоваров, СтрокаЗапасов.Количество);

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

			СтрокаЗапасов.Количество = СтрокаЗапасов.Количество - НоваяСтрока.Количество;
			СтрокаЗапасов.КоличествоПоРНПТ = СтрокаЗапасов.КоличествоПоРНПТ - НоваяСтрока.КоличествоПоРНПТ;			
			СтрокаЗапасов.СуммаСНДС = СтрокаЗапасов.СуммаСНДС - НоваяСтрока.СуммаСНДС;
			СтрокаЗапасов.СуммаНДС = СтрокаЗапасов.СуммаНДС - НоваяСтрока.СуммаНДС;
			СтрокаЗапасов.СуммаРучнойСкидки = СтрокаЗапасов.СуммаРучнойСкидки - НоваяСтрока.СуммаРучнойСкидки;
			
			КоличествоТоваров = КоличествоТоваров - НоваяСтрока.Количество;
			СуммаСНДС = СуммаСНДС - НоваяСтрока.СуммаСНДС;
			СуммаНДС = СуммаНДС - НоваяСтрока.СуммаНДС;
			СуммаРучнойСкидки = СуммаРучнойСкидки - НоваяСтрока.СуммаРучнойСкидки;

			Если КоличествоТоваров = 0 Тогда
				Прервать;
			КонецЕсли;

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

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

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

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

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

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

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

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

#КонецЕсли

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