Отчет комитенту о продажах / Модуль объекта

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

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

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

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

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

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

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

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

	ВзаиморасчетыСервер.ПриКопировании(ЭтотОбъект);
	
	СтруктураПересчетаСуммы = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВТЧ(ЭтотОбъект);

	СтруктураДействий = Новый Структура;
	КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
	СтруктураДействий.Вставить("СкорректироватьСтавкуНДС",
		ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(ЭтотОбъект));
		
	ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьТЧ(Товары, СтруктураДействий, КэшированныеЗначения);

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

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

	ОтчетКомитентуЛокализация.ПриКопировании(ЭтотОбъект, ОбъектКопирования);
	
	Автор = Пользователи.ТекущийПользователь();

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

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

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

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

	КомиссионнаяТорговляСервер.ПроверитьКорректностьПериода(ЭтотОбъект, Отказ);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// Процедура формирует временную таблицу доступных видов запасов.
//
// Параметры:
//  МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - Менеджер временных таблиц
Процедура СформироватьДоступныеВидыЗапасов(МенеджерВременныхТаблиц) Экспорт
	
	Запрос = Новый Запрос("

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

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

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

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

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

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

			НоваяСтрока.Количество			= 0;
			НоваяСтрока.КоличествоУпаковок	= 0;
			НоваяСтрока.КоличествоПоРНПТ	= 0;
			
			НоваяСтрока.СуммаСНДС			= СуммаСНДС;
			НоваяСтрока.СуммаНДС			= СуммаНДС;
			НоваяСтрока.СуммаВознаграждения	= СуммаВознагражденияДляВидаЗапасов;

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

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

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

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

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

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

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

Функция ЕстьТоварыБезКоличества(МенеджерВременныхТаблиц)

	Запрос = Новый Запрос();
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	Запрос.Текст =
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	ТаблицаТоваров.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры
	|ИЗ
	|	ВтТаблицаТоваров КАК ТаблицаТоваров
	|
	|ГДЕ
	| ТаблицаТоваров.Количество = 0";
	
	Возврат (Не Запрос.Выполнить().Пустой());

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

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

#КонецЕсли

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