Изменение мест работы / Модуль объекта

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

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

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

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

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

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

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

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

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

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

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