Отпуск / Форма документа / Модуль формы

файл

#Область ОписаниеПеременных

&НаКлиенте
Перем СотрудникУдаляемойСтроки;

&НаКлиенте
Перем СтарыеЗначенияКонтролируемыхПолей Экспорт;

&НаКлиенте
Перем ИдентификаторЗамераПроведениеНеНужнаРегистрацияОшибки;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура КоличествоДнейОсновногоОтпускаПриИзменении(Элемент)
	
	ВыполнитьДействияПриИзмененииКоличестваДнейОсновногоОтпускаИРассчитать();
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ДнейЧасовКомпенсацииОтпускаПриИзменении(Элемент)
	
	ДнейЧасовКомпенсацииОтпускаПриИзмененииНаСервере();
	ВыполнитьРасчетИПерезаполнениеНачислений();
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ВидРасчетаЕдиновременнойВыплатыКОтпускуПриИзменении(Элемент)
	
	ВыполнитьРасчетИПерезаполнениеНачислений();	
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ДоначислитьЗарплатуПриНеобходимостиПриИзменении(Элемент)
	
	ВыполнитьРасчетИПерезаполнениеНачислений();
	
КонецПроцедуры

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

&НаКлиенте
Процедура НачалоОтпускаПриИзменении(Элемент)
	
	ЗаполнитьПоложенныеВидыОтпусков();
	ВыполнитьРасчетИПерезаполнениеНачислений();
	
КонецПроцедуры

&НаКлиенте
Процедура ОкончаниеОтпускаПриИзменении(Элемент)
	
	ЗаполнитьПоложенныеВидыОтпусков();
	ВыполнитьРасчетИПерезаполнениеНачислений();
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура Подключаемый_ПорядокВыплатыПриИзменении(Элемент)
	
	ПерезаполнитьНачисления = Неопределено;
	ПорядокВыплатыПриИзмененииНаСервере(ПерезаполнитьНачисления);
	
	Если ПерезаполнитьНачисления = Истина Тогда
		ВыполнитьРасчетИПерезаполнениеНачислений();
	ИначеЕсли ПерезаполнитьНачисления = Ложь Тогда
		ВыполнитьРасчетИПерезаполнениеНачислений(Ложь);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура ПредоставитьОтгулПриИзменении(Элемент)
	
	ОтгулПриИзмененииНаСервере();
	ВыполнитьРасчетИПерезаполнениеНачислений();
	
КонецПроцедуры

&НаКлиенте
Процедура КоличествоДнейОтгулаПриИзменении(Элемент)
	ВыполнитьРасчетИПерезаполнениеНачислений();
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура СтатьяФинансированияПриИзменении(Элемент)
	ОбновитьБухучетРезультатовРасчета();
КонецПроцедуры

&НаКлиенте
Процедура СтатьяРасходовПриИзменении(Элемент)
	ОбновитьБухучетРезультатовРасчета();
КонецПроцедуры

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

&НаКлиенте
Процедура ОтношениеКЕНВДПриИзменении(Элемент)
	ОбновитьБухучетРезультатовРасчета();
КонецПроцедуры

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

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

// Обработчик подсистемы "ПодписиДокументов".

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

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

// Конец Обработчик подсистемы "ПодписиДокументов".

// СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов
&НаКлиенте
Процедура Подключаемый_ДекорацияСостояниеОригиналаНажатие()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	РасчетЗарплатыКлиент.СтрокаРасчетаПриНачалеРедактирования(ЭтаФорма, "НачисленияПерерасчет", Элементы.НачисленияПерерасчет.ТекущиеДанные, НоваяСтрока, Копирование);
КонецПроцедуры

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

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

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

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

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

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

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

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыОтсутствияПоДругимМестамРаботы

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

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

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

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

&НаКлиенте
Процедура УправленческиеНачисленияПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	РасчетЗарплатыКлиент.СтрокаРасчетаПриНачалеРедактирования(ЭтаФорма, "УправленческиеНачисления", Элементы.УправленческиеНачисления.ТекущиеДанные, НоваяСтрока, Копирование);
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПериодыПриостановкиОтпускаДатаНачалаПериодаПриИзменении(Элемент)
	ИзменениеПериодаПриостановки(Элемент);
КонецПроцедуры

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

&НаКлиенте
Процедура ПериодыПриостановкиОтпускаПослеУдаления(Элемент)
	ВыполнитьРасчетИПерезаполнениеНачислений();
КонецПроцедуры

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

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

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

