Доплата до оклада при командировках. ЗУП 2.5

Программирование - Практика программирования

7
Продолжаю серию статей.
Сегодня речь пойдет о внесении изменений в конфигурации ЗУП 2.5/УПП/КА1.1, для организации ДОПЛАТЫ ДО ОКЛАДА при расчете командировки сотруднику.

Задача:

Согласно утвержденных положений в нашем предприятии, сотруднику, направленного в  командировку, ему должна осуществляется доплата по полного оклада с учётом районного коэффициента и северной надбавки. Доплата должна отражаться в листке начислений сотруднику отдельной строкой. Не должна включаться в расчет среднего заработка в следующих оплатах по среднему (это идет в разрез с мнением 1С и некоторых комментариев финансистов, но наши юристы/аудиторы абсолютно уверены что так правильно - это тема для отдельного холивара).
Исследуя задачу доплаты, мне не удалось решить ее без конфигурирования, более того, хотелось увидеть доплату сразу в документе "оплата по среднему заработку", но там нельзя указать одновременно два вида начисления.

Что создаем план работ.

План:

1. Создаем отдельное начисление в основных начислениях организаций.
2. Добавляем на форму документа "Оплата по среднему заработку" поле с выбором вида доплаты.
3. При расчете начислений в документе "Оплата по среднему заработку" добавляем вторую запись в начисления - "Доплата до оклада".
4. Проверяем листок начислений сотрудника, отражения сумм доплаты в 6-НДФЛ, 4-ФСС

После дискуссий с кадровиками и расчетчиками было ясно, что доплаты могут бать в дальнейшем различные, более того, они назначаются не всем сотрудникам в командировках. Ну и конечно изменения не должны затронуть расчеты за более старые периоды, даже в случае их пересчета.

Было принято решение создать в документе дополнительное поле с видом расчета, в случае заполнение которого, будет производится расчет доплаты по выбранному методу.

Выполнение:

Снимаем с поддержки корень документа "ОплатаПоСреднемуЗаработку" добавляем в шапку новый реквизит "ИТ_ВидРасчетаДоплата" с типом "ПланВидовРасчетаСсылка.ОсновныеНачисленияОрганизаций".

Заходим в модуль документа и находим экспортную процедуру "СформироватьДвиженияПоНачислениям",  она формирует записи регистра "ОсновныеНачисленияРаботниковОрганизаций" по данным шапки документа. Перед строкой "ТекущаяДатаНачала = ТекущаяДатаОкончания + 1;" продублируем код по добавлению записи в набор начислений сотруднику, в случае выбора вида начисления в поле "ИТ_ВидРасчетаДоплата".

