Способ расчета зарплаты
Оплата продавцов магазина производится процентом от месячного товарооборота магазина. Месячный оклад зав. магазином – 3100руб. до 200000 руб. (минимальный размер) товарооборота. При обороте свыше 200000 руб. заведующей магазина дополнительно к окладу с суммы превышения товарооборота начисляется заработная плата по существующим расценкам с рубля товарооборота на общих основаниях.
Оплата труда продавцов за товарооборот до 200000 руб. производится без учета зав. магазином по существующим расценкам.
Оплата труда продавцов за товарооборот свыше 200000 руб. производится с учетом зав. магазином по существующим расценкам.
Пример расчета:
Оборот составил 970000руб., процент от оборота – 3,7%.
- Заведующая 167 ч.*33,557126 = 5604,04+3100,00=8704,04 руб.
- Продавец 1 176 ч.*44,407565 = 7815,73 руб.
- Продавец 2 176 ч.*44,407565 = 7815,73 руб.
- Продавец 3 165 ч.*44,407565 = 7327,25 руб.
- Продавец 4 165 ч.*44,407565 = 7327,25 руб.
682ч./849ч. 35890,00 руб.
Для решения задачи завел в справочнике "Показатели схем мотивации" новые элементы.
Перед расчетом зарплаты вводим значения показателей в обработку "Показатели схем мотивации"
В форму обработки добавил кнопку "Расчет показателей", по нажатию которой и рассчитываются нижние показатели.
Некоторые куски кода обработки:
мПоказатель = Новый Массив; мПоказатель.Добавить(Справочники.ПоказателиСхемМотивации.НайтиПоРеквизиту("Идентификатор","ВыручкаПоМагазину")); мПоказатель.Добавить(Справочники.ПоказателиСхемМотивации.НайтиПоРеквизиту("Идентификатор","ПроцентПоРознице")); мПоказатель.Добавить(Справочники.ПоказателиСхемМотивации.НайтиПоРеквизиту("Идентификатор","КонстантаОборот"));
Ищу показатели по реквизиту "Идентификатор".
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| ЗначенияПоказателейСхемМотивации.Значение,
| ЗначенияПоказателейСхемМотивации.Показатель
|ИЗ
| РегистрСведений.ЗначенияПоказателейСхемМотивации КАК ЗначенияПоказателейСхемМотивации
|ГДЕ
| ЗначенияПоказателейСхемМотивации.ПериодДействия = &ПериодДействия
| И ЗначенияПоказателейСхемМотивации.Организация = &Организация
| И ЗначенияПоказателейСхемМотивации.Подразделение = &Подразделение
| И ЗначенияПоказателейСхемМотивации.Показатель В(&Показатель)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПериодическиеЗначенияПоказателейСхемМотивацииСрезПоследних.Значение,
| ПериодическиеЗначенияПоказателейСхемМотивацииСрезПоследних.Показатель
|ИЗ
| РегистрСведений.ПериодическиеЗначенияПоказателейСхемМотивации.СрезПоследних(
| &ПериодДействия,
| Показатель.ВидПоказателя = ЗНАЧЕНИЕ(Перечисление.ВидыПоказателейСхемМотивации.ДляВсехОрганизаций)
| И Показатель В (&Показатель)) КАК ПериодическиеЗначенияПоказателейСхемМотивацииСрезПоследних"; Запрос.УстановитьПараметр("ПериодДействия", ПериодДействия); Запрос.УстановитьПараметр("Организация", Организация); Запрос.УстановитьПараметр("Подразделение", Подразделение); Запрос.УстановитьПараметр("Показатель", мПоказатель); ТЗ = Запрос.Выполнить().Выгрузить();
Выбираю запросом значения заданных показателей из двух(!) РС: ЗначенияПоказателейСхемМотивации и ПериодическиеЗначенияПоказателейСхемМотивации (причем в последний как ни странно попадают показатели из вкладки "Постоянные"!).
Нахожу отработанное время суммарное и заведующей:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ
| РабочееВремяРаботниковОрганизацийОбороты.ЧасовОборот КАК ОтработаноЧасов
|ИЗ
| РегистрНакопления.РабочееВремяРаботниковОрганизаций.Обороты(&ПериодНачало, &ПериодКонец, Месяц, Сотрудник В (&мСотрудники)) КАК РабочееВремяРаботниковОрганизацийОбороты
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| РабочееВремяРаботниковОрганизацийОбороты.ЧасовОборот
|ИЗ
| РегистрНакопления.РабочееВремяРаботниковОрганизаций.Обороты(&ПериодНачало, &ПериодКонец, Месяц, Сотрудник = &Заведующая) КАК РабочееВремяРаботниковОрганизацийОбороты"; Запрос.УстановитьПараметр("мСотрудники", мСотрудники); Запрос.УстановитьПараметр("Заведующая", Заведующая); Запрос.УстановитьПараметр("ПериодНачало", НачалоМесяца(ПериодДействия)); Запрос.УстановитьПараметр("ПериодКонец", КонецМесяца(ПериодДействия)); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать();
Рассчитываю стоимость часа продавца и заведующей:
ПроцентПоРознице = ПроцентПоРознице/100; СтоимостьЧасаЗаведующей = (ВыручкаПоМагазину-ВыручкаПоМагазинуМинимальныйПорог)*ПроцентПоРознице/ОтРаботаноЧасовПоМагазинуВсего; СтоимостьЧасаПродавцовПредварительная = ВыручкаПоМагазинуМинимальныйПорог*ПроцентПоРознице/(ОтРаботаноЧасовПоМагазинуВсего-ОтРаботаноЧасовПоМагазинуЗаведующей); СтоимостьЧасаПродавцов = СтоимостьЧасаПродавцовПредварительная+СтоимостьЧасаЗаведующей;
Ну, и записываю результат в РС:
Для каждого СтрокаТЗ Из ТЗ Цикл
НаборЗаписей = РегистрыСведений.ЗначенияПоказателейСхемМотивации.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.ПериодДействия.Установить(ПериодДействия); НаборЗаписей.Отбор.Организация.Установить(Организация); НаборЗаписей.Отбор.Подразделение.Установить(Подразделение); НаборЗаписей.Отбор.Показатель.Установить(СтрокаТЗ.Показатель); НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.ПериодДействия = ПериодДействия; НоваяЗапись.Организация = Организация; НоваяЗапись.Подразделение = Подразделение; НоваяЗапись.Показатель = СтрокаТЗ.Показатель; НоваяЗапись.Значение = СтрокаТЗ.Значение; НаборЗаписей.Записать(); КонецЦикла;
Создаю 2 новых вида расчета в видах расчета "Основные начисления организаций" для заведующей и продавцов.
Расчет готов.
P.S.
С учетом замечаний вынес расчет показателей из модуля формы во внешнюю обработку заполнения ТЧ.
В ТЧ "Начисления" документа "Начисление зарплаты сотрудникам организации" появилась кнопка "Заполнить" по которой и происходит выполнение обработки. Таким образом, удалось избежать изменения кода конфигурации.