// ИнтеграцияС1САрхивом

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

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

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

// Конец ИнтеграцияС1САрхивом

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// СтандартныеПодсистемы.Свойства

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

// Конец СтандартныеПодсистемы.Свойства

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

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

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

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

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция РасчетДенежногоСодержанияРедактировался(ДенежноеСодержание)

	Для каждого СтрокаТЧ Из ДенежноеСодержание Цикл
		Если СтрокаТЧ.ФиксРасчет Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Ложь;

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

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

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

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

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

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

&НаКлиенте
Процедура Подключаемый_ОткрытьЗаявкуСотрудника(Команда)

	ПоказатьЗначение(, Объект.ЗаявкаСотрудника);
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура КомандаПровестиИЗакрыть(Команда) Экспорт
	
	ПараметрыЗаписи = Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение);
	ЗаписатьНаКлиенте(Истина, ПараметрыЗаписи);
	
КонецПроцедуры

&НаКлиенте
Процедура КомандаПровести(Команда)
	
	ПараметрыЗаписи = Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение);
	ЗаписатьНаКлиенте(Ложь, ПараметрыЗаписи);
	
КонецПроцедуры

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

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

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

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

// БлокировкаИзмененияОбъектов

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

// Конец БлокировкаИзмененияОбъектов

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

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

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

// СтандартныеПодсистемы.Свойства 

&НаСервере
Процедура ОбновитьЭлементыДополнительныхРеквизитов()

	УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект);

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

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

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

// Конец СтандартныеПодсистемы.Свойства

// СтандартныеПодсистемы.КонтрольВеденияУчета

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

#Область ИсправлениеДокументов

&НаКлиенте
Процедура УстановитьПоляИсправленияНаКлиенте() Экспорт
	
	УстановитьПоляИсправления(ЭтаФорма);

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

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьПоляИсправления(Форма)

	ИсправлениеДокументовЗарплатаКадрыКлиентСервер.УстановитьПоляИсправления(Форма);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

#Область ИнициализацияФормы

&НаСервере
Процедура ПриПолученииДанныхНаСервере()

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

	РеквизитыКДобавлению.Очистить();
	РеквизитыКУдалению.Очистить();
	
	УстановитьПредставлениеОтработанныхДней();
	УстановитьПредставлениеСведенияДляОплатыОтпускаСФР();
	
КонецПроцедуры

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

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

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

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

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

	Возврат ПараметрыРедактирования;
	
КонецФункции

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

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

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

&НаКлиенте
Процедура РассчитатьНачисленияНаКлиенте()
	
	ВыполнитьРасчетНачисленийНаСервере();
	
КонецПроцедуры

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

&НаКлиенте
Процедура ПерезаполнитьИРассчитатьНачисленияНаКлиенте()
	
	ВыполнитьПерезаполнениеИРасчетНачисленийНаСервере();
	
КонецПроцедуры

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

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

	ПерезаполнитьНачисленияСотрудника(, , ПерезаполнитьНачисления);

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

#Область ЗаполнитьВидыРасчетовПоВидамОтпусков

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	ЗаполнитьПериодРасчетаСреднегоЗаработка();
	       	
	УстановитьПредупреждениеДокументНеРассчитан(ЭтотОбъект);

	ОчиститьРассчитанныеДанные();
	
	УстановитьПривилегированныйРежим(Ложь);

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

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

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

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

&НаКлиенте
Функция ПодобратьСледующуюДатуНачалаОтпуска()
	ПодобраннаяДата = '00010101'; 
	
	КоличествоДополнительныхОтпусков = Объект.ДополнительныеОтпуска.Количество() - 1;
	Если ЗначениеЗаполнено(Объект.ДатаНачалаОсновногоОтпуска) Тогда
		Если ЗначениеЗаполнено(Объект.ДатаОкончанияОсновногоОтпуска) Тогда
			Если КоличествоДополнительныхОтпусков > 0 Тогда
				ПодобраннаяДата = ПодобратьСледующуюДатуНачалаДополнительногоОтпуска(); 	
			Иначе
				ПодобраннаяДата = КонецДня(Объект.ДатаОкончанияОсновногоОтпуска) + 1;
			КонецЕсли;
		КонецЕсли;
	Иначе
		Если КоличествоДополнительныхОтпусков > 0 Тогда
			ПодобраннаяДата = ПодобратьСледующуюДатуНачалаДополнительногоОтпуска(); 	
		КонецЕсли;		
	КонецЕсли;
	Возврат ПодобраннаяДата