Код в результате выглядит так:
 

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

		// Реквизиты
		Движение.Показатель1				= ВыборкаПоШапкеДокумента.ПроцентОплаты;
		Движение.ПодразделениеОрганизации	= ВыборкаПоШапкеДокумента.ПодразделениеОрганизации;
		Движение.ОбособленноеПодразделение	= ВыборкаПоШапкеДокумента.ОбособленноеПодразделение;
		
		Если МесяцыРасчетаВремениПоТабелю.Найти(НачалоМесяца(ТекущаяДатаНачала)) = Неопределено Тогда
			Движение.ГрафикРаботы			= ВыборкаПоШапкеДокумента.ГрафикРаботы;
		Иначе
			Движение.ГрафикРаботы			= ВыборкаПоШапкеДокумента.Сотрудник;
		КонецЕсли; 
		
		Движение.ВидУчетаВремени			= ВидУчетаВремени;
		Движение.ПериодРасчетаСреднегоЗаработкаНачало	= ВыборкаПоШапкеДокумента.ПериодРасчетаСреднегоЗаработкаНачало;
		Движение.ПериодРасчетаСреднегоЗаработкаОкончание= ВыборкаПоШапкеДокумента.ПериодРасчетаСреднегоЗаработкаОкончание;
		Движение.ДатаНачалаСобытия			= ВыборкаПоШапкеДокумента.ДатаНачалаСобытия;
		Движение.Авторасчет					= Истина;
		
		//++ ИТ:Дима ************* НАЧАЛО: ЭТО ДОБАВЛЕННЫЙ КОД ДЛЯ ОТРАЖЕНИЯ ВТОРОГО НАЧИСЛЕНИЯ ***********
		Если НЕ ИТ_ВидРасчетаДоплата.Пустая() Тогда
			// строка движений
			Движение = НаборОсновныеНачисления.Добавить();
			
			// Свойства
			Движение.ПериодРегистрации			= ПериодРегистрации;
			Движение.ПериодДействияНачало		= НачалоДня(ТекущаяДатаНачала);
			Движение.ПериодДействияКонец		= КонецДня(ТекущаяДатаОкончания);
			Движение.ВидРасчета					= ИТ_ВидРасчетаДоплата;
			
			// Измерения
			Движение.Сотрудник					= ВыборкаПоШапкеДокумента.Сотрудник;
			Движение.ФизЛицо					= ВыборкаПоШапкеДокумента.ФизЛицо;
			Движение.Организация				= ВыборкаПоШапкеДокумента.ГоловнаяОрганизация;

			// Реквизиты
			Движение.Показатель1				= ВыборкаПоШапкеДокумента.ПроцентОплаты;
			Движение.ПодразделениеОрганизации	= ВыборкаПоШапкеДокумента.ПодразделениеОрганизации;
			Движение.ОбособленноеПодразделение	= ВыборкаПоШапкеДокумента.ОбособленноеПодразделение;
			
			Если МесяцыРасчетаВремениПоТабелю.Найти(НачалоМесяца(ТекущаяДатаНачала)) = Неопределено Тогда
				Движение.ГрафикРаботы			= ВыборкаПоШапкеДокумента.ГрафикРаботы;
			Иначе
				Движение.ГрафикРаботы			= ВыборкаПоШапкеДокумента.Сотрудник;
			КонецЕсли; 
			
			Движение.ВидУчетаВремени			= ВидУчетаВремени;
			Движение.ПериодРасчетаСреднегоЗаработкаНачало	= ВыборкаПоШапкеДокумента.ПериодРасчетаСреднегоЗаработкаНачало;
			Движение.ПериодРасчетаСреднегоЗаработкаОкончание= ВыборкаПоШапкеДокумента.ПериодРасчетаСреднегоЗаработкаОкончание;
			Движение.ДатаНачалаСобытия			= ВыборкаПоШапкеДокумента.ДатаНачалаСобытия;
			Движение.Авторасчет					= Истина;
			
		КонецЕсли;
		//-- ИТ:Дима   ************* КОНЕЦ: ЭТО ДОБАВЛЕННЫЙ КОД ДЛЯ ОТРАЖЕНИЯ ВТОРОГО НАЧИСЛЕНИЯ ***********
		
		ТекущаяДатаНачала = ТекущаяДатаОкончания + 1;
		ТекущаяДатаОкончания = Мин(КонецМесяца(ТекущаяДатаНачала), ДатаОкончания);	
		
		
	КонецЦикла;

КонецПроцедуры // СформироватьДвиженияПоНачислениям()


Вывод на форму поля "ИТ_ВидРасчетаДоплата" можно произвести непосредственно в конфигураторе.
Но поскольку мы используем механизм программирования форм документов, добавлю просто код в свой общий модуль ИТ_РаботаСДиалогами.

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

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

Форма будет выглядеть так:
Пример формы оплаты по среднему

Теперь приступим к описанию и созданию самого вида расчета "Доплата до оклада".

Поскольку для правильного расчета доплаты до оклада нужно несколько расчетных баз начисления (оклад, РК, СН, оплата по среднему), использовать стандартный способ расчета "Произвольная формула расчета" не возможно.

