Top.Mail.Ru

Регистры расчета в 1С для чайников(Часть 2)

В данной статье на примерах покажем принцип действия «механизма вытеснения по периоду действия«.

Для наглядности расчета Оклада добавим в структуру регистра расчета ресурс «ОтработаноЧасов» и реквизит «ЧасовПлан».

Следует понимать, что реквизиты регистра расчёта служат только для хранения справочных данных, ни в вытеснении, ни при получении базы для расчёта они не участвуют(мы не получаем базу для расчёта на основе реквизитов регистра расчета) поэтому «ЧасовПлан»(количество плановых рабочих часов в месяце) мы делаем реквизитом. На основе ресурсов регистра расчёта мы можем получать базу для расчета(скажем премии) поэтому «ОтработаноЧасов»(количество фактически отработанных работником часов в месяце) делаем ресурсом.

Будем заполнять добавленные поля при расчёте Оклада:

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

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

Перепроведём ранее созданный документ:

В движениях документа видно, что плановых часов в месяце 184, оклад сотрудника составляет 60000 рублей, отработанных часов в месяце 64, начисленная зарплата 20 869,57 рублей. Проверим, правильно ли рассчитался оклад: (60000/184) * 64 = 20 869,57 рублей.

В прошлой статье(см.Регистры расчета в 1С для чайников(Часть 1)) мы познакомились с виртуальной таблицей «ДанныеГрафика» регистра расчёта, сейчас изучим виртуальную таблицу «ФактическийПериодДействия«.

Виртуальная таблица «ФактическийПериодДействия» в результате выполнения запроса вернёт нам интервал(или интервалы т.к. их может быть несколько) времени на которых действовал вид расчёта Оклад.

Сформируем запрос к таблице «ФактическийПериодДействия» и выполним его в консоли запросов:

ВЫБРАТЬ
	ОсновныеНачисленияФактическийПериодДействия.ПериодРегистрации,
	ОсновныеНачисленияФактическийПериодДействия.Регистратор,
	ОсновныеНачисленияФактическийПериодДействия.НомерСтроки,
	ОсновныеНачисленияФактическийПериодДействия.ВидРасчета,
	ОсновныеНачисленияФактическийПериодДействия.ПериодДействия,
	ОсновныеНачисленияФактическийПериодДействия.ПериодДействияНачало,
	ОсновныеНачисленияФактическийПериодДействия.ПериодДействияКонец,
	ОсновныеНачисленияФактическийПериодДействия.Активность,
	ОсновныеНачисленияФактическийПериодДействия.Сторно,
	ОсновныеНачисленияФактическийПериодДействия.Сотрудник,
	ОсновныеНачисленияФактическийПериодДействия.Сумма,
	ОсновныеНачисленияФактическийПериодДействия.ОтработаноЧасов,
	ОсновныеНачисленияФактическийПериодДействия.График,
	ОсновныеНачисленияФактическийПериодДействия.Параметр,
	ОсновныеНачисленияФактическийПериодДействия.ЧасовПлан
ИЗ
	РегистрРасчета.ОсновныеНачисления.ФактическийПериодДействия(
			Регистратор = &РегистраторДок
				И ВидРасчета = &Оклад) КАК ОсновныеНачисленияФактическийПериодДействия

В качестве параметра «РегистраторДок» укажем ссылку на наш документ «Начисление зарплаты», в качестве параметра «Оклад» укажем вид расчёта «Оклад».

Результат выполнения запроса представлен ниже:

Как мы видим результат запроса выдал 1 строку с видом расчета «Оклад» и полями: «ПериодДействияНачало» равным 01.03.17, «ПериодДействияКонец» равным 10.03.17, «ОтработаноЧасов» равным 64. Таблица «ФактическийПериодДействия» вернула нам интервал действия вида расчёта Оклад до вытеснения командировкой.

Введём в плане видов расчёта «Основные начисления» новый вид расчёта «Командировка», командировка будет вытеснять «Оклад» по периоду действия.

В качестве вытесняющих видов расчёта для вида расчёта «Оклад» укажем вид расчёта «Командировка».

Дополним обработку проведения документа «Начисление зарплаты», для вида расчёта «Командировка» сразу же будем начислять фиксированную сумму:

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

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

Добавим в существующем документе вид расчёта командировка c 03.03.2017 по 05.03.2017 для сотрудника Иванов. Проведём документ.

В движениях документа видим 2 записи — по окладу и командировке.

По командировке сразу же начислена фиксированная сумма 5000 рублей. Так же мы видим, что поле «Отработано часов» по окладу также уменьшилось(было 64 часа, стало 56 часов). Произошло вытеснение вида расчёта «Оклад» видом расчёта «Командировка» по периоду действия т.к. период действия командировки расположен на периоде действия оклада и командировка имеет больший, чем оклад приоритет.

Примечание: Вытесняющий и вытесняемый виды расчетов должны принадлежать одному плану видов расчёта и обладать протяжённостью во времени. Механизм вытеснения не имеет смысла для видов расчётов не протяжённых во времени.

Командировкой был вытеснен 1 рабочий день(03.03.2017) вместо 3(03.03.2017-05.03.2017) так как даты 04.03.2017 и 05.03.2017 являются выходными днями исходя из графика работы.

Сформируем запрос к таблице «ФактическийПериодДействия» и выполним его в консоли запросов, мы получим результат после вытеснения оклада командировкой:

В результате выполнения запроса мы получили 2 записи по виду расчёта Оклад, 1 запись с периодом действия 01.03.2017-02.03.2017, 2 запись с периодом действия 06.03.2017-10.03.2017. Между этими 2 записями и действует вид расчёта «Командировка». P.S. Все остальные поля виртуальной таблицы «ФактическийПериодДействия» полностью аналогичны физической таблице регистра расчёта «Основные начисления».

 

 

Продолжение тут Регистры расчета в 1С для чайников(Часть 3)

 

 

 

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar