int NumTableForIntegrationNU = 501; //номер таблицы Интеграция. Настройка видов Н-У (в Сетках - Прочие справочники организации) int NumTableForIntegrationSetki = 502; //номер таблицы Интеграция. Сетки (в Сетках - Прочие справочники организации) // устанавливаются в const.s IntegrGetSetka(nameSet,doljnAmbaId,xmlNode) { // проверка имени сетки из КП, добавление в наши если нету // ЭТА ФУНКЦИЯ ВЫЗЫВАЕТСЯ И ПРИ ОБРАБОТКЕ ПИСЕМ // doljnAmbaId - идентификатор исп.должности = "Z1026\p024110,1,03.05.2002" // где Z1026\p024110 - имя файла лицевого, 1- код совместительства, 03.05.2002 - дата начала должности (даты может не быть если способ приема должностей = 0) // xmlNode - xml пришедший из КП (класс XMLDOMNode) return PriorityCall("UserIntegrGetSetka","SysIntegrGetSetka",nameSet,doljnAmbaId,xmlNode); } IntegrPartSetkaValue(nameSet, doljnAmbaId, xmlNode, partNum) { // partNum==0 определение имени сетки из КП по содержимому узла "..ПоСетке" // partNum==1 определение кода разряда по содержимому узла "..ПоСетке" // ФУНКЦИЯ ВЫЗЫВАЕТСЯ ПРИ ОБРАБОТКЕ ПИСЕМ и при разноске приказов return PriorityCall("UserIntegrPartSetkaValue","SysIntegrPartSetkaValue",nameSet, doljnAmbaId, xmlNode, partNum); } IntegrProcessVidNU(typeOrd,doljnAmbaId,AmbaKey,xmlNode) { //ФУНКЦИЯ, КОТОРАЯ ВЫЗЫВАЕТСЯ ПРИ ОБРАБОТКЕ ПРИКАЗА ВИД-НУ //typeOrd = 1 - новый вид // 2 - изменение вида // 3 - удаление // doljnAmbaId - идентификатор исп.должности = см.выше // AmbaKey - идентификатор присвоенный при предыдущей разноске вида (например внутр.код) // xmlNode - xml пришедший из КП (класс XMLDOMNode) return PriorityCall("UserIntegrProcessVidNU","SysIntegrProcessVidNU",typeOrd,doljnAmbaId,AmbaKey,xmlNode); } SysIntegrPartSetkaValue(nameSet, doljnAmbaId, xmlNode, partNum) { // partNum==0 возвращаем все что находится до последнего знака ; // например по строке "БС2: 1; 10" вернет "БС2: 1" // по строке "МЕД(НОВАЯ): 0; 3; 2" вернет "МЕД(НОВАЯ): 0; 3" // partNum==1 возвращаем код разряда (после последнего знака ;) char s[256]; s=nameSet; for (int i=strlen(s)-1; i--; i>=0) if (s[i]==';') if (partNum==0) return SubStr(s,0,i); else return SubStr(s,i+1); return nameSet; } SysIntegrGetSetka(nameSet, doljnAmbaId, xmlNode) { //если не нужно обрабатывать письмо то выполнить следующий код: // var err="Текст сообщения"; throw err; string nameSetE=IntegrPartSetkaValue(nameSet, doljnAmbaId, xmlNode,0); nameSetE=AnsiToOem(nameSetE); char FileSetki[256]; FileSetki = GetNameFileRefTime(NumTableForIntegrationSetki, GetOrgForPodr(GetGeneralPodrLS()),datatek); RTrim(FileSetki); if (strlen(FileSetki)==0) { var err="Не найдена настройка сеток для интеграции видов"; throw err; } char Kod[256]; int rc=GetValueClassifIfExist(FileSetki,nameSetE,Kod,255,"Kod","NameSet"); //эта функция работает гораздо быстрее чем ручное чтение таблиц т.к. запоминает все справочники в памяти if (rc==-1) //нет такой сетки { var CTable=CreateObject("CurPrnTbl"); CTable.InitialNameFile(static_cast_to_string(FileSetki)); int FldNameSetki=CTable.Find_Name_Fld("NameSet"); int FldKod=CTable.Find_Name_Fld("Kod"); if (FldNameSetki<0 || FldKod<0) { var err="Неправильная структура таблицы настройки сеток для интеграции видов"; throw err; } CTable.Add_Rcr(CTable.Count_Rcr()-1,1); CTable.SText(FldNameSetki,CTable.Count_Rcr()-1,nameSetE); if (CTable.Count_Rcr()==2) CTable.Del_Empty_Rcr(); CTable.Rewrite(); return -1; } if (RTrimS(Kod)=="=") return -2; return atoi(Kod); } IntegrCalcBZ(typeOrd,doljnAmbaId,AmbaKey,xmlNode,IntCode) { return PriorityCall("UserIntegrCalcBZ","SysIntegrCalcBZ",typeOrd,doljnAmbaId,AmbaKey,xmlNode,IntCode); } SysIntegrCalcBZ(typeOrd,doljnAmbaId,AmbaKey,xmlNode,IntCode) { // вычисление БЗ по письму // пример письма по сотруднику // <ВидНУ ИДСотр="{B6E6295F-5DF9-4EFB-BFBE-15D32E6CCB79}" ИдИспДол="{78F03DF9-D2CB-4E5C-AC43-5A5B291B957B}" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> // <ДНач>13.09.2004 // <ДКон>20.12.2007 // <Код>495 // <Параметры> // <Сумма xsi:nil="true"/> // <СуммаПоСетке xsi:nil="true"/> // <Оклад xsi:nil="true"/> // <ОкладПоСетке xsi:nil="true"/> // <Тариф xsi:nil="true"/> // <ТарифПоСетке xsi:nil="true"/> // <Процент xsi:nil="true"/> // <ПроцентПоСетке xsi:nil="true"/> // <ПроцентУменьшения xsi:nil="true"/> // <Коэффициент xsi:nil="true"/> // <КоэффициентПоСетке xsi:nil="true"/> // // string BegD=GetXmlValue(xmlNode, "ДНач"); string EndD=GetXmlValue(xmlNode, "ДКон"); string Sum= GetXmlValue(xmlNode, "Параметры/Сумма"); string SumSet= GetXmlValue(xmlNode, "Параметры/СуммаПоСетке"); string Oklad= GetXmlValue(xmlNode, "Параметры/Оклад"); string OkladSet= IntegrGetSetkaValue(GetXmlValue(xmlNode, "Параметры/ОкладПоСетке"),doljnAmbaId,xmlNode); string Tarif= GetXmlValue(xmlNode, "Параметры/Тариф"); string TarifSet= IntegrGetSetkaValue(GetXmlValue(xmlNode, "Параметры/ТарифПоСетке"),doljnAmbaId,xmlNode); string Procent= GetXmlValue(xmlNode, "Параметры/Процент"); string ProcentSet= IntegrGetSetkaValue(GetXmlValue(xmlNode, "Параметры/ПроцентПоСетке"),doljnAmbaId,xmlNode); string ProcentDown= GetXmlValue(xmlNode, "Параметры/ПроцентУменьшения"); string Koef= GetXmlValue(xmlNode, "Параметры/Коэффициент"); string KoefSet= IntegrGetSetkaValue(GetXmlValue(xmlNode, "Параметры/КоэффициентПоСетке"),doljnAmbaId,xmlNode); switch(IntCode) { // case 296: return atod(Oklad); // case 103: return atod(Sum); default: if (Sum!="") return atod(Sum); if (SumSet!="") return atod(SumSet); if (Oklad!="") return atod(Oklad); if (OkladSet!="") { double bz=atod(OkladSet); if ((Procent!="" || ProcentDown!="") && GetCommonCnfInt("ProcVidSet","integr")) { double proc=atod(Procent); if (proc>100.0 || Procent!="" && proc==0.0) { var err="Невозможно разнести процент "+Procent+" долей ставки в БЗ"; throw err; } if (proc==0) proc= 100.0; double procDown=atod(ProcentDown); if (procDown>=100.) { var err="Невозможно разнести процент уменьшения "+ProcentDown+" долей ставки в БЗ"; throw err; } if (procDown>0.0) proc=proc*(100.0-procDown)/100.0; if (proc<100.0) bz+=proc/100.0; } return bz; } if (Tarif!="") return atod(Tarif); if (TarifSet!="") return atod(TarifSet); if (Procent!="") return atod(Procent); if (ProcentSet!="") return atod(ProcentSet); } return 0.; } IntegrGetSetkaValue(kpSetkaValue,doljnAmbaId,xmlNode) { if (Str_Cmp(kpSetkaValue," "," ")) { int Num=IntegrGetSetka(kpSetkaValue, doljnAmbaId,xmlNode); //номер сетки if (Num==-1) { var err="Не найдена настройка для сетки Контур-Персонала \""+kpSetkaValue+"\""; throw err; } if (Num==0) { var err="Необходимо настроить соответствие сетки Контур-Персонал \""+kpSetkaValue+"\""; throw err; } string kpValue=IntegrPartSetkaValue(kpSetkaValue, doljnAmbaId, xmlNode, 1); if (Num==-2) return kpValue; string kpValueOem=AnsiToOem(kpValue); char FileSetki[256]; FileSetki = GetNameFileRefTime(Num, GetOrgForPodr(GetGeneralPodrLS()),datatek); RTrim(FileSetki); if (strlen(FileSetki)==0) { var err="Для сетки из КП \""+kpSetkaValue+"\"указана таблица номер "+static_cast_to_string(Num)+". Но такая таблица не найдена!"; throw err; } char Kod[256]; int rc=GetValueClassifIfExist(FileSetki,kpValueOem,Kod,255,"Kod","KodKP"); //эта функция работает гораздо быстрее чем ручное чтение таблиц т.к. запоминает все справочники в памяти if (rc==-1) { var err="В настройке сеток для интеграции с Контур-Персонал, в сетке номер "+static_cast_to_string(Num)+" не найдено значение \""+kpValue+"\""; throw err; } RTrim(Kod); return Kod; } return ""; } IntegrGetVid(KodKP) { return PriorityCall("UserIntegrGetVid","SysIntegrGetVid",KodKP); } SysIntegrGetVid(KodKP) { char FileNU[256]; FileNU = GetNameFileRefTime(NumTableForIntegrationNU, GetOrgForPodr(GetGeneralPodrLS()),datatek); RTrim(FileNU); if (strlen(FileNU)==0) { var err="Не найдена настройка соответствия видов Н-У (в Сетках - Прочие справочники). Не найдена таблица с номером "+static_cast_to_string(NumTableForIntegrationNU); throw err; } char sExtCode[256]; GetValueClassif(FileNU,AnsiToOem(KodKP),sExtCode,255,"Extern_Cod","VidKP"); //эта функция работает гораздо быстрее чем ручное чтение таблиц т.к. запоминает все справочники в памяти if (!Str_Cmp(sExtCode," "," ")) //нет такого вида { var err="Не найдена настройка для обработки вида Н-У из Контур-Персонала с кодом "+KodKP; throw err; } int IntCode=Extern_To_Intern(sExtCode); if (IntCode==-1) { var err="Не найден внешний код вида "+sExtCode+ " указанный в настройке для обработки вида Н-У из Контур-Персонала"; throw err; } return IntCode; } IntegrGetVidName(IntCode) { int pos; if ( (pos=poisk1(IntCode,kodnu1,cntplus,1))==EOF ) return ""; string codename=GetFullNameNUPos(pos); if (!Str_Cmp(codename," "," ") || !GetCommonCnfInt("FullNameNU","correct")) { codename=SubStr(GetNameKodNU(pos),0,7); } return OemToAnsi(RTrimS(codename)); } AmbaKeyFromIntCode( IntCode) { char s[40]; sprintf(s,"%.2f",IntCode); return s; } IntegrGetPKGvalue(xmlNode, doljnAmbaId) { string PoSetke=GetXmlValue(xmlNode, "Параметры/ОкладПоСетке"); if (PoSetke=="") return PoSetke; string nameSetE=IntegrPartSetkaValue(PoSetke, doljnAmbaId, xmlNode,0); nameSetE=AnsiToOem(nameSetE); char FileSetki[256]; FileSetki = GetNameFileRefTime(NumTableForIntegrationSetki, GetOrgForPodr(GetGeneralPodrLS()),datatek); RTrim(FileSetki); if (strlen(FileSetki)==0) { var err="Не найдена настройка сеток для интеграции видов"; throw err; } char PKG[256]; PKG=""; int rc=GetValueClassifIfExist(FileSetki,nameSetE,PKG,255,"pkg","NameSet"); //эта функция работает гораздо быстрее чем ручное чтение таблиц т.к. запоминает все справочники в памяти //if (rc==-1) //нет такой сетки return RTrimS(PKG); } IntegrSetPKGinKch(pkg, kdBeg, combine, row) { var TmpCurCom = CreateObject("TmpCurCombine"); TmpCurCom.Init(combine); SetKchValue("p_k_g", pkg, kdBeg); if (row != -1) //если передали row значит выполняется изменение интегрированного вида и нужно удалить старое значение ПКГ в кч { var oldDate = KDateFromD(GetBegDate(row)); if (!oldDate.IsEq(kdBeg)) // старая дата отличается от новой { // проверим, можно ли удалить старое значение ПКГ из КЧ // убедимся что нет больше видов с такой же датой начала int rowkod[ROWMAX]; var Prop = CreateObject("APropBE"); Prop.SetCombine(combine); int cntrow=poiskosnkodProp(GetCode(row),rowkod,0,Prop); bool del=true; for (int j=0; j1) 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); 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; } } 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; // } PutBegDate(row,dBeg); PutEndDate(row,dEnd); PutBase(row,bz); if (PKG!="") IntegrSetPKGinKch(PKG, kdBeg, Id_Combine,-1); AmbaKey = AmbaKeyFromIntCode(GetCode(row)); return AmbaKey; // привязка приказа к виду } } } //============================================================================= IntegrOtpuskDescription(xmlNode) { return PriorityCall("UserIntegrOtpuskDescription","SysIntegrOtpuskDescription",xmlNode); } IntegrOtpuskTypeKP(typeKP, Short) { if (SubStr(typeKP,0,3)=="115") return Short?"Осн": "Отпуск (Основной)"; if (typeKP=="501") return Short?"По раб.дням": "Ежегодный отпуск по рабочим дням"; if (typeKP=="173-176") return Short?"Учебн": "Учебный отпуск"; if (typeKP=="128") return Short?"Без сохр": "Отпуск без сохранения зарплаты"; if (typeKP=="256/1.5") return Short?"до 1.5 лет": "Отпуск по уходу за ребенком до 1.5 лет"; if (typeKP=="256") return Short?"до 3 лет": "Отпуск по уходу за ребенком до 3 лет"; if (typeKP=="255") return Short?"по беременности":"Отпуск по беременности и родам"; return Short?"Доп":"дополнительный отпуск";// 117 118 119 321 321/1 601 602 603 605 606 607 } SysIntegrOtpuskDescription(xmlNode) // функция вызывается при обработке письма отпуск { // по коду отпуска из КП возвращает его описание для списка приказов if (xmlNode.nodeName=="Отпуска") { string ret="Отпуск"; string orderDescr=""; var nodes=xmlNode.selectNodes("./Отпуск"); if (!VarHasValue(nodes) || nodes.length==0) return ret; for (int i=0; i 11.Настройка интеграции с Контур-Персонал -> Символ табеля для отпуска без сохранения" char buf[256]; sprintf(buf,"Разнести в табель за период [%s - %s] символ %s ?",Beg,End,OemToAnsi(SimvTabel)); if (IDYES!=MsgBox(buf,IntegrOtpuskTypeKP(T,0), MB_YESNOCANCEL|MB_ICONQUESTION)) return ESC; var BegKD=KDateFromStr(Beg); var EndKD=KDateFromStr(End); if (!BegKD.IsValid() || !EndKD.IsValid()) return -1; int tmpMrasch=mrasch; for ( int m=BegKD.GetAbs(); m<=EndKD.GetAbs(); m++ ) { if (mmtek+B2MES) continue; s50(m); int z1,z2; s6400(BegKD.GetDouble(),EndKD.GetDouble(),z1,z2,data); zamena_simv_v_tab("nrsw",SimvTabel,calm,z1,z2,EOF,0); //меняем в табеле все нормативные, рабочие, выходные на наш символ (если уже заполнены О,Б,Д то они останутся) s145(colc2,1); //сохранение табеля за месяц } s50(tmpMrasch); return 0; } int TypeOtp; if (SubStr(T,0,3)=="115" || T=="501") // обычный отпуск TypeOtp = OTPUSK_OSN; else if (T=="173-176") // учебный отпуск TypeOtp = OTPUSK_UCH; else TypeOtp = OTPUSK_DOP; // все остальные считаем как Доп var BegD=KDateFromStr(Beg); var EndD=KDateFromStr(End); var Otp= CreateObject("KCalcSredn"); //установит func[0]=2 - глобальный режим "расчет отпуска", восстановит при разрушении if (!VarHasValue(lsform)) { if (ESC==param_b2(2)) // запрос параметров расчета (автоматически, с корректировкой...), работает для режима в func[0] return ESC; } if (ESC==Otp.InitOtp2(BegD,EndD,TypeOtp,monthSr,0)) return ESC; if (!VarHasValue(lsform)) lsform=CreateObject("LS_Form"); return Otp.Calculate(1,2); } IntegrOtpIndexForMap(DateString) { var BegD=KDateFromStr(DateString); int index=BegD.GetAbs()*100+BegD.GetDay(); return index; } IntegrNeedJoinOtp(typeOtp) { var par = CreateObject("ParamFuncRW"); par.IInitial(OemToAnsi(GetCommonCnfStr("UnionOtps","integr"))," ,",50); for (int i=0;i28 дней" // OTPUSK_KOMPUV --||-- "компенсация за неиспользованный отпуск при ув." // KOMPUV_AND_UV - запуск расчета увольнения (с компенсацией) // -1 - автоматическая обработка приказов такого типа не предусмотрена // -2 - приказ обработан в данном скрипте, не запускать системную функцию расчета отпуска // ESC - обработка прервана пользователем string T = GetXmlValue(xmlNode, "Тип"); if (xmlNode.nodeName=="Отпуска") T=GetXmlValue(xmlNode, "Отпуск/Тип"); if (xmlNode.nodeName=="Компенсации") T=GetXmlValue(xmlNode, "Компенсация/Тип"); string Date1 = GetXmlValue(xmlNode, "НачалоПериода"); string Date2 = GetXmlValue(xmlNode, "КонецПериода"); otp[2] = KDateFromStr(Date1).GetDouble(); //otp[2-3] - глобальная переменная откуда T60 возьмет период за который предоставлен отпуск otp[3] = KDateFromStr(Date2).GetDouble(); if (typeOrd == otCompensation) { otp[4] = atod(GetXmlValue(xmlNode, "ЧислоДней")); //otp[4] - глобальная переменная откуда возьмется ЧислоДней компенсации в панели расчета увольнения/компенсации if (xmlNode.nodeName=="Компенсации") { var periods = CreateObject("KDatePeriods"); var childlist = xmlNode.selectNodes("./Компенсация"); if (VarHasValue(childlist)) for (int i=0; i28 return OTPUSK_KOMPUV; //"использовано до даты внедрения" } if (typeOrd == otOtpusk) { var lsform; //для WIN создали окно где будет происходить корректировка сумм if (xmlNode.nodeName=="Отпуска") { var mapOtp=CreateObject("Map"); var childlist = xmlNode.selectNodes("./Отпуск"); if (VarHasValue(childlist) && childlist.length>0) { var periods = CreateObject("KDatePeriods"); //отсортируем отпуска по дате начала for (int i=0; i