Сотрудники / Модуль объекта

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

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

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

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

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

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

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

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

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

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

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

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

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

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