-- Шаблон создан мастером бланков
-- 22.11.2004 16:11:58
--
БланкСШаблоном "Создание рабочего плана счетов";

Path:S;
ПС:I;
var ПС_:S=if(ПС=1:"Бюджетного учреждения (переходный период) (Инструкция 162н)"
            |ПС=2:"Казенного учреждения (Инструкция 162н)"
            |ПС=3:"Бюджетного учреждения (Инструкция 174н)"
            |ПС=4:"Автономного учреждения (Инструкция 183н)"
            |ПС=5:"План счетов финансового органа (Инструкция 162н)"
            |ПС=6:"Объединенный план счетов КУ+ФО (Инструкция 162н)"
            |True:"");

var fПС:S=if(ПС=1:" and Pos('КУ',S04)>0"
            |ПС=2:" and Pos('КУ',S04)>0"
            |ПС=3:" and Pos('БУ',S04)>0"
            |ПС=4:" and Pos('АУ',S04)>0"
            |ПС=5:" and Pos('ФО',S04)>0"
            |ПС=6:" and (Pos('ФО',S04)>0 or Pos('КУ',S04)>0)"
            |True:"");
ВД:S;

var A:S="+";
var D:S="-";

var Упр:I;
var БК[]:S;
var ЭК[]:S;
var КОСГУ[]:S;
var ТипБК[]:S;
var НаимБК[]:S;

var BufKey[]:S;
var BufAcc[]:S;
var BufBal[]:S;
var BufTxt[]:S;
var Buf[]:S;

var StoreБК:S;
var StoreЭК:S;

var Искл101      :L;
var Искл104      :L;
var Искл105      :L;
var Искл106      :L;
var ИсклЛизинг   :L=[True];
var ИсклВПути    :L=[True];
var ИсклИмущКазны:L=[True];
var ИсклЗатраты  :L=[True];
var Искл201_35   :L;
var Искл208      :L;
var Искл210_03   :L;
var Искл303      :L;
var Искл304_02   :L;
var ИсклПлан     :L=[True];
var ИсклАссигн   :L=[True];
var ИсклГРБС     :L=[True];
var ИсклРБС      :L=[if(ПС=3 or ПС=4,True,False)];

fУжеСущ:L;
--
--Процедуры и функции ------------- 
Proc Очистить;
 ClearVariable(Упр);
 ClearVariable(БК);
 ClearVariable(ЭК);
 ClearVariable(КОСГУ);
 ClearVariable(ТипБК);
 ClearVariable(НаимБК);
end;

Func ПолучитьКОСГУ(vЭК:S):S;
var z:i;
 z=Int(vЭК);
 if z<300: ^""; fi;
 ^Str(z+100);
end;

Func ОпределитьТипБК(v1:S; v2:S; Iter:I):S;
 if Match(v1+"."+v2,"???.0000.0000000.000.000"): НаимБК[Iter]="Код главы"; ^"КРZ";
   |Match(v1,"???.0000.0000000.000") and ВД="1": НаимБК[Iter]="Код главы"; ^"КРZ";
   |Match(v1,"???.0000.0000000.000") and ВД="3": НаимБК[Iter]="Код главы"; ^"КРZ";
   |Match(v1,"???.????.???????.???"):            НаимБК[Iter]="Классификация расходов бюджета"; ^"КРБ";
   |Match(v1,"???.0.00.00000.00.0000"):          НаимБК[Iter]="Код главы"; ^"КДZ";
   |Match(v1,"???.?.??.?????.??.????"):          НаимБК[Iter]="Классификация доходов бюджета"; ^"КДБ";
   |Match(v1,"???.00.00.00.00.00.0000"):         НаимБК[Iter]="Код главы"; ^"КИZ";
   |Match(v1,"???.??.??.??.??.??.????"):         НаимБК[Iter]="Классификация источников дефицита"; ^"КИФ";
 fi;
 НаимБК[Iter]="";
 ^"";
end;

Proc УдалитьПустыеСтроки;
var Iter:I;
 Iter=1;
 While Iter<Упр do
  if БК[Iter]="" and ЭК[Iter]="": DeleteFrame(Упр,Iter); else Iter=Iter+1; fi;
 od;
end;

