Материальная помощь / Модуль объекта

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

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

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

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

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

Процедура ОбработкаУдаленияПроведения(Отказ)
	
	ПерерасчетЗарплаты.УдалитьПерерасчетыПоРегистратору(Ссылка);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ЗаполнитьПерерасчеты(МенеджерРасчета, СотрудникиОтбора, ПараметрыРасчета) Экспорт
	
	Сотрудники = ПараметрыРасчета.Сотрудники;

	Если ИсправлениеДокументовРасчетЗарплаты.ДоначисленияРазрешены(МенеджерРасчета) Тогда
		
		ИсходныеДанныеДляПерерасчета = ИсправлениеРасчетовБЗК.ИсходныеДанныеДляПерерасчетаИзРезультатаРасчета(МенеджерРасчета.Зарплата.Начисления);

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

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

	ОписаниеДокумента = Документы.МатериальнаяПомощь.ОписаниеДокумента();
	ОписаниеТаблицы = Документы.МатериальнаяПомощь.ОписаниеТаблицыНачислений(РегистрацияНачисленийДоступна);
	ИдентификаторыСтрок = Новый Массив;

	Отбор = Новый Структура("Сотрудник");
	ОтборПоказателей = Новый Структура("ИдентификаторСтрокиВидаРасчета");

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

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

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

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

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

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

Процедура ЗаполнитьПланируемуюДатуВыплаты() Экспорт  
	ПланируемаяДатаВыплаты = ПолучитьПланируемуюДатуВыплаты(); 
КонецПроцедуры

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

	ПланируемаяДатаВыплаты = РасчетЗарплатыРасширенный.ПланируемаяДатаВыплатыЗарплатыПоНастройкамПоПорядкуВыплаты(
		ПараметрыПолученияДатыВыплаты);
	
	Возврат ПланируемаяДатаВыплаты;
	
КонецФункции

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

			КонецЦикла;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

Процедура ДанныеОбъектаВДанныеМенеджераРасчета(МенеджерРасчета, ПараметрыРасчета, Отбор = Неопределено, ПозицииВставки = Неопределено) Экспорт
	
	ДокументыРазовыхНачисленийФормы.ПередПомещениемДанныхФормыВМенеджерРасчета(ЭтотОбъект);

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

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

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

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

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

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

#Область РезультатыРасчетовВДанныеОбъекта

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

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

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

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

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

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

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

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

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

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