UserTabelProcessData(ID_Combine, xmlNode, dateStart, dateEnd) // эта функция для первоначальных проверок, если не нужно обрабатывать письмо то // выполнить следующий код: // var err="Текст сообщения"; throw err; { // ID_Combine - внутренний код исполняемой должности (к этому моменту она уже выбрана в TmpCurCombine // xmlNode - xml пришедший из КП (класс XMLDOMNode) // dateStart, dateEnd - даты начала и конца табеля (класс KDate) } UserTabelUpdateData(ID_Combine, xmlNode, dateStart, dateEnd) { // в этой функции необходимо записать данные в ЛС // бросать здесь исключения нельзя ни в коем случае!!! // ID_Combine - внутренний код исполняемой должности (к этому моменту она уже выбрана в TmpCurCombine // xmlNode - xml пришедший из КП (класс XMLDOMNode) // dateStart, dateEnd - даты начала и конца табеля (класс KDate) } // Следующие функции аналогичны предыдущим двум, только здесь надо разнести РВ // Если раскомментированы предыдущие 2 функции - то эти вызываться не будут UserRVProcessData(ID_Combine, xmlNode, dateStart, dateEnd) // эта функция для первоначальных проверок, если не нужно обрабатывать письмо то // выполнить следующий код: // var err="Текст сообщения"; throw err; // если РВ в xml отличается от РВ в ЛС - взвести соответствующий флаг из Changes // в результате функции { // ID_Combine - внутренний код исполняемой должности (к этому моменту она уже выбрана в TmpCurCombine // xmlNode - xml пришедший из КП (класс XMLDOMNode) // dateStart, dateEnd - даты начала и конца табеля (класс KDate) /* const */ int vidscnt=8; // флаги, комбинацию которых надо вернуть, если значение РВ в ЛС отличается // от разносимого int Changes[vidscnt]; Changes[0]=0x0004; // bEvening Changes[1]=0x0008; // bNight Changes[2]=0x0010; // bOvertime Changes[3]=0x0020; // bOvertime Changes[4]=0x0040; // bSr Changes[5]=0x0080; // bDop Changes[6]=0x0100; // bHoliday Changes[7]=0x0200; // bIdle //xml-тэги, из которых брать РВ string xmlTags[vidscnt]; xmlTags[0]="ВечернееВремя"; xmlTags[1]="НочноеВремя"; xmlTags[2]="Сверхурочные1"; xmlTags[3]="Сверхурочные2"; xmlTags[4]="ВремяОплачиваемоеПоСреднему"; xmlTags[5]="ДополнительныйВыход"; xmlTags[6]="ДополнительныйВыходВПраздничныеДни"; xmlTags[7]="НецелосменныеПростои"; //настройка, в которой указан вид, куда нужно разнести РВ из соотв. xml-тэга //0 - не разносить string cnfs[vidscnt]; cnfs[0]="EvVid"; cnfs[1]="NightVid"; cnfs[2]="OvertVid"; cnfs[3]="OvertVid"; cnfs[4]="SrVid"; cnfs[5]="DopVid"; cnfs[6]="HolidVid"; cnfs[7]="IdleVid"; int result=0; return result; } UserRVUpdateData(ID_Combine, xmlNode, dateStart, dateEnd) { // в этой функции необходимо записать данные в ЛС // бросать здесь исключения нельзя ни в коем случае!!! // ID_Combine - внутренний код исполняемой должности (к этому моменту она уже выбрана в TmpCurCombine // xmlNode - xml пришедший из КП (класс XMLDOMNode) // dateStart, dateEnd - даты начала и конца табеля (класс KDate) /* const */ int vidscnt=8; //xml-тэги, из которых брать РВ string xmlTags[vidscnt]; xmlTags[0]="ВечернееВремя"; xmlTags[1]="НочноеВремя"; xmlTags[2]="Сверхурочные1"; xmlTags[3]="Сверхурочные2"; xmlTags[4]="ВремяОплачиваемоеПоСреднему"; xmlTags[5]="ДополнительныйВыход"; xmlTags[6]="ДополнительныйВыходВПраздничныеДни"; xmlTags[7]="НецелосменныеПростои"; //настройка, в которой указан вид, куда нужно разнести РВ из соотв. xml-тэга //0 - не разносить string cnfs[vidscnt]; cnfs[0]="EvVid"; cnfs[1]="NightVid"; cnfs[2]="OvertVid"; cnfs[3]="OvertVid2"; cnfs[4]="SrVid"; cnfs[5]="DopVid"; cnfs[6]="HolidVid"; cnfs[7]="IdleVid"; } int UserIdleScript_SkipFirstStart=0; UserIdleScript() { // функция которая запускается при бездействии пользователя через промежуток // времени указанный в переменной UserScriptRunInterval (в usconst.s) // если первый запуск (сразу после старта программы) нужно пропустить, то можно // выше присвоить UserIdleScript_SkipFirstStart=1; if (UserIdleScript_SkipFirstStart) { UserIdleScript_SkipFirstStart=0; return 0; } var CMsg = 0; // Процент выполненной работы int bTime = false; // false-показывать процент, // true-показывать оставшееся время CMsg=CreateObject("ProgressBar"); CMsg.Initial(0,100,1); CMsg.SetShowTime(static_cast_to_int(bTime)); for(int i=0;i<2000;i++) { if ( CMsg.Msg_Proc(AnsiToOem(" Пример фоновой задачи. "),100.*i/2000)==ESC ) return 0; int n; for(int u=0;u<100000;u++) n=u*u*i/123+i-u*n; } } /* Пример пользовательской функции обработки приказа по виду для разноски количества ставок из тэга Процент в поле КЧ "Коэффициент занятости-ставка", работает только для 496вида с заполненным в письме тэгом "Параметры/ОкладПоСетке" */ UserIntegrProcessVidNU(typeOrd,doljnAmbaId,AmbaKey,xmlNode) { //typeOrd = 1 - новый вид // 2 - изменение вида // 3 - удаление // doljnAmbaId - идентификатор исп.должности = "Z1026\p024110,1,03.05.2002" // где Z1026\p024110 - имя файла лицевого, 1- код совместительства, 03.05.2002 - дата начала должности (даты может не быть если способ приема должностей = 0) // = пустой в письме на удаление! // AmbaKey - идентификатор присвоенный при предыдущей разноске вида (например внутр.код) // xmlNode - xml пришедший из КП (класс XMLDOMNode) if (atoi(IntegrGetVid(GetXmlValue(xmlNode, "Код"))) != "4") return SysIntegrProcessVidNU(typeOrd,doljnAmbaId,AmbaKey,xmlNode); if (typeOrd==3) //удаление (в этом случае doljnAmbaId - пустой!) { double oldIntCod=atof(AmbaKey); if (!oldIntCod) { //MsgBox("Приказ о удалении вида обработан (предыдущий приказ на создание вида не был разнесен)","",MB_OK); } else { if (ExistSumOut(oldIntCod,205001.01,205001.01)) { var err="Невозможно автоматически удалить вид "+to_string(Intern_To_ExternE(oldIntCod)) +" "+IntegrGetVidName(oldIntCod)+" - на нем содержатся суммы в месяцах"; throw err; } else { var LS = CreateObject("LS"); LS.GetGlobalLS(); var MatrLS = LS.MatrLS(); MatrLS.DeleteRowByCode(oldIntCod); toUseal(1); } } return AmbaKey; } int Id_Combine=0; var Param = CreateObject("ParamFuncRW"); Param.IInitial(doljnAmbaId,",",3); if (Param.Count()>1) Id_Combine=atoi(Param.Get(1)); string DoljnBegDate=""; //дата приема на должность if (Param.Count()>2) DoljnBegDate=Param.Get(2); string KodKP=GetXmlValue(xmlNode, "Код"); int IntCode=IntegrGetVid(KodKP); double bz=IntegrCalcBZ(typeOrd,doljnAmbaId,AmbaKey,xmlNode,IntCode); string PKG = IntegrGetPKGvalue(xmlNode, doljnAmbaId); // РАЗНОСКА string BegD=GetXmlValue(xmlNode, "ДНач"); string EndD=GetXmlValue(xmlNode, "ДКон"); var kdBeg=KDateFromStr(BegD); var kdEnd=KDateFromStr(EndD); if (kdEnd.IsEqI(INVALID_DATE_VALUE)) kdEnd.SetDate("01.01.2050"); string PeriodDat=" ("+kdBeg.GetStr()+"-"+kdEnd.GetStr()+")";//для комментариев в ошибках double dBeg=kdBeg.GetDouble(); double dEnd=kdEnd.GetDouble(); bool bNewOrder=!VarHasValue(AmbaKey) || AmbaKey==""; if (!bNewOrder) // вид уже разносили { double oldIntCod=atof(AmbaKey); if (ExistSumOut(oldIntCod,dBeg,dEnd)) { if (IDYES!=AmbaMessageBox("ђ §­®бЄ  ўЁ¤  "+ static_cast_to_string(Intern_To_ExternE(oldIntCod))+PeriodDat+ ". ‘гйҐбвўгов бг¬¬л §  ЇаҐ¤Ґ« ¬Ё ¤ в бва®ЄЁ. Џа®¤®«¦Ёвм а §­®бЄг?", "‚­Ё¬ ­ЁҐ",MB_YESNOCANCEL|MB_ICONWARNING, 0)) { var err="Существуют суммы за пределами строки. Пользователь отказался от разноски"; throw err; } } int row=GetRowForIntCode(oldIntCod); if (row==-1) { if (IDYES!=AmbaMessageBox("ђ §­®бЄ  ўЁ¤  "+ static_cast_to_string(Intern_To_ExternE(oldIntCod))+PeriodDat+ ". Џ®б«Ґ ЇаҐ¤л¤г饩 а §­®бЄЁ ¤ ­­®Ј® ўЁ¤  ®­ Ўл« г¤ «Ґ­ Ё§ «б. ђ §­ҐбвЁ ўЁ¤ ҐйҐ а §?", "‚­Ё¬ ­ЁҐ",MB_YESNOCANCEL|MB_ICONWARNING, 0)) { var err="Пользователь отказался от разноски"; throw err; } else bNewOrder=true; } else { if (PKG!="") IntegrSetPKGinKch(PKG, kdBeg, Id_Combine, row);// перед PutBegDate PutBegDate(row,dBeg); PutEndDate(row,dEnd); PutBase(row,bz); return AmbaKey; } } if (bNewOrder) // новый вид { int rowkod[ROWMAX]; int FoundRows[ROWMAX+1]; int FoundCount=0; var Prop = CreateObject("APropBE"); Prop.SetCombine(Id_Combine); var ts1 = CreateObject("TempCommonSrc"); ts1.TempCommonSrcInitial(CMN_SRC_C_WORK); SetCommonProp(CMN_SRC_C_WORK,Prop); var ts2 = CreateObject("TempCommonSrc"); ts1.TempCommonSrcInitial(CMN_SRC_MAIN); //т.к. lslook берет оттуда SetCommonProp(CMN_SRC_MAIN,Prop); var TmpCurCom = CreateObject("TmpCurCombine"); TmpCurCom.Init(Id_Combine); bool GreenExists = false; int cntrow=poiskosnkodProp(IntCode,rowkod,0,Prop); for (int j=0; jdEnd) continue; //////////////////////////////////////////////////////////////////// // здесь можно выполнить дополнительные проверки //////////////////////////////////////////////////////////////////// // все устраивает, добавляем вид в найденные string sAmbaKey=AmbaKeyFromIntCode(GetCode(row)); int addFlag = 0; if(OrdersCountByAmbaKey(otVidNU, sAmbaKey, "")) //отмечаем виды для которых уже есть приказы { addFlag = 0x80000; GreenExists = true; } FoundRows[FoundCount]=row | addFlag; FoundCount++; } if (FoundCount==0) //не нашли подходящего вида, сразу добавим его { if(otkrsnu(IntCode,dBeg,dEnd,bz,"",0)==-1 ) //присвоит аттрибуты из CMN_SRC_C_WORK (совместительство, установленное выше) { var err="Ошибка при добавлении вида"+static_cast_to_string(Intern_To_Extern(IntCode)); throw err; } double NewCode = GetCode(countkod-1); double procent = atof(GetXmlValue(xmlNode, "Параметры/Процент")); //Скопировано с форума принимаем процент из письма Rkv_in(NewCode,"kfc",procent); //Скопировано с форума ставим в доп.реквизит AmbaKey = AmbaKeyFromIntCode(NewCode); if (PKG!="") IntegrSetPKGinKch(PKG, kdBeg, Id_Combine,-1); return AmbaKey; // привязка приказа к виду } // if (FoundCount>1) // подходят несколько видов, номера их строк в FoundRows // { // var err="Существует несколько подходящих строк для разноски вида "+ // static_cast_to_string(Intern_To_Extern(IntCode))+PeriodDat+ // ". Изменение можно выполнить только вручную"; // throw err; // } if (FoundCount>=1) { int SelectedVidsFlagsMask = 0xFFFF0000; int row=FoundRows[0] & ~SelectedVidsFlagsMask ; double Epsilon=0.000001; while (FoundCount==1 && !(FoundRows[0] & SelectedVidsFlagsMask)) // найден только один неинтегрированный вид, изменяем даты при таком же БЗ { double foundEnd=GetEndDate(row); double foundBeg=GetBegDate(row); double foundBZ =GetBase(row); if (nabs(foundBZ-bz)>Epsilon) break; //если БЗ различается то покажет лицевой на редактирование if (ExistSumOut(GetCode(row),dBeg,dEnd)) { if (IDYES!=MsgBox("Разноска вида "+ static_cast_to_string(Intern_To_ExternE(GetCode(row)))+PeriodDat+ ". Существуют суммы за пределами дат строки. Продолжить разноску?", "Внимание",MB_YESNOCANCEL|MB_ICONWARNING)) { break; } } double procent = atof(GetXmlValue(xmlNode, "Параметры/Процент")); //Скопировано с форума принимаем процент из письма Rkv_in(GetCode(row),"kfc",procent); //Скопировано с форума ставим в доп.реквизит PutBegDate(row,dBeg); PutEndDate(row,dEnd); PutBase(row,bz); if (PKG!="") IntegrSetPKGinKch(PKG, kdBeg, Id_Combine,-1); AmbaKey = AmbaKeyFromIntCode(GetCode(row)); return AmbaKey; // привязка приказа к виду } string message="В лицевом счете уже существу" + (FoundCount==1 ? "ет подходящая строка": "ют подходящие строки")+ "\nОтметьте одну строку для разноски вида из КП: "; message+=static_cast_to_string(Intern_To_Extern(GetCode(row)))+" "+IntegrGetVidName(GetCode(row)); message+="\n"+PeriodDat+" Баз.знач="+static_cast_to_string(bz)+" или создайте новую и отметьте только ее"; if (GreenExists) message+= "\n (зеленым цветом отмечены строки Н-У разнесенные предыдущими приказами)"; FoundRows[FoundCount]=-1; string ExitMessage="Разнести даты действия и БЗ на отмеченный вид?"; while (1) { var FoundRowsCopy = FoundRows; int rc=lslookSelectVid(message,ExitMessage,FoundRowsCopy); //вернет F10 если выбрали только один вид и подтвердили разноску, выбранный вид в FoundRowsCopy[0] if (rc==ESC) { var err="Пользователь отказался от разноски"; throw err; } row=FoundRowsCopy[0] & ~SelectedVidsFlagsMask ; string ExtCode=static_cast_to_string(Intern_To_ExternE(GetCode(row))); string sAmbaKey=AmbaKeyFromIntCode(GetCode(row)); int cn = OrdersCountByAmbaKey(otVidNU, sAmbaKey, "",1); // 1 - приказ обработан, 2 - разноска, 4 - удаление, -1 -приказов несколько, 0 - нет приказов if(cn==2 || cn==-1) { MsgBox("Для выбранного вида "+ ExtCode+ " есть другие необработанные приказы, необходимо обработать их в первую очередь.", "Внимание", MB_OK|MB_ICONSTOP); continue; } else if (cn==1) { if (IDYES!=MsgBox("На выбранный вид "+ ExtCode+ " уже разнесен другой приказ! Продолжить разноску?\n(предыдущий приказ будет удален)","Внимание", MB_YESNOCANCEL|MB_ICONWARNING|MB_DEFBUTTON2)) continue; } if (ExistSumOut(GetCode(row),dBeg,dEnd)) { if (IDYES!=MsgBox("Разноска вида "+ExtCode+PeriodDat+ ". Существуют суммы за пределами дат строки. Продолжить разноску?", "Внимание",MB_YESNOCANCEL|MB_ICONWARNING)) continue; } if (cn!=0) { SetOrderProcessedAndUnlink(otVidNU, sAmbaKey, ""); } break; } // { // var err="Отладка. Для разноски выбрали вид "+ExtCode; // throw err; // } double procent = atof(GetXmlValue(xmlNode, "Параметры/Процент")); //Скопировано с форума принимаем процент из письма Rkv_in(GetCode(row),"kfc",procent); //Скопировано с форума ставим в доп.реквизит PutBegDate(row,dBeg); PutEndDate(row,dEnd); PutBase(row,bz); if (PKG!="") IntegrSetPKGinKch(PKG, kdBeg, Id_Combine,-1); AmbaKey = AmbaKeyFromIntCode(GetCode(row)); return AmbaKey; // привязка приказа к виду } } } // функция, вызываемая после смены подразделения ЛС в результате обработки письма из КП на интеграцию исполняемой должности // bool isDelete = true - функция вызвалась при отмене в КП приказа на прием/перевод // (при удалении исполяемой должности/строчки в поле КЧ должность); // иначе функция вызвалась при приеме/переводе (создание исп.должности/строчки в поле КЧ должность) // int podrOld - старое значение подразделения // int podrNew - новое значение подразделения // int idCombineOld - внутренний код "старой" исполняемой должности: с которой произошел перевод, либо которую удалили при отмене // приказа (может быть 0 в случае приема, либо может уже отсутствовать, так как удаление происходит раньше) // int idCombineNew - внутренний код "новой" исполняемой должности: на которую произошел прием/перевод, а в случае удаления здесь будет // либо та же должность (если переводы настроены в КЧ), либо предыдущая исполняемая должность (для удаленной), // предыдущая исполняемая может быть 0 в случае отмены приема // KDate dateStart - дата начала должности (в случае удаления - она же, т.е. дата начала удаленной должности) /* UserIntegrIspDoljn_LSPodrChanged(isDelete, podrOld, podrNew, idCombineOld, idCombineNew, &dateStart) { } */