//  взято из Волны

DialBeg(__AdrTable)  // ввод даты перед расчетом
                     // вызов модуля из "Начало расчета таблицы"__:
                     // LoadScriptModule("user\\otp_dni");return DialBeg(__AdrTable);
{
 var CTabl = CreateObject("CurPrnTbl");
 CTabl.Initial(__AdrTable);

 char NewDay[256], DatEnd2[256];                
 NewDay  = CTabl.TextS("DatEndPer",0);    FreeSpaceString(NewDay,3,"");
 DatEnd2 = CTabl.TextS("DatEndPer2",0);   FreeSpaceString(DatEnd2,3,"");

 if(strlen(NewDay) < 8 )
  {
   var DateEnd = CreateObject("KDate");
   DateEnd.SetDateII(1,mrasch);           
   NewDay=DateEnd.GetStr();               
  }                                        

 if(strlen(DatEnd2) < 8 )
  {
   var DateEnd2 = CreateObject("KDate");
   DateEnd2.SetDateII(1,mrasch);           
   DatEnd2=DateEnd2.GetStr();               
  }                                        




 if (ESC==Panel_Zapros(" Введите дату окончания расчетного периода","",
                         "  Дата (дд.мм.гггг) : ",NewDay, 10)
//                       "  Дата (дд.мм.гггг) : ",NewDay, 10,
//                       "  Дата_2 (дд.мм.гггг) : ",DatEnd2, 10)
                                                               ) return ESC;
 FreeSpaceString(NewDay,3,"");
 FreeSpaceString(DatEnd2,3,"");

 for ( int LRcr=0; LRcr<CTabl.Count_Rcr(); LRcr++ )
  {
    CTabl.STextS("DatEndPer",LRcr, static_cast_to_string(NewDay));
//    CTabl.STextS("DatEndPer2",LRcr, static_cast_to_string(DatEnd2));
  }

}


TN(tab)   // № подраздел из КЧ
{
   char tn[91], ls1[255];
   sprintf(tn,"%.90s",static_cast_to_string(tab));
   FreeSpaceString(tn,3,"");
   double tabn = atof(tn);

   if(tabn != 0)
    {
      lsname(Find_Full_TN(tabn),ls1);
      FreeSpaceString(ls1,3,"");
      double llss = atof(ls1);
      lsread(ls1,0);                   // инициализация ТН

      char str1[9];
      kch_from("podr",str1);
      int pr = atoi(str1);
      return pr;
    }
}


Dat_End(beg_d, end_d)   // проверка наличия даты конца периода
{
 char dat_b[90], dat_e[90];
 sprintf(dat_b,"%.90s",static_cast_to_string(beg_d));   FreeSpaceString(dat_b,3,"");
 sprintf(dat_e,"%.90s",static_cast_to_string(end_d));   FreeSpaceString(dat_e,3,"");
 // если конец периода не введен
 if ( strlen(dat_e) == 0 )
  {
   string err = "нетданных";
   return err;
  }
 
 else return dat_e;

}


