Физические лица / Форма редактирования процента северной надбавки / Модуль формы

файл

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

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

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

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

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


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

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

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

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

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

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

&НаКлиенте
Процедура ДатаПриемаПриИзменении(Элемент)
	
	НаборЗаписейСеверногоСтажа[0].ДатаОтсчета = ДатаПриема;
	ПриИзмененииСтажа();
	
КонецПроцедуры

&НаКлиенте
Процедура ЛетСтажаПриИзменении(Элемент)
	
	НаборЗаписейСеверногоСтажа[0].Лет = ЛетСтажа;
	ПриИзмененииСтажа();
	
КонецПроцедуры

&НаКлиенте
Процедура МесяцевСтажаПриИзменении(Элемент)
	
	НаборЗаписейСеверногоСтажа[0].РазмерМесяцев = МесяцевСтажа;
	ПриИзмененииСтажа();
	
КонецПроцедуры

&НаКлиенте
Процедура ДнейСтажаПриИзменении(Элемент)
	
	НаборЗаписейСеверногоСтажа[0].РазмерДней = ДнейСтажа;
	ПриИзмененииСтажа();
	
КонецПроцедуры

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


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

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

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

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

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

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

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

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


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

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

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

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


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

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

&НаКлиенте
Процедура Отмена(Команда)
	
	Модифицированность = Ложь;
	Закрыть();
	
КонецПроцедуры

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

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


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

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

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

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

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

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

&НаСервере
Процедура УстановитьДоступностьЭлементовФормы()

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

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

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

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

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

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

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

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

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

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

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