Увольнение списком / Модуль объекта

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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