Больничный лист / Модуль менеджера

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// СтандартныеПодсистемы.ТекущиеДела

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

// Конец СтандартныеПодсистемы.ТекущиеДела

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#Область ЭЛН

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

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

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

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

#Область УходЗаДетьми

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

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

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

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

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

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

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

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

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

Функция ИспользоватьПериодыУходаВШапке(Больничный) Экспорт
	Возврат Больничный.ПериодыУходаЗаРодственниками.Количество() = 0
		И Перечисления.ПричиныНетрудоспособности.ЭтоУходЗаРодственником(Больничный.ПричинаНетрудоспособности)
		И (ЗначениеЗаполнено(Больничный.РодственникЗаКоторымОсуществляетсяУход1)
			Или ЗначениеЗаполнено(Больничный.РодственникЗаКоторымОсуществляетсяУход2));
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

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

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

#Область Печать

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

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

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

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

#Область ПФ_MXL_РасчетПособия

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

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

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

Процедура ВывестиШапкуРасчетаПособия(КонтекстПечати, ВыборкаДляШапки, КадровыеДанныеСотрудников)
	// Определение локальных переменных.
	ТабличныйДокумент       = КонтекстПечати.ТабличныйДокумент;
	Макет                   = КонтекстПечати.Макет;
	ИменаПараметровОбластей = КонтекстПечати.ИменаПараметровОбластей;
	КадровыеДанныеСотрудника = КадровыеДанныеСотрудников.Найти(ВыборкаДляШапки.Сотрудник);
	
	// Вывод заголовка.
	ИмяОбласти = ?(ВыборкаДляШапки.ДатаНачала < '20220101', "ЗаголовокШапки", "ЗаголовокШапки2022");
	СекцияЗаголовокШапки = Макет.ПолучитьОбласть(ИмяОбласти);
	ТабличныйДокумент.Вывести(СекцияЗаголовокШапки);
	
	// Вывод шапки.
	ПараметрыШапки = Новый Структура(ИменаПараметровОбластей.Шапка);
	ЗаполнитьЗначенияСвойств(ПараметрыШапки, ВыборкаДляШапки);
	
	ЗаполнитьШапкуРасчетаПособия(ПараметрыШапки, ВыборкаДляШапки, КадровыеДанныеСотрудника);
	
	СекцияШапка = Макет.ПолучитьОбласть("Шапка");
	СекцияШапка.Параметры.Заполнить(ПараметрыШапки);
	ТабличныйДокумент.Вывести(СекцияШапка);
КонецПроцедуры

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

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

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

Функция РазделитьПоШирине(Строка, Разделитель, МаксимальнаяШирина)
	МассивСтрок = Новый Массив;
	
	КоличествоСтрок = СтрЧислоСтрок(Строка);
	Для НомерСтроки = 1 По КоличествоСтрок Цикл
		Подстрока = СтрПолучитьСтроку(Строка, НомерСтроки);
		Пока СтрДлина(Подстрока) > МаксимальнаяШирина Цикл
			Позиция = СтрНайти(Подстрока, Разделитель, НаправлениеПоиска.СКонца, МаксимальнаяШирина);
			Если Позиция = 0 Тогда
				Позиция = СтрНайти(Подстрока, Разделитель, НаправлениеПоиска.СНачала, МаксимальнаяШирина);
				Если Позиция = 0 Тогда
					Прервать; // Неделимая строка.
				КонецЕсли;
			КонецЕсли;
			МассивСтрок.Добавить(Лев(Подстрока, Позиция));
			Подстрока = Сред(Подстрока, Позиция + 1);
		КонецЦикла;
		МассивСтрок.Добавить(Подстрока);
	КонецЦикла;
	
	Возврат МассивСтрок;
КонецФункции

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

