пятница, 6 февраля 2015 г.

1c специалист. Задача 3.12.


Решение:
Скачать решение
1) Определимся в видами расчета.
Заводим 2 ПВР "Основные начисления" и "дополнительные начисления".
В "Основные" поместим ВР "Оклад" и "Больничный".
Больничный, естественно вытесняет оклад, так как базой больничного является оклад за прошлый месяц, то в базовые помещаем "оклад".
ПВР "Дополнительные начисление" не зависит от периода действия и будет зависеть от базы по периоду действия, так как у нас есть "премия %" от начислений всех  текущего месяца. Соответвенно,  в базовые начисления включаем все ВР из обоих ПВР.
Заводим 2 регистра расчетов, для РР "Дополнительные начисления" ставим базовый период = "месяц".
2) Заполняем РС "графики" с помощью обработки, немножко ее поработав.
3) Хранение справочной информации.
Необходимо как-то организовать хранение справочной информации.
Размер оклада и размер премии решил хранить как ресурсы РС "Сведения о сотрудниках", в принципе можно было бы и размер компенсации мобильника судя запихнуть, но не хочется переделывать так как до этого решил компенсации хранить в отдельном регистре "Компенсации".
График подразделения решил хранить просто реквизитом справочника "подразделения".

4) Документ "Начисление ЗП".
Для того чтобы соблюдалось условие "Считать, что данные о начислении по окладу вводятся только в пределах одного месяца" добавим процедуру проверки при изменении конца периода.

&НаКлиенте
Процедура ОсновныеНачисленияПериодДействияКонецПриИзменении(Элемент)
ТекДанные = Элементы.ОсновныеНачисления.ТекущиеДанные;
Если НачалоМесяца(ТекДанные.ПериодДействияНачало)<> НачалоМесяца( ТекДанные.ПериодДействияКонец) 
И Не ЭтоБольничный(ТекДанные.ВидРасчета) Тогда
Сообщение = Новый("СообщениеПользователю");
Сообщение.Текст ="Даты принадлежать разным периодам";
Сообщение.Сообщить();
ТекДанные.ПериодДействияКонец = Дата(1,1,1);
КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ЭтоБольничный(ВидРасчета)
Возврат ?(ВидРасчета= ПланыВидовРасчета.ОсновныеНачисления.Больничный, Истина,Ложь);
КонецФункции

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


Поле "период" и РС на конец и будет датой изменения оклада, которую мы и будем проверять при обработке запроса.

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


  • По условию "Средняя  дневная ставка определяется как сумма начисленного за предыдущий месяц
    оклада, поделенная на количество рабочих дней в предыдущем месяце."
    Я это условие понял так, что нужно получить количество рабочих дней по пятидневке, так как работал сотрудник по пятидневке, но не нашел как получить это значение. Смотрел решения комрадов на форумах и обнаружил что все поняли что нужно количество рабочих дней получать по графику больничного, то есть по шестидневке. Делать нечего, решил не заморачиваться и сделать тоже так, авось прокатит).
С расчетом доп. начислений все вроде-бы понятно.
Остается только сделать диаграмму Ганта, наверное стоит сделать шпаргалку на экзамен на этот случай, чтобы от волнения не забыть чего.

Скачать решение

Возможно Вам будет интересен курс "Профессиональный учет в 1С:ЗУП 3.0»

1 комментарий: