Премия / Модуль объекта

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	ИдентификаторСтроки = ОписаниеТаблицыНачислений.НомерТаблицы * 1000000 + 1;
	ТаблицаОбъекта = ЭтотОбъект[ОписаниеТаблицыНачислений.ИмяТаблицы];
	Индекс = 0;
	Пока Индекс < ТаблицаОбъекта.Количество() Цикл
		ТаблицаОбъекта[Индекс].ИдентификаторСтрокиВидаРасчета = ИдентификаторСтроки;
		ИдентификаторСтроки = ИдентификаторСтроки + 1;
		Индекс = Индекс + 1;
	КонецЦикла;
	
	ЗаполнитьПоДаннымПоказателей(ДанныеЗаполнения);
	
КонецПроцедуры

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

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

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

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

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

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

	УстановитьПривилегированныйРежим(Ложь);
	
	Если ОтменятьЗапись = Истина Тогда
		ОтменитьТранзакцию();
	КонецЕсли;

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

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

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

	Если ИсправлениеДокументовРасчетЗарплаты.ДоначисленияРазрешены(МенеджерРасчета) Тогда
		ИсходныеДанныеДляПерерасчета = ИсправлениеРасчетовБЗК.ИсходныеДанныеДляПерерасчетаИзРезультатаРасчета(МенеджерРасчета.Зарплата.Начисления);

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

Процедура ЗаполнитьСтрокиУдержаний(Сотрудники, МенеджерРасчета)
	
	Если Не РассчитыватьУдержания Тогда
		Возврат;
	КонецЕсли;

	МенеджерРасчета.ЗаполнитьУдержанияСотрудниковЗаПериод(Сотрудники, ПериодРегистрации, КонецМесяца(ПериодРегистрации));
		
КонецПроцедуры

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

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

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

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

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

Функция ОкончательныйРасчетНДФЛ() Экспорт
	Возврат Ложь;
КонецФункции  

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

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

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