-- Шаблон создан мастером бланков
-- 28.01.2011 14:36:58
--
БланкСШаблоном "Акт инвентаризации наличных денежных средст";

Усл:S="*.201.34.*";

Рекв:Record;
НаимОрг:String;
ОКПО:String;
НаимПодраз:String;
ВидДеят:String;
ВидОпер:String;
НомерДок:String;
ДатаДок:Date=[today];
ФИОМол:String;
ДолжМол:String;
Доп:String;
Доп2:String;
Доп3:String;
Доп4:String;
Сум1:N;
Сум2:N;
Сум3:N;
Сум4:N;
Сум5:N;
Сум6:N;
Сум7:N;
Сум1К:I;
Сум2К:I;
Сум3К:I;
Сум4К:I;
Сум5К:I;
Сум6К:I;
Сум7К:I;
Сум1Р:I;
Сум2Р:I;
Сум3Р:I;
Сум4Р:I;
Сум5Р:I;
Сум6Р:I;
Сум7Р:I;
СумНал:N;
СумНалР:I;
СумНалК:I;
СумПропФ[]:String;
СумПропФК:I;
СумПропУ[]:String;
СумПропУК:I;
НомерОсн:String;
ДатаОсн:Date;
СумУД:N;
СумУДР:I;
СумУДК:I;
СумИзл:N;
СумИзлК:I;
СумИзлР:I;
СумНед:N;
СумНедР:I;
СумНедК:I;
НомерПрих:String;
НомерРасх:String;
ДолжПК:String;
ДолжЧК1:String;
ДолжЧК2:String;
ДолжЧК3:String;
ДолжРук:String;
ФИОПК:String;
ФИОЧК1:String;
ФИОЧК2:String;
ФИОЧК3:String;
ФИОРук:String;
ОбПрич:String;
РешРук:String;
var A1:S="+";
var D1:S="-";
ОбПрич:S;
УпрОбъяснение:I=[1];
Объяснение[]:S;
A2:S="+";
D2:S="-";

РешРук:S;
УпрРешение:I=[5];
Решение[]:S;
var Умолч:S="Настройка по умолчанию";
var ЗакрНастр:S="Закрыть настройку";
Фильтр:S=["*.?.201.34.*"];
var УпрНастр:L;
var УпрНом:L;
var УпрУтв:L;
btnРасчет:Object;
btnНастр :Object;
var fУтвДок:L=[True];
var fУтвДок_:S=if(fУтвДок,"Отображать","Не отображать");
var fНомФор:L=[True];
var fНомФор_:S=if(fНомФор,"Отображать","Не отображать");
var НомФор_:S="Унифицированная форма - ИНВ-15";
var НомФор1_:S="Оборотная сторона формы - ИНВ-15";
var УтвДок_:S="Утвержденная Постановлением Госкомстата России от 18.08.1998 - 88";

var Buf[] :String;

Proc Обнул;
Clearvariable(Сум1К);
Clearvariable(Сум2К);
Clearvariable(Сум3К);
Clearvariable(Сум4К);
Clearvariable(Сум5К);
Clearvariable(Сум6К);
Clearvariable(Сум7К);
Clearvariable(Сум1Р);
Clearvariable(Сум2Р);
Clearvariable(Сум3Р);
Clearvariable(Сум4Р);
Clearvariable(Сум5Р);
Clearvariable(Сум6Р);
Clearvariable(Сум7Р);
Clearvariable(СумНалР);
Clearvariable(СумНалК);
Clearvariable(СумПропФ);
Clearvariable(СумПропФК);
Clearvariable(СумПропУ);
Clearvariable(СумПропУК);
Clearvariable(СумУДР);
Clearvariable(СумУДК);
Clearvariable(СумИзлК);
Clearvariable(СумИзлР);
Clearvariable(СумНедР);
Clearvariable(СумНедК);
end;

func TruncReal(num:n; t:i):n;-- верный вариант Trunc
 var n,tn:n;
 var zn:i;
 if num>0:zn=1;
  | true:zn=-1;num=num*zn;
 fi;
 if num=0:^0;fi;
 if t>0 :tn=Эксп(t * Лог(10));
  | t<0 :tn=1/Эксп(-t * Лог(10));
  | true:tn=1;
 fi;
 n=num*tn;
 if int(n)>n:n=int(n)-1;
  | true:n=int(n);
 fi;
 ^zn*n/tn;--возвращаем знак и разряд