DneyOtp(beg_d, end_d,tab)  // подсчет кол-ва "отработ_календ_дней" 
                           // и кол-ва  дней заработанного отпуска
                           // на входе дата_начала (beg_d) и дата конца (end_d) периода
{
 char tn[91], ls1[255];
 sprintf(tn,"%.90s",static_cast_to_string(tab));   FreeSpaceString(tn,3,"");
 double tabn = atof(tn);
 lsname(Find_Full_TN(tabn),ls1);
 lsread(ls1,0);                   // инициализация ТН


 char dat_b[90], dat_e[90];
 sprintf(dat_b,"%.90s",static_cast_to_string(beg_d));   FreeSpaceString(dat_b,3,"");
 sprintf(dat_e,"%.90s",static_cast_to_string(end_d));   FreeSpaceString(dat_e,3,"");

 if ( dat_b == "отсутств" )
  {
    int dney = 0;
    return  dney;
  }


 if ( strlen(dat_e) == 9 )       // если отсутств дата конца
  {
   double err = 0.;
   return err;
  }

 else
  {
   // определяем абсолютные месяцы начала и конца расчетного периода на основе (dat_b и dat_e)
   var dat1 = CreateObject("KDate");      //создаем объекта класса  KDate  
   dat1.SetDate(to_string(dat_b));        //инициализируем объект датой      ДД.ММ.ГГГГ
   int mBegAbs =dat1.GetAbs();            // абсол знач мес
   var dat2 = CreateObject("KDate");      //создаем объекта класса  KDate  
   dat2.SetDate(to_string(dat_e));        //инициализируем объект датой      ДД.ММ.ГГГГ
   int mEndAbs =dat2.GetAbs();            // абсол знач мес

   var Dat_B = CreateObject("ParamFuncRW");
   Dat_B.IInitial(static_cast_to_string(dat_b),".",4);
   char mes_b[90], dni_b[90];
   sprintf(mes_b,"%s", static_cast_to_string(Dat_B.Get(1))); FreeSpaceString(mes_b,3,"");
   sprintf(dni_b,"%s", static_cast_to_string(Dat_B.Get(0))); FreeSpaceString(dni_b,3,"");

   var Dat_E = CreateObject("ParamFuncRW");
   Dat_E.IInitial(static_cast_to_string(dat_e),".",4);
   char mes_e[90], dni_e[90];
   sprintf(mes_e,"%s", static_cast_to_string(Dat_E.Get(1))); FreeSpaceString(mes_e,3,"");
   sprintf(dni_e,"%s", static_cast_to_string(Dat_E.Get(0))); FreeSpaceString(dni_e,3,"");

   int m_b = static_cast_to_int(mes_b),  d_b = static_cast_to_int(dni_b);
   int m_e = static_cast_to_int(mes_e),  d_e = static_cast_to_int(dni_e);

   //string str_mes = "|_";      // для режима настройки

   double KalendDnSr = 29.3;     // СредКоличествоКалендДней
   double DniOtpZak  = 28;       // КоличДнейОтп по Закону
   double DnOtZarPer = .0;       // Дней Заработанного Отпуска в Периоде
   double DnOtIspPer = .0;       // Дней Отпуска исползованного в Периоде
   double SaldoDnOt  = .0;       // Остатки дней отпуска с прошлых периодов
   int    Limit_14   = 1;        // Округление месяца_: если  СредКоличествоОтработДнейМесяца < 14

                                 // то месяц исключается, т.е. ДнейЗаработОтпЗаМес = 0
   char strOtp[90];
                     //проверяем в КЧ наличие дней DniOtpZak  
    kch_from("DniOtZak",strOtp); FreeSpaceString(strOtp,3,"");        
    if ( atoi(strOtp) != 0 )  DniOtpZak = atoi(strOtp);
                     //проверяем в КЧ наличие остатков дней с прошлого периода DniResOt 
    kch_from("DniResOt",strOtp); FreeSpaceString(strOtp,3,"");        
    if ( atof(strOtp) != 0 )  SaldoDnOt = atof(strOtp);


   double nerabPer = 0;            // нерабочих дней в периоде

   for ( int ii = mBegAbs; ii <= mEndAbs; ii++)         // цикл по месяцам (абсолютным)
    {
     double nerabMes = 0;          // нерабочих дней в месяце
     int dd1=1, dd2=countday;   // первый и последний дни месяца для
                                // идеального месяца (отработан полностью) 
     double RabDnSr    = .0;    // СредКоличествоОтработДнейМесяца
     double DnOtZarMes = .0;    // Дней Заработанного Отпуска в Месяце

     s50(ii);                   // инициализируем месяц
     
     // определим первый и последний месяцы периода
     if ( ii == mBegAbs )         //первый месяц периода
      {
       dd1 = d_b;
       nerabMes = d_b - 1;           // если период начин не с начала месяца 
                                     // то минусуем дни до начала периода
      }
     if ( ii == mEndAbs )            //последний месяц периода
      {
       dd2 = d_e;
       nerabMes = countday - d_e;    // если период заканчив в середине месяца
                                     // то минусуем дни до после окончания периода
      }
     
     DnOtIspPer += dney_v_tab("О",calm,dd1,dd2);     // 20140724 Учет дней отпуска использованного во время расчетного периода
     nerabMes   += dney_v_tab("АТ",calm,dd1,dd2);       
     nerabPer   += nerabMes;

        // Считаем СренееКоличОтработДнейЗаМесяц (отпускной стаж)
     RabDnSr = ( KalendDnSr / countday ) * ( countday - nerabMes );  // (СредЧислоКалендДней (29.3) / ВсегоКалендДней)                       
                                                                     //                                   * (ВсегоКалендДней - Неявки)          

     
     if ( Limit_14 == 1 )    // учитываем округление месяца
      {
       if ( RabDnSr < 14  )  DnOtZarMes = 0;                // месяц исключаем
       if ( RabDnSr >= 14 )  DnOtZarMes = DniOtpZak / 12;   // месяц учитываем
      }

     else                    // не учитываем округление месяца
           DnOtZarMes = ( DniOtpZak / 12 / KalendDnSr ) * RabDnSr;   // (КолДнОтпМесЗак / 29.3) * СрКолРабДнМес


     DnOtZarPer += DnOtZarMes;

     //str_mes = str_mes + to_string(DniOtpZak) + "__" + to_string(KalendDnSr) + "__" +  to_string( DniOtpZak / 12 ) + "_!__";
    }

   
   DnOtZarPer += SaldoDnOt;
   DnOtZarPer = DnOtZarPer - DnOtIspPer;   // 20140724 Учет дней отпуска использованного во время расчетного периода                     
   return   DnOtZarPer;         //return  str_mes;        
  }

}