Тут ест два способа решений:

  1. Использовать любой стандартный способ расчета (например тот же "произвольная формула расчета") и перехватить нужный нам расчет, например по названию.
  2. Я выбрал путь, более кардинальный, создал совсем свой способы расчета, с ним и буду дальше работать

Снимаем с поддержки перечисление "СпособыРасчетаОплатыТруда" и добавляем новый способ "ИТ_ДоплатаДоОклада"

Снимаем с поддержки форму вида расчета. Прописываем наш новый вид расчета в необходимых переменных.

	// используем для показа одной из закладок Прочее 
	РасчетИмеетБазовыеНачисления = СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.Процентом 
				//...
				Или СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ИТ_ДоплатаДоОклада; //++ ИТ:Дима
	// используем для показа нужной страницы панели ПанельРасчеты
	ЭтоРасчетПоСреднемуЗаработку = СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ПоСреднемуЗаработку 
				//...							
                             Или СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ИТ_ДоплатаДоОклада;//++ ИТ:Дима			
		ЭтоВторичноеНачисление = СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.Процентом 
				//...
				ИЛИ СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ИТ_ДоплатаДоОклада; //++ ИТ:Дима
			ЭтоРасчетПоСреднемуЗаработку = СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ПоСреднемуЗаработку 
			//...
			ИЛИ СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ИТ_ДоплатаДоОклада;//++ ИТ:Дима
	РасчетИмеетБазовыеНачисления = СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.Процентом 
					//...
					ИЛИ СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ИТ_ДоплатаДоОклада; //++ ИТ:Дима

Очень странно что программисты 1С раскидали эти переменные по всему модулю формы. Куда лучше и изящней было бы создать функцию для получения сразу всех этих переменных в виде структуры к конкретному виду расчета. Надеюсь тому программисту зачтется такая халатность перед небесным судом.

Переходим непосредственно к перехвату расчета основных начислений сотрудника.

Тут спасибо 1С, нам предоставили специальный общий модуль "ПроведениеРасчетовПереопределяемый". Снимаем его с поддержки.

Несколько переменных нужно предварительно поправить для авто расчета показателей в дальнейшем.

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

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

	 СписокСпособов.Добавить(Перечисления.СпособыРасчетаОплатыТруда.ДоначислениеПоУправленческомуУчету);
	 СписокСпособов.Добавить(Перечисления.СпособыРасчетаОплатыТруда.ИТ_ДоплатаДоОклада); //++ ИТ:Дима
	 Возврат СписокСпособов

КонецФункции // ДополнитьСписокОсновныхВариантовНачисленийОрганизации()
Функция ПолучитьСписокСпособовРасчетаНеТребующихУказанияВалюты() Экспорт
//...
	СписокСпособов.Добавить(Перечисления.СпособыРасчетаОплатыТруда.ИТ_ДоплатаДоОклада);  //++ ИТ:Дима
	
	Возврат СписокСпособов;
	
КонецФункции 
Функция ПолучитьОписаниеДополнительногоСпособа(СпособРасчета, Режим) Экспорт
	
	СтрокаФормулы = "";
	
	Если  СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ДоначислениеПоУправленческомуУчету Тогда
		Если Режим = "Текст" Тогда
			СтрокаФормулы = "<От обратного>";
		Иначе
			СтрокаФормулы = "
							|Результат = <FONT color=#0000ff>От обратного</FONT>"
		КонецЕсли;
	ИначеЕсли  СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ИТ_ДоплатаДоОклада Тогда          //++ ИТ:Дима
		Если Режим = "Текст" Тогда
			СтрокаФормулы = "Макс((Оклад по дням * Районный коэффициент * Северная надбавка / Норма времени в днях * Время в днях)- Расчетная база,0)";
		Иначе
			СтрокаФормулы = "
							|Результат = <FONT color=#0000ff>Макс((Оклад по дням  * Районный коэффициент * Северная надбавка / Норма времени в днях * Время в днях)- Расчетная база,0)</FONT>"
		КонецЕсли;    //-- ИТ:Дима
	КонецЕсли;
	
    Возврат СтрокаФормулы;	
	
