BeforeCalcSrednOtp - Функция, вызываемая перед началом расчета среднего для отпуска

Функция, вызываемая перед началом расчета среднего для отпуска

Синтаксис:

BeforeCalcSrednOtp(string DatBeg, string DatEnd, long Adr, &FlagShowTabl,&Arr)

Параметры:

DatBeg - начала отпуска (строка вида ДД.ММ.ГГГГ)

DatEnd - конец отпуска (строка вида ДД.ММ.ГГГГ)

Adr - адрес для инициализации

[Примечание]

var Sr = CreateObject("KCalcSredn");

Sr.InitByPointer(Adr);

// (класс используемый для расчета среднего в скриптах) - через этот класс можно получить доступ к настройкам по которым будет считаться средний.

FlagShowTabl - признак "показывать таблицу среднего"

Arr - резерв (для новых параметров если понадобиться)

Пример.Функция, вызываемая перед началом расчета среднего для отпуска

BeforeCalcSrednOtp(DatBeg,DatEnd,Adr,&FlagShowTabl,&Arr)
/*
Функция вызывается перед расчетом отпуска.
Считаем кол-во символов Sim в табеле за период от "даты начала периода для отпуска"(псевдоним "BdataOtp") + 12 месяцев
Если "дата начала периода" не указана - берем период 12 предыдущих месяцев от даты начала отпуска
При количестве символов Sim >14, выдаем сообщение
*/ 
{
  string Sim="А"; //символы табеля
  //создаем объект для работы со списком должностей
  var CL=CreateObject("CombineList");
  var it = CL.CreateIterator();
  for (it.SetBegin();!it.IsEnd();it.Next()) //цикл по должностям (it.CurKey() - внутренний код исполняемой должности
  {
    var tc=CreateObject("TmpCurCombine");   // Класс для временной смены, а затем и восстановления текущей должности
    tc.Init(it.CurKey());//инициализируем  
    //определяем "дату начала периода для отпуска" на дату начала отпуска
    var datBegOtp = CreateObject("KDate");
    datBegOtp.SetDate(to_string(DatBeg));
    
    char str[256];
    //если поле с псевдонимом "BdataOtp" нашли в настройке к.ч. получим значение этого поля на дату начала отпуска
    if (kch_num_sys("BdataOtp")!=-1) GetKchValue("BdataOtp",str,10,datBegOtp);
    
    var DateBegPeriodOtp = CreateObject("KDate");
    DateBegPeriodOtp.SetDate(to_string(str));
    //дата не указана - берем 12 предыдущих месяцев от даты начала отпуска
    if (!DateBegPeriodOtp.IsValid()) DateBegPeriodOtp.SetDateII(datBegOtp.GetDay(),datBegOtp.GetAbs()-12);
    
    var DateEndPeriodOtp = CreateObject("KDate");
    DateEndPeriodOtp.SetDateII(DateBegPeriodOtp.GetDay(),DateBegPeriodOtp.GetAbs()+12);
    DateEndPeriodOtp.Dec(); //уменьшаем дату на 1 день
    int cntSim=CountDaySimv(DateBegPeriodOtp.GetStr(),DateEndPeriodOtp.GetStr(),Sim,0,0);
   
    if (cntSim>14)
    {
      char s[256],nameDolgn[256];
      nameDolgn=CL.GetName(it.CurKey());FreeSpaceString(nameDolgn,2,""); //название должности
      sprintf(s,"У должности \"%s\" проставлено %d символов \"%s\" в периоде с %s по %s",nameDolgn,cntSim,Sim,DateBegPeriodOtp.GetStr(),DateEndPeriodOtp.GetStr());
      string message=to_string(s)+"\r\n";
      AmbaMessageBox(message,"Внимание!",MB_OK|MB_ICONERROR,0); 
    }
  }
}