Функция ПредставлениеПериодаОтсутствия(Пол, ДатаНачала, ДатаОкончания)
	Если Пол = Перечисления.ПолФизическогоЛица.Женский Тогда
		Представление = НСтр("ru = 'Не работала c [ДатаНачала] по [ДатаОкончания]'");
	Иначе
		Представление = НСтр("ru = 'Не работал c [ДатаНачала] по [ДатаОкончания]'");
	КонецЕсли;
	Представление = СтрЗаменить(Представление, "[ДатаНачала]", Формат(ДатаНачала, "ДЛФ=D"));
	Представление = СтрЗаменить(Представление, "[ДатаОкончания]", Формат(ДатаОкончания, "ДЛФ=D"));
	Возврат Представление;
КонецФункции

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

Функция ПредставлениеВозраста(ЧислоЛет, ЧислоМесяцев)
	Возврат ЗарплатаКадрыКлиентСервер.ПредставлениеВозраста(ЧислоЛет, ЧислоМесяцев);
КонецФункции

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

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

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

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

Функция ФормаМножественногоЧислаДней(КоличествоДней)
	
	Возврат ПерсонифицированныйУчет.ФормаМножественногоЧисла(НСтр("ru = ' календарный день'"), НСтр("ru = ' календарных дня'"), НСтр("ru = ' календарных дней'"), КоличествоДней);
	
КонецФункции

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

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

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

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

#Область ПФ_MXL_ДоплатаЗаДниНетрудоспособности

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

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

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

#Область ПФ_MXL_ЗаменаЛетРасчетногоПериода

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

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

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

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

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

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

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

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

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

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

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

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

#Область ПериодыУходаЗаДетьми

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#Область ТекущиеДела

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

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

#Область ЭЛН

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

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

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

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

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

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

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

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

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

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

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

Процедура ЗаполнитьПроцентОплатыИОграничениеПособия(Больничный) Экспорт
	Структура = УчетПособийСоциальногоСтрахования.ПроцентОплатыИОграничениеПособия(Больничный);
	ЗаполнитьЗначенияСвойств(Больничный, Структура);
КонецПроцедуры

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

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

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

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

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

Функция НеучтенныеИсключаемыеДаты(Больничный, Кэш)
	Значение = Кэш["НеучтенныеИсключаемыеДаты"];
	Если Значение <> Неопределено Тогда
		Возврат Значение;
	КонецЕсли;
	ДатыНачислений(Больничный, Кэш);
	Возврат Кэш["НеучтенныеИсключаемыеДаты"];
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

Функция ВыполнитьПакет(Запрос, КоличествоПоследнихТаблиц)
	РезультатыЗапроса = Запрос.ВыполнитьПакет();
	Пока РезультатыЗапроса.Количество() > КоличествоПоследнихТаблиц Цикл
		РезультатыЗапроса.Удалить(0);
	КонецЦикла;
	Возврат РезультатыЗапроса;
КонецФункции

Процедура УменьшитьОстаток(Остаток, Уменьшение)
	Остаток = Макс(Остаток - Уменьшение, 0);
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ЗаполнитьРассчетУтвержденИОтветственных() Экспорт
	
	
КонецПроцедуры