Func Проверить:L;
var Iter,Iter2:I;
 if Path="": Message("Введите размещение плана счетов",mtError); Template.Field="Path"; ^False; fi;
 if ПС=0:  Message("Введите тип плана счетов",mtError); Template.Field="ПС_"; ^False; fi;
 if ВД="": Message("Введите вид деятельности",mtError); Template.Field="ВД"; ^False; fi;
 УдалитьПустыеСтроки;
 for Iter=1..Упр do
  if БК[Iter]="": Message("Введите БК",mtError); Template.Field="БК"; Template.Frame=Iter; ^False; fi;
  if ЭК[Iter]="": Message("Введите КОСГУ",mtError); Template.Field="ЭК"; Template.Frame=Iter; ^False; fi;
  for Iter2=Iter+1..Упр do
   if БК[Iter]=БК[Iter2] and ЭК[Iter]=КОСГУ[Iter]: Message("Повторный ввод БК",mtError); Template.Frame=Iter2; ^False; fi;
  od;
 od;
 ^True;
end;

Proc Расчет;
var OWA,n,nr,Iter,z,ff,nf:i;
var F1,F2,Acc,Key,Last,Path_,Prefix,КодСч:S;
var Flag:L;
 Path_=SubStr(ExtractWord(1,Path,"\"),2,255);
 Path_=Раб.Бюджет2005.Контроль2Слэш(PlanVar(Path_)+"\Счета\");
 ClearVariable(BufKey);
 ClearVariable(BufAcc);
 ClearVariable(BufBal);
 ClearVariable(BufTxt);
 ClearVariable(Buf);
 OWA=OpenWorkArea("РПО_БЮДЖ_КЛАСС","NAME_VOC;CODE","1=0");
 ShowProgress(Упр,"Формирование плана счетов...");
 Try
  for Iter=1..Упр do
   ProgressPos(Iter);
   Prefix=Раб.Бюджет2005.ТипКБКСчета(БК[Iter]);
   F1="Name_Voc='СЧ' and ((Pos('"+ВД+"',S01)>0 and Pos('"+ТипБК[Iter]+"',S01)>0) or (Pos('"+ВД+"',S02)>0 and Pos('"+ТипБК[Iter]+"',S02)>0))"+fПС;
   if КОСГУ[Iter]="": F2=" and (Pos('."+ЭК[Iter]+"',Code)>0 or Pos('"+ЭК[Iter]+"',S03)>0 or S03='000')"; else F2=" and (Pos('."+ЭК[Iter]+"',Code)>0 or Pos('."+КОСГУ[Iter]+"',Code)>0 or Pos('"+ЭК[Iter]+"',S03)>0 or S03='000')"; fi;
   SetFilter(OWA,F1+F2);
   Nr=Records(OWA);
   for n=1..nr do
    Hint(Str(n)+" из "+Str(nr));
    КодСч=GetFieldS(OWA,n,"Code");
    Flag=True;
    if Искл101: Flag=not Раб.Бюджет2005.MatchMask(КодСч,"101.*"); fi;
    if Искл104 and Flag: Flag=not Раб.Бюджет2005.MatchMask(КодСч,"104.*"); fi;
    if Искл105 and Flag: Flag=not Раб.Бюджет2005.MatchMask(КодСч,"105.*"); fi;
    if Искл106 and Flag: Flag=not Раб.Бюджет2005.MatchMask(КодСч,"106.*"); fi;
    if ИсклЛизинг and Flag: Flag=not Раб.Бюджет2005.MatchMask(КодСч,"101.4?.*|104.4?.*|105.4?.*|106.4?.*|107.4?.*"); fi;
    if ИсклВПути and Flag: Flag=not Раб.Бюджет2005.MatchMask(КодСч,"107.*|201.13.*|201.23.*|202.12.*|202.22.*|202.32.*|203.20.*|501.?6.*|503.?6.*"); fi;
    if ИсклИмущКазны and Flag: Flag=not Раб.Бюджет2005.MatchMask(КодСч,"104.5?.*|108.*"); fi;
    if ИсклЗатраты and Flag and ВД="1": Flag=not Раб.Бюджет2005.MatchMask(КодСч,"109.*"); fi;
    if Искл201_35 and Flag: Flag=not Раб.Бюджет2005.MatchMask(КодСч,"201.35.*"); fi;
    if Искл208 and Flag: Flag=not Раб.Бюджет2005.MatchMask(КодСч,"208.*"); fi;
    if Искл210_03 and Flag: Flag=not Раб.Бюджет2005.MatchMask(КодСч,"210.03.*"); fi;
    if Искл303 and Flag: Flag=not Раб.Бюджет2005.MatchMask(КодСч,"303.*"); fi;
    if Искл304_02 and Flag: Flag=not Раб.Бюджет2005.MatchMask(КодСч,"304.02.*"); fi;
    if ИсклПлан and Flag:
       if Match(КодСч,"50?.*"):
          Flag=Раб.Бюджет2005.MatchMask(КодСч,"50?.1?.*");
       fi;
    fi;
    if ИсклАссигн and Flag: Flag=not Раб.Бюджет2005.MatchMask(КодСч,"503.*"); fi;
    if ИсклГРБС and Flag and not (ПС=5 or ПС=6): Flag=not Раб.Бюджет2005.MatchMask(КодСч,"501.?1.*|503.?1.*"); fi;
    if ИсклРБС and Flag: Flag=not Раб.Бюджет2005.MatchMask(КодСч,"501.?2.*|503.?2.*|501.?4.*|503.?4.*"); fi;
    if Flag:
       Acc=БК[Iter]+"."+ВД+"."+КодСч;
       if Name_S(Acc)=" " or not fУжеСущ:
          if Prefix="ФКР":
             Key="ФКР_"+SubStr(БК[Iter],1,3)+"_"+SubStr(БК[Iter],5,4);
            |Prefix="КД":
             Key="КД_"+SubStr(БК[Iter],1,3);
            |Prefix="КИФД":
             Key="КИФД_"+SubStr(БК[Iter],1,3);
          fi;
          if SearchInArray(BufKey,Key+" "+Acc,True)=-1:
             z=InsertInArraySort(BufKey,Key+" "+Acc);
             InsertInArray(BufAcc,z,Acc);
             InsertInArray(BufBal,z,GetFieldS(OWA,n,"S05"));
             InsertInArray(BufTxt,z,GetFieldS(OWA,n,"Txt"));
          fi;
       fi;
    fi;
   od;
  od;
 Finally
  CloseWorkArea(OWA);
  CloseProgress;
 end;
 ClearVariable(Buf);
 Try
  ff=0;
  nr=LengthOfArray(BufKey);
  Last="";
  nf=0;
  for n=1..nr do
   Key=ExtractWord(1,BufKey[n]," ");
   if not Key=Last:
      Last=Key;
      if not ff=0: TextFileClose(ff); ff=0; fi;
      nf=nf+1;
      Buf[nf]=Key+'.lis';
      if ExistFile(Path_+Buf[nf]): DeleteFile(Path_+Buf[nf]); fi;
      ff=TextFileCreate(Path_+Buf[nf]);
      TextFileWriteLn(ff,"Счета");
   fi;
   TextFileAppendLn(ff,BufAcc[n]+" ");
   TextFileAppendLn(ff,BufBal[n]+" --");
   TextFileWriteLn(ff,BufTxt[n]);
  od;
 Finally
  if not ff=0: TextFileClose(ff); fi;
 end;
 --
 if ExistFile(Path_+"Счета.txt"): DeleteFile(Path_+"Счета.txt"); fi;
 ff=TextFileCreate(Path_+"Счета.txt");
 Try
  for n=1..nf do
   TextFileAppendLn(ff,"СЧЕТА "+Path+Buf[n]+" -");
   if Match(Buf[n],"ФКР_*"): TextFileWriteLn(ff,"-"+Раб.Бюджет.НаимКБК("ФКР2006",SubStr(Buf[n],9,4)));
     |Match(Buf[n],"КД_*"): TextFileWriteLn(ff,"-Классификация доходов");
     |Match(Buf[n],"КИФД_*"): TextFileWriteLn(ff,"-Классификация источников финансирования дефицитов");
   fi;
  od;
 Finally
  TextFileClose(ff);
 end;
 OpenEditor(Path_+"Счета.txt");
end;
--Процедуры и функции -------------                           
--
--
--Обработчики событий полей шаблона-----
Func Path_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
 ClearVariable(Buf);
 Buf[1]="$ГЛАВА\Счета\  -- ["+Раб.Бюджет2005.Контроль2Слэш(Lo(PlanVar("ГЛАВА"))+"\счета\]");
 Buf[2]="$НАСТР\Счета\  -- ["+Раб.Бюджет2005.Контроль2Слэш(Lo(PlanVar("НАСТР"))+"\счета\]");
 Buf[3]="$БУХ\Счета\       -- ["+Раб.Бюджет2005.Контроль2Слэш(Lo(PlanVar("БУХ"))+"\счета\]");
 n=Alternate("Размещение плана счетов",Buf,-1,1,12);
 if n=0: ^False; fi;
 Path=Trim(SubStr(Buf[n],1,Pos("--",Buf[n])-1));
 Return False;
end;

Func ПС_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
 ClearVariable(Buf);
 Buf[1]="План счетов бюджетного учреждения (переходный период) (Инструкция 162н)";
 Buf[2]="План счетов казенного учреждения (Инструкция 162н)";
 Buf[3]="План счетов бюджетного учреждения (Инструкция 174н)";
 Buf[4]="План счетов автономного учреждения (Инструкция 183н)";
 Buf[5]="План счетов финансового органа (Инструкция 162н)";
-- Buf[6]="План счетов органа осуществляющего кассовое обслуживание";
 Buf[6]="Объединенный план счетов КУ+ФО (Инструкция 162н)";
 n=Alternate("Выберите план счетов",Buf,-1,ПС,12);
 if n=0: ^False; fi;
 ПС=n;
 Return False;
end;

Func ВД_OnEnter(FieldName: String; Iter: Integer): logical;
var n,nn,OWA:i;
 if ПС=0: Message("Выберите план счетов",mtError);  Template.Field="ПС_"; ^False; fi;
 ClearVariable(Buf);
 n=0;
 OWA=OpenWorkArea("РПО_БЮДЖ_КЛАСС","CODE","Name_Voc='СЧ' and Length(Code)=1");
 Try
  nn=Records(OWA);
  for n=1..nn do
   Buf[n]=GetFieldS(OWA,n,"CODE")+" --"+GetFieldS(OWA,n,"TXT");
  od;
 Finally
  CloseWorkArea(OWA);
 end;
 n=Alternate("Вид деятельности",Buf,-1,1,12);
 if n=0: ^False; fi;
 ВД=Str(n);
 for Iter=1..Упр do
  ТипБК[Iter]=ОпределитьТипБК(БК[Iter],ЭК[Iter],Iter);
 od;
 Return False;
end;

Func A_OnEnter(FieldName: String; Iter: Integer): logical;
 InsertFrame(Упр,Iter+1);
 Return  False;
end;

Func D_OnEnter(FieldName: String; Iter: Integer): logical;
 DeleteFrame(Упр,Iter);
 if Упр<1: InsertFrame(Упр,1); fi;
 Return  False;
end;

Func БК_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 tmp=AnaElection("ФКР.*|КД.*|КИФД.*",False,False,StoreБК);
 if tmp="": ^False; fi;
 StoreБК=tmp;
 БК[Iter]=SubStr(tmp,Pos(".",tmp)+1,255);
 ЭК[Iter]="";
 ТипБК[Iter]=ОпределитьТипБК(БК[Iter],ЭК[Iter],Iter);
 Return False;
end;

Func ЭК_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 if БК[Iter]="": Message("Введите БК",mtError); Template.Field="БК"; Template.Frame=Iter; ^False; fi;
 if Match(БК[Iter],"???.????.???????.???"): tmp=AnaElection(Раб.Бюджет2005.МаскаРасхКОСГУ+"|КОСГУ.000",False,False,StoreЭК);
   |Match(БК[Iter],"???.?.??.?????.??.????"): tmp=AnaElection(Раб.Бюджет2005.МаскаДоходКОСГУ+"|КОСГУ.000",False,False,StoreЭК);
   |Match(БК[Iter],"???.??.??.??.??.??.????"): tmp=AnaElection(Раб.Бюджет2005.МаскаДефицитКОСГУ+"|КОСГУ.000",False,False,StoreЭК);
 fi;
 if tmp="": ^False; fi;
 StoreЭК=tmp;
 ЭК[Iter]=SubStr(tmp,7,3);
 КОСГУ[Iter]=ПолучитьКОСГУ(ЭК[Iter]);
 ТипБК[Iter]=ОпределитьТипБК(БК[Iter],ЭК[Iter],Iter);
 Return False;
end;
--Обработчики событий полей шаблона-----
--
--
--Обработчики событий объектов шаблона-----
Proc btnСоздать_OnClick(Sender: String);
 if not Проверить: Exit; fi;
 Расчет;
end;

Proc btnЗагрБК_OnClick(Sender: String);
var n,Iter:i;
var Voc,tmp:S;
 RefreshAna;
 ClearVariable(Buf);
 Buf[1]="Функциональная классификация расходов (ФКР)";
 Buf[2]="Классификация доходов (КД)";
 Buf[3]="Классификация источников финансирования дефицитов (КИФД)";
 n=Alternate("Загрузка БК",Buf,-1,1,12);
 if n=0: Exit; fi;
 if n=1: Voc="ФКР.*";
   |n=2: Voc="КД.*";
   |n=3: Voc="КИФД.*";
 fi;
 УдалитьПустыеСтроки;
 Iter=1;
 While Iter<=Упр do
  if n=1 and Match(БК[Iter],"???.????.???????.???"): DeleteFrame(Упр,Iter);
    |n=2 and Match(БК[Iter],"???.?.??.?????.??.????"): DeleteFrame(Упр,Iter);
    |n=3 and Match(БК[Iter],"???.??.??.??.??.??.????"): DeleteFrame(Упр,Iter);
    |True: Iter=Iter+1;
  fi;
 od;
 for Sign tmp=Voc, Sort do
  InsertFrame(Упр,Упр+1);
  БК[Упр]=SubStr(tmp,Pos(".",tmp)+1,255);
  ТипБК[Упр]=ОпределитьТипБК(БК[Упр],ЭК[Упр],Упр);
  ЭК[Упр]="";
 od;
end;

Proc btnОчистить_OnClick(Sender: String);
 Очистить;
end;

Proc btnСохр_OnClick(Sender: String);
var FName:S;
var F,n:I;
 УдалитьПустыеСтроки;
 if БК[1]="": Message("Список БК пуст",mtError); Exit; fi;
 FName="Список БК.txt";
 if ChooseSaveFile(FName,"Сохранить файл...", "Текстовые файлы(*.txt)|*.txt")=cmCancel: Exit; fi;
 if ExistFile(FName): if EnqOkCancel("Файл "+FName+" существует, переписать ?")=cmCancel: Message("Отказ от сохранения данных"); Exit; fi; fi;
 F=TextFileCreate(FName);
 Try
  for n=1..Упр do
   TextFileWriteLn(F,БК[n]+"|"+ЭК[n]);
  od;
 Finally
  TextFileClose(F);
 end;
 Message("Список БК успешно сохранен");
end;

Proc btnЗагрузить_OnClick(Sender: String);
var FName,tmp:S;
var F,n:I;
 if ChooseFile(FName,"Открыть файл...", "Текстовые файлы(*.txt)|*.txt")=cmCancel: Exit; fi;
 F=TextFileOpenRead(FName);
 Try
  Раб.Бюджет2005.РежимМаски="?";
  Очистить;
  n=0;
  While not TextFileEndOfFile(F) do
   n=n+1;
   Hint("Чтение списка БК..."+Str(n));
   tmp=TextFileReadLn(F);
   if Match(tmp,Раб.Бюджет2005.МаскаФКР+"|*") or Match(tmp,Раб.Бюджет2005.МаскаКД+"|*") or Match(tmp,Раб.Бюджет2005.МаскаКИФД+"|*"):
      InsertFrame(Упр,Упр+1);
      БК[Упр]=ExtractWord(1,tmp,"|");
      ЭК[Упр]=ExtractWord(2,tmp,"|");
      ТипБК[Упр]=ОпределитьТипБК(БК[Упр],ЭК[Упр],Упр);
      КОСГУ[Упр]=ПолучитьКОСГУ(ЭК[Упр]);
   fi;
  od;
 Finally
  TextFileClose(F);
 end;
 УдалитьПустыеСтроки;
 if not БК[1]="": Message("Список БК успешно загружен"); else Message("Выбранный файл не является списком БК",mtError); fi;
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
--Обработчики событий шаблона -----
--



Конец
