Ваши комментарии

Форма 001. Текстовая форма. В идеале бы какой-нибудь сохранять в PDF, но это так, необязательно.

Один файл на всё точно не надо. Нужно "почеловечно", намного гибче. Нужно чтобы в имя файла входили как минимум номер подразделения (3 символа) и табельный номер (6 символов).

Остальное несущественное. Вашу функцию я слегка модифицировал - мне нужно было знать дату закрытия, чтобы открыть другой вид на следующий день, а проверкой типа в С++ я как-то не владею.При ответе Вячеслава всё наладилось.

AfterWriteLS(Tn) {

var CL=CreateObject("CombineList");
var it = CL.CreateIterator();
for (it.SetBegin();!it.IsEnd();it.Next()) { //цикл по должностям (it.CurKey() - внутр.код совместительства )

long comb = it.CurKey();

if (!IsTimeLS(Tn,comb))
continue;

var d=KDateFromInt_WithDay(1,mrasch);

var last_day_982 = TryFindCodeValidOnDate(comb,982,d);
var last_day_988 = TryFindCodeValidOnDate(comb,988,d);
var open_date = CreateObject("KDate");
open_date.SetDate("01.01.2099");

// проверяем на последний закрытый вид оплаты
bool Otkr982 = false; // true - нужно открыть 982, false - не нужно открывать
bool Otkr988 = false; // true - нужно открыть 988, false - не нужно открывать

if (last_day_982.IsValid()) {
if (last_day_988.IsValid()) {
if (last_day_982.IsEq(open_date) || last_day_988.IsEq(open_date)) { // открыт любой вид
// не нужно ничего открывать
} else { // оба вида закрыты, вычисляем последний закрытый вид
if (last_day_982.LT(last_day_988)) { // если 988 закрыт позже, чем 982
Otkr982 = true;
} else
Otkr988 = true;
}
} else { // 988 не существует
if (!last_day_982.IsEq(open_date)) // 982 закрыт
Otkr988 = true;
}

} else { // 982 не существует
if (last_day_988.IsValid()) {
if (!last_day_988.IsEq(open_date)) // 988 закрыт
Otkr982 = true;
} else {
Otkr982 = true; // если ни один вид не существует, то открываем 982
}
}

//AmbaMessageBox("982 = " + last_day_982.GetStr(),"",MB_OK|MB_ICONINFORMATION,0);
//AmbaMessageBox("988 = " + last_day_988.GetStr(),"",MB_OK|MB_ICONINFORMATION,0);

var tc=CreateObject("TmpCurCombine"); // Класс для временной смены, а затем и восстановления текущей должности
tc.Init(comb);//инициализируем

//AmbaMessageBox("текущее совместительство " + to_string(IntCombineToExt(GetCurCombine())),"",MB_OK|MB_ICONERROR,0);

// соответственно открываем вид оплаты
if (Otkr982 == true) {

var dat = CreateObject("KDate");

if (last_day_988.IsValid()) {
last_day_988.Inc();
dat.SetDateD(last_day_988.GetDouble());
} else
dat = KDateFromInt_WithDay(1,mrasch);

char date[11];
date = dat.GetStr();

if (Panel_Zapros("Дата открытия 982 вида (" + to_string(IntCombineToExt(comb)) + ")"
, "", "Укажите дату открытия (" + to_string(IntCombineToExt(comb)) + ")", date, 10) != ESC) {
var temp = CreateObject("KDate");
temp.SetDate(to_string(date));
if (temp.IsValid()) {
dat.SetDateD(temp.GetDouble());
}
}

if ( otkrsnu(201, dat.GetDouble() , 205001.01, 0.00, "70", 0) == EOF )
AmbaMessageBox("Не получилось открыть вид 982","",MB_OK|MB_ICONERROR,0);
else {
long FullTn = Find_Full_TN(Tn);
if ( FullTn != EOF ) {
char ls[LSSTR];
lsname(FullTn,ls);
lswrite(ls,0);
}
}

} else if (Otkr988) {

var dat = CreateObject("KDate");

if (last_day_982.IsValid()) {
last_day_982.Inc();
dat.SetDateD(last_day_982.GetDouble());
} else
dat = KDateFromInt_WithDay(1,mrasch);

char date[11];
date = dat.GetStr();

if (Panel_Zapros("Дата открытия 988 вида (" + to_string(IntCombineToExt(comb)) + ")"
, "", "Укажите дату открытия (" + to_string(IntCombineToExt(comb)) + ")", date, 10) != ESC) {
var temp = CreateObject("KDate");
temp.SetDate(to_string(date));
if (temp.IsValid()) {
dat.SetDateD(temp.GetDouble());
}
}

if ( otkrsnu(222, dat.GetDouble() , 205001.01, 0.00, "70", 0) == EOF )
AmbaMessageBox("Не получилось открыть вид 988" ,"",MB_OK|MB_ICONERROR,0);
else {
long FullTn = Find_Full_TN(Tn);
if ( FullTn != EOF ) {
char ls[LSSTR];
lsname(FullTn,ls);
lswrite(ls,0);
}
}
}
tc = 0;
}
}

Еще вопросик. Если параметр comb имеет значение, то как получить список совместительств для лицевого счета?

За расчетный месяц. Это связано с автоматическим открытием видов оплаты. Раньше я почему то думал, что закрытие это удаление. А, фактически, закрытие - это проставление даты окончания отличной от 01.01.2050. Поскольку открытие предполагается после записи ЛС (раньше не отловить, насколько я понял), то нужно сделать анализ на предмет того, что открыто и закрыто. У меня 2 вида оплаты - аванс. Алгоритм один, а назначение разное: одно - выплата через банк, другое - через кассу.   Разумеется, два одновременно не должны быть открыты. Или одно, или другое. Предполагается, что закрываем одно, открывается другое.



Сервис поддержки клиентов работает на платформе UserEcho