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

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

#Область ПрограммныйИнтерфейс

// СтандартныеПодсистемы.ВерсионированиеОбъектов

// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
//  Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт

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

// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов

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

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

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

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

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

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

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

// Конец СтандартныеПодсистемы.УправлениеДоступом

// СтандартныеПодсистемы.Печать

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

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

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

// ЗарплатаКадрыПодсистемы

// Формирует печатную форму. Вызывается из УправлениеПечатьюБЗК.Печать.
//
// Параметры:
//   КонтекстПечати - Структура - См. УправлениеПечатьюБЗК.КонтекстПечати.
//
Процедура ПриФормированииПечатнойФормы(КонтекстПечати) Экспорт
	
	Макеты = Метаданные.Документы.Отпуск.Макеты;
	Если КонтекстПечати.МетаданныеМакета = Макеты.ПФ_MXL_СправкаДляОплатыОтпускаЧАЭС Тогда
		ПриПечатиСправкиДляОплатыОтпускаЧАЭС(КонтекстПечати);
	ИначеЕсли КонтекстПечати.МетаданныеМакета = Макеты.ПФ_MXL_ОтпускНаПериодЛечения_2024 Тогда
		ПриПечатиОтпускаНаПериодЛечения_2024(КонтекстПечати);
	КонецЕсли;
	
КонецПроцедуры

// Конец ЗарплатаКадрыПодсистемы

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

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

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

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

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

#Область СлужебныйПрограммныйИнтерфейс

#Область ОбновлениеИнформационнойБазы

// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления.
Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
	
	Обработчик = Обработчики.Добавить();
	Обработчик.Версия          = "3.1.30.34";
	Обработчик.РежимВыполнения = "Отложенно";
	Обработчик.Идентификатор   = Новый УникальныйИдентификатор("9d6378e1-44f6-11ef-812c-4cedfb43b11a");
	Обработчик.Процедура       = "Документы.Отпуск.ЗаполнитьФлажкиНаличияВидовОтпусков";
	Обработчик.Комментарий     = НСтр("ru = 'Заполнение флажков наличия видов дополнительных отпусков.'");
	
КонецПроцедуры

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

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

#Область ОбработчикиПравилРегистрации

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

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

// Возвращает описание состава документа
//
// Возвращаемое значение:
//  Структура - см. ЗарплатаКадрыСоставДокументов.НовоеОписаниеСоставаОбъекта.
Функция ОписаниеСоставаОбъекта() Экспорт
	Возврат ЗарплатаКадрыСоставДокументов.ОписаниеСоставаОбъектаФизическоеЛицоВШапке();
КонецФункции

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

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

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

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

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

#Область РассылкаДокументов

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

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

#Область ПрямыеВыплаты

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

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

#Область СЭДО

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

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

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

Функция ОбъектЗаблокирован(СсылкаНаОбъект) Экспорт
	
	Возврат Ложь;
	
КонецФункции

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

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

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

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

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

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

	Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
	Результаты = Запрос.ВыполнитьПакет();
	
	РеквизитыДляПроведения = РеквизитыДляПроведенияПустаяСтруктура();
	
	ВыборкаРеквизиты = Результаты[0].Выбрать();
	Пока ВыборкаРеквизиты.Следующий() Цикл
		ЗаполнитьЗначенияСвойств(РеквизитыДляПроведения, ВыборкаРеквизиты);
	КонецЦикла;
	
	РеквизитыДляПроведения.РаспределениеПоТерриториямУсловиямТруда = Результаты[1].Выгрузить();
	РеквизитыДляПроведения.РаспределениеРезультатовНачислений = Результаты[2].Выгрузить();
	РеквизитыДляПроведения.ДополнительныеОтпуска = Результаты[3].Выгрузить();
	РеквизитыДляПроведения.Начисления = Результаты[4].Выгрузить();
	РеквизитыДляПроведения.ПериодыПриостановкиОтпуска = Результаты[5].Выгрузить();

	СотрудникиДаты = Результаты[0].Выгрузить();
	СотрудникиДаты.Колонки.ДатаНачалаСобытия.Имя = "ДатаСобытия";
	РеквизитыДляПроведения.СотрудникиДаты = СотрудникиДаты;
	
	Возврат РеквизитыДляПроведения;
	
