Отмена совмещения / Модуль объекта

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

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

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

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

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

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

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

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

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

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

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

	Организация = РеквизитыДокументаОснования.Организация;
	СовмещающийСотрудник = РеквизитыДокументаОснования.СовмещающийСотрудник;
	ДокументОснование = ДокументОснование;	
	Начисление = РеквизитыДокументаОснования.Начисление;

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

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

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

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