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

файл

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

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

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

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

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

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

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

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

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыСведенияОСтажах

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура Ок(Команда)
	
	СохранитьИЗакрытьНаКлиенте();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура СохранитьИЗакрыть(Результат, ДополнительныеПараметры) Экспорт 
	
	СохранитьИЗакрытьНаКлиенте();
	
КонецПроцедуры

&НаКлиенте
Процедура СохранитьИЗакрытьНаКлиенте(ЗакрытьФорму = Истина) Экспорт

	Если Не ТолькоПросмотр Тогда
		ТекущийЭлемент = Элементы.ФормаОк;
	КонецЕсли;
	
	Отказ = Ложь;

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

&НаКлиенте
Процедура ПослеСохраненияНаКлиенте()
	
	ПослеСохраненияНаСервере();
	
КонецПроцедуры

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

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

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

&НаСервере
Процедура УстановитьПредставлениеПроцентаСевернойНадбавки()
	
	ФизическоеЛицоПроцентСевернойНадбавкиТекст = СотрудникиФормыРасширенный.ПредставлениеПроцентаСевернойНадбавки(ФизическоеЛицоСсылка);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ИмпортСТДРЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат <> Неопределено Тогда
		ЗаполнитьТрудовуюДеятельностьПоДаннымФайла(Результат);
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиентеНаСервереБезКонтекста
Процедура ПроинициализироватьНовуюСтрокуТрудовойДеятельности(СтрокаТрудоваяДеятельностьФизическихЛиц, ФизическоеЛицоСсылка)
	
	СтрокаТрудоваяДеятельностьФизическихЛиц.ФизическоеЛицо = ФизическоеЛицоСсылка;
	СтрокаТрудоваяДеятельностьФизическихЛиц.ИдентификаторЗаписи = Новый УникальныйИдентификатор;
	
КонецПроцедуры

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

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