Простой, отстранение от работы / Модуль объекта

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

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

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

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

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

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

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

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

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

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

#Область ПроверкаЗаполненияДокумента

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

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

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

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

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

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

Процедура ПроверитьПересечениеПериодовОтсутствия(Отказ)
		
	РезультатПроверки = РезультатПроверкиПересеченийПериодовОтсутствия();
	
	Если РезультатПроверки.ДанныеСотрудников.Количество() = 0 Тогда 
		Возврат;
	КонецЕсли;
	
	Если РезультатПроверки.Отказ Тогда
		Для Каждого ДанныеСотрудника Из РезультатПроверки.ДанныеСотрудников Цикл 
			ТекстСообщения = НСтр("ru = 'На период %1 сотруднику %2 уже зарегистрирован простой документом %3.'");
			ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ДанныеСотрудника.Значение.ПредставлениеПериода, ДанныеСотрудника.Ключ, ДанныеСотрудника.Значение.Регистратор);
			ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, , , , Отказ);
		КонецЦикла;
		Возврат;
	КонецЕсли;
	
КонецПроцедуры

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

Процедура ПроверитьПрименениеРКиСНДляОрганизацииДокумента(ПроверяемыеРеквизиты) 

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

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

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

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

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