Имя: Пароль:
1C
1С v8
ЗУП3.1 Показатель ОтработаноДней считается неправильно - что посоветуете?
0 Провинциальный 1сник
 
04.07.18
18:39
Есть вид расчета "компенсация молока за вредность", там формула ЕжедневнаяОплатаМолока*ОтработаноДней. И почему-то у некоторых сотрудников, которые часть месяца не работали (отпуск), показатель ОтработаноДней - полное время по графику, а не фактические рабочие дни. В печатной форме табеля при этом всё нормально, оклад тоже считается исходя из реальных рабочих дней. Пробовал заменить ОтработаноДней в формуле на ВремяВДнях с указанием вида времени Явка - всё то же самое, выдает полное количество рабочих дней по графику. При этом у некоторых сотрудников всё считается нормально. Пытался определить, в чем разница - не смог. Всё одинаково, график один и тот же, но у одного считает рабочие дни по факту, а у другого - по графику.

Где копать, что может быть не так?
1 Alexandr_U1982
 
04.07.18
18:50
Копать отладчиком. Модуль объекта обработки МенеджерРасчетаЗарплаты, Процедура ЗаполнитьЗначенияПоказателейНачисленийСлужебный().
Нужно смотреть содержимое таблиц в переменной МенеджерРасчетаЗарплаты.
2 Alexandr_U1982
 
04.07.18
18:54
+(1) Пардон, Процедура РассчитатьЗначенияПоказателейНачислений().
3 Alexandr_U1982
 
04.07.18
18:57
У вас отпуск вытесняет компенсацию молока за вредность?
4 Alexandr_U1982
 
04.07.18
19:05
Судя по процедуре РассчитатьЗначенияПоказателейОтработаноВсего(), отработано дней собирается по таблице фактического периода действия регистра расчета "Начисления". Полное время в этой таблице может рассчитывается в случае, если нет вытесняющей записи.
Ну а более точно причину проблемы можно определить по содержимому таблиц.
5 Провинциальный 1сник
 
04.07.18
19:18
(3) Нет конечно. Это компенсационная выплата, дополнительно за уже оплаченное время.
6 Провинциальный 1сник
 
04.07.18
19:20
(4) Смотрю уже. Этот неверный показатель (20 дней вместо 1 дня) появляется при выполнении процедуры РассчитатьЗначенияПоказателейОтработаноВсего(), а там идет обращение в запросе через менеджер временных таблиц к другим ранее созданным временным таблицам. Как их посмотреть, не ковыряя код?
7 Провинциальный 1сник
 
04.07.18
19:21
(5) Как вообще доплата может что-то вытеснять?
8 Радим1987
 
04.07.18
19:26
Необходимо вставить код вместо  // МесяцНачисления = МесяцыРасчета[0];

Обработка.МенеджерРасчетаЗарплаты

Процедура РассчитатьЗарплатуСлужебный()

    
    // Причина такого действия:
    // При увольнения сотрудника программа 1С пытается делать расчет зарплаты с последнего начисления
    // Допустим сотрудник увольняется в июне а последнее начисление было в апреле т.е май пропущен
    // в итоге для расчета ЗП у нас 2 месяца апрель и май
    // МесяцыРасчета это массив там 2 даты 01.05.2018 и 01.06.2018
    // типовой отбирает только первый элемент т.е 01.05.2018 и отклонения (отсутствия, неявки ...) которые введены в июне
    // не будет действовать        

    Если НЕ РасчетОдногоМесяца и ТипЗнч(ИсключаемыйРегистратор) = Тип("ДокументСсылка.Увольнение") Тогда
        МесяцНачисления = МесяцыРасчета[1];
    Иначе
        МесяцНачисления = МесяцыРасчета[0];
    КонецЕсли;

Посмотри здесь
9 RomanYS
 
04.07.18
19:28
Подпишусь
10 Провинциальный 1сник
 
04.07.18
19:29
Задал вытеснения - стало считаться правильно. Но блин это какой-то маразм. Теперь во все надбавках, зависящих от рабочего времени, придется вытеснения настраивать? Раньше ведь работало всё..
11 Фрэнки
 
04.07.18
19:58
(10) раньше? это где? В 2.5 без вытеснения аналогичные расчеты точно также работали криво
12 Провинциальный 1сник
 
04.07.18
20:04
(11) В 3.1 работаем с начала года, проблема вылезла только в июне. Предыдущие месяца рассчитались нормально. Такое ощущение, что что-то там наоптимизировали и поменялся способ вычисления отработанного времени для "начисления-доплаты", теперь он приравнен к "начислению-оплате".
13 Фрэнки
 
04.07.18
21:04
(12) ну этого тоже нельзя исключать. Ну не будешь же нарочно сидеть-сравнивать результаты и ломать голову - было или не было изменения в коде... там даже просто список изменений большой и выискивать вы нем долго. Я просто допускаю, что в данном конкретном моменте решились сделать одинаковый алгоритм с использованием вытеснения, чтоб он был хоть как-то наглядный и привычный
14 Alexandr_U1982
 
04.07.18
23:47
(10) Никакого маразма тут нет. В Формуле расчета начисления вы использовали предопределеный показатель, к которому жестко привязан алгоритм расчета значения по фактическому периоду действия. Соответственно, если вы хотите, чтобы из расчета выбрасывались какие-либо периоды, то нужно настроить вытеснения. Все логично, системе абсолютно по барабану как вы для себя классифицируете это начисление. Есть четко прописанный алгоритм - получите результат.
15 Alexandr_U1982
 
04.07.18
23:48
(7) В данном случае не доплата должна что-то вытеснять, а отпуск должен вытеснять доплату.
16 Alexandr_U1982
 
04.07.18
23:55
(6) Есть один прием для просмотра содержимого временных таблиц.
В платформе 8.3 во время отладки можно изменять значения пременных.Соответственно можно изменить и текст запроса.
Находите в коде строчку «Запрос.Выполнить()» и ставите после нее точку останова.
С помощью окна просмотра значений переменных смотрите какие временные таблицы содержатся в Запрос.МенеджерВременныхТаблиц.
Затем меняете текст запроса на «ВЫБРАТЬ * ИЗ ИмяВременнойТаблицы» и выполняете команду «Запрос.Выполнить().Выгрузить()». В итоге получаете содержимое временной таблицы.
17 Провинциальный 1сник
 
05.07.18
01:43
(14) Я предполагал, что механизм вытеснения относится лишь к начислениям, изменяющим рабочее время, чтобы при пересечении нескольких начислений на одном периоде подсистема знала, какое из них применится. Теперь буду знать, что вытеснение применяется в том числе и для определения периода действия начислений, напрямую на рабочее время не влияющих. Ок.