Больничный лист / Модуль объекта

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ПроверитьПоКадровымДаннымСотрудника(Отказ)
	Если Не ЗначениеЗаполнено(Сотрудник) Тогда
		ФизическоеЛицо = Неопределено;
		Возврат;
	КонецЕсли;
	Если Не ЗначениеЗаполнено(ДатаНачалаСобытия) Тогда
		Возврат;
	КонецЕсли;
	УстановитьПривилегированныйРежим(Истина);
	ИменаПолей = "ФизическоеЛицо, ВидЗанятости, ДатаНачала, ДатаОкончания, ДатаУвольнения";
	Если Не ЗначениеЗаполнено(Дата) Тогда
		Дата = ТекущаяДатаСеанса();
	КонецЕсли;
	ДатаСреза = ?(ЗначениеЗаполнено(ДатаНачалаСобытия), ДатаНачалаСобытия, Дата);
	КадровыеДанные = КадровыйУчет.КадровыеДанныеСотрудника(Ложь, Сотрудник, ИменаПолей, ДатаСреза);
	Если КадровыеДанные = Неопределено Тогда
		КадровыеДанные = Новый Структура(ИменаПолей);
	КонецЕсли;
	
	ФизическоеЛицо = КадровыеДанные.ФизическоеЛицо;
	
	ОсновнойСотрудникВоеннослужащий = Ложь;
	Если ОбщегоНазначения.ПодсистемаСуществует("ЗарплатаКадрыПриложения.ГосударственнаяСлужба") Тогда
		ДанныеОсновногоСотрудника = КадровыйУчет.КадровыеДанныеОсновногоСотрудникаФизическогоЛица(
			Организация, ФизическоеЛицо, "ВидДоговора", ДатаНачалаСобытия, Ложь);
		ОсновнойСотрудникВоеннослужащий = ДанныеОсновногоСотрудника <> Неопределено
			И Перечисления.ВидыДоговоровССотрудниками.ЭтоДоговорВоеннослужащего(ДанныеОсновногоСотрудника.ВидДоговора);
	КонецЕсли;
	
	Если КадровыеДанные.ВидЗанятости <> Перечисления.ВидыЗанятости.ОсновноеМестоРаботы
		И КадровыеДанные.ВидЗанятости <> Перечисления.ВидыЗанятости.Совместительство
		И Не ОсновнойСотрудникВоеннослужащий И Не КадровыйУчет.ЕстьДоговорыГПХ(ФизическоеЛицо, Организация) Тогда
		Текст = НСтр("ru = 'Выбран сотрудник с неверным видом занятости.
			|Следует выбрать сотрудника по основному месту работы, или внешнему совместительству.'");
		СообщенияБЗК.СообщитьОбОшибкеВОбъекте(Отказ, ЭтотОбъект, Текст, "Сотрудник");
	КонецЕсли;
	
	Если КодПричиныНетрудоспособности <> "11" И Не УчетПособийСоциальногоСтрахования.ИспользуетсяУсловиеИсчисления(ЭтотОбъект, "46") Тогда
		ТекстОшибки = "";
		Если Не ЗначениеЗаполнено(КадровыеДанные.ДатаНачала) Тогда
			Договор = СЭДОФСС.ДоговорФизлицаНаДатуСобытия(Организация, ФизическоеЛицо, ДатаСреза);
			Если Договор <> Неопределено
				И ЗначениеЗаполнено(Договор.Начало)
				И ЗначениеЗаполнено(Договор.Окончание)
				И Договор.Окончание <= ДобавитьМесяц(Договор.Начало, 6) Тогда
				ТекстОшибки = НСтр("ru = 'ERR_PR_1007: У сотрудника договор менее 6 месяцев необходимо заполнить условия исчисления: код 46'");
			КонецЕсли;
		ИначеЕсли ЗначениеЗаполнено(КадровыеДанные.ДатаНачала) И ЗначениеЗаполнено(КадровыеДанные.ДатаОкончания) Тогда
			Если (ДатаСреза <= КадровыеДанные.ДатаОкончания И КадровыеДанные.ДатаОкончания <= ДобавитьМесяц(КадровыеДанные.ДатаНачала, 6))
					Или (ДатаСреза > КадровыеДанные.ДатаОкончания И (ЗначениеЗаполнено(КадровыеДанные.ДатаУвольнения)
						И КадровыеДанные.ДатаОкончания >= КадровыеДанные.ДатаУвольнения)) Тогда
				ТекстОшибки = НСтр("ru = 'ERR_PR_1007: У сотрудника трудовой договор менее 6 месяцев необходимо заполнить условия исчисления: код 46'");
			КонецЕсли;
		КонецЕсли;
		Если ТекстОшибки <> "" Тогда
			Если Не ЗначениеЗаполнено(УсловияИсчисленияКод1) Тогда
				СообщенияБЗК.СообщитьОбОшибкеВОбъекте(Отказ, ЭтотОбъект, ТекстОшибки, "УсловияИсчисленияКод1");
			ИначеЕсли Не ЗначениеЗаполнено(УсловияИсчисленияКод2) Тогда
				СообщенияБЗК.СообщитьОбОшибкеВОбъекте(Отказ, ЭтотОбъект, ТекстОшибки, "УсловияИсчисленияКод2");
			Иначе
				СообщенияБЗК.СообщитьОбОшибкеВОбъекте(Отказ, ЭтотОбъект, ТекстОшибки, "УсловияИсчисленияКод3");
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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