КонецФункции

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

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

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

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

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

&НаСервере
Процедура УстановитьКоличествоДнейДополнительногоОтпускаАвансом(СтрокаОтпуска) 
	Если ОстатокОтпускаСотрудника = Неопределено Тогда 
		РассчитатьОстаткиОтпусков();
	КонецЕсли;
	Документы.Отпуск.УстановитьКоличествоДнейДополнительногоОтпускаАвансом(СтрокаОтпуска, ОстатокОтпускаСотрудника, СтрокаОтпуска.ЭтоЕжегодныйОтпуск);
КонецПроцедуры

///////////////////////////////////////////////////////////////////////////////
// Подключение механизма расчета начислений.

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ОписаниеТаблицыСохраняемоеДенежноеСодержание()

	Возврат КадровыйУчетРасширенныйКлиентСервер.ОписаниеТаблицыСохраняемоеДенежноеСодержание();

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

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

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

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


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

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

&НаКлиентеНаСервереБезКонтекста
Функция ОписаниеТаблицыКорректировкиВыплаты()
	
	ОписаниеТаблицы = РасчетЗарплатыРасширенныйКлиентСервер.ОписаниеТаблицыКорректировкиВыплаты();
	Возврат ОписаниеТаблицы;
	
КонецФункции

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

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

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

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

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

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

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

&НаКлиенте
Функция ПолучитьСтарыеЗначенияКонтролируемыхПолей() Экспорт
	Возврат СтарыеЗначенияКонтролируемыхПолей;
КонецФункции

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ЭтоСреднеЧасовойЗаработок()
	
	// Отпускные считаются только по среднедневному заработку.
	Возврат Ложь;
	
КонецФункции

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

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

///////////////////////////////////////////////////////////////////////////////
// Обслуживание элементов формы.

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

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

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

	УточнитьВозможностьРасчетаЗарплаты();
	
	УстановитьВидимостьПерерасчетов();
	
	УстановитьФункциональныеОпцииФормы();
	
	УстановитьЗаголовокФлажкаРассчитатьЗарплату();
	
КонецПроцедуры

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

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

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

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

	ЗаполнитьПериодРасчетаСреднегоЗаработка();
	
	УстановитьПредупреждениеДокументНеРассчитан(ЭтотОбъект);
	
	ОчиститьРассчитанныеДанные();
	
	ПрочитатьПостоянныеКадровыеДанныеСотрудника();
	ОбновитьДлительностьИнтервалов();
	
	ОбновитьРабочиеГодыОтпусков();
	
	ОбновитьНадписьРасшифровкаОстаткаОтпуска(ЭтотОбъект);
	
	ЗаполнитьОтсутствияПоДругимМестамРаботы();
	УстановитьВидимостьОтсутствияПоДругимМестамРаботы();
	
	УстановитьПланируемуюДатыВыплаты();
	УстановитьДоступностьИЗначениеПоУмолчаниюСвойстваУчитыватьМРОТ();
	
	РассчитатьОстаткиОтпусков();
	УстановитьКоличествоДнейОтпускаАвансом();
	
	ПроверитьНазначениеДополнительныхОтпусков();
	
	ЗаполнитьОтработанныеДни();
	ЗаполнитьОтработанныеЧасы();
	УстановитьПредставлениеОтработанныхДней();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

	ОбновитьРабочийГодДополнительногоОтпуска(Строка);
	
	УточнитьВозможностьРасчетаЗарплаты();
	
	ЗаполнитьОтсутствияПоДругимМестамРаботы();
	
	УстановитьКоличествоДнейДополнительногоОтпускаАвансом(Строка);
	
	УстановитьОбщийПериодОтпуска();
	
	ЗаполнитьОтработанныеДни();
	ЗаполнитьОтработанныеЧасы();
	УстановитьПредставлениеОтработанныхДней();
	
КонецПроцедуры

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

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

	ОбновитьРабочийГодДополнительногоОтпуска(Строка);
	
	ЗаполнитьОтсутствияПоДругимМестамРаботы();
	
	УстановитьКоличествоДнейДополнительногоОтпускаАвансом(Строка);
	
	УстановитьОбщийПериодОтпуска();
	
	ЗаполнитьОтработанныеДни();
	ЗаполнитьОтработанныеЧасы();
	УстановитьПредставлениеОтработанныхДней();
	
КонецПроцедуры

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

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

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

	ОбновитьРабочийГодДополнительногоОтпуска(Строка);

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура УстановитьСтраницуСреднегоЗаработка()

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

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

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

