Приз, подарок / Модуль объекта

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

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

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

		ДанныеНовогоДокумента = Документы.ПризПодарок.ДанныеНовогоДокумента();

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

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

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

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

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

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

Процедура ПриКопировании(ОбъектКопирования)
	
	ИсправленныйДокумент = Неопределено;
	НачисленияПерерасчет.Очистить();
	
КонецПроцедуры

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

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

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

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

	ЗарплатаКадры.ЗаполнитьЗначенияВФорме(ЭтотОбъект, ЗапрашиваемыеЗначения, ФиксированныеЗначения);

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

Процедура УстановитьКодДохода()
	КодДоходаНДФЛ = Документы.ПризПодарок.УстановитьКодДохода(ВидПризаПодарка);
КонецПроцедуры

Процедура УстановитьКодВычета()
	КодВычетаНДФЛ = УчетНДФЛ.КодВычетаПоКодуДоходаНДФЛ(КодДоходаНДФЛ);
	УстановитьКодВычетаСотрудников();
КонецПроцедуры

Процедура УстановитьКодВычетаСотрудников()
	Документы.ПризПодарок.УстановитьКодВычетаСотрудников(Начисления, КодВычетаНДФЛ);
КонецПроцедуры

Процедура УстановитьКатегориюДохода()
	КатегорияДохода = УчетНДФЛПовтИсп.КатегорияДоходаПоЕгоКоду(КодДоходаНДФЛ);
	УстановитьКатегориюДоходаНДФЛ();
КонецПроцедуры

Процедура УстановитьКатегориюДоходаНДФЛ()
	Документы.ПризПодарок.УстановитьКатегориюДоходаНДФЛ(НДФЛ, КатегорияДохода);
КонецПроцедуры

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

	Если Не ЗначениеЗаполнено(ДатаПолученияДохода) Тогда
		ДанныеЗаполнения.Свойство("ДатаПолученияДохода", ДатаПолученияДохода);
	КонецЕсли;

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

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

Функция КадровыеДанныеСотрудника(КадровыеДанные, Сотрудник)
	Возврат КадровыеДанные.НайтиСтроки(Новый Структура("Сотрудник", Сотрудник));
КонецФункции	

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

#Область ЗаполнениеИРасчет	

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

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

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

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

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

Процедура РассчитатьНДФЛ(ПараметрыРасчета)
	
	Если Не ПараметрыРасчета.РассчитатьНалогиИВзносы Тогда
		Возврат;
	КонецЕсли;
	
	Если ПараметрыРасчета.РасчетНДФЛНарастающимИтогомСНачалаГода Тогда
		РассчитатьНДФЛНарастающимИтогом(ПараметрыРасчета);
	Иначе
		РассчитатьНДФЛТекущегоДохода(ПараметрыРасчета);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

	КонецЦикла;

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

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

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

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

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

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

#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли

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