БЛАНКСШАБЛОНОМ[07.11.2005] "Справка к инвентарной карточке";
-- Редакция ЗАО "Агентство 'Русспромоценка'"
--2 Переменные
СекцТаблица  :Object;
var Позиции  :Integer;
btnРасчет    :Object;
btnClose     :Object;
var НФАк     :String;
var МХЭк     :String;
var МОЛк     :String;
var НФА_     :String;
var УЧН_     :String;
var СЧУ_     :String;
var МХЭ_     :String;
var МОЛ_     :String;
var ИНВ_     :String=Name_A('ИНВВЕД.'+НФАк+".УЧН."+УЧН_);

var ДАТА1    :Date;
var АМО      :Numeric;
var БАЛ_КОН  :Numeric;
var АМО_КОН  :Numeric;
var ОСТ_КОН  :Numeric;

var ПЕР[]    :String;
var БАЛ[]    :Numeric;
var АММ[]    :Numeric;
var АМВ[]    :Numeric;
var КОН[]    :Numeric=Round(Abs(БАЛ[$]-АМВ[$]), 2);
var ДОТ[]    :Date;
var СЧ_ОС[]  :String;
var СЧ_АМ[]  :String;

var ДАТАОТЧ  :Date;

2-- Общие процедуры и функции
Proc ОчиститьТаблицу;
 ClearVariable(ДАТА1);
 ClearVariable(АМО); ClearVariable(АММ); ClearVariable(БАЛ_КОН);
 ClearVariable(ПЕР); ClearVariable(АМВ); ClearVariable(АМО_КОН);
 ClearVariable(БАЛ); ClearVariable(КОН); ClearVariable(ОСТ_КОН);
 ClearVariable(ДОТ);
 ClearVariable(Позиции);
end;

Proc Очистить;
 ClearVariable(НФАк); ClearVariable(НФА_);  ClearVariable(МХЭ_);
 ClearVariable(МХЭк); ClearVariable(УЧН_);  ClearVariable(МОЛ_);
 ClearVariable(МОЛк); ClearVariable(СЧУ_);  ClearVariable(ДАТАОТЧ);
 ClearVariable(СЧ_ОС); ClearVariable(СЧ_АМ);
 ОчиститьТаблицу;
end;

Func ДатаПроводки(УСЛсч:String; УСЛан:String; ДатаРасчета:Date; Последняя:Logical) :Date;
var x :Integer;
var ANA :String;
var Res :Numeric;
var ddv :Date;
 ddv=1.1.100; ANA=УСЛсч+"{"+УСЛан+"}";
 Try Res=Saldo(ANA, 1.1.100); Except Raise; ^ddv; end;
 if Последняя:
   for Transaction x=ANA, 1.1.100, ДатаРасчета, Reverse do ddv=TransDate(x); if ddv<>1.1.100: Break; fi; od;
 else
   for Transaction x=ANA, 1.1.100, ДатаРасчета          do ddv=TransDate(x); if ddv<>1.1.100: Break; fi; od;
 fi;
 ^ddv;
end;

Func СчСам(сч:s):l;
var tmp:s;
 if WordsCount(СЧ,'.')<>8:^false; fi;
 if not match(СЧ,'???.????.??????*.???.?.???.??.???'):^false; fi;
    tmp=ExtractWord(6,СЧ,'.');
    if tmp='101':tmp='310';
     | tmp='102':tmp='320';
     | true:^false;
    fi;
    ^Name_S(SubStr(СЧ, 1, length(СЧ)-3)+tmp)<>" ";
end;

