Кадровый перевод списком / Модуль объекта

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

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

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

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

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	
	Документы.КадровыйПеревод.ОбработкаПроведения(ЭтотОбъект, Отказ, РежимПроведения);
	
КонецПроцедуры

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

Процедура ОбработкаУдаленияПроведения(Отказ)
	
	Документы.КадровыйПеревод.ОбработкаУдаленияПроведения(ЭтотОбъект, Отказ);
	
КонецПроцедуры

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

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

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

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

#Область ОбменДанными

Функция СовместноРегистрируемыеОбъекты() Экспорт
	Возврат Сотрудники.ВыгрузитьКолонку("Сотрудник");
КонецФункции

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

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

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

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

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

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

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