КонецФункции // ПолучитьОписаниеДополнительногоСпособа()


Находим сакральную процедуру ЗУПа "РассчитатьЗаписиНабора"

Добавляем наш способ расчета в необходимость расчета времени, благодаря этому, стандартный механизм сам нам рассчитает оплачиваемое время и нормативы  рабочего времени 

				БылоСообщениеОРабочемВремени = (
					СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ПоСреднемуЗаработку или 
//...
					СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ИТ_ДоплатаДоОклада или //++ ИТ:Дима
					СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ДоплатаЗаНочныеЧасы); 


Ну и добавляем непосредственно сам расчет доплаты.
Его нужно добавить в следующий раздел кода:
 

	// расчет будем проводить только для авторассчитываемой записи
	Если СтрокаДвижений.Авторасчет Тогда
             //...
		// Процентом и от стажа процентом
		//	
		Если ПроведениеРасчетов.ПолучитьСписокНачисленийПроцентом().Найти(СпособРасчета) <> НеОпределено Тогда
                //...
		ИначеЕсли СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ПроизвольнаяФормула Тогда 
                //...

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

Обратите внимание, что оклад, районный коэффициент, и северная надбавка берется на начало периода доплаты (командировки).
Кстати о северной надбавке, 1С при получении ставки северной надбавки для сотрудника самостоятельно не проверяет количество лет работы в районах крайнего севера, вместо этого ждет, когда кадровик в сведениях о стаже работы на севере руками внесет новый процент надбавки. Я также не стал рассчитывать, а просто взял текущую ставку.

Вы можете изменить код расчета так, как вам захочется.

Сохраняем конфигурацию и запускаем 1С для настройки.

Создаем в списке основных начислений организации новый элемент плана вида расчета. Заполняем как указано ниже.

Доплата до оклада 1 лист плана

Доплата до оклада 2 лист плана

Доплата до оклада 3 лист плана

Доплата до оклада 5 лист плана

Доплата до оклада 6 лист плана

Доплата до оклада 8 лист плана

В расчет средней заработной платы данный вид начислений не включаем. Это требование наших аудиторов.
Напомню, что судя по ИТС 1С думает по-другому, они включают доплаты в расчет по среднему.

Не вносим в средний заработок.

Проверяем.

Создаем документ Оплата по среднему заработку.
Если не указан вид расчета доплаты, все считается по старому.

Без доплаты до оклада

А если указать вид доплаты, производится расчет доплаты в закладке "Оплата".

Доплата до оклада
 

При этом, как и оплата по среднему, доплата до оклада осуществляется только в рабочие дни командировки.
Если дни в пути попадают на выходные дни, отдельная выплата в двойном размере производится уже через документ "Оплата праздничных и выходных дней организаций".

Формируем расчетный листок.

Расчетный листок

Видим доплату отдельной строкой.
Перепроверяем расчет:
Оклад сотрудника = 40250 руб.
Районный коэффициент для Красноярска = 30%
Северная надбавка (группа 4) месяцев 101 = 30%

Расчетный оклад = 40250+( 40250*(30+30)/100) = 64400

Размер оклада за один рабочий день в мае = 64400/20=3220

За три рабочих дня командировки должен получить по окладу = 3220* 3 =9660
Фактически оплачено по средней зарплате = 6767,67
Требуется доплатить 9660-6767,67 = 2892,33
НДФЛ: (80500все выплаты за месяц-1400вычет)*0,13 = 10283

Готово.

Пример для реализации доплаты до оклада в ЗУП 3.0 доступен для подписчиков ИТС.

7

См. также