Func ОбновитьДанные(ddОтч:Date) :Logical;
var Путь, tmp, ANA, СЧА_ :String;
var Отч1 :Report;
var Режим, ЕстьОстатки :Logical;
var k :Integer;
var dd, df :Date;
var SUM :Numeric;
 if Name_A(НФАк)=" ": Message("Аналитического признака с кодом "+НФАк+" не существует!", mtError); ^False; fi;
 ОчиститьТаблицу;
 Режим=AutoRefresh;
 ToggleAutoRefresh(False);
 ShowProgress(0, "Поготовка данных по счетам...");
 ClearVariable(СЧ_ОС); ClearVariable(СЧ_АМ);
 СЧ_ОС[ 1]="101.11"; СЧ_АМ[ 1]='104.11.410';
 СЧ_ОС[ 2]="101.12"; СЧ_АМ[ 2]='104.12.410';
 СЧ_ОС[ 3]="101.13"; СЧ_АМ[ 3]='104.13.410';
 СЧ_ОС[ 4]="101.15"; СЧ_АМ[ 4]='104.15.410';
 СЧ_ОС[ 5]="101.18"; СЧ_АМ[ 5]='104.18.410';
 СЧ_ОС[ 6]="101.21"; СЧ_АМ[ 6]='104.21.410';
 СЧ_ОС[ 7]="101.22"; СЧ_АМ[ 7]='104.22.410';
 СЧ_ОС[ 8]="101.23"; СЧ_АМ[ 8]='104.23.410';
 СЧ_ОС[ 9]="101.24"; СЧ_АМ[ 9]='104.24.410';
 СЧ_ОС[10]="101.25"; СЧ_АМ[10]='104.25.410';
 СЧ_ОС[11]="101.26"; СЧ_АМ[11]='104.26.410';
 СЧ_ОС[12]="101.27"; СЧ_АМ[12]='104.27.410';
 СЧ_ОС[13]="101.28"; СЧ_АМ[13]='104.28.410';
 СЧ_ОС[14]="101.31"; СЧ_АМ[14]='104.31.410';
 СЧ_ОС[15]="101.32"; СЧ_АМ[15]='104.32.410';
 СЧ_ОС[16]="101.33"; СЧ_АМ[16]='104.33.410';
 СЧ_ОС[17]="101.34"; СЧ_АМ[17]='104.34.410';
 СЧ_ОС[18]="101.35"; СЧ_АМ[18]='104.35.410';
 СЧ_ОС[19]="101.36"; СЧ_АМ[19]='104.36.410';
 СЧ_ОС[20]="101.37"; СЧ_АМ[20]='104.37.410';
 СЧ_ОС[21]="101.38"; СЧ_АМ[21]='104.38.410';
 СЧ_ОС[22]="102.20"; СЧ_АМ[22]='104.29.420';
 СЧ_ОС[23]="102.30"; СЧ_АМ[23]='104.39.420';
 Try
   Refresh(False);
   Путь=PlanVar("НФА")+"\Отчеты\НФАОТЧ.lst";
   if not(ExistFile(Путь)): Message("Файл-отчет детализации отсутствует!", mtError); ^False; fi;
   ANA=НФАк+"&УЧН."+УЧН_;
   -- Выделяем счета учета
   if not СчСам(СЧУ_):Message("Непредвиденная ошибка!", mtError); ^False; fi;
   tmp=SubStr(СЧУ_, length(СЧУ_)-9, 6);
   k=SearchInArray(СЧ_ОС, tmp, True, 1);
   if k=-1: Message("Непредвиденная ошибка!", mtError); ^False; fi;
   СЧА_=SubStr(СЧУ_, 1, length(СЧУ_)-10)+СЧ_АМ[k];
   if Name_S(СЧА_)=" ": Message("Счета "+СЧА_+" нет в структуре учета!", mtError); ^False; fi;
   df=1.1.100; SUM=0;
   df=ДатаПроводки(СЧА_, ANA, ddОтч+1, False);
   if df>1.1.100: if Mon(df)=12: df=Dat(1, 1, Year(df)+1); else df=Dat(1, Mon(df)+1, Year(df)); fi; fi;
   if df>1.1.100: SUM=Abs(Turn(СЧА_+"/00"+"{"+ANA+"}", 1.1.100, df)); fi;
   if SUM>0: ЕстьОстатки=True; else ЕстьОстатки=False; fi;
   if ЕстьОстатки: ДАТА1=df; АМО=Abs(Turn(СЧА_+"/00"+"{"+ANA+"}", 1.1.100, df)); else ДАТА1=1.1.100; АМО=0; fi;
   SUM=0;
   Отч1=RepOpen(Путь+"|Амортизация по месячно", СЧА_, ANA, 1.1.100, ddОтч+1);
   k=1;
   Try
     RepReset(Отч1);
     while RepNext(Отч1) do 
       SUM=RepTurn(Отч1, отчСверн);
       dd=AddMon(StringToDate(RepIdent(Отч1)), 1)-1;
       if SUM<>0 and dd>ДАТА1:
         ДОТ[k]=dd;
         ПЕР[k]=Месяц(Mon(dd))+", "+Str(Year(dd));
         АММ[k]=Abs(SUM);
         БАЛ[k]=Abs(Saldo(СЧУ_+"{"+ANA+"}", dd));
         АМВ[k]=Abs(Saldo(СЧА_+"{"+ANA+"}", dd+1));
         k=k+1;
       fi;
     end;
   Finally
     Отч1=RepClose(Отч1);
   end;
 Finally
   ToggleAutorefresh(Режим);
 end;
 БАЛ_КОН=Abs(Saldo(СЧУ_+"{"+ANA+"}", ddОтч+1));
 АМО_КОН=Abs(Saldo(СЧА_+"{"+ANA+"}", ddОтч+1));
 ОСТ_КОН=Round(Abs(БАЛ_КОН-АМО_КОН), 2);
 Позиции=LengthOfArray(ПЕР);
 ^True;
