
int BankKchNumSetNumber = 645; // номер сетки в Дополнительных справочниках организации для списка банков и псевдонимов КЧ для них

var MapBankNames=CreateObject("MapString"); 
var MapBankKchPseudos=CreateObject("MapString"); 
var MapBankCashCodes=CreateObject("Map"); 
string __userSelectedBank;
var __userQueryDate; //певое число текущего месяца


User_Forma_W_Script( &pDoc, Kind_Form, Code, Col )
//////////////////////////////////////////////////////////////////////
// Вспомогательная функция для панели Panel_Cash
//////////////////////////////////////////////////////////////////////
{
  MapBankNames.Clear(); 
  MapBankKchPseudos.Clear(); 
  MapBankCashCodes.Clear(); 
  char dir[256];char str[256];
  GetCommonZPL(dir,255);//определяем путь до сетевого ЗПЛ -справочник берем из него
  sprintf(str,"%s\\TABLSET2\\Tabl%d.sum",dir,BankKchNumSetNumber);  // путь до справочника
  var   CTabl = CreateObject("CurPrnTbl");
  CTabl.InitialNameFile(to_string(str));
  int cr=CTabl.Count_Rcr();         // число рабочих записей в таблице    
  if (cr==1 && CTabl.Check_Empty_Rcr(0))
     return Sys_Forma_W_Script( pDoc, Kind_Form, Code, Col );
     
  int idxname=CTabl.Find_Name_Fld("BankName");
  int idxkch=CTabl.Find_Name_Fld("KchPseudo");
  int idxvid[8];
  idxvid[1]=CTabl.Find_Name_Fld("VidZarp");
  idxvid[3]=CTabl.Find_Name_Fld("VidUvoln");
  idxvid[4]=CTabl.Find_Name_Fld("VidOneVid");
  idxvid[5]=CTabl.Find_Name_Fld("VidColumn");
  
  
  if (idxname<0 || idxkch<0)
  {
     AmbaMessageBox("Некорректная структура сетки "+to_string(BankKchNumSetNumber)+ " в доп.справочниках организации","",0,0);
     return Sys_Forma_W_Script( pDoc, Kind_Form, Code, Col );
   }
  // цикл по записям таблицы
  for (int zap=0; zap<cr; zap++)
  {
    MapBankNames.Add(to_string(zap), RTrimS(to_string(CTabl.Text(idxname,zap))));
    string kchPseudo=to_string(CTabl.Text(idxkch,zap));
    if (kch_num_sys(kchPseudo)==EOF)
    {
       AmbaMessageBox("Не заполнено поле КЧ в строке "+to_string(zap)+" сетки "+to_string(BankKchNumSetNumber)+ " в доп.справочниках организации","",0,0);
       return Sys_Forma_W_Script( pDoc, Kind_Form, Code, Col );
    }
    MapBankKchPseudos.Add(to_string(zap), kchPseudo);
    var arr[8];
    for(int k=1; k<8; k++)
      if (idxvid[k]>=0)
         arr[k]=atoi(CTabl.Text(idxvid[k],zap));
    
    MapBankCashCodes.Add(zap, arr);
  }

  if (cr==1)
    __userSelectedBank=0;
  else
  {
     var MapRez = CreateObject("MapString");
     int c=PanelValueFromMap(MapBankNames,MapRez,1, "Выберите банк для создания ведомости");
     if (c==ESC)
     {
        return(ESC);
     }
     MapRez.InitIterator();
        
     __userSelectedBank=MapRez.GetCurKey();
  }
  
  __userQueryDate=KDateFromInt_WithDay(1,mtek);

  var Ved =  CreateObject("Doc");
  Ved.Initial(static_cast_to_string(pDoc));
  
  var cashcode = MapBankCashCodes.GetValue(to_int(__userSelectedBank))[Kind_Form];
  if (VarHasValue(cashcode) && cashcode != 0)   Ved.SetCashCode(Extern_To_Intern(cashcode));  // установка вида для разноски ведомости, заработает только в версии 606.6 
     

  switch(Kind_Form)
  {

    case 1:       /* --- за месяц */
          Ved.FillStrRemDoc("Заpплата" +usGetBankName());
          break;

    case 2:       /* --- отпуск */
          Ved.FillStrRemDoc("Отпускные" +usGetBankName());
          break;

    case 3:     /* --- увольнение */
          Ved.FillStrRemDoc("К увольнению" +usGetBankName());
          break;

    case 0:       /* --- аванс */
    case 4:       /* --- произв.вид */
        {
          double InternCode = Extern_To_Intern(Code);
          Ved.SetWorkInternCode(InternCode);
          int n=poisk1(InternCode, kodnu1, cntplus,1);
          sprintf(str,"По виду %1d-%-7.7s",kodnu4[n],GetNameKodNU(n));
          Ved.FillStrRemDoc(static_cast_to_string(str) +usGetBankName());
          break;
        }

    case 5:       /* --- по столбцу т.вх. */
          Ved.SetWorkCol(Col);
          if ( Ved.GetWorkCol()==0 )
          {  // произвольн.набор
            memcpy(dopst,dopst2,MAXKOD);
          }
          Ved.FillStrRemDoc("По набору видов" +usGetBankName());
          break;

    case 6:       /* --- . */
          Ved.FillStrRemDoc("Выдача сумм" +usGetBankName());
          break;

    case 7:       /* частичная выдача */
          Ved.FillStrRemDoc("Выдача за xx.xxxx" +usGetBankName());
          break;

    default:
          Ved.FillStrRemDoc(" ");
          break;
  }
  return;
}



User_Before_Summa_W( &Doc , Kind_Form)
{
   // Функция вызываемая перед приемом ЛС в кассовую ведомость
   // если вернуть 0 - текущий лс по текущему фильтру не будет приниматься (не будет вызвана Summa_W_Script)
   // вернуть 1 для приема суммы
   // Doc - объект класса Doc 
  //CheckLsHaveFewCards(__userQueryDate); //проверяем что у сотрудника в к.ч. нет 2х действующих карт  ОТКЛЮЧЕНО!!!
  
  
  string kchPseudo = MapBankKchPseudos.GetValue(__userSelectedBank);
  if (EmployeeHaveCard(kchPseudo,__userQueryDate))
    return 1;
      
  return 0;  
}

CheckLsHaveFewCards(kDate)
//проверяем что у сотрудника в к.ч. нет 2х действующих карт
{
  int countCards=0;
  if (EmployeeHaveCard("AlfaCard",kDate))
    countCards++;
  if (EmployeeHaveCard("sbrCard",kDate))
    countCards++;
  if(countCards>1 && !bMessageRepeatAgain[idxMessageLsHaveFewCards] && !silentMode )
  {
    char s[1024];
    sprintf(s,"ФИО - %s\r\nУ сотрудника заведено несколько действующих банковских карт",GetFioFromKch());
    FreeSpaceString(s,2,"");
    MsgBoxCheck(OemToAnsi(s),OemToAnsi("Внимание"),MB_OK|MB_ICONERROR,OemToAnsi("Больше не показывать это сообщение"),bMessageRepeatAgain[idxMessageLsHaveFewCards]);  
  }
}

EmployeeHaveCard(fieldName,queryDate)
{
  char cardNumber[256];
  GetKchValue(fieldName,cardNumber,255,queryDate);
  return atoi(cardNumber)>0;
}

usGetBankName()
{
  return MapBankNames.GetValue(__userSelectedBank);
}

