Имя: Пароль:
1C
1С v8
Распределить остаток отпуска по периодам
0 егаис
 
11.06.22
15:58
Коллеги, не нравится код, хоть убейте.
Как бы вы решили задачу распределения остатка отпуска по периодам (для документа остатки отпусков в ЗУП)
На входе общий остаток отпуска (инвентаризацию провели) и дата ввода отпуска. На примере основного отпуска.
ДатаОстатковОтпусков = Дата(2022,04,30);    
    ГраницаОкончание = ДатаОстатковОтпусков;
    ГраницаНачало = ?(Месяц(ДатаПриема) > Месяц(ДатаОстатковОтпусков), Дата(2021, Месяц(ДатаПриема), День(ДатаПриема)), Дата(2022, Месяц(ДатаПриема), День(ДатаПриема))); //учитываем факт, что дата приема может быть раньше 30.04, тогда отрезок за 22 год
    Пока ОстатокОсновной > 0 Цикл  
        РазницаВДнях = (НачалоДня(ГраницаОкончание) - НачалоДня(ГраницаНачало)) / (60 * 60 * 24) + 1;
        ПоложеноОтпускаЗаПериод = 28 / 365 * РазницаВДнях;
        ОстатокКРаспределению = Мин(ПоложеноОтпускаЗаПериод, ОстатокОсновной);
        
        ОстатокОсновной = ОстатокОсновной - ОстатокКРаспределению;
        ГраницаОкончания = ГраницаНачало - 86400;
        ГраницаНачало = Макс(ДатаПриема, ДобавитьМесяц(ГраницаНачало, -12));
    КонецЦикла;
1 Amra
 
11.06.22
16:39
Выкинуть весь код нафиг. Ибо неверный алгоритм. Вот тут - ПоложеноОтпускаЗаПериод = 28 / 365 * РазницаВДнях;

А значит и все остальное в топку
2 егаис
 
14.06.22
07:04
(1)хотелось бы узнать почему "весь код нафиг"?
На примере, остаток 40 дней, сотрудник принят 15.06.19 г
по алгоритму
Первый период равен 15.06.21 - 30.04.22, остаток по распределению = 28 / 365 * 285 = 21,86
3 егаис
 
14.06.22
07:05
Второй период 15.06.20 - 14.06.21, остаток = мин(18.14, 28 / 365 * 365) = 18.14
4 hhhh
 
14.06.22
09:27
(3) но вы сами придумали эту формулу? По законодательству ведь другие цифры. И там дробей вообще нет. Например, человек отгулял 10 дней за рассматриваемый период, всего за период положено 28 дней, значит, ему осталось 18 дней. Откуда у вас дроби взялись. Да еще 14 сотых.
5 егаис
 
14.06.22
09:33
(4) дроби вторичны, можно и округлить, не суть.
Задача раскидать остаток отпуска по годам от обратного.
Поэтому и спрашиваю, что не уверен.
6 егаис
 
14.06.22
09:36
сам код рабочий, вопросов нет. Сам подход насколько верен, это интересует
7 pavlika
 
14.06.22
09:56
Где проверка, что одна часть отпуска не меньше 14 дней? Где проверка на отпуска за свой счет свыше 14 дней, прогулы и отпуска по уходу, которые увеличиват рабочиц год?
8 pavlika
 
14.06.22
10:11
9 SleepyHead
 
гуру
14.06.22
10:19
А чем стандартный алгоритм не устраивает?