Компенсация за задержку выплаты заработной платы / Форма документа / Модуль формы

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

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

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

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
	Оповестить("Запись_КомпенсацияЗаЗадержкуЗарплаты", ПараметрыЗаписи, Объект.Ссылка);
КонецПроцедуры

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

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

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

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

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

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ОрганизацияПриИзменении(Элемент)
	ОрганизацияПриИзмененииНаСервере();
КонецПроцедуры

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

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

#Область РедактированиеМесяцаСтрокой

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

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

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

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

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

&НаКлиенте
Процедура ОбработчикОжиданияМесяцНачисленияПриИзменении()
	
	ОбработатьИзменениеМесяцНачисленияНаСервере();
	ЗаполнитьНаСервере();
		
КонецПроцедуры

&НаКлиенте
Процедура ПериодРегистрацииАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка)
	ЗарплатаКадрыКлиент.ВводМесяцаАвтоПодборТекста(Текст, ДанныеВыбора, СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура ПериодРегистрацииОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка)
	ЗарплатаКадрыКлиент.ВводМесяцаОкончаниеВводаТекста(Текст, ДанныеВыбора, СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура ПериодВзаиморасчетовПриИзменении(Элемент)
	ЗарплатаКадрыКлиент.ВводМесяцаПриИзменении(
		ЭтаФорма, 
		"Объект.ПериодВзаиморасчетов", 
		"ПериодВзаиморасчетовСтрокой", 
		Модифицированность);
КонецПроцедуры

&НаКлиенте
Процедура ПериодВзаиморасчетовНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ЗарплатаКадрыКлиент.ВводМесяцаНачалоВыбора(
		ЭтаФорма, 
		ЭтаФорма, 
		"Объект.ПериодВзаиморасчетов", 
		"ПериодВзаиморасчетовСтрокой");
КонецПроцедуры

&НаКлиенте
Процедура ПериодВзаиморасчетовРегулирование(Элемент, Направление, СтандартнаяОбработка)
	ЗарплатаКадрыКлиент.ВводМесяцаРегулирование(
		ЭтаФорма, 
		"Объект.ПериодВзаиморасчетов", 
		"ПериодВзаиморасчетовСтрокой", 
		Направление, 
		Модифицированность);
КонецПроцедуры

&НаКлиенте
Процедура ПериодВзаиморасчетовАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка)
	ЗарплатаКадрыКлиент.ВводМесяцаАвтоПодборТекста(Текст, ДанныеВыбора, СтандартнаяОбработка);
КонецПроцедуры

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

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

#Область РеквизитыПервичногоДокумента

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

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

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

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

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

&НаКлиенте
Процедура ДатаПервичногоДокументаНачалоВыбораЗавершение(Дата, ДополнительныеПараметры) Экспорт
	
	Если ЗначениеЗаполнено(Дата) Тогда
		Объект.ДатаПервичногоДокумента = Дата;
		ДатаПервичногоДокументаПредставление = Формат(Дата,"ДФ=dd.MM.yyyy");
		Модифицированность = Истина;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ДатаПервичногоДокументаОчистка(Элемент, СтандартнаяОбработка)
	Объект.ДатаПервичногоДокумента = Дата(1,1,1);
	Модифицированность = Истина;
КонецПроцедуры

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

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

&НаКлиенте
Процедура РегистрироватьКакОблагаемыйНДФЛДоходПриИзменении(Элемент)
	РегистрироватьКакОблагаемыйНДФЛДоходПриИзмененииНаСервере();
	УстановитьСвойстваКатегорииДоходаНДФЛ(ЭтаФорма);
КонецПроцедуры

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

&НаКлиенте
Процедура КатегорияДоходаПриИзменении(Элемент)
	РассчитатьНДФЛ();
КонецПроцедуры

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

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

// Обработчик подсистемы "ПодписиДокументов".
&НаКлиенте
Процедура Подключаемый_ПодписиДокументовЭлементПриИзменении(Элемент) 
	ПодписиДокументовКлиент.ПриИзмененииПодписывающегоЛица(ЭтаФорма, Элемент.Имя);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПодписиДокументовЭлементНажатие(Элемент) 
	ПодписиДокументовКлиент.РасширеннаяПодсказкаНажатие(ЭтаФорма, Элемент.Имя);
КонецПроцедуры
// Конец Обработчик подсистемы "ПодписиДокументов".

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыСостав

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

&НаКлиенте
Процедура СоставПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
	Если Не Копирование Тогда
		ПодобратьСотрудников();
	КонецЕсли;	
	Отказ = Истина;
КонецПроцедуры

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

&НаКлиенте
Процедура СоставОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	СоставОбработкаВыбораНаСервере(ВыбранноеЗначение);
КонецПроцедуры

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

&НаКлиенте
Процедура СоставПослеУдаления(Элемент)
	СоставПослеУдаленияНаСервере();
КонецПроцедуры

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

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