Dat_Beg(tab)     // ищем дату окончания последнего отпуска и формируем
                 // дату начала периода для подсчета заработанных дней отпуска  
{
 char tn[91], ls1[255];
 sprintf(tn,"%.90s",static_cast_to_string(tab));   FreeSpaceString(tn,3,"");
 double tabn = atof(tn);
 lsname(Find_Full_TN(tabn),ls1);
 lsread(ls1,0);                   // инициализация ТН

 int    recrd = 0;    // ключ для записи
 int    Kod_Otp = 40;                           
 double DatEndLastOt=0.;
 double KodVidaNU=0.;
 string InfoStr = "";

 char strOtp[90];                                            //  ищем в КЧ дату начала
 kch_from("DatResOt",strOtp); FreeSpaceString(strOtp,3,"");  // рсчетного периода для отпуска    
 if ( strlen(strOtp) == 10 )  InfoStr = strOtp;   // т.к. при пустой дате м.б. 2 (две) точки

       // если в КЧ отсутствует дата начала периода то анализируем в ЛС 140-е виды
 else  
  {
     for ( int i=0; i<countkod; i++ )            // цикл по строкам видов в ЛС
     {
      KodVidaNU=GetCode(i);

      char KodV[250];   sprintf(KodV,"%s",static_cast_to_string(KodVidaNU));
      var PSParam = CreateObject("ParamFuncRW");
      PSParam.IInitial(static_cast_to_string(KodV),".",2);
      char KodShort[150];                                   // ищем целое значение вида
      sprintf(KodShort,"%s", static_cast_to_string(PSParam.Get(0))); FreeSpaceString(KodShort,3,"");

      if (KodShort == Kod_Otp) recrd = 1;    // нашли хотя бы один отпуск
      if ( (KodShort == Kod_Otp) && ( DatEndLastOt < GetEndDate(i) ) )  DatEndLastOt = GetEndDate(i);
     }

     if ( recrd == 1 )
      {
       var dat  = CreateObject("KDate");     // создаем объекта класса  KDate  
       dat.SetDateD(DatEndLastOt);           // инициализируем объект датой  ГГГГММ.ДД
       double d1=dat.Inc();                  // дата, следующая за DatEndLastOt
       string s1=dat.GetStr();               // дата в виде ДД.ММ.ГГГГ

       // InfoStr = static_cast_to_string(d1);
       InfoStr = s1;
      }
     else  InfoStr ="отсутств";       //  InfoStr+"_отпуск не найден_"
  }

 return InfoStr;
}



Oklad_bz(tab)
{
   char tn[91], ls1[255];
   sprintf(tn,"%.90s",static_cast_to_string(tab));
   FreeSpaceString(tn,3,"");
   double tabn = atof(tn);
   lsname(Find_Full_TN(tabn),ls1);
   lsread(ls1,0);                   // инициализация ТН

   double n1=0;
   poiskbz(0, 4, 0, 0, n1);  //оклад по 4-му виду
   
   return n1;
}