end;

Proc btnOnClick(Sender:String); -- объекты при нажатии
 if Sender="btnClose" :Close;

 |  Sender="btnРасчет": if ОбновитьДанные(ДатаОтч): Message("Обновление данных инвентарной карточки завершено!", mtInformation); fi;
 |  Sender="btnПечать": РАБ.НАСТР_ПЕЧАТЬ.Prn("","","RPO_STD_000.cfg","",1);
 fi;
end;

2-- События шаблона
Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
var Flag :Logical;
var tmp :String;
 Очистить;
 tmp="НФА.ДОКУМЕНТЫ.КАРТОЧКИ.ОКУД_0504031";
 if not(IsBlankOpen(tmp)) or (РАБ.УПП.LIB.ИмяБланка<>tmp):
   Message("Бланк не работает самостоятельно!"+Chr(13)+
           "Данный бланк - вспомогательный и открывается через другой бланк!", mtInformation);
   Close;
 fi;
 if LengthOfArray(РАБ.УПП.LIB.TempSTR)<>6:
   Message("Ошибка считывания начальных данных!", mtError);
   Close;
 fi;
 НФАк=РАБ.УПП.LIB.TempSTR[1];
 УЧН_=РАБ.УПП.LIB.TempSTR[2];
 СЧУ_=РАБ.УПП.LIB.TempSTR[3];
 МХЭк=РАБ.УПП.LIB.TempSTR[4];
 МОЛк=РАБ.УПП.LIB.TempSTR[5];
 ДАТАОТЧ=1.1.100;
 Try ДАТАОТЧ=StringToDate(РАБ.УПП.LIB.TempSTR[6]); Except ДАТАОТЧ=1.1.100; end;
 Flag=False;
 if Name_A(НФАк)<>" " and Name_A("УЧН."+УЧН_)<>" "   : Flag=True; else Flag=False; fi;
 if Flag: if SignUsed(НФАк) and SignUsed("УЧН."+УЧН_): Flag=True; else Flag=False; fi; fi;
 if Flag=False or ДАТАОТЧ=1.1.100:
   Message("Ошибка считывания начальных данных!", mtError);
   Close;
 fi;
 if not СчСам(СЧУ_):
   Message("Ошибка считывания начальных данных!", mtError);
   Close;
 fi;
 НФА_="["+НФАк+"] - "+if(Name_A(НФАк)<>"", Name_A(НФАк), "наименования нет");
 МХЭ_="["+МХЭк+"] - "+if(Name_A(МХЭк)<>"", Name_A(МХЭк), "наименования нет");
 МОЛ_="["+МОЛк+"] - "+if(Name_A(МОЛк)<>"", Name_A(МОЛк), "наименования нет");
 ClearVariable(РАБ.УПП.LIB.ИмяБланка); ClearVariable(РАБ.УПП.LIB.TempSTR);
 РАБ.НАСТР_ПЕЧАТЬ.Cfg("","RPO_STD_000.cfg"); -- стандартная настройка
 Template.Object="btnРасчет";
end;

Proc Template_OnClose(Destroy:Logical); -- при закрытии шаблона
 Очистить;
end;

КОНЕЦ -- конец бланка