&НаСервереБезКонтекста
Функция ЭтоМежрасчетнаяВыплата(ПорядокВыплаты)
		
	Возврат РасчетЗарплатыРасширенный.ЭтоМежрасчетнаяВыплата(ПорядокВыплаты);
	
КонецФункции

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

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

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

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

	Форма.ПерерасчетИтог = Форма.Объект.НачисленияПерерасчет.Итог("Результат");		
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьРассчитанныеДанныеНаКлиенте()
	
	ОчиститьРассчитанныеДанные();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ОсновнойИлиДополнительныйОтпускПриИзмененииНаСервере()
	
	ЗаполнитьСсылкиНачислений(Ложь);
	ОбновитьИнформациюОПересеченииОтпускаСБольничным();
	
	УстановитьДатуНачалаСобытия();
	             	
	УстановитьПланируемуюДатыВыплаты();

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

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

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

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

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

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

&НаСервере
Процедура УстановитьДругихСотрудниковФизическогоЛица(ДатаНачала, ДатаОкончания)

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьНадписьРасшифровкаОстаткаОтпуска(Форма)
	Если ЗначениеЗаполнено(Форма.Объект.Сотрудник) Тогда
		Форма.РасшифровкаОстаткаОтпуска = НСтр("ru='Как сотрудник использовал отпуск?'");
	Иначе
		Форма.РасшифровкаОстаткаОтпуска = "";
	КонецЕсли;
КонецПроцедуры

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

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

&НаСервере
Процедура ДополнительныеОтпускаПослеУдаленияНаСервере()
	
	ОбновитьФлажкиНаличияВидовОтпусков();
	УстановитьПараметрыВыбораВидаОтпуска(ЭтотОбъект);
	УстановитьВидимостьОтпускаПострадавшимНаЧАЭС();	
	УстановитьДатуНачалаСобытия();
	
КонецПроцедуры

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

&НаСервере
Процедура УстановитьЗаголовокСтраницыДополнительныеОтпуска()

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

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

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

&НаСервере
Функция ДоступенРасчетЗарплаты(НачалоПериода)
	
	Возврат Объект.ДатаНачалаСобытия > НачалоПериода 
			И Объект.ДатаНачалаСобытия <= КонецМесяца(НачалоПериода)
			И ЭтоМежрасчетнаяВыплата(Объект.ПорядокВыплаты);
	
КонецФункции

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

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

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

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

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

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

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

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

&НаСервере
Функция ДанныеКорректировокВыплаты()
	
	Возврат РасчетЗарплатыРасширенныйФормы.ДанныеКорректировокВыплаты(ЭтаФорма);
	
КонецФункции

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

&НаСервере
Процедура ЗаполнитьЗначениеКорректировкиВыплаты()
	
	КорректировкаВыплаты = Объект.КорректировкиВыплаты.Итог("КорректировкаВыплаты");
	
КонецПроцедуры

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

&НаСервере
Процедура ЗаполнитьПериодПриостановки(СсылкаНаБольничный, Идентификатор)
	
	Строка = Объект.ПериодыПриостановкиОтпуска.НайтиПоИдентификатору(Идентификатор);
	
	ПериодыОтсутствий = Документы.Отпуск.ПериодыОтсутствий(Объект);
	ПериодОтсутствия = Документы.Отпуск.ПериодОтсутствия(ПериодыОтсутствий);
	
	Если ЗначениеЗаполнено(СсылкаНаБольничный) Тогда
		ДанныеПриостановки = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СсылкаНаБольничный, "ДатаНачала, ДатаОкончания");
		Причина = СсылкаНаБольничный;
	Иначе
		ДанныеПриостановки = Новый Структура("ДатаНачала, ДатаОкончания");
		ДанныеПриостановки.ДатаНачала	 = Строка.ДатаНачалаПериода;
		ДанныеПриостановки.ДатаОкончания = Строка.ДатаОкончанияПериода;
		Причина = СтрШаблон(НСтр("ru='Период приостановки %1-%2'"),
			Формат(Строка.ДатаНачалаПериода, "ДФ=dd.MM.yyyy"), 
			Формат(Строка.ДатаОкончанияПериода, "ДФ=dd.MM.yyyy"));
	КонецЕсли;
	
	Если Не (ОбщегоНазначенияБЗК.ИнтервалыПересекаются(
		ДанныеПриостановки.ДатаНачала, ДанныеПриостановки.ДатаОкончания,
		ПериодОтсутствия.НачалоПериода, ПериодОтсутствия.ОкончаниеПериода)) Тогда
		
		СообщениеПользователю = СтрШаблон(НСтр("ru='%1 не пересекается с данным отпуском'"), Причина);
		ОбщегоНазначения.СообщитьПользователю(СообщениеПользователю);
		СсылкаНаБольничный = Документы.БольничныйЛист.ПустаяСсылка();
		Возврат;
		
	КонецЕсли;
	
	ПериодПересечения = ОбщегоНазначенияБЗК.ПериодПересеченияДвухИнтервалов(ДанныеПриостановки.ДатаНачала, 
		ДанныеПриостановки.ДатаОкончания,ПериодОтсутствия.НачалоПериода, ПериодОтсутствия.ОкончаниеПериода);
	Строка.ДатаНачалаПериода = ПериодПересечения.ДатаНачала;
	Строка.ДатаОкончанияПериода = ПериодПересечения.ДатаОкончания;
	
	Документы.Отпуск.ЗаполнитьКоличествоДнейПриостановки(Объект, Строка);
	
