Формирование записей раздела 7 декларации по НДС / Модуль менеджера

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

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

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

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

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

Функция ВремяДокументаПоУмолчанию() Экспорт
	
	Возврат Новый Структура("Часы, Минуты", 23, 0);
	
КонецФункции

// Определяет список команд отчетов.
//
// Параметры:
//   КомандыОтчетов - См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов.КомандыОтчетов
//   Параметры - См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов.Параметры
//
Процедура ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры) Экспорт
	
КонецПроцедуры

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

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

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

// Параметры:
//   Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение.
//
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт

	Ограничение.Текст =
	"РазрешитьЧтениеИзменение
	|ГДЕ
	|	ЗначениеРазрешено(Организация)";

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

// Конец СтандартныеПодсистемы.УправлениеДоступом

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

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

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

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

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

// СтандартныеПодсистемы.ВерсионированиеОбъектов

// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
//  Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт

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

// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов

// Заполняет список команд печати.
// 
// Параметры:
//   КомандыПечати - ТаблицаЗначений - состав полей см. в функции УправлениеПечатью.СоздатьКоллекциюКомандПечати
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
	
	
КонецПроцедуры

#Область ОбработчикиОбновления

// Обработчик обновления, который записывает представление ссылки подтверждающих документов.
//
// Параметры:
//  Параметры - Структура - параметры обработчика обновления.
//
Процедура ЗаполнитьПредставлениеПодтверждающихДокументов(Параметры) Экспорт

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

	РезультатЗапроса = Запрос.Выполнить();

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

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

Процедура ЗаполнитьПредставлениеДокументаВСтроке(СтрокаТабличнойЧасти, ПодтверждающиеДокументыПоСтроке)
	
	ПодтверждающиеДокументыПредставление = "";
	КоличествоПодтверждающихДокументов = ПодтверждающиеДокументыПоСтроке.Количество();
	Для Инд = 0 По КоличествоПодтверждающихДокументов - 1 Цикл
		
		ПодтверждающийДокумент = ПодтверждающиеДокументыПоСтроке[Инд];
		Если Инд = 2 Тогда
			ПодтверждающиеДокументыПредставление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = '%1 и еще %2'"),
				ПодтверждающиеДокументыПредставление, 
				КоличествоПодтверждающихДокументов - 2);
				
		ИначеЕсли Инд < 2 Тогда
			ПодтверждающиеДокументыПредставление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = '%1%2%3 №%4 от %5'"),
				ПодтверждающиеДокументыПредставление, 
				?(ЗначениеЗаполнено(ПодтверждающиеДокументыПредставление), ";", ""),
				Строка(ПодтверждающийДокумент.ТипДокумента),
				ПодтверждающийДокумент.НомерДокумента,
				Формат(ПодтверждающийДокумент.ДатаДокумента,"ДЛФ=D"));
		КонецЕсли;
		
	КонецЦикла;
	
	СтрокаТабличнойЧасти.ПодтверждающиеДокументыПредставление = ПодтверждающиеДокументыПредставление;
	
КонецПроцедуры

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

Функция ДополнительныеИсточникиДанныхДляДвижений(ИмяРегистра) Экспорт

	ИсточникиДанных = Новый Соответствие;
	
	Возврат ИсточникиДанных;

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

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

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

#КонецЕсли

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