// Расчетный листок без разбивки и без сортировки.

int flCheck = 1; // 1-собственные настройки
                 // 0-настройки порядка подведения баланса в ЛС из общих настроек системы

////////////////////////////////////////////////////////////////////////////////////////////
// Значения, используемые при ручной настройке
//
// Порядок сортировки и глубина сортировки
int SortSrc = 0, // источник
    SortPod = 1, // подразделение
    SortCom = 2, // совместительство
    SortSub = 3, // объект

    OrdSort = 0; // глубина сортировки

////////////////////////////////////////////////////////////////////////////////////////////
// Общие настройки квитка

int OrdDepth = 0; // глубина разбиения (на квитки)

int tfOrdSort = 0; // игнорировать ограничение глубины сортировки (OrdSort) значением PR_BALANCE (глубина разбиения баланса в ЛС из настрек АМБы)
int fitPartCheck = 0; // 1 - печатать итоги по части квитка; 0 - не печатать
int fVedCheck = 0; // 0 - печатать одну сумму в ведомость по квитку; 1 - печатать сумму в ведомость по каждой части квитка


string RV0 = ""; // символ для нулевого РВ

int lenNazv = 0, // 0-короткое название вида Н-У, 1-длинное имя
    prnTn   = 0; // 0-не печатать ФИО и ТН для каждого квитка одного ЛС, 1-печатать       //

// Размер поля при формировании строки квитка (значения настраиваются в форме печати квитка)
int lmes = 0, // месяц
    lkod = 0, // код
    lsrc = 0, // источник финансирования
    lpod = 0, // подразделение
    lcom = 0, // совместительство
    lsub = 0, // объект
    lnaz = 0, // название
    l_rv = 0, // рабочее время
    l_rvu = 0, // рабочее время
    lsum = 0, // сумма
    lmni = 0; // мнимость
  

int sh = 0; // длина половины строки квитка (если 0 - вычисляем)
int shu = 17;

int l_tn = 0, // размер поля для табельного номера
    lkat = 0; // размер поля для категории

////////////////////////////////////////////////////////////////////////////////////////////

// cntCheck   - число квитков для данного ЛС
// ptRow      - число строк Н-У для отдельного квитка
// cntOst     - число строк остатка в квитке
// cntDol     - число строк долга в квитке
// cntNac     - число строк начислений в квитке
// cntUdr     - число строк удержаний в квитке
// cNac       - число строк начислений для части квитка
// cUdr       - число строк удержаний для части квитка
// sumNac     - итого начислено по квитку
// sumUdr     - итого удержано по квитку
// sumPartNac - итого начислено по части квитка
// sumPartUdr - итого удержано по части квитка

// Функции печати квитка
// ---------------------
// MainCheck() - главная функция
// Header() - печать шапки по ЛС
// PrintChecks() - печать квитков (для одного ЛС может быть несколько квитков)
// PrintCheck(n) - печать одного квитка
// PrintPartCheck(n) - печать одной части квитка (в квитке может быть несколько частей 
//                   в случае если выполняется сортировка по какому-либо признаку)
// PrintOstDolg() - печать строк остатка и долга по квитку
// ItgNacPart(n) - формирует строку итога по начислениям для части квитка
// ItgUdrPart(n) - формирует строку итога по удержаниям для части квитка
// PrintVedChek(n) - печать суммы в ведомость по квитку
// Footer() - печать подножия по ЛС

int m   = 0, // календарный месяц
    kod = 0; // внешний код вида Н-У

char mnim = ' '; // мнимость

string nazv = "", // название вида Н-У
         rv = ""; // рабочее время

double sum = 0.0; // сумма

char src = ' '; // источник финансирования

int pod = 0; // подразделение

string com = "", // совместительство
       sub = ""; // объект

int len = 256; // длина строки

char str[len], // вспомогательные строки
     arg[len],
     ts1[len],
     ts2[len];

char strpod[len]; // строка подчеркивания
char strpod2[len];
char empty[len]; // пустая строка

////////////////////////////////////////////////////////////////////////////////////////////////////////

