Анализ начислений НДС с авансов (полученных) / Модуль объекта

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

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

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

	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);

	ВнешниеНаборыДанных = ПолучитьВнешниеНаборыДанных();
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);

	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

#КонецЕсли

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