КонецПроцедуры

&НаКлиенте
Процедура ПерезаполнитьПериодыПересечения()
	Если Объект.ПериодыПриостановкиОтпуска.Количество() > 0 Тогда
		ПерезаполнитьПериодыПересеченияНаСервере();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьДействияПриИзмененииКоличестваДнейОсновногоОтпускаИРассчитать()
	КоличествоДнейОсновногоОтпускаПриИзмененииНаСервере();
	ПерезаполнитьПериодыПересечения();
	ВыполнитьРасчетИПерезаполнениеНачислений();
КонецПроцедуры

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

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

#Область ПараметрыВыбораВидаОтпуска

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#Область РаспределениеПоТерриториямУсловиямТруда

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

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

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

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

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

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

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

#Область КлючевыеРеквизитыЗаполненияФормы

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

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

&НаКлиентеНаСервереБезКонтекста
Функция КлючевыеРеквизитыЗаполненияФормыУстановитьОтображениеПредупреждения(Форма)
	ЗарплатаКадрыКлиентСервер.КлючевыеРеквизитыЗаполненияФормыУстановитьОтображениеПредупреждения(Форма, ?(ЕстьФиксированныеДанные(Форма), ОтображениеПредупрежденияПриРедактировании.Отображать, ОтображениеПредупрежденияПриРедактировании.Авто));
КонецФункции 

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

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

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

	Если Объект.ПредоставитьОтгул Тогда
		ЗаполнитьНакопленнымиОтгуламиНаСервере();
	КонецЕсли;
	
	УстановитьДоступностьЭлементовФормы(ЭтаФорма, Объект);
	
	ЗаполнитьОтработанныеДни();
	ЗаполнитьОтработанныеЧасы();
	УстановитьПредставлениеОтработанныхДней();
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьНакопленнымиОтгуламиНаСервере()

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

#Область ОтсутствияПоДругимМестамРаботы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ОбновитьБухучетРезультатовРасчета()
	
	Если ИспользоватьСтатьиФинансирования И Объект.Начисления.Количество() > 0 Тогда 
		ОбновитьБухучетРезультатовРасчетаНаСервере();
	КонецЕсли;

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

#Область УточнениеВидаВремени

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

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

&НаСервереБезКонтекста
Функция СостояниеПоВидуОтпуска()
	Возврат СостоянияСотрудников.СостояниеПоВидуОтпуска(Справочники.ВидыОтпусков.Основной);
КонецФункции

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

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

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

#Область Больничные