Процедура ЗаполнитьДатуНачалаПоловиннойОплаты(Документ) Экспорт
	Документ.ДатаНачалаПоловиннойОплаты = '00010101';
	
	Если Не ЗначениеЗаполнено(Документ.ДатаНачалаОплаты)
		И Не ЗначениеЗаполнено(Документ.ДатаОкончанияОплаты)  Тогда
		ДатаНачалаОплаты    = Документ.ДатаНачала;
		ДатаОкончанияОплаты = Документ.ДатаОкончания;
	Иначе
		ДатаНачалаОплаты    = Документ.ДатаНачалаОплаты;
		ДатаОкончанияОплаты = Документ.ДатаОкончанияОплаты;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(Документ.ДатаНачалаСобытия)
		Или Не ЗначениеЗаполнено(ДатаНачалаОплаты)
		Или Не ЗначениеЗаполнено(ДатаОкончанияОплаты)
		Или УчетПособийСоциальногоСтрахования.ИспользуетсяУсловиеИсчисления(Документ, "44")
		Или Не ИспользоватьПериодыУходаВШапке(Документ) Тогда
		Возврат;
	КонецЕсли;
	
	ДнейПолнойОплаты = УчетПособийСоциальногоСтрахования.ДнейПолнойОплатыПередПоловинной(
		Документ.СлучайУходаЗаБольнымРебенком,
		Документ.ДатаНачалаСобытия);
	Если ДнейПолнойОплаты = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ДатаНачалаПоловиннойОплаты = Документ.ДатаНачалаСобытия + ДнейПолнойОплаты * 86400;
	Если ДатаОкончанияОплаты < НачалоДня(ДатаНачалаПоловиннойОплаты) - 1 Тогда
		Возврат;
	КонецЕсли;
	
	Документ.ДатаНачалаПоловиннойОплаты = Макс(ДатаНачалаПоловиннойОплаты, ДатаНачалаОплаты);
	
КонецПроцедуры

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

#Область КадровыеДанные

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

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

Процедура ЗаполнитьУсловияИсчисления(Документ, КадровыеДанные) Экспорт
	
	Если ЗначениеЗаполнено(КадровыеДанные.ВидЗанятости)
		И ЗначениеЗаполнено(КадровыеДанные.ДатаУвольнения)
		И Документ.ДатаНачалаСобытия > КадровыеДанные.ДатаУвольнения
		И Не КадровыеДанные.ЕстьДоговорыГПХ Тогда
		УчетПособийСоциальногоСтрахования.УстановитьУсловиеИсчисления(Документ, "47");
	ИначеЕсли Не ЗначениеЗаполнено(КадровыеДанные.ВидЗанятости)
		И Не КадровыеДанные.ЕстьДоговорыГПХ Тогда 
		УчетПособийСоциальногоСтрахования.УстановитьУсловиеИсчисления(Документ, "47");
	Иначе
		УчетПособийСоциальногоСтрахования.УдалитьУсловиеИсчисления(Документ, "47");
	КонецЕсли;
	
	Если ЗначениеЗаполнено(КадровыеДанные.Инвалидность)
		И КадровыеДанные.Инвалидность Тогда
		УчетПособийСоциальногоСтрахования.УстановитьУсловиеИсчисления(Документ, "45");
	Иначе
		УчетПособийСоциальногоСтрахования.УдалитьУсловиеИсчисления(Документ, "45");
	КонецЕсли;
	
КонецПроцедуры

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

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

#Область Стаж

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

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

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

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

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

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

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

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

#Область СреднийЗаработок

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

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

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

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

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

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

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

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

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

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

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

Процедура ОтключитьНеприменимыеВариантыДоплаты(Документ, ВариантДоплаты = Неопределено) Экспорт
	Если ВариантДоплаты = Неопределено Тогда
		ВариантДоплаты = ВариантДоплаты(Документ);
	КонецЕсли;
	Если ВариантДоплаты <> 1 Тогда
		Документ.ДоплачиватьДоСреднегоЗаработка = Ложь;
		Документ.ПроцентДоплатыЗаДниНетрудоспособности = 0;
	КонецЕсли;
	Если ВариантДоплаты <> 2 Тогда
		Документ.ДоплачиватьДоДенежногоСодержания = Ложь;
	КонецЕсли;
КонецПроцедуры

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

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

#Область ПересеченияСОтпусками

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

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

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

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

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

#Область ПриостановленияТД

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

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

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

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

#Область Расчет

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// Устарела. Следует использовать СЭДОФСС.ЗаполнитьСсылкиРодственников.
Процедура ПриЗаполненииСсылокРодственников(Больничный, РодственникиЭЛН) Экспорт
	СЭДОФСС.ЗаполнитьСсылкиРодственников(Больничный.ФизическоеЛицо, РодственникиЭЛН);
КонецПроцедуры

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

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

#КонецЕсли

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