Назначение подработки / Модуль объекта

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

		ДанныеДляПроведения.Вставить("ЗначенияПоказателей", ЗначенияПоказателей);

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

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

// Возвращает Строку:
//	НаименованиеКраткое из должности + Количество подработок с таким же кратким наименованием.
//
Функция УточнениеНаименованияПодработки() Экспорт
	
	Если ДополнительныеСвойства.Свойство("УточнениеНаименования") Тогда
		Возврат ДополнительныеСвойства.УточнениеНаименования;
	КонецЕсли;

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

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

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

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