&НаСервере
Процедура ОбновитьИнформациюОПересеченииОтпускаСБольничным()
	
	ПериодыБольничных = ПериодыБольничных();
	Если ПериодыБольничных.Количество() = 0 Тогда
		Элементы.ОтпускПересекаетсяСБольничнымГруппа.Видимость = Ложь;
	Иначе
		Элементы.ОтпускПересекаетсяСБольничнымГруппа.Видимость = Истина;
		// Формирование html-представления больничных.
		ПредставленияПричин = Новый Массив;
		ПредставленияБольничных = Новый Массив;
		Для Каждого ПериодБольничного Из ПериодыБольничных Цикл
			ПредставлениеПричины = Перечисления.ПричиныНетрудоспособности.ПредставлениеБезКода(
				ПериодБольничного.ПричинаНетрудоспособности);
			ПредставленияБольничных.Добавить(СтрШаблон(
				"<a href=""%1"">%2 %3</a>",
				ПолучитьНавигационнуюСсылку(ПериодБольничного.Регистратор),
				ПредставлениеПричины,
				ОбщегоНазначенияБЗК.НаименованиеПериода(ПериодБольничного.ДатаНачала, ПериодБольничного.ДатаОкончания)));
			ОбщегоНазначенияБЗК.ДобавитьЗначениеВМассив(ПредставленияПричин, ПредставлениеПричины);
		КонецЦикла;
		// Вывод в заголовок надписи.
		Если ПредставленияБольничных.Количество() = 1 Тогда
			Шаблон = НСтр("ru = 'Отпуск пересекается с больничным: %1'");
		Иначе
			Шаблон = НСтр("ru = 'Отпуск пересекается с больничными: %1'");
		КонецЕсли;
		СтрокаHTML = СтрШаблон(Шаблон, СтрСоединить(ПредставленияБольничных, ", "));
		Элементы.ОтпускПересекаетсяСБольничным.Заголовок = СтроковыеФункции.ФорматированнаяСтрока(СтрокаHTML);
		// Вывод подсказки.
		СтрокаHTML = СтрШаблон(
				НСтр("ru = '%1 не дает права на продление отпуска и в случае пересечения с отпуском <a href=""%2"">должен оплачиваться отпуск</a>. 
					|Рекомендуется проинформировать работника.
					|Если решено изменить отпуск, то больничный потребуется исправить и пересчитать.'"),
				СтрСоединить(ПредставленияПричин, ", "),
				"https://its.1c.ru/db/newsclar#content:468901:hdoc");
		ЗаголовокПодсказки = СтроковыеФункции.ФорматированнаяСтрока(СтрокаHTML);
		Элементы.ОтпускПересекаетсяСБольничным.РасширеннаяПодсказка.Заголовок = ЗаголовокПодсказки;
	КонецЕсли;
	
КонецПроцедуры

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

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

&НаСервере
Функция ИндексДополнительногоОтпускаПослеОсновного(ДатаОкончанияОсновногоОтпуска)
	Для Каждого ДополнительныйОтпуск Из Объект.ДополнительныеОтпуска Цикл
		Если ДополнительныйОтпуск.ДатаНачала > ДатаОкончанияОсновногоОтпуска Тогда
			Возврат Объект.ДополнительныеОтпуска.Индекс(ДополнительныйОтпуск);
		КонецЕсли;
	КонецЦикла;
	Возврат Объект.ДополнительныеОтпуска.Количество()+ 1;
КонецФункции

// ЭДОБЗК

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

// Конец ЭДОБЗК

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

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

&НаСервере
Процедура ПерезаполнитьПериодыПересеченияНаСервере()
	Для Каждого СтрокаПриостановки Из Объект.ПериодыПриостановкиОтпуска Цикл
		ЗаполнитьПериодПриостановки(СтрокаПриостановки.Причина, СтрокаПриостановки.ПолучитьИдентификатор());
	КонецЦикла;
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьВидимостьНастроекБухучета(Форма)

	Если Форма.Объект.БухучетУказываетсяРаспределением Тогда
		Форма.Элементы.СтраницыБухучет.ТекущаяСтраница = Форма.Элементы.СтраницаБухучетРаспределение;
	Иначе
		Форма.Элементы.СтраницыБухучет.ТекущаяСтраница = Форма.Элементы.СтраницаБухучет;
	КонецЕсли;

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

&НаКлиенте
Процедура ИзменитьБухучетРаспределениеЗавершение(Результат, Параметры) Экспорт

	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ИзменитьБухучетРаспределениеЗавершениеНаСервере(Результат);
	
КонецПроцедуры

&НаСервере
Процедура ИзменитьБухучетРаспределениеЗавершениеНаСервере(Результат)

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

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

&НаСервере
Процедура ЗаполнитьПредставлениеРаспределенияБухучета()

	Элементы.ПредставлениеРаспределенияБухучета.Заголовок = ОтражениеЗарплатыВБухучетеРасширенный.ПредставлениеРаспределенияБухучетаДокумента(Объект.НастройкиБухучета);

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

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

	УстановитьВидимостьПерерасчетов();
	
	УстановитьОтметкуНезаполненногоПланируемойДатыВыплаты(ЭтаФорма);
КонецПроцедуры	

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#Область Инициализация

СтарыеЗначенияКонтролируемыхПолей = Новый Соответствие;

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

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