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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#Область ЗаполнениеИРасчет	

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

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

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

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

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

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

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

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

Процедура ОбновитьДанныеДляРасчетаСреднего(ПараметрыРасчета)
	
	УстановитьПривилегированныйРежим(Истина);
	
	ЭтотОбъект.ДанныеОбИндексации.Очистить();
	ЭтотОбъект.ОтработанноеВремяДляСреднегоОбщий.Очистить();
	ЭтотОбъект.СреднийЗаработокОбщий.Очистить();

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

	ПараметрыРасчета.ЗаполнениеВыполнено = Истина;
	
КонецПроцедуры	

Процедура ОбновитьДанныеДляРасчетаСохраняемогоДенежногоСодержания()
	УстановитьПривилегированныйРежим(Истина);

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

	РассчитатьСреднийЗаработок();
	
КонецПроцедуры

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

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

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

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

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

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

Процедура ДанныеОбъектаВДанныеМенеджераРасчета(МенеджерРасчета)

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

Функция НачатьНовуюТранзакцию()
	Если ТранзакцияАктивна() Тогда
		Возврат Ложь;
	Иначе
		НачатьТранзакцию();
		Возврат Истина;
	КонецЕсли;		
КонецФункции

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

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

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

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