Комментарии
Сортировка: Древо
1. Craig 188 10.06.18 15:31 Сейчас в теме
Статья очень интересная, рассмотрен действительно актуальный вопрос и самое главное грамотное решение. Но зачем на конфигурации Зуп 2.5? Данная конфигурация уже снята с поддержки, в ближайшее будущее и ЗУП КОРП снимут с поддержки. По моему мнению, статьи на ЗУП 3 были бы более актуальные.
3. dima_home 100 11.06.18 10:25 Сейчас в теме
(1)Поскольку я работаю на компанию, и продукт моего труда принадлежит компании, считаю возможным поделится с 1С сообществом только с теми работами, которые уже не являются "НО ХАУ" нашей компании или же могут сподвигнуть саму 1С на реализацию некоторых идей в 1С.

Например, модуль по проверке контрагентов в ИНН мы писали еще на базе 7.7 комплексная конфигурация, правда список "плохих" ИНН нам давала сама ФНС (ранее она называлась ИМНС) как крупнейшему налогоплательщику в виде тестового файла. Появление в дальнейшем этого функционала в стандартных конфигурациях 1С сильно нас обрадовало.
2. dima_home 100 11.06.18 09:15 Сейчас в теме
Для зарплаты: ЗУП 2.5 = УПП = КА1.1

Многие крупные компании когда-то вложили много денег на внедрении УПП, и теперь не готовы, по желанию 1С, вдруг перебираться на сырые новые продукты. Если ЗУП 3 и БУХ 3 уже более менее проработано, то ЕРП крайне проблемная при внедрении конфигурация.
Ну сами подумайте, компаний приобрела когда-то УПП, Приняла штат программистов, 5 лет изменяла и доводила до совершенства бизнес процессы и конфигурацию и вдруг вам говорят, мы прекращаем поддержку, делайте все заново в нашей новой версии 1С. Все эти заявления о прекращении поддержки это лозунги для франчайзи - до сих пор с приходят новые формы отчетности для бух 7.7.

И второй очень важный аспект (попытаюсь сформулировать): новые продукты компания "1С" создает для бизнес процессов, идеально соответствующих действующему законодательству, тогда как крупные компании имеют бизнес процессы "не описывающиеся законодательными актами". Чего стоит потеря флажков "БУХ/УПР/НАЛ". Да и сложность переработки конфигурации возросло многократно, и особенно при применении функционального программирования. Если сомневаетесь, зайдите в свою конфигурацию ЗУП и посмотрите сколько там объектов со словом "УДАЛИТЬ" или "НЕ ИСПОЛЬЗУЕТСЯ", сами поймете что продукт еще сильно перерабатывается.

