0
Отвечен

Массовый расчет отпускных

Игорь Шалдин 4 недели назад в Прочее обновлен Гашков Николай (Эксперт) 3 недели назад 12

Клиент хочет рассчитывать отпуска сотрудников массово, на основе данных из внешнего источника.

Этот самый "внешний источник" может выдать данные по отпускам в виде таблицы ТН - дата начала - дата конца - тип отпуска (обычный/учебный).

Согласны на "полуавтоматический" расчет: принимаем даты начала/конца в таблицу  - разносим. Но вместо разноски открывается интерфейс расчета отпуска с предзаполненными датами и типом отпуска. Можно ли такое реализовать? 

Есть ли ещё какие-то варианты решения вопроса?

Думал о расчете отпускных в таблице, но кроме сумм в ЛС надо заполнить ещё и табель. И тут возникает два вопроса:

1. Функция replace разнесет символ "О" во все дни периода отпуска, в т.ч. - в праздники. Как "обойти" праздничные дни?

2. Функция replace, вроде как, работает только с текущим месяцем. Как разнести символ "О" в будущий месяц, если отпуск переходящий?

Ответ

Ответ

Пример таблицы для расчета отпуска.

Расчет происходит при разноске таблицы. 

В таблице должны быть заполнены поля:

  •  ТН в КЗ
  • Дата начала отпуска
  • Дата окончания отпуска

расчет отпуска из таблицы.zip

Для запуска расчета отпуска используется такой скрипт

UserCalcOneOtpusk(Beg, End)
{
  var BegD=KDateFromStr(Beg);
  
  var EndD=KDateFromStr(End);
  //даты отпуска заданы неверно
  if( !BegD.IsValid() || !EndD.IsValid() || BegD.GT(EndD))
    return "-1";
  
  int  monthSr= BegD.GetAbs()-1;// месяц для расчета среднего
  var lsform=CreateObject("LS_Form"); //для WIN создали окно где будет происходить корректировка сумм
  if (!VarHasValue(lsform)) 
  {
    if (ESC==param_b2(2))   // запрос параметров расчета (автоматически, с корректировкой...), работает для режима в func[0]
      return to_string(ESC);
  }
  int TypeOtp = OTPUSK_OSN; 
/*
 else if (T=="173-176")     // учебный отпуск
      TypeOtp = OTPUSK_UCH; 
   else TypeOtp = OTPUSK_DOP; // все остальные считаем как Доп
*/
  var Otp = CreateObject("KCalcSredn"); //установит func[0]=2 - глобальный режим "расчет отпуска", восстановит при разрушении 
  if (ESC==Otp.InitOtp2(BegD,EndD,TypeOtp,monthSr,0)) 
      return to_string(ESC);

  string rez=to_string(Otp.Calculate(0,2))+"^";  
  //количество дней между датами
  //rez+=to_string(EndD.Diff(BegD)+1)+"^";
  //количество дней отпуска (определяем по табелю)
  rez+=to_string(CalcTabelSimCount(BegD,EndD,"О"))+"^";
  //средний
  rez+=to_string(Otp.SumSredn());
  return rez;  
}

ХОРОШО, МНЕ ПОНРАВИЛОСЬ
Оценка удовлетворенности от Игорь Шалдин 3 недели назад

С разноской символов "О" вопрос решил.

И всё-таки, нельзя ли как-то передавать из таблицы в интерфейс расчета отпуска даты начала и конца, как это делает письмо из КП?

На рассмотрении

Добрый день.

А показать панель отпуска точно нужно или достаточно посчитать отпуск в ЛС "молча"?

Можно посмотреть пример в integration.S функция SysIntegrProcessOneOtpusk()

Если выложите пример таблички- могу помочь со скриптом..

Вроде как нечто подобное обсуждалось несколько лет назад в теме

https://kontur.userecho.com/ru/communities/47/topics/8644-prikazyi-po-otpuskam   

Если интересно,  могу покопаться в архивах и найти ту таблицу, которая лет 10 

работала примерно с тем же функционалом, какой вы запрашивали.

Сделал "табличный" вариант расчета с последующей разноской сумм и букв табеля: Tabl14.Sum

"Молчаливый" вариант расчета тоже интересует. На основе той же таблицы.

1)FindTnForKCH(1,"tn_ibm") лучше поместить в "Начало расчета таблицы"

иначе будет долго работать... ( для каждой записи в таблице будет полностью читаться весь список ЛС)

2) Не уверен что у вас правильно посчитает СДЗ..

Функции расчета не читают ЛС - это нужно делать самостоятельно через LSRead(Tn, flag)

Ответ

Пример таблицы для расчета отпуска.

Расчет происходит при разноске таблицы. 

В таблице должны быть заполнены поля:

  •  ТН в КЗ
  • Дата начала отпуска
  • Дата окончания отпуска

расчет отпуска из таблицы.zip

Для запуска расчета отпуска используется такой скрипт

UserCalcOneOtpusk(Beg, End)
{
  var BegD=KDateFromStr(Beg);
  
  var EndD=KDateFromStr(End);
  //даты отпуска заданы неверно
  if( !BegD.IsValid() || !EndD.IsValid() || BegD.GT(EndD))
    return "-1";
  
  int  monthSr= BegD.GetAbs()-1;// месяц для расчета среднего
  var lsform=CreateObject("LS_Form"); //для WIN создали окно где будет происходить корректировка сумм
  if (!VarHasValue(lsform)) 
  {
    if (ESC==param_b2(2))   // запрос параметров расчета (автоматически, с корректировкой...), работает для режима в func[0]
      return to_string(ESC);
  }
  int TypeOtp = OTPUSK_OSN; 
/*
 else if (T=="173-176")     // учебный отпуск
      TypeOtp = OTPUSK_UCH; 
   else TypeOtp = OTPUSK_DOP; // все остальные считаем как Доп
*/
  var Otp = CreateObject("KCalcSredn"); //установит func[0]=2 - глобальный режим "расчет отпуска", восстановит при разрушении 
  if (ESC==Otp.InitOtp2(BegD,EndD,TypeOtp,monthSr,0)) 
      return to_string(ESC);

  string rez=to_string(Otp.Calculate(0,2))+"^";  
  //количество дней между датами
  //rez+=to_string(EndD.Diff(BegD)+1)+"^";
  //количество дней отпуска (определяем по табелю)
  rez+=to_string(CalcTabelSimCount(BegD,EndD,"О"))+"^";
  //средний
  rez+=to_string(Otp.SumSredn());
  return rez;  
}

FindTnForKCH(1,"tn_ibm") лучше поместить в "Начало расчета таблицы"

А как это сделать?

Спасибо за "ценную" информацию. :)

Я вообще-то про синтаксис в поле "Начала расчета" и в функции расчета спрашивал...

в поле "Начало расчета таблицы" нужно написать 

FindTnForKCH(1,"tn_ibm");return; 

Сервис поддержки клиентов работает на платформе UserEcho