end;
Func LenM(X:Numeric) :Integer; -- вычисляем количество цифр после запятой
var i :Integer;
 x=x-TruncReal(x,0);
 while (X-TruncReal(X, i))<>0 do i=i+1; od;
 ^i;
end;

func FracToInt(num:n; t:i):i;
  if num<0:num=-num;fi;
  if t=0:t=LenM(num);fi;
  num=(num-TruncReal(num,0))*Эксп(t * Лог(10));
  ^int(num);
end;


Proc ЗаполнитьКлиента(Rec:Record);
--НаимОрг:String;
--ОКПО:String;
Рекв=Rec;
if Rec=nil then
   ОКПО="";
   НаимОрг="";
  else
   ОКПО=GetCardFieldS("Контрагент",Rec,"ОКПО");
   НаимОрг=GetCardFieldS("Контрагент",Rec,"КорИмя");
fi;
end;

Proc СложитьРубКоп(Сумма:S;Коп:S;Рубли:S);
var SumN:N;
var SumK:I;
var SumР:I;
SumN=GetVariableN(Сумма);
SumK=GetVariableI(Коп);
SumР=GetVariableI(Рубли);
SumN=SumР+SumK/100;
PutvariableN(Сумма,SumN);
end;

Proc РазделитьРубКоп(Сумма:S;Коп:S;Рубли:S);
var SumN,tmpN:N;
var SumK:I;
var SumР:I;
  SumN=GetVariableN(Сумма);
  SumK=FracToInt(SumN,2);
  tmpN=TruncReal(SumN,0);
  SumР=Int(tmpN);
  PutVariableI(Коп,SumK);
  PutVariableI(Рубли,SumР);
end;

Proc СоздатьПропись;
var Пропись_:S;
var lenl,N,NN,i,ii,s:I;
var Ret,tmp:S;
Clearvariable(СумПропФ);
Clearvariable(СумПропУ);
 lenl=76;
 Пропись_=Slo_(Trunc(СумНалР),"РУБ1");   --вернуть прописью рубли
 Пропись_=SubStr(Пропись_,1,Pos("руб",Пропись_)-1);  --отрезать слово "руб".
 N=WordsCount(Пропись_," ");   --разбить на 2 строки
 s=1;
 Ret="";
 ii=0;
 for NN=1..N do   --для каждого слова в "Пропись_"
 tmp=ExtractWord(NN,Пропись_," ");   --слово
  i=Length(tmp);
  if (s=1 and ii+i+if(ii=0,0,1)<lenl) or (not s=1 and ii+i+if(ii=0,0,1)<58): --если на первой строке уже прочитанные слова+читаемое слово меньше 77 или на второй строке меньше 58
     Ret=Ret+if(ii=0,""," ")+tmp;
     ii=ii+i+if(ii=0,0,1);
    else
     СумПропФ[s]=Ret;  --поле равняется предыдущим прочитанным словам;
     Ret=tmp;  --а Ret, ii считаются заново для следующей строки;
     ii=i;
     s=s+1;
  fi;
 od;
 СумПропФ[s]=Ret;

 if s<3:                --заполняет строку пробелами до максимального количества вмещаемых символов;
    tmp=RepStr(" ",if(s=1,lenl,57)-Length(СумПропФ[s]));
    СумПропФ[s]=СумПропФ[s]+tmp;
 fi;
  -- по аналогии для других строк. Вынести в отдельную универсальную функцию??
   Пропись_=Slo_(Trunc(СумУДР),"РУБ1");
   Пропись_=SubStr(Пропись_,1,Pos("руб",Пропись_)-1);
 NN=WordsCount(Пропись_," ");
  s=1;
 Ret="";
 ii=0;
 for N=1..NN do
  tmp=ExtractWord(N,Пропись_," ");
  i=Length(tmp);
  if (s=1 and ii+i+if(ii=0,0,1)<lenl) or (not s=1 and ii+i+if(ii=0,0,1)<58):
     Ret=Ret+if(ii=0,""," ")+tmp;
     ii=ii+i+if(ii=0,0,1);
    else
     СумПропУ[s]=Ret;
     Ret=tmp;
     ii=i;
     s=s+1;
  fi;
 od;
 СумПропУ[s]=Ret;
 if s<3:    --почему 3??
    tmp=RepStr(" ",if(s=1,76,57)-Length(СумПропУ[s]));
    СумПропУ[s]=СумПропУ[s]+tmp;
 fi;
 --Не забываем копейки!
 СумПропФК=СумНалК;