КонецФункции

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

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

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

Функция ДанныеОбОтгулах(РеквизитыДляПроведения)

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

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

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

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

Функция ДатаНачалаОтгула(РеквизитыДляПроведения)

	ОтгулыНачисления = РеквизитыДляПроведения.Начисления.НайтиСтроки(Новый Структура("Начисление", РеквизитыДляПроведения.ВидРасчетаОтгул));
	Если ОтгулыНачисления.Количество() > 0 Тогда
		Возврат ОтгулыНачисления[0].ДатаНачала;
	Иначе	
		Возврат РеквизитыДляПроведения.Дата;
	КонецЕсли;

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

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

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

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

#Область ПечатьРасчетаСреднегоЗаработка

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

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

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

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

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

#Область ПечатьПодробногоРасчетаНачислений

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

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

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

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

#Область ПечатьСправкиДляОплатыОтпускаЧАЭС

Функция ДанныеДляПечатиСправкиДляОплатыОтпускаЧАЭС(МассивСсылок)

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

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

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

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

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

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

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

#Область ПФ_MXL_ОтпускНаПериодЛечения

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

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

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

Функция ДатаКомпенсацииОтпуска(ПланируемаяДатаВыплаты, ПериодРегистрации) Экспорт 
	
	ДатаКомпенсации = ?(ПланируемаяДатаВыплаты < ПериодРегистрации, ПериодРегистрации,
		?(ПланируемаяДатаВыплаты > КонецМесяца(ПериодРегистрации), НачалоДня(КонецМесяца(ПериодРегистрации)), ПланируемаяДатаВыплаты));
		
	Возврат ДатаКомпенсации;	
		
КонецФункции	

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

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

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

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

	УчетПособийСоциальногоСтрахованияРасширенный.ЗаполнитьСведенияОПособиях(ДанныеДляПроведения, ПособиеПлатитУчастникПилотногоПроекта);

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

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

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

Функция ВидыОтпусковОбъекта(ТекущийОбъект) Экспорт

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

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

// Функция возвращает структуру с описанием данного вида документа.
//
Функция ОписаниеДокумента() Экспорт 

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

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

Функция ДанныеДляБухучетаЗарплатыПервичныхДокументов(Объект) Экспорт

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

#Область ПараметрыВыбораНачислений

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

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

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

Функция КатегорияНачисленияОтпускБезОплаты() Экспорт
	Возврат Перечисления.КатегорииНачисленийИНеоплаченногоВремени.ОтпускБезОплаты;
КонецФункции

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

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

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

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

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

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

Процедура ЗаполнитьИсходныеДанныеПерерасчетов(ПараметрыОбновления) Экспорт

	ПараметрыЗаполнения = ПерерасчетЗарплаты.ПараметрыЗаполненияИсходныхДанныхПерерасчетов();
	ПерерасчетЗарплаты.ЗаполнитьИсходныеДанныеПерерасчетов(ПараметрыОбновления, Метаданные.Документы.Отпуск, ПараметрыЗаполнения);

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

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

Функция КоличествоДнейОтпускаАвансом(КоличествоДнейОтпуска, ОстатокОтпуска) Экспорт
	
	Остаток = ?(ОстатокОтпуска = Неопределено, 0, ОстатокОтпуска);
	Возврат Мин(КоличествоДнейОтпуска, Макс(КоличествоДнейОтпуска - Остаток, 0));
	
КонецФункции

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

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

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

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

#Область СозданиеНовогоДокумента

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Функция ОписаниеТаблицыПерерасчетов() Экспорт
	
	ОписаниеТаблицы = РасчетДокументовБЗК.ОписаниеТаблицыРасчета();
	
	ОписаниеТаблицы.ИмяТаблицы									= "НачисленияПерерасчет";
	ОписаниеТаблицы.НомерТаблицы 								= 1;

	ОписаниеТаблицы.ИмяРеквизитаПериод 							= "ПериодРегистрации";
	ОписаниеТаблицы.ИмяРеквизитаДокументОснование 				= "ДокументОснование";
	
	Возврат ОписаниеТаблицы;
КонецФункции

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

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

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

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

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

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

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

#КонецЕсли

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