Например: На внедрение расчета зарплаты для производства, где премиальный фонд по компании распределяется на зарплаты работников пропорционально выпущенной продукции за время работы по станками/группами станков/цехами/обслуживающиммы потратили три месяца. В ЕРП, где предусмотрен только расчет сдельной зарплаты по конкретным тарифам в маршрутной карте продукции, внедрение наших бизнес процессов длится уже 6 месяцев...и у руководства не раз возникал соблазн бросить этот процесс и сменить свою мотивацию сотрудников на такой, который есть в ЕРП. Вот вам и внедрение новых продуктов.
Хотя ЗУП 3 сам по себе очень хорош, многое можно сделать вообще без конфигурирования.
4. Craig 188 14.06.18 08:33 Сейчас в теме
(2) Моя компания занимается внедрением 1С: ЕРП на средних и крупных заводах. Я не по наслышке знаю, с какими сложностями приходится столкнуться при запуске. Особенно с изменениями бизнес-процессов. Я не буду расписывать плюсы и минусы конфигураций (сравнений предостаточно). Но мир не стоит на месте, он постоянно изменяется. И на смену УПП пришла ЕРП. УПП в начале своего пути тоже была "Сырая", позже стала эталоном среди комплексных систем учета. Тоже самое и будет с ЕРП. По этой причине ценность статей на продуктах прошлого поколения значительно ниже, чем ценность статьи для актуальных продуктов.
5. the1 322 25.06.18 09:01 Сейчас в теме
(2) Да уж, ЗУП 3 можно прямиком на говнокод.ру отправлять. Этих объектов "Удалить" там тысячи
Прикрепленные файлы:
6. dima_home 100 25.06.18 15:56 Сейчас в теме
(5)тут дело не в «говнокоде» как вы выразились, а скорее в том , что компанияия 1с ещё находится в поиске «правильных» бизнес процессов, по этому постоянно создают новые и удаляют старые объекты. Ну и государственная дума круглогодично занимается членовредительством в масштабах страны, постоянно меняя налоговое законодательство.
7. the1 322 26.06.18 15:13 Сейчас в теме
(6) Вы забыли добавить "зато крымнаш и доллар по 30 60", иначе нещитово. Госдума-то тут при чем? Вполне определенная фирма 1С по прошествии 20 лет (начиная с 90-х) не может определиться со структурой хранения данных, нормально, чо уж.
8. dima_home 100 29.06.18 12:18 Сейчас в теме
(7)
Госдума-то тут при чем?
При том, что постоянно меняют "вперед-назад" законодательство и подзаконные акты, например:
1. Страховые взносы в фонды>>Единый социальный налог>>Страховые взносы по фондам(уже без медстраха)>>Расчеты по страховым взносам в ФНС
2. Продавец счет фактуры кратное ИЛИ полное наименование>краткое И полное наименование>краткое ИЛИ полное наименование
3. Совсем недавно файл передачи данных в ПФР UTF-8 > UTF-8 без BOM, движок 8.2 не поддерживает, а главное зачем?
4. 6-НДФЛ это просто *******
5. ЕГАИС в рознице - приходы с начала года, расходы с июля. Потом несоответствие остатков в алкогольной декларации с данными в ЕГАИС.
6. ОНЛАЙН кассы, запуск с июля, при этом в стране нет необходимого количества ФН, ККМ сырые, новые драйвера и прошивки выпускались каждый месяц, а потом еще выясняется, что утвержденный ФНС протокол 1.0 годится разве что только для супермаркетов. Думаю 1С намучилась новыми ККМ, как и мы.
7. Гос. контракты.
8. Обновление форм отчетности за несколько дней до окончания налогового периода.


И Крым тут не причем, разве что классификатор адресов КЛАДР по нему не сразу появился.
9. the1 322 29.06.18 12:28 Сейчас в теме
(8)
Но как-то в 2.5 и даже в 7.7 управлялись без тысяч объектов с префиксом "Удалить". И в чем госдума например виновата, если разработчики ЗУПа вид занятости перенесли из основного кадрового регистра в специально для этого созданный?
10. dima_home 100 06.07.18 08:13 Сейчас в теме
Вы все перевернули с ног на голову.
Как я ранее писал "что компанияия 1с ещё находится в поиске «правильных» бизнес процессов" и это основная причина сырости кода. В старых 1С 7.7 и 2.5 количество разных объектов методанных было гораздо меньше и применения механизма переноса старых данных через "Удалить" тоже реже встречалось.

Но в части холивара про Госдуму все же добавлю.
Я по личному опыту вижу, что в своей работе в последние годы я все больше времени трачу на задачи связанные с изменением законодательства, чем на решения бизнез процессов.

Вот и сегодня нам приходится участвовать в пилотном проекте по маркировке табачной продукции (надо все успеть до 2019 года). Уже анализируем обратный переход на 20% НДС, как и что придётся переделывать. Думаем как прикрутить этот обязательный ветеринарный "меркурий" к 1С. А недавно совсем, организовывали переход на новые кассы. Все эти работы, за которые владельцы бизнеса платят мне и моей команде, связано не автоматизацией из бизнес процесса, а внедрением навязанных бизнесу изменением законов.

В вот что точно можно утверждать - читаемость кода сильно снизилась, как следствие и анализ ошибок.
Прикрепленные файлы:
Оставьте свое сообщение