end;

Proc НахождениеСумНал;
var i:I;
 СумНал=0;
 for i=1..7 do
   СложитьРубКоп("Сум"+Str(i),"Сум"+Str(i)+"К","Сум"+Str(i)+"Р");
   СумНал=СумНал+GetVariableN("Сум"+Str(i));
 od;
 РазделитьРубКоп("СумНал","СумНалК","СумНалР");
end;

Proc РазницаСум;
var N1:N;
 НахождениеСумНал;
 СложитьРубКоп("СумНал","СумНалК","СумНалР");
 СложитьРубКоп("СумУД","СумУДК","СумУДР");
 N1=СумНал-СумУД;
 if N1>=0:
 СумИзл=N1;
 СумНед=0;
 | N1<0:
 СумНед=N1*(-1);
 СумИзл=0;
 fi;
 РазделитьРубКоп("СумИзл","СумИзлК","СумИзлР");
 РазделитьРубКоп("СумНед","СумНедК","СумНедР");
 СумПропФК=СумНалК;
 СумПропУК=СумУДК;
end;

Proc ВзятьПоУчету;
 Сум1=Saldo(Фильтр,ДатаДок+1);
 РазделитьРубКоп("Сум1","Сум1К","Сум1Р");
 СумНал=Saldo(Фильтр,ДатаДок+1);
 РазделитьРубКоп("СумНал","СумНалК","СумНалР");
 СоздатьПропись;
 СумУД=Saldo(Фильтр,ДатаДок+1);
 РазделитьРубКоп("СумУД","СумУДК","СумУДР");
 СоздатьПропись;
end;

func ТекущийФ (name :String; index:String; filter :String) :String;
      -- определение  номера текущей записи в картотеке (с фильтром)
  var N :String;
  var к :Integer;
  var cnt :Integer;
      к=ОткрытьРабочуюОбласть(name,"",filter); -- index
      попытка
        cnt=ЗАПИСЕЙ(к);
        If cnt>0: N=GetFieldS(к,cnt,index); fi;
        ^N;
      окончание
        ЗакрытьРабочуюОбласть(к);
      end;
end;

Proc ВзятьНомераОрдеров;
 -- Определения текущего номера с учетом перехода между годами, с учетом фильтра и заданной даты
var Общ:Integer;
  Общ=Год(ДатаДок);
  НомерПрих=ТекущийФ("ПрихОрд","НОМЕРБУМ","(Д >="+DateToString(Дат(1,1,Общ))+") And (Д <="+DateToString(if(ДатаДок>1.1.2000, ДатаДок, ToDay))+") And (Проводить)");
  НомерРасх=ТекущийФ("РасхОрд","НОМЕРБУМ","(Д >="+DateToString(Дат(1,1,Общ))+") And (Д <="+DateToString(if(ДатаДок>1.1.2000, ДатаДок, ToDay))+") And (Проводить)");
end;

Func НаимОрг_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec:Record;
  Rec=OpenCardFile("Контрагент","Наше",Рекв,crdRecordOnly);
  if not Rec=nil:
     ЗаполнитьКлиента(Rec);
  fi;
  Return False;
end;

Proc НаимОрг_OnExit(FieldName: String; Iter: Integer);
  ЗаполнитьКлиента(nil);
end;

Func НаимПодраз_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Rec:Record;
  Template.HideEditor(False);
  Rec=OpenCardFile("Подразделения","",nil,crdRecordOnly);
  if not Rec=nil:
     НаимПодраз=GetCardFieldS("Подразделения",Rec,"ПОДРАЗ");
  fi;
  Return Cur;
end;

Func ДолжМол_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Field:S;
var Rec:Record;
var v1,v2:S;
 Template.HideEditor(False);
 Field=AsString(Template.Field);
 Template.HideEditor(False);
 Rec=OpenCardFile("Сотрудники");
 if not Rec=nil:  --если выберешь должность, автоматически заполнит фио и наоборот
    v1=GetCardFieldS("Сотрудники",rec,"ДОЛЖНОСТЬ.Долж");
    v2=GetCardFieldS("Сотрудники",rec,"ФАМИЛИЯ")+" "+GetCardFieldS("Сотрудники",rec,"ИНИЦИАЛЫ");
    if Field="ДолжМол" or Field="ФИОМол": ДолжМол=v1; ФИОМол=v2;
      |Field="ДолжРук" or Field="ФИОРук": ДолжРук=v1; ФИОРук=v2;
      |Field="ДолжПК"  or Field="ФИОПК":  ДолжПК=v1;  ФИОПК=v2;
      |Field="ДолжЧК1" or Field="ФИОЧК1": ДолжЧК1=v1; ФИОЧК1=v2;
      |Field="ДолжЧК2" or Field="ФИОЧК2": ДолжЧК2=v1; ФИОЧК2=v2;
      |Field="ДолжЧК3" or Field="ФИОЧК3": ДолжЧК3=v1; ФИОЧК3=v2;
    fi;
 fi;
  Return cur ;