&НаКлиенте
Процедура СоставСуммаКомпенсацииПриИзменении(Элемент)
	СоставСуммаКомпенсацииПриИзмененииНаСервере(Элементы.Состав.ТекущаяСтрока);
КонецПроцедуры

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

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

#Область ОбработчикиКомандФормы

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

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры

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

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

&НаКлиенте
Процедура Заполнить(Команда)
	ОчиститьСообщения();
	ЗаполнитьНаСервере();
КонецПроцедуры

&НаКлиенте
Процедура Подобрать(Команда)
	ПодобратьСотрудников();		
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьКомпенсацию(Команда)
	РедактироватьКомпенсациюСтроки(Элементы.Состав.ТекущиеДанные);	
КонецПроцедуры
	
#КонецОбласти

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

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

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

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

&НаКлиенте
Процедура Подключаемый_ПланируемаяДатаВыплатыПриИзменении(Элемент)
	
	ПланируемаяДатаВыплатыПриИзмененииНаСервере();
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПорядокВыплатыПриИзменении(Элемент)
	
	ПорядокВыплатыПриИзмененииНаСервере();
	
КонецПроцедуры


&НаСервере
Процедура ПланируемаяДатаВыплатыПриИзмененииНаСервере()
	
	ЗаполнитьНаСервере();
	
КонецПроцедуры

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

#Область ОбработчикиСобытийПроцессыОбработкиДокументов

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

&НаКлиенте
Процедура Подключаемый_ВыполнитьЗадачуПоОбработкеДокументаОповещение(Контекст, ДополнительныеПараметры) Экспорт
	ВыполнитьЗадачуПоОбработкеДокументаНаСервере(Контекст);
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры, Контекст);
КонецПроцедуры

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

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

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

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

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

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

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

			ПредставлениеПериодов = 
				ПредставлениеПериодов 
				+ НРег(ЗарплатаКадрыКлиентСервер.ПолучитьПредставлениеМесяца(ПериодыВзаиморасчетов[Индекс].ПериодВзаиморасчетов));
			
		КонецЦикла;	
		
		Если ЗначениеЗаполнено(ПредставлениеПериодов) Тогда
			РасшифровкаПериодов = 
				СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'в т.ч. за %1'"), ПредставлениеПериодов);
		КонецЕсли;	
		
	КонецЕсли;	
	
	СтрокаСостава.Расшифровка = "";
	Если ЗначениеЗаполнено(РасшифровкаПериодов) Тогда
		СтрокаСостава.Расшифровка = СтрокаСостава.Расшифровка + РасшифровкаПериодов;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(РасшифровкаРабочихМест) Тогда
		СтрокаСостава.Расшифровка = 
			СтрокаСостава.Расшифровка
			+ ?(ЗначениеЗаполнено(СтрокаСостава.Расшифровка), "; "+Символы.ПС, "")
			+ РасшифровкаРабочихМест;
	КонецЕсли;
	
КонецПроцедуры	

&НаСервере
Процедура ОрганизацияПриИзмененииНаСервере()
	ЗаполнитьДанныеФормыПоОрганизации();
КонецПроцедуры

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

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

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

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

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

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

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

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

	ПриПолученииДанныхНаСервере(ТекущийОбъект);	
	
КонецПроцедуры

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

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

&НаСервере
Функция АдресСпискаПодобранныхСотрудников()
	Возврат ПоместитьВоВременноеХранилище(Объект.Состав.Выгрузить(,"Сотрудник").ВыгрузитьКолонку("Сотрудник"), УникальныйИдентификатор);
КонецФункции

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

&НаКлиенте
Процедура РедактироватьКомпенсациюСтрокиЗавершение(РезультатыРедактирования, ДополнительныеПараметры) Экспорт
	
	Если РезультатыРедактирования <> Неопределено И РезультатыРедактирования.Модифицированность Тогда
		РедактироватьКомпенсациюСтрокиЗавершениеНаСервере(РезультатыРедактирования)
	КонецЕсли;
	
КонецПроцедуры

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

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

&НаСервере
Функция АдресВХранилищеНачисленийСотрудника(Сотрудник) Экспорт
	Возврат ПоместитьВоВременноеХранилище(Объект.Начисления.Выгрузить(Новый Структура("Сотрудник", Сотрудник)), УникальныйИдентификатор);
КонецФункции	

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

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

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

&НаСервере
Функция НДФЛПодробнееНаСервере(ФизическиеЛица) Экспорт

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

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

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

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

	СотрудникиФизическихЛиц = СотрудникиФизическихЛиц(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Параметр.ФизическоеЛицо));

	СотрудникиКРасчету = СотрудникиФизическихЛиц.ВыгрузитьКолонку("Сотрудник");
	
	ТолькоОбновитьНалоги = Истина;
	
	Модифицированность = Истина;
	
	РассчитатьНДФЛ(СотрудникиКРасчету, ТолькоОбновитьНДФЛ);
	
КонецПроцедуры

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

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