MainCheck(&Param)
{
  int np = 26;
  int param[np];

  param[0]  = atoi(Param[0]);
  param[1]  = atoi(Param[1]);
  param[2]  = atoi(Param[2]);
  param[3]  = atoi(Param[3]);
  param[4]  = atoi(Param[4]);
  param[5]  = atoi(Param[5]);
  param[6]  = atoi(Param[6]);
  param[7]  = atoi(Param[7]);
  param[8]  = atoi(Param[8]);
  param[9]  = atoi(Param[9]);
  param[10] = atoi(Param[10]);
  param[11] = atoi(Param[11]);
  param[12] = atoi(Param[12]);
  param[13] = atoi(Param[13]);
  param[14] = 0; // vatr
  param[15] = 1; // flCheck
  param[16] = 0; // SortSrc
  param[17] = 1; // SortPod
  param[18] = 2; // SortCom
  param[19] = 3; // SortSub
  param[20] = 0; // OrdSort
  param[21] = 0; // OrdDepth
  param[22] = 0; // tfOrdSort
  param[23] = 0; // prnTn
  param[24] = 0; // fitPartCheck
  param[25] = 0; // fVedCheck

  MainCheckPar(param,np);

  return 0;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////

MainCheckPar(&param,np)
{
  // Читаем параметры (размеры полей при формировании строки квитка)
  if ( np >  0 ) lmes = atoi(param[0]); // месяц
  if ( np >  1 ) lkod = atoi(param[1]); // код
  if ( np >  2 ) lsrc = atoi(param[2]); // источник финансирования
  if ( np >  3 ) lpod = atoi(param[3]); // подразделение
  if ( np >  4 ) lcom = atoi(param[4]); // совместительство
  if ( np >  5 ) lsub = atoi(param[5]); // объект
  if ( np >  6 ) lnaz = atoi(param[6]); // название
  if ( np >  7 ) l_rv = atoi(param[7]); // рабочее время
  if ( np >  8 ) lsum = atoi(param[8]); // сумма
  if ( np >  9 ) lmni = atoi(param[9]); // мнимость

  if ( np > 10 )   sh         = atoi(param[10]); // длина половины строки квитка (если 0 - вычисляем)
  if ( np > 11 ) l_tn         = atoi(param[11]); // размер поля для табельного номера
  if ( np > 12 ) lkat         = atoi(param[12]); // размер поля для категории
  if ( np > 13 ) lenNazv      = atoi(param[13]); // 0-короткое название вида Н-У, 1-длинное имя
//if ( np > 14 ) vAttr        = atoi(param[14]);
  if ( np > 15 ) flCheck      = atoi(param[15]);
  if ( np > 16 ) SortSrc      = atoi(param[16]);
  if ( np > 17 ) SortPod      = atoi(param[17]);
  if ( np > 18 ) SortCom      = atoi(param[18]);
  if ( np > 19 ) SortSub      = atoi(param[19]);
  if ( np > 20 ) OrdSort      = atoi(param[20]);
  if ( np > 21 ) OrdDepth     = atoi(param[21]);
  if ( np > 22 ) tfOrdSort    = atoi(param[22]);
  if ( np > 23 ) prnTn        = atoi(param[23]);
  if ( np > 24 ) fitPartCheck = atoi(param[24]);
  if ( np > 25 ) fVedCheck    = atoi(param[25]);

  
  UnloadScriptModule("check\\comcheck");
  LoadScriptModule("check\\comcheck");

  SetvAttr();
  fOrdSort = tfOrdSort; // игнорировать ограничение глубины сортировки (OrdSort) значением PR_BALANCE (глубина разбиения баланса в ЛС из настрек амбы)
  
  Kvitok(); // Вызов функций подготовки данных для печати квитка по данному ЛС
  Header(); // Печать шапки по данному ЛС
  PrintChecks(); // Печать квитков по данному ЛС
  Footer(); // Печать подножия по данному ЛС

  UnloadScriptModule("check\\comcheck");

  return 0;
}

//######################################################################################################

SetvAttr()
{
  int saSrc = 0,
      saPod = 0,
      saCom = 0,
      saSub = 0;

  for ( int i = 0; i < OrdSort; i++ )
  {
    if ( BALANCE[i] == ItSRC ) saSrc = 1;
    if ( BALANCE[i] == ItPOD ) saPod = 1;
    if ( BALANCE[i] == ItCOM ) saCom = 1;
    if ( BALANCE[i] == ItSUB ) saSub = 1;
  }

  if ( lsrc && !saSrc ) vAttr = 1;
  if ( lpod && !saPod ) vAttr = 1;
  if ( lcom && !saCom ) vAttr = 1;
  if ( lsub && !saSub ) vAttr = 1;

  return 0;
}

//######################################################################################################

char Fio[len]; // ФИО
int iTn;

Header()
// Печать шапки по данному ЛС
{
  char Org[len],  // Организация
       Podr[len], // Подразделение
       Fam[len],
       Ima[len],
       Otc[len];

  string s = ""; 
//  for ( int i = 0; i < sh * 2 + 1; i++ ) s = s + "-";
  for ( int i = 0; i < sh + shu + 1; i++ ) s = s + "-";
  sprintf(strpod,"%s",s);
  string ss = "";
  for ( int i = 0; i < sh + 1; i++ ) ss = ss + "-";
  sprintf(strpod2,"%s",ss);

  var Mes = CreateObject("KMonth");
  Mes.SetMonth(mtek);
  int iGod = Mes.GetYear();
  int iMes = Mes.GetMonth();

  sprintf(arg,"1,%d",mtek); R_DATA_EX(arg,str,20,0); Trim(str);
  string sMes = static_cast_to_string(str);

  GetEnterpriseVar("ИМЯП",Org,len-1); Trim(Org);

  kch_from("f", Fam); Trim(Fam);
  kch_from("i", Ima); Trim(Ima);
  kch_from("o", Otc); Trim(Otc);

  int iPodr = kch_from_int("podr"); // Код подразделения
  int iKat  = kch_from_int("kat");  // Код категории
      iTn   = kch_from_int("tn");   // Табельный номер

  int pos = poisk2(iPodr,OtdList(),CountOtd());
  sprintf(Podr,"%s", (pos!=EOF) ? OtdName(pos) : "неизвестное подразделение"); Trim(Podr);

  if ( !KV_FIO ) sprintf(Fio,"%s %c.%c.",Fam,Ima[0],Otc[0]);
  else           sprintf(Fio,"%s %s %s",Fam,Ima,Otc);

//  int ln = sh * 2 + 1 - 17; // sh * 2 + 1 - длина строки квитка; 17 - длина строки с месяцем и годом
  int ln = sh +shu + 1 - 17; // sh * 2 + 1 - длина строки квитка; 17 - длина строки с месяцем и годом


  sprintf(arg,"%s",Org);

  if ( strlen(arg) >= ln ) sprintf(ts1,"%-*.*s",ln,ln,arg);
  else
  {
    int lk = ln - strlen(arg);
    sprintf(ts1,"%s%*.*s",arg,lk,lk,"");
  }
  
  sprintf(str,"ОАО <<НПК <<КБМ>>");  print(str);
  sprintf(str,"   Р А С Ч Ё Т Н Ы Й     Л И С Т О К");  print(str);
  //sprintf(str,"%s %-9.9s%d г.",ts1,sMes,iGod);  print(str);
  sprintf(str,"%-10.10s Таб№ %-4.4d   %-9.9s%d г.",Podr,iTn,sMes,iGod);  print(str);
  sprintf(str,"%s %s %s",Fam,Ima,Otc);  print(str);

  double chs=123;    int dn=0;
  dn=dney_v_tab("Р",calm,1,countday);
  skoljko(chs,data,1,countday,"Р",calm,1);
  //sprintf(str,"Подр-е:%d   %d(%d): %s",iPodr,iTn,iKat,Fio); print(str);
  sprintf(str,"Отработано: дней_%d   часов_%.2f",dn,chs); print(str);

  print(strpod);

  return 0;
}

//######################################################################################################

PrintChecks()
// Печать квитков по данному ЛС
{
  for ( int i = 0; i < cntCheck; i++ )
  {
    PrepareTableForCheck(i);
    PrintCheck(i,FlgPrintCheck()); // печать одного квитка
  }

  return 0;
}

//######################################################################################################

FlgPrintCheck()
{
  if ( cntNac ) return 1;
  if ( cntUdr ) return 1;
  if ( cntOst ) return 1;
  if ( cntDol ) return 1;

  int flgSumVedCheck = 0;

  for ( int i = 0; i < cntPartCheck; i++ )
  {
    if ( nabs(GetSumVedPart(i)) > eps ) 
    {
      flgSumVedCheck = 1;
      break;
    }
  }

  if ( flgSumVedCheck ) return 1;

  return 0;
}

//######################################################################################################

PrintCheck(n,fPrnCheck)
// печать одного квитка
// n - номер квитка
// fPrnCheck - флаг печати квитка
{
  if ( cntCheck > 1 )
  {
    if (n) print(strpod);
    sprintf(str," квиток %2d из %2d",n+1,cntCheck); print(str);

    for ( int i = 0; i < OrdDepth; i++ )
    {
      if ( BALANCE[i] == ItSRC ) sprintf(str," Источник финанс.  %s (%c)",CurSrcNameCheck(n),CurSrcExtCodCheck(n));
      if ( BALANCE[i] == ItPOD ) sprintf(str," Подразделение:    %s (%d)",CurPodNameCheck(n),CurPodrCheck(n));
      if ( BALANCE[i] == ItCOM ) sprintf(str," Совместительство: %s (%s)",CurComNameCheck(n),CurComExtCodCheck(n));
      if ( BALANCE[i] == ItSUB ) sprintf(str," Объект:           %s (%s)",CurSubNameCheck(n),CurSubExtCodCheck(n));
    
      print(str);
    }

    if ( prnTn && n )
    {
      sprintf(str," %d %s",iTn,Fio); print(str);
    }

    print(strpod);
  }

  if ( !fPrnCheck )
  {
    sprintf(str," по данному квитку сумм нет"); print(str);
    print(strpod);
    return 0;
  }

  PrintOstDolg();

  for ( int i = 0; i < cntPartCheck; i++ )
  {
    PrepareTableForPartCheck(i);
    PrintPartCheck(i); // печать одной части квитка
    if ( fitPartCheck ) PrintItogPartCheck(i); // печать итога по части квитка
  }

  print(strpod);

//  arg = " ВCЕГО начислено ";
  arg = " ВCЕГО нач ";
  int ln = sh - strlen(arg) - 1 - lsum;
  sprintf(ts1,"%s%*.*s%*.2f ",arg,ln,ln,"",lsum,sumNac);
                                  
//  arg = " удержано ";
  arg = " удерж ";
  ln = shu - strlen(arg) - 1 - lsum;
  sprintf(ts2,"%s%*.*s%*.2f ",arg,ln,ln,"",lsum,sumUdr);

//  sprintf(str,"%-*.*s|%-*.*s",sh,sh,ts1,sh,sh,ts2);

  sprintf(str,"%-*.*s%-*.*s",sh,sh,ts1,sh,sh,ts2);
                           

  print(str);
 // print(strpod);

  PrintVedChek(n);
  print("");

  return 0;
}

//######################################################################################################

PrintPartCheck(n)
// печать одной части квитка
// n - номер части квитка
{
  int cnt = ( cNac > cUdr ) ? cNac : cUdr;

  int row = 0;

  // Цикл по строкам части квитка
  for ( row = 0; row < cnt; row++ )
  {
    if ( row < cNac )
    { // Строка начисления
      GetStrNac(row);
      if ( vAttr ) getiProp(nCOD[row]);
      formStringSum(ts1);
    }
    else 
      sprintf(ts1,"%s",empty);

    if ( row < cUdr )
    { // Строка удержания
      GetStrUdr(row);
      if ( vAttr ) getiProp(uCOD[row]);
      formStringSumU(ts2);
    }
    else 
      sprintf(ts2,"%s",empty);

//    sprintf(str,"%s|%s",ts1,ts2); print(str);
    sprintf(str,"%s%s",ts1,ts2); print(str);

  }

  return 0;
}

//######################################################################################################

PrintItogPartCheck(n) 
{ // печать итога по части квитка

  sprintf(ts1,"%-*.*s",sh,sh,ItgNUPart(n,sumPartNac));
  sprintf(ts2,"%-*.*s",sh,sh,ItgNUPart(n,sumPartUdr));

//  sprintf(str,"%s|%s",ts1,ts2); print(str);
  sprintf(str,"%s%s",ts1,ts2); print(str);

  return 0;
}

//######################################################################################################

ItgNUPart(n,sumPart)
// формирует строку итога по начислениям или удержаниям для части квитка
{
  string ss[4]; for ( int i = 0; i < 4; i++ ) ss[i] = "";

  int iss = 0;

  if ( OrdSort > OrdDepth )
  {
    for ( int i = OrdDepth; i < OrdSort; i++ )
    {
      if ( BALANCE[i] == ItSRC ) { sprintf(arg,"(%c)",CurSrcExtCodPart(n)); ss[iss] = static_cast_to_string(arg); iss++; }
      if ( BALANCE[i] == ItPOD ) { sprintf(arg,"(%d)",CurPodrPart(n)); ss[iss] = static_cast_to_string(arg); iss++; }
      if ( BALANCE[i] == ItCOM ) { sprintf(arg,"(%s)",Trim(CurComExtCodPart(n))); ss[iss] = static_cast_to_string(arg); iss++; }
      if ( BALANCE[i] == ItSUB ) { sprintf(arg,"(%s)",Trim(CurSubExtCodPart(n))); ss[iss] = static_cast_to_string(arg); iss++; }
    }
  }

  char ts[len]; ts = " итого ";
//  sprintf(arg,"(%-*.*s) %s",lsub,lsub,CurSubExtCodPart(n),CurSubNamePart(n));

  arg = "";
  for ( int i = 0; i < iss; i++ )
  {
    arg += ss[i] + " ";
  }

  int ln = sh - strlen(ts) - 1 - lsum;
  sprintf(str,"%s%-*.*s%*.2f ",ts,ln,ln,arg,lsum,sumPart);
                                    
  return static_cast_to_string(str);
}

//######################################################################################################

PrintOstDolg()
// Печать строк остатка и долга по квитку
{
  int cnt = ( cntOst > cntDol ) ? cntOst : cntDol;

  sprintf(empty,"%*.*s",sh,sh,"");

//  formStringTitle(ts1,"начисл.");
//  formStringTitle(ts2,"удерж.");
  formStringTitle(ts1," ");
  formStringTitleU(ts2," ");

//  sprintf(str,"%*.*s|%*.*s",sh,sh,ts1,sh,sh,ts2);

  sprintf(str,"%*.*s%*.*s",sh,sh,ts1,shu,shu,ts2);

  print(str);

  for ( int row = 0; row < cnt; row++ )
  {
    if ( row < cntOst )
    {
      GetStrOst(row);
      if ( vAttr ) getiProp(osCOD[row]);
      formStringOD(ts1);
    }
    else
      sprintf(ts1,"%s",empty);
    
    if ( row < cntDol )
    {
      GetStrDol(row);
      if ( vAttr ) getiProp(doCOD[row]);
      formStringOD(ts2);
    }
    else
      sprintf(ts2,"%s",empty);

//    sprintf(str,"%s|%s",ts1,ts2); print(str);
    sprintf(str,"%s%s",ts1,ts2); print(str);

  }

  if ( cnt ) print(strpod);

  return 0;
}

//######################################################################################################

PrintVedChek(n)
// печать суммы в ведомость по квитку
{
  if ( fVedCheck )
  {
    for ( int i = 0; i < cntPartCheck; i++ )
    {
//      arg = " в вед. за месяц ";
//      arg = " в вед.";
      arg = "к выдаче";
      int ln = sh - strlen(arg) - 1 - lsum;
      sprintf(ts1,"%s%*.*s%*.2f",arg,ln,ln,"",lsum,GetSumVedPart(i));
                                        
      double to = GetSumOstPart(i);
      double td = GetSumDolPart(i);
    
      ts2 = "";
    
      if ( to >= td && nabs(to) > eps )
      {
        arg = "остаток";
//        int ln = sh - strlen(arg) - 1 - lsum;
        int ln = shu - strlen(arg) - 1 - lsum;
        sprintf(ts2,"%s%*.*s%*.2f",arg,ln,ln,"",lsum,to);
      }
    
      if ( td >= to && nabs(td) > eps )
      {
        arg = " долг ";
        int ln = sh - strlen(arg) - 1 - lsum;
        sprintf(ts2,"%s%*.*s%*.2f",arg,ln,ln,"",lsum,td);
      }
    
      sprintf(str,"%-*.*s %-*.*s",sh,sh,ts1,sh,sh,ts2);
                                  
      print(str);
    }
  }
  else
  {
//    arg = " в вед. за месяц ";
//    arg = " в вед. ";
    arg = " к выдаче ";
    int ln = sh - strlen(arg) - 1 - lsum;
  //  sprintf(ts1,"%s%*.*s%*.2f",arg,ln,ln,"",lsum,checkSumVed);
    FreeSpaceString(strpod2, 3, "");
    sprintf(ts1,"_________________  к выдаче: %8.2f ",checkSumVed);
  print(ts1);                             
    double to = checkSumOst;
    double td = checkSumDol;
    
    ts2 = "";
    
    if ( to >= td && nabs(to) > eps )
    {
      arg = "остат";
      int ln = shu - strlen(arg) - 1 - lsum;   // int ln = sh - strlen(arg) - 1 - lsum;
      sprintf(ts2,"%s%*.*s%*.2f",arg,ln,ln,"",lsum,to);
    }
    
    if ( td >= to && nabs(td) > eps )
    {
      arg = " долг ";
      int ln = sh - strlen(arg) - 1 - lsum;
      sprintf(ts2,"%s%*.*s%*.2f",arg,ln,ln,"",lsum,td);

      sprintf(ts1,"         долг за работающим: %8.2f ",td);
      print(ts1);
    }
    
   // sprintf(str,"%-*.*s %-*.*s",sh,sh,ts1,sh,sh,ts2);
   // sprintf(str,"%-*.*s ",sh,sh,ts1);
                                
   // print(str);
  }

  return 0;
}

//######################################################################################################

Footer()
// печать подножия
{
  Mnim();
  // Печать табеля
  for ( int i = 0; i < cntCom; i++ )
  {
    var TmpCurCom = CreateObject("TmpCurCombine");
    TmpCurCom.Init(GetComIntCod(i));

    sprintf(ts1,"%-*.*s",countday,countday,calm);

    if ( cntCom == 1 )
    {
      sprintf(str,"Табель: %s", ts1); print(str);
    }
    else
    {
//      sprintf(str," Табель по (%s) %s",GetComExtCod(i),GetNameCOM(GetComIntCod(i))); print(str);
//      sprintf(str," %s",calm); print(str);
      sprintf(str," Табель (%s): %s",GetComExtCod(i),ts1); print(str);
    }

  }
  return 0;
}

//######################################################################################################


formStringTitleU(&ts,strnu)
{ // формирование строки заголовка
   // sprintf(ts," М  код %s",strnu); 
  sprintf(ts,"%*s %*s %-*.*s%s%-*.*s%s%-*.*s%s%-*.*s%s%-*.*s%*.*s %*.*s%*.*s",
             lmes,"М",                       // календарный месяц
             lkod,"код",                     // внешний код вида начисления
             lsrc,lsrc,"И",    (lsrc)?" ":"",// внешний код источника финансирования
             lpod,lpod,"подр.",(lpod)?" ":"",// внешний код подразделения
             lcom,lcom,"сов.", (lcom)?" ":"",// внешний код совместительства
             lsub,lsub,"об-кт",(lsub)?" ":"",// внешний код объекта
             lnaz,lnaz,strnu,                // название вида начисления
             l_rvu,l_rvu,"рв",                 // рабочее время
             lsum,lsum,"сумма",              // сумма
             lmni,lmni,"");                  // мнимость

  return 0;
}


formStringTitle(&ts,strnu)
{ // формирование строки заголовка
   // sprintf(ts," М  код %s",strnu);
  //sprintf(ts,"%*s %*s %-*.*s%s%-*.*s%s%-*.*s%s%-*.*s%s%-*.*s%*.*s %*.*s%*.*s",
  sprintf(ts,"%*s %*s %-*.*s%s%-*.*s%s%-*.*s%s%-*.*s%s%-*.*s%*.*s %*.*s%*.*s", 
             lmes,"М",                       // календарный месяц
             lkod,"код",                     // внешний код вида начисления
             lsrc,lsrc,"И",    (lsrc)?" ":"",// внешний код источника финансирования
             lpod,lpod,"подр.",(lpod)?" ":"",// внешний код подразделения
             lcom,lcom,"сов.", (lcom)?" ":"",// внешний код совместительства
             lsub,lsub,"об-кт",(lsub)?" ":"",// внешний код объекта
             lnaz,lnaz,strnu,                // название вида начисления
             l_rv,l_rv,"рв",                 // рабочее время
             lsum,lsum,"сумма",              // сумма
             lmni,lmni,"");                  // мнимость

  return 0;
}

//######################################################################################################


formStringSumU(&ts);
{ // формирование строки начисления-удержания
  sprintf(str,"%c",src);
  sprintf(arg,"%d",pod);

  char nzv[2]; nzv[0]=' ';   //20091129
  //sprintf(ts,"%*d %*d %-*.*s%s%-*.*s%s%-*.*s%s%-*.*s%s%-*.*s%*.*s %*.2f%c",
  sprintf(ts,"%*d %*d %-*.*s%s%-*.*s%s%-*.*s%s%-*.*s%s%-*.*s%*.*s %*.2f%c",
             lmes,m,                      // календарный месяц
             lkod,kod,                    // внешний код вида начисления
             lsrc,lsrc,str,(lsrc)?" ":"", // внешний код источника финансирования
             lpod,lpod,arg,(lpod)?" ":"", // внешний код подразделения
             lcom,lcom,com,(lcom)?" ":"", // внешний код совместительства
             lsub,lsub,sub,(lsub)?" ":"", // внешний код объекта
             lnaz,lnaz,nzv,              // название вида начисления
             l_rvu,l_rvu,rv,                // рабочее время
             lsum,sum,                    // сумма
             mnim);                       // мнимость

  return 0;
}


formStringSum(&ts);
{ // формирование строки начисления-удержания
  sprintf(str,"%c",src);
  sprintf(arg,"%d",pod);

  char nzv[2]; nzv[0]=' ';   //20091129
  char rvr[4]; //rvr[0]='2';  rvr[1]='2';

  //int rvln=poiskc('.',rv,9);      // убрать символ '.' из рабочего времени

  int rvln;
  if ( poiskc('.',rv,strlen(rv))!=EOF) rvln = poiskc('.',rv,strlen(rv));

  copy1(rvr,rv,rvln);

  sprintf(ts,"%*d %*d %-*.*s%s%-*.*s%s%-*.*s%s%-*.*s%s%-*.*s%*.*s %*.2f%c",
             lmes,m,                      // календарный месяц
             lkod,kod,                    // внешний код вида начисления
             lsrc,lsrc,str,(lsrc)?" ":"", // внешний код источника финансирования
             lpod,lpod,arg,(lpod)?" ":"", // внешний код подразделения
             lcom,lcom,com,(lcom)?" ":"", // внешний код совместительства
             lsub,lsub,sub,(lsub)?" ":"", // внешний код объекта
             lnaz,lnaz,nzv,              // название вида начисления
             l_rv,l_rv,rvr,                // рабочее время
             lsum,sum,                    // сумма
             mnim);                       // мнимость

  return 0;
}

//######################################################################################################

formStringOD(&ts)
{ // формирование строки остатка-долга
  sprintf(str,"%c",src);
  sprintf(arg,"%d",pod);

  sprintf(ts,"%*d %*d %-*.*s%s%-*.*s%s%-*.*s%s%-*.*s%s%-*.*s%*.*s %*.2f%c", 
             lmes,m,                      // календарный месяц
             lkod,kod,                    // внешний код остатка
             lsrc,lsrc,str,(lsrc)?" ":"", // внешний код источника финансирования
             lpod,lpod,arg,(lpod)?" ":"", // внешний код подразделения
             lcom,lcom,com,(lcom)?" ":"", // внешний код совместительства
             lsub,lsub,sub,(lsub)?" ":"", // внешний код объекта
             lnaz,lnaz,nazv,              // название вида начисления
             l_rv,l_rv,rv,                // рабочее время
             lsum,sum,                    // сумма
             mnim);                       // мнимость

  return 0;
}

//######################################################################################################

getiProp(codenu)
{
  iProp.Initial(GetPropOfCod(codenu));

  isrc = iProp.GetSrc();     src = IntSrcToExt(isrc);
  ipod = iProp.GetPodr();    pod = ipod;
  icom = iProp.GetCombine(); com = iCombList.GetExtCod(icom);
  isub = iProp.GetSubject(); sub = iSubjList.GetExtCod(isub);

  return 0;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////

int isrc = 0,
    ipod = 0,
    icom = 0,
    isub = 0;

var iProp     = CreateObject("APropBE");
var iSubjList = CreateObject("SubjectList");
var iCombList = CreateObject("CombineList");

int vAttr = 0; // 1 - включить "принудительную" визуализацию атрибутов (нужна в случае если сортировка по атрибуту не ведется, но обозначить его надо)
               // 0 - не включать

// Вспомогательные функции
// -----------------------

// внешние коды, исползуются в печати квитка
// CurSrcExtCodCheck(n) - источник
// CurPodrCheck(n)      - подразделение
// CurComExtCodCheck(n) - совместительство
// CurSubExtCodCheck(n) - объект

// названия, исползуются в печати квитка
// CurSrcNameCheck(n) - источник
// CurPodNameCheck(n) - подразделение
// CurComNameCheck(n) - совместительство
// CurSubNameCheck(n) - объект

// внутренние коды, исползуются в печати квитка
// CurSrcIntCodCheck(n) - источник
// CurPodIntCodCheck(n) - подразделение
// CurComIntCodCheck(n) - совместительство
// CurSubIntCodCheck(n) - объект

// внешние коды, исползуются в печати части квитка
// CurSrcExtCodPart(n) - источник
// CurPodrPart(n)      - подразделение
// CurComExtCodPart(n) - совместительство
// CurSubExtCodPart(n) - объект

// названия, исползуются в печати части квитка
// CurSrcNamePart(n) - источник
// CurPodNamePart(n) - подразделение
// CurComNamePart(n) - совместительство
// CurSubNamePart(n) - объект

// GetSumVedPart(n) - сумма в ведомость по части квитка
// GetSumOstPart(n) - остаток следующего месяца по части квитка
// GetSumDolPart(n) - долг следующего месяца по части квитка

// GetNameSRC(src) - название источника по внутреннему коду
// GetNamePOD(pod) - название подразделения по внутреннему коду
// GetNameCOM(com) - название совместительства по внутреннему коду
// GetNameSUB(sub) - название объекта по внутреннему коду

// GetComIntCod(i) - внутренний код совместительства из списка совместительств по которым есть ненулевые строки видов Н-У
// GetComExtCod(i) - внешний код совместительства из списка совместительств по которым есть ненулевые строки видов Н-У


Mnim()
 {
  var dat  = CreateObject("KDate"); 
  dat.SetMonth(mtek);
  int month=dat.GetMonth();

  int Vid[1000];   //массив видов для подвала

  Vid[282]=1;
  Vid[382]=1;
  Vid[283]=1;
  Vid[384]=1;
  Vid[308]=1;
  Vid[302]=1;
  Vid[303]=1;
  Vid[385]=1;
  Vid[387]=1;
  Vid[388]=1;
  Vid[396]=1;
  Vid[397]=1;
  Vid[488]=1;
  Vid[489]=1;
  Vid[492]=1;
  Vid[386]=1;
  Vid[389]=1;
  Vid[405]=1;
  Vid[412]=1;
  Vid[395]=1;
  Vid[309]=1;
  Vid[398]=1;
  Vid[383]=1;
  Vid[310]=1;
  Vid[493]=1;
  Vid[494]=1;
  Vid[345]=1;
  Vid[401]=1;
  Vid[311]=1;
  Vid[475]=1;
  Vid[486]=1;


  for ( int vid = 0; vid < 1000; vid++ )
   {
    if (( CollectSumm(vid,0,mtek, CL_MV | CL_EXT ) != 0 ) &&  ( Vid[vid] == 1 ))  PrnSummPodv(vid, month);
   }

 }

PrnSummPodv(a1, a2)
{
  double s1=0.0,  s2=0.0;
  int v1 = atoi(a1);
  int m1 = atoi(a2);

  s1 = CollectSumm(v1,mtek,mtek, CL_M | CL_MV | CL_EXT );
  s2 = CollectSumm(v1,mtek-1,mtek, CL_M | CL_MV | CL_EXT );

  if(s2) {  sprintf(str,"%2d %3i     %10.2f", m1-1, v1, s2);   print(str); }  
  if(s1) {  sprintf(str,"%2d %3i     %10.2f", m1,   v1, s1);   print(str); }
}     



     