0
Отвечен

Как извлечь допреквизит вида НУ

Игорь Шалдин 5 лет назад в Расчеты начислений и удержаний / Алгоритмы обновлен Гашков Николай (Эксперт) 5 лет назад 2

Здравствуйте.

Извлекаю значение допреквизита  "kfc" из строки вида начисления с внутренним кодом 4:


   StartRkv(4);
ReadRkv("kfc",st);
FinishRkv(); 

Но если видов с внутренним кодом 4 в ЛС несколько (действующий один, остальные закрыты), то в переменную st записывается значение допреквизита вида с минимальным расширением. 

Как можно извлечь допреквизит вида действующего в расчётном месяце?

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

Добрый день.

  1. Определить номер строки, для вида, действующего в расчетном месяце.
  2. По номеру строки определить точный код вида
  3. Передать точный код вида в StartRkv()

P.S.

для пункта 1 можно использовать такой код:

double code=GetFirstValidNuCode();
////////////
GetFirstValidNuCode()
{
   int stolbec=25;
   string sims="1"; 
   var nuList=GetValidNuList(mrasch,stolbec,sims); //список точных внутренних кодов видов НУ (действующих в указанном месяце)    
   if(nuList.Size()<1) //нет действующих видов
    return -1;
   nuList.InitIterator(); 
   return atof(nuList.GetCurKey());//возвращаем первый
}
////////////
GetValidNuList(m,stolb,Simv)
{  
  var map=CreateObject("MapString");map.Clear();
  var db=KDateFromInt_WithDay(1,m); //первое    число 
  var de=KDateFromInt_LastDay(m);   //последнее число 
  for (int i=0;i < cntplus;i++)
  {
    char Sim[2];Sim[1]=0;
    Sim[0]=Sim_For_Intern_Cod(kodnu1[i],stolb-1);  //определяем символ в ТВХ
    if ( IsSubStrPresent(Simv,"*")&&(Sim!="0") || IsSubStrPresent(Simv,Sim))
    {
      int rowkod[ROWMAX];//массив с номерами строк
      var Prop=GetCommonProp(CMN_SRC_COUNT_LS);//определяем атрибуты глобального фильтра
      int cntrow=poiskosnkodProp(kodnu1[i],rowkod,0,Prop);//получаем список строк с внутренним кодом==kodnu1[i]
      for (int row=0; row < cntrow; row++)                    //перебираем все строки
      {
        var dbRow = KDateFromD(GetBegDate(rowkod[row]));
        var deRow = KDateFromD(GetEndDate(rowkod[row]));
        //фильтр на действующие строки
        if (( dbRow.IsValid() && dbRow.GT(de))|| //дата_начала вида больше даты окончания периода
          (deRow.IsValid() && deRow.LT(db)) )   //дата_окончания вида меньше даты начала период
        continue; 
        map.Add(to_string(GetCode(rowkod[row])),"");
      }
    }      
  }
  return map;
}

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