По просьбам решил выложить свой способ расчета доплаты сотрудникам, в период нахождения их в командировке, если они заработали меньше чем работали бы без нее.
По скольку у каждой организации разновсяческие доплаты, премии, и пр. сделать универсальную обработку достаточно не легко, что бы она подошла всем. Но что бы было что нибудь - попробую описать что и где надо допиливать и переделывать что бы у вас тоже заработало мое предложение.
Задача стояла сделать расчет доплаты до среднего заработка автоматизированной в документе "Начисление зарплаты работникам организаций".
Собственно... После того как расчитаны командировачные (Оплата по среднему заработку) и расчитана зарплата со всеми премиями и надбавками, переходится в вкладку "Дополнительные начисления" и жмется "Заполнить->Расчет доп начислений за командировку"
Обработка собирает данные по сотрудникам, смотрит сколько он отработал бы без командировки, сравнивает суммы с командировкой и без и выводит результат.
А теперь про обработку...
За основу берется предопределенный элемент Планов видов расчета "Оплата по среднему заработку командировок" (00031), по которому расчитана у сотрудника командировка. Если у вас она не так называется - меняем называние в 18 стр.
Запрос.УстановитьПараметр("ВидРасчета",ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоНаименованию("Оплата по среднему заработку командировок"));
Далее с 118 стр. идет перебор всех видов расчета которые есть у сотрудников. Если они соответсвуют нашим отборам то они записываются в значения для дальнейшего расчета. Тут уже ваш выход и нужно будет немного поменять названия начислений и переменные куда они будут записываться. Сначало идут Основные начисления, затем по аналогии дополнительные
пСотрудникМесОклад = 0;
пСотрудникРК = 0;
пСотрудникСН = 0;
пСотрудникДзС1_151 = 0;
пСотрудникДзС3_151Ф = 0;
пСотрудникСекретность = 0;
пСотрудникПзМесяц = 0;
пСотрудникПерсНадб_56 = 0;
пСотрудникПремияПерсНадб_74 = 0;
Пока РезультатЗапроса3.Следующий() Цикл
Область = Макет.ПолучитьОбласть("Строка");
Область.Параметры.Сотрудник = РезультатЗапроса.Сотрудник;
//Информативность ==================================
//Сообщить(РезультатЗапроса.Сотрудник);
Если РезультатЗапроса3.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ОкладПоДням Тогда
пСотрудникМесОклад = РезультатЗапроса3.Результат;
Область.Параметры.Вид = "Оклад";
Область.Параметры.Число = пСотрудникМесОклад;
//Информативность ==================================
//Сообщить("пСотрудникМесОклад="+""+пСотрудникМесОклад);
ИначеЕсли РезультатЗапроса3.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ТарифЧасовой Тогда
КоличествоЧасов = ПолучениеЧасовВМесяце(РезультатЗапроса.ГрафикРаботы,Объект.ПериодРегистрации);
пСотрудникМесОклад = КоличествоЧасов*РезультатЗапроса3.Результат;
Область.Параметры.Вид = "Оклад";
Область.Параметры.Число = пСотрудникМесОклад;
//Информативность ==================================
//Сообщить("пСотрудникМесОклад="+""+пСотрудникМесОклад);
//КонецЕсли;
ИначеЕсли РезультатЗапроса3.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.РайонныйКоэффициент Тогда
пСотрудникРК = РезультатЗапроса3.Результат/100;
Область.Параметры.Вид = "Районный коэф";
Область.Параметры.Число = пСотрудникРК;
//Информативность ==================================
//Сообщить("пСотрудникРК="+""+пСотрудникРК);
//КонецЕсли;
ИначеЕсли РезультатЗапроса3.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.СевернаяНадбавка Тогда
пСотрудникСН = 80/100;
Область.Параметры.Вид = "Северная надбавка";
Область.Параметры.Число = пСотрудникСН;
//Информативность ==================================
//Сообщить("пСотрудникСН= "+""+пСотрудникСН);
//КонецЕсли;
ИначеЕсли РезультатЗапроса3.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоНаименованию("Доплата за совмещение 1 ст.151 ТК") Тогда
пСотрудникДзС1_151 = РезультатЗапроса3.Результат/100;
//Область = Макет.ПолучитьОбласть("Строка");
Область.Параметры.Вид = "Доплата за совмещение 1 ст.151 ТК";
Область.Параметры.Число = пСотрудникДзС1_151;
//Информативность ==================================
//Сообщить("пСотрудникДзС1_151="+""+пСотрудникДзС1_151);
//КонецЕсли;
ИначеЕсли РезультатЗапроса3.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоНаименованию("Доплата за совмещение 3 ст.151 ТК фикс.суммой") Тогда
пСотрудникДзС3_151Ф = РезультатЗапроса3.Результат;
Область.Параметры.Вид = "Доплата за совмещение 3 ст.151 ТК фикс.суммой";
Область.Параметры.Число = пСотрудникДзС3_151Ф;
//
//Информативность ==================================
//Сообщить("пСотрудникДзС3_151Ф="+""+пСотрудникДзС3_151Ф);
//КонецЕсли;
ИначеЕсли РезультатЗапроса3.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоНаименованию("Надбавка за секретность") Тогда
пСотрудникСекретность = 10/100;
Область.Параметры.Вид = "Надбавка за секретность";
Область.Параметры.Число = пСотрудникСекретность;
//Информативность ==================================
//Сообщить("пСотрудникСекретность= "+""+пСотрудникСекретность);
ИначеЕсли РезультатЗапроса3.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоНаименованию("Персональная надбавка (п.5.6)") Тогда
пСотрудникПерсНадб_56 = РезультатЗапроса3.Результат;
Область.Параметры.Вид = "Персональная надбавка (п.5.6)";
Область.Параметры.Число = пСотрудникПерсНадб_56;
//ИначеЕсли РезультатЗапроса3.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоНаименованию("Премия на персональную надбавку (оклад) п.7.4") Тогда
// пСотрудникПерсНадб_56 = РезультатЗапроса3.Результат;
// Область.Параметры.Вид = "Премия на персональную надбавку (оклад) п.7.4";
// Область.Параметры.Число = пСотрудникПерсНадб_56;
Иначе
//Информативность ==================================
//Сообщить(""+РезультатЗапроса.Сотрудник+": не учтен основной вид расчета "+""+РезультатЗапроса3.ВидРасчета,СтатусСообщения.Важное);
КонецЕсли;
Можно использовать сообщение "не учтен основной/дополнительный вид расчета" как план к дальнейшим действиям (мало ли забыли чего). Сообщение это надо будет раскоментировать, подвериться и что бы в будущем не мешал - снова закоментировать.
После 239стр. (Формулы) идет расчет показателей зарплат, тут вам надо будет состряпать то что вы выше запихали в переменные в зарплату (это если бы сотрудник не был в командировке) и собственно сам расчет доплаты...
СотрудникДзС1_151 = пСотрудникМесОклад*пСотрудникДзС1_151;
СотрудникДзС3_151Ф = пСотрудникДзС3_151Ф;
СотрудникСекретность = пСотрудникМесОклад*пСотрудникСекретность;
СотрудникПзМесяц = (пСотрудникМесОклад+СотрудникДзС1_151+СотрудникДзС3_151Ф)*пСотрудникПзМесяц;
СотрудникРК = (пСотрудникМесОклад+СотрудникДзС1_151+СотрудникДзС3_151Ф+СотрудникСекретность+СотрудникПзМесяц)*пСотрудникРК;
СотрудникСН = (пСотрудникМесОклад+СотрудникДзС1_151+СотрудникДзС3_151Ф+СотрудникСекретность+СотрудникПзМесяц)*пСотрудникСН;
пСотрудникПремияПерсНадб_74 = пСотрудникПерсНадб_56 * пСотрудникПремияПерсНадб_74;
СотрудникЗП = пСотрудникМесОклад+СотрудникДзС1_151+СотрудникДзС3_151Ф+СотрудникСекретность
+СотрудникПзМесяц+СотрудникРК+СотрудникСН+пСотрудникПерсНадб_56+пСотрудникПремияПерсНадб_74;
Попытка
СрДнВКом = РезультатЗапроса.Результат/РезультатЗапроса.ОплаченоДнейЧасов;
СрДнМес = СотрудникЗП/РезультатЗапроса2.КоличествоРабДней;
Разность = СрДнМес - СрДнВКом;
Доплата = Разность*РезультатЗапроса.ОплаченоДнейЧасов;
Исключение
Сообщить("Информация об ошибке:"+Символы.ПС + "Сотрудник: " + Строка.Сотрудник +Символы.ПС
+ "Средний по командировке = " +РезультатЗапроса.Результат + " , " + "Оплачено дней/часов = "+ РезультатЗапроса.ОплаченоДнейЧасов + Символы.ПС
+ "Зарплата = "+ СотрудникЗП+ " , "+ "Кол-во рабочих дней = "+ РезультатЗапроса2.КоличествоРабДней + Символы.ПС
+ "Ошибка при расчете: (ЗП/КолРабДней - Средний/ОплаченоДнейЧасов)*ОплаченоДнейЧасов");
Доплата = -1;
КонецПопытки;
У нас доплата называется "Доплата за период нахождения в командировке", созданная в дополнительных начислений по формуле "Фиксированная сумма". Ваше название нужно подстанавливать в стр. 267
Если Доплата>=0 Тогда
СтрокаТаблицы = Объект.ДополнительныеНачисления.Добавить();
СтрокаТаблицы.Сотрудник = Строка.Сотрудник;
СтрокаТаблицы.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисленияОрганизаций.НайтиПоНаименованию("Доплата за период нахождения в командировке");
СтрокаТаблицы.ПодразделениеОрганизации = РезультатЗапроса.ПодразделениеОрганизации;
СтрокаТаблицы.Показатель1 = СотрудникЗП;
СтрокаТаблицы.Результат = Доплата;
КонецЕсли;
Результат наших расчетов добавляется в табличную часть "Дополнительные начисления" документа. И попутно вылетает что то типа отчета с параметрами из расчета (для того что бы бух мало ли что проверил)
УСТАНОВКА.
Качаем, сохраняем. Идем в "Сервис-Внешние обработки и отчеты-Дополнительные обработки табличных частей", добавляем новый элемент. Жмем кнопку "Заменить файл внешней обработки", выбираем скаченную обработку. В табличной части "Принадлежность обработки по заполнению табличных частей" добавляем новую строчку, "Представление объекта - выбираем документ"Начисление зарплаты работникам организаций", табличная часть-"Дополнительные начисления", представление кнопки-"Начисление доплаты за нахождение в командировке", и жмем ОК. После этого в документе "Начисление зарплаты работникам организаций" в табличной части "Дополнительные начилсения" в подменю "Заполнить" появится вышеуказанная кнопочка.
Соответсвенно после исправлении обработки перепривязываем ее по кнопке "Заменить файл внешней обработки"