end;

Proc Сум1Р_OnExit(FieldName: String; Iter: Integer);
 НахождениеСумНал;
 СоздатьПропись;
 РазницаСум;
end;                  --это на случай, если эти два поля будут редактироваться вручную?

--Proc СумНалР_OnExit(FieldName: String; Iter: Integer);
-- СоздатьПропись;
-- СумПропФК=СумНалК;
-- СумПропУК=СумУДК;
-- РазницаСум;
--end;

Proc Настр(Flag:L);
 btnРасчет.Visible=not Flag;
 btnНастр.Visible=not Flag;
 УпрНастр=Flag;
end;

Proc НомФор(Flag:L);
 УпрНом=Flag;
end;

Proc УтвДок(Flag:L);
 УпрУтв=Flag;
end;

Func ПроверитьНастр:L;
 if Фильтр="": Message("Заполните условие отбора остатков",mtError); ^False; fi;
 if ДатаДок=01.01.100: Message("Заполните дату акта",mtError); ^False; fi;
 if fНомФор=True: НомФор(True); else НомФор(False); fi;
 if fУтвДок=True: УтвДок(True); else УтвДок(False); fi;
 ^True;
end;

Func A_OnEnter(FieldName: String; Iter: Integer): logical;
 if FieldName="A1": InsertFrame(УпрОбъяснение,Iter+1);
   |FieldName="A2": InsertFrame(УпрРешение,Iter+1);
 fi;
 Return False;
end;

Func D_OnEnter(FieldName: String; Iter: Integer): logical;
 if FieldName="D1": if УпрОбъяснение>1 then DeleteFrame(УпрОбъяснение,Iter); fi;
   |FieldName="D2": if УпрРешение>1 then DeleteFrame(УпрРешение,Iter); fi;
 fi;
 Return False;
end;

Proc BtnРасчет_OnClick(Sender: String);
  Обнул;
  ВзятьПоУчету;
  ВзятьНомераОрдеров;
end;

Func СумНалК_OnVerify(FieldName: String; Iter: Integer; Value: Integer): Logical;
  If value>99:
     Message ("Неверное количество знаков");
     ^False;
  else
     ^True;
  Fi;
end;

Proc BtnНастр_OnClick(Sender: String);
 Настр(True);
end;

Func НастрПоУмолч_OnEnter(FieldName: String; Iter: Integer): logical;
 if EnqOkCancel("Восстановить настройку по умолчанию ?",mtWarning)=cmOk:
    Фильтр="*.?.201.34.*";
    fУтвДок=True;
    fНомФор=True;
    Message("Настройка по умолчанию восстановлены");
 fi;
 Return False;
end;

Func Flags_OnEnter(FieldName: String; Iter: Integer): logical;
 FieldName=SubStr(FieldName,1,Length(FieldName)-1);
 PutVariableL(FieldName,not GetVariableL(FieldName));
 Return False;
end;

Func НастрЗакр_OnEnter(FieldName: String; Iter: Integer): logical;
 if not ПроверитьНастр: ^False; fi;
 Настр(False);
 Return False;
end;

Func Доп_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var nameField :String;
var num, jj :Integer;
 Template.HideEditor(False);
 nameField=asString(Template.Field);
 ClearVariable(Buf);
 Buf[1]="Аккредитаций";
 Buf[2]="Свид. аккредитаций";
 Buf[3]="Лицензий";
 Buf[4]="Прил. к лицензиям";
 Buf[5]="Свидетельств";
 jj=SearchInArray(Buf, GetVariableS(nameField), False, 1);
 num=Alternate("", Buf, -1, if(jj>0, jj, 1), 12);
 if num>0: Try PutVariableS(nameField, Buf[num]); Except end; fi;
 ^"";
end;


Конец
