Отпуск / Модуль объекта

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Функция ПараметрыРасчета() Экспорт
	Возврат Документы.Отпуск.ПараметрыРасчета();
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ОбновитьДанныеДляРасчетаСохраняемогоДенежногоСодержания()
	УстановитьПривилегированныйРежим(Истина);

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

	РассчитатьСреднийЗаработок();
	
КонецПроцедуры

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

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

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

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

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

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

// Функция возвращает виды расчета, хранящихся в документе. 
//
// Возвращаемое значение - тип Массив.
Функция ВидыРасчетаДокумента()

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

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

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

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

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