int __userSelectedBank; var __userQueryDate; //певое число текущего месяца userPanelChoiceOfBank() { var Map = CreateObject("MapString"); Map.Add("00","Любой банк"); Map.Add("01","Сбербанк России"); Map.Add("02","ВТБ 24"); Map.Add("03","Убрир"); string Title = "Выберите банк..."; var MapRez = CreateObject("MapString"); if ( PanelValueFromMap(Map,MapRez,1,Title) == ESC ) return 0; if ( !MapRez.InitIterator() ) return 0; return atoi(MapRez.GetCurKey()); } NeedTakeLsToVed() { var queryDate=KDateFromStr(to_string(datatek)); switch (__userSelectedBank) { case 1: return EmployeeHaveCard("sberBank",queryDate); case 2: return EmployeeHaveCard("vtbBank",queryDate); case 3: return EmployeeHaveCard("BankCard",queryDate); default: return 0; } } CheckLsHaveFewCards(kDate) //проверяем что у сотрудника в к.ч. нет 2х действующих карт { int countCards=0; if (EmployeeHaveCard("sberBank",kDate)) countCards++; if (EmployeeHaveCard("vtbBank",kDate)) countCards++; if (EmployeeHaveCard("BankCard",kDate)) countCards++; if(countCards>1 && !bMessageRepeatAgain[idxMessageLsHaveFewCards]) { char s[1024]; sprintf(s,"ФИО - %s\r\nУ сотрудника заведено несколько действующих банковских карт",GetFioFromKch()); FreeSpaceString(s,2,""); MsgBoxCheck(OemToAnsi(s),OemToAnsi("Внимание"),MB_OK|MB_ICONERROR,OemToAnsi("Больше не показывать это сообщение"),bMessageRepeatAgain[idxMessageLsHaveFewCards]); } } import "layer92.dll" unsigned int NumOfOrder=0; /* переменная для отслежеивания порядкового номера */ /* печатаемой записи при печати в формате пользователя */ double Itog=0; int LenStrItog=0; User_Print_Title_Script( HandleOutputFile ) /************************************************************** ** Функция печатает заголовок в файл. ** Используется при передачи кассовых ведомостей и ордеров ** в файл в формате пользователя. *************************************************************** */ { // return Sys_Print_Title_Script( HandleOutputFile ); // ВНИМАНИЕ !!! Файл открыт для записи в двоичном режиме // { для УБРиР 12.05.00 char Title[81]; char CurData[11]; var EndTable="L-----+-------------------+-----------------+-----------\r\n"; int LenStrTable=strlen(EndTable); strcpy(CurData,datatek); CurData[6] = CurData[8]; // эти манипуляции необходимы CurData[7] = CurData[9]; // чтобы привести дату из формата CurData[8] = '\0'; // ДД.ММ.ГГГГ в формат ДД.ММ.ГГ sprintf(Title,"%.8s 98 2 3 4 75000 \r\n",CurData); write(HandleOutputFile, Title, strlen(Title)); write(HandleOutputFile, "------T-------------------T-----------------T----------▄\r\n", LenStrTable); /* write(HandleOutputFile, "╓ N ╓ Номер карточки ╓ Сумма операции ╓ Счет ╓\r\n", LenStrTable); write(HandleOutputFile, "+-----+-------------------+-----------------+----------+\r\n", LenStrTable); */ write(HandleOutputFile, EndTable, LenStrTable); NumOfOrder=0; // } для УБРиР 12.05.00 return; } User_Transfer_One_Script( &pDoc, HandleOutputFile, Num, Flag, Otbor ) /*-------------------------------------------------------------------*/ /* Pазноска одной стpоки из списка оpдеpов или ведомости. */ /* pDoc - указатель на объект (ордер или ведомость) */ /* HandleOutputFile - файл в который пишем */ /* Num - номеp стpоки в списке оpдеpов или в ведомости. */ /* Flag - 'O' pазноска оpдеpа. */ /* Flag - 'I' pазноска ведомости. */ /* Otbor - 0 передача только непереданных ЛС */ /* Otbor - 1 передача всех ЛС (независимо от того, передавался он */ /* раньше или нет) */ /* Функция используется при передачи кассовых ведомостей и ордеров */ /* в файл в формате пользователя. */ /*-------------------------------------------------------------------*/ { // return Sys_Transfer_One_Script( pDoc, HandleOutputFile, Num, Flag, Otbor ); var Ved = CreateObject("Doc"); Ved.Initial(static_cast_to_string(pDoc)); int N_Fld_Transf=Ved.GetNumFld("TRANSFER"); // Номер поля с именем TRANSFER в которое заносится // признак передачи в файл (в АРМ). // Проверка: "оpдеp или стpока ведомости pазнесены в АРМ" // Если поле TRANSFER отсутствует в ордере или ведомости то разноска // все равно будет происходить, только не будет проставлятся признак // разноски. // Если не надо передавать уже переданные ЛС и есть отметка, что // текущий ЛС передан, то его мы передавать не будем if ( Ved.Char_From_Field( N_Fld_Transf,Num )=='П' && !Otbor ) return; // { 12.05.00 для УБРиР var EndTable="L-----+-------------------+-----------------+-----------\r\n"; long tn=sizetn*atol(Ved.TextS(Ved.Get_N_POD(), Num)) +atol(Ved.TextS(Ved.Get_N_TAB(), Num)); char ls[LSSTR]; lsname(tn, ls); int c=lsread(ls, 2); if ( c==ESC || c==0 ) return; // Записываем номер карточки char NumCard[17]; /* Номер карточки */ kch_from("kart",NumCard); // } 12.05.00 для УБРиР // Записываем ТН /* Табельный номер */ long Tab_Num = atol( static_cast_to_string(Ved.TextS(Ved.Get_N_TAB(), Num)) ); char Fio[40], /* ФИО */ Name_Podr[81], /* Название подразделения */ Data_Transf[11], /* Дата передачи */ Month[3], Year[5]; /* Месяц и год, за которые сумма */ double Summa=0.; /* Сумма, которая разносится */ // Записываем название подразделения long Dep = atol( static_cast_to_string(Ved.TextS(Ved.Get_N_POD(), Num)) ); sprintf(Name_Podr,"%.80s",GetOtdName(Dep)); // Записываем текущую дату sprintf(Data_Transf,"%.10s",datatek); // Записываем месяц и год за которые передана сумма sprintf(Month,"%d",Month_Cash); sprintf(Year, "%d",Year_Cash); // Записываем сумму Summa = atof( static_cast_to_string(Ved.TextS(Ved.Get_N_SUM(), Num)) ); // Печать в файл сформированной записи // ВНИМАНИЕ !!! Файл открыт для записи в двоичном режиме // { для УБРиР 12.05.00 char str[255]; int LenStrTable=strlen(EndTable); if ( !NumOfOrder ) Itog=LenStrItog=0; Itog+=Summa; // подготовимся к печати первой строки sprintf( str, "╓ %3d ╓ %16.16s ╓ %15.2f ╓ ╓\r\n", ++NumOfOrder, NumCard, Summa); lseek(HandleOutputFile, -(LenStrTable+LenStrItog), SEEK_CUR); write(HandleOutputFile, str, LenStrTable); write(HandleOutputFile, EndTable, LenStrTable); sprintf( str, " ИТОГО: %34.2f\r\n", Itog); LenStrItog = strlen(str); write(HandleOutputFile, str, LenStrItog); // } для УБРиР 12.05.00 // Заполнение столбца разноски if ( N_Fld_Transf != -1 ) Ved.SetText( N_Fld_Transf, Num, "П"); return; } User_Before_Summa_W( &Doc , Kind_Form) { //получаем "номер банка"(номер зарплатного проекта) из к.ч. сотрудника char tmp[256];kch_from("BankCard",tmp); int curLsIdBank=atoi(GetElementFromString(1,tmp,"^")); if (!__userSelectedBank || __userSelectedBank!=curLsIdBank) //если зарплатный проект не выбран или выбран, но не совпадает с зарплатным проектом сотрудника - возвращаем 0 return 1; return 0; } User_Summa_W_Script( &pDoc, Kind_Form ) /********************************************************************/ /* Вычисление суммы в ведомость или оpдеp */ /* Kind_Form - тип ведомости/оpдеpа ( Аванс, Заpплата и т.д. ) */ /********************************************************************/ { return Sys_Summa_W_Script( pDoc, Kind_Form ); } User_Forma_W_Script( &pDoc, Kind_Form, Code, Col ) ////////////////////////////////////////////////////////////////////// // Вспомогательная функция для панели Panel_Cash ////////////////////////////////////////////////////////////////////// { __userSelectedBank=userPanelChoiceOfBank(); __userQueryDate=KDateFromInt_WithDay(1,mtek); return Sys_Forma_W_Script( pDoc, Kind_Form, Code, Col ); } User_Prepar_User_Append_To_Text_Script(HandleOutputFile) /************************************************************************* ** Функция производит подготовку открытого текстового файла к добавлению ** так, как это требуется пользователю при печати кассовых документов ** в формате пользователя. ** ( Внимание !!! Файл открыт в двоичном виде, т.е. с флагом O_BINARY ) **************************************************************************/ { // return Sys_Prepar_User_Append_To_Text_Script(HandleOutputFile); // 12.05.00 для УБРиР char buffer[4]; /********************************************************************* ** В связи с тем что нужен для печати номер по-порядку, необходимо ** определить каким был номер последней напечатанной записи ********************************************************************** */ char str[81]; long LengthFile=lseek(HandleOutputFile,0,SEEK_END); long CountStr=0; // Отойдем назад на две строки (количество строк на которое отходим // назад зависит от формы печати!!!), для того чтобы встать на последнюю // запись в таблице NumOfOrder=0; for ( long OffsetFile=4; OffsetFile<=LengthFile; ) { lseek(HandleOutputFile,-OffsetFile++,SEEK_END); read(HandleOutputFile, buffer, 2); if ( buffer[0]=='\r' && buffer[1]=='\n' && ++CountStr==3 ) { read(HandleOutputFile,str,1); read(HandleOutputFile,str,9); NumOfOrder = atoi(str); break; } if ( buffer[0]=='\r' && buffer[1]=='\n' && CountStr==1 ) { read(HandleOutputFile,str,20); read(HandleOutputFile,str,60); Itog = atof(str); LenStrItog = OffsetFile-3; } } lseek(HandleOutputFile,0,SEEK_END); return; } int idxMessageLsHaveFewCards =0, //у ЛС в к.ч. больше одной действующей карты... idxMessageCount =1; int bMessageRepeatAgain[idxMessageCount];//флаги для показа MsgBoxCheck EmployeeHaveCard(fieldName,queryDate) { char cardNumber[256]; GetKchValue(fieldName,cardNumber,255,queryDate); return atoi(cardNumber)>0; }