-- Шаблон создан мастером бланков
-- 09.05.2006 9:44:25
--
БланкСШаблоном "Конвертация учета";

ТекНастр:I=[1];

var Настр1:S="Счета...";
var Настр2:S="Признаки...";
var Настр3:S="Картотеки...";
var Настр4:S="Журналы...";

var A:S="+";
var D:S="-";
var пп[]:i=$;

var fldКлюч[]:S;
var fldСинт[]:S;
var fldАна[]:S;

var Buf[]:S;
var Buf1[]:S;
var Buf2[]:S;

var StoreCardField:S;
var StoreCard:S;
--Счета
var ДобТаблСч_:S="Доб. новую табл.";
var УдалТаблСч_:S="Удалить таблицу";
var КопТаблСч_:S="Копировать табл.";
var ЗагрТаблСч_:S="Загрузить табл. счетов";
var СохрТаблСч_:S="Сохранить табл. счетов";
var СтдТаблСч_:S="Стандарт. табл. счетов";
var ОчистТаблСч_:S="Очистить табл. счетов";

ИстСчOld:I;
ИстСчФайлOld:S;
ИстСчOld_:S=if(ИстСчOld=1:"Источник файл:"+Chr(13)+"["+ИстСчФайлOld+"]"|ИстСчOld=2:"Источник:"+Chr(13)+"[Тек. план счетов (список)]"|True:"Источник:"+Chr(13)+"[Тек. план счетов (счета)]");

ИстСчNew:I;
ИстСчФайлNew:S;
ИстСчNew_:S=if(ИстСчNew=1:"Источник файл:"+Chr(13)+"["+ИстСчФайлNew+"]"|ИстСчNew=2:"Источник:"+Chr(13)+"[Тек. план счетов (список)]"|True:"Источник:"+Chr(13)+"[Тек. план счетов (счета)]");

ИстСчУслСч:I;
ИстСчУслСчФайл:S;
ИстСчУслСч_:S=if(ИстСчУслСч=1:"Источник файл:"+Chr(13)+"["+ИстСчУслСчФайл+"]"|ИстСчУслСч=2:"Источник:"+Chr(13)+"[Тек. план счетов (список)]"|True:"Источник:"+Chr(13)+"[Тек. план счетов (счета)]");

ИстСчУслАн:I;
ИстСчУслАнФайл:S;
ИстСчУслАн_:S=if(ИстСчУслАн=1:"Источник файл:"+Chr(13)+"["+ИстСчУслАнФайл+"]"|True:"Источник:"+Chr(13)+"[Тек. список признаков]");

УпрСч:I;
ТекТаблСч:S;
var ТекТаблСч_:S=ТекТаблСч;
ТекТаблСчКмнт:S;
ТекТаблСчРежим:I;
var ТекТаблСчРежим_:S=if(ТекТаблСчРежим=1,"Продолжить обработку","Закончить обработку");
ТекТаблСчКБК:I;
var ТекТаблСчКБК_:S=if(ТекТаблСчКБК=2:"По счету без КБК"|ТекТаблСчКБК=1:"По шаблону счета"|ТекТаблСчКБК=0:"По шаблону КБК");
ТекСчOld[]:S;
ТекСчNew[]:S;
ТекСчУслСч[]:S;
ТекСчУслАн[]:S;
ТекСчДобАн[]:S;

ТаблСч[]:S;
ТаблСчКмнт[]:S;
ТаблСчРежим[]:I;
ТаблСчКБК[]:I;
СчOld[]:S;
СчNew[]:S;
СчУслСч[]:S;
СчУслАн[]:S;
СчДобАн[]:S;

var BufСчNew[]:S;
var VerСчNew:S;
var pСчNew:I;
var BufСчOld[]:S;
var VerСчOld:S;
var pСчOld:I;
var BufСчУслСч[]:S;
var BufСчУслАн[]:S;

S1_1: Section;
S1_2: Section;
S1_3: Section;
S1_4: Section;
--Счета
--Аналитика
var ДобТаблАн_:S="Доб. новую табл.";
var УдалТаблАн_:S="Удалить таблицу";
var КопТаблАн_:S="Копировать табл.";
var ЗагрТаблАн_:S="Загрузить табл. признаков";
var СохрТаблАн_:S="Сохранить табл. признаков";
var СтдТаблАн_:S="Стандарт. табл. признаков";
var ОчистТаблАн_:S="Очистить табл. признаков";

ИстАнOld:I;
ИстАнФайлOld:S;
ИстАнOld_:S=if(ИстАнOld=1:"Источник файл:"+Chr(13)+"["+ИстАнФайлOld+"]"|True:"Источник:"+Chr(13)+"[Тек. список признаков]");

ИстАнNew:I;
ИстАнФайлNew:S;
ИстАнNew_:S=if(ИстАнNew=1:"Источник файл:"+Chr(13)+"["+ИстАнФайлNew+"]"|True:"Источник:"+Chr(13)+"[Тек. список признаков]");

ИстАнУслСч:I;
ИстАнУслСчФайл:S;
ИстАнУслСч_:S=if(ИстАнУслСч=1:"Источник файл:"+Chr(13)+"["+ИстАнУслСчФайл+"]"|ИстАнУслСч=2:"Источник:"+Chr(13)+"[Тек. план счетов (список)]"|True:"Источник:"+Chr(13)+"[Тек. план счетов (счета)]");

ИстАнУслАн:I;
ИстАнУслАнФайл:S;
ИстАнУслАн_:S=if(ИстАнУслАн=1:"Источник файл:"+Chr(13)+"["+ИстАнУслАнФайл+"]"|True:"Источник:"+Chr(13)+"[Тек. список признаков]");

УпрАн:I;
ТекТаблАн:S;
var ТекТаблАн_:S=ТекТаблАн;
ТекТаблАнКмнт:S;
ТекТаблАнРежим:I;
var ТекТаблАнРежим_:S=if(ТекТаблАнРежим=1,"Продолжить обработку","Закончить обработку");
ТекАнOld[]:S;
ТекАнNew[]:S;
ТекАнУслСч[]:S;
ТекАнУслАн[]:S;

ТаблАн[]:S;
ТаблАнКмнт[]:S;
ТаблАнРежим[]:I;
АнOld[]:S;
АнNew[]:S;
АнУслСч[]:S;
АнУслАн[]:S;

var BufАнNew[]:S;
var VerАнNew:S;
var pАнNew:I;
var BufАнOld[]:S;
var VerАнOld:S;
var pАнOld:I;
var BufАнУслСч[]:S;
var BufАнУслАн[]:S;

S2_1: Section;
S2_2: Section;
S2_3: Section;
S2_4: Section;
--Аналитика
--Картотеки
var СписокКарт_:S="Список журналов картотек";
var СтдНастрКарт_:S="Стандартные параметры";
var ОчистКарт_:S="Очистить";
var ЗагрСписокКарт_:S="Загрузить список картотек";
var СохрСписокКарт_:S="Сохранить список картотек";
var КартТКС_:S="Выбрать...";
var КартТКА_:S="Выбрать...";

УпрКарт:I;

Карт[]:S;
var КартЖ:S="Ж";
КартНаим[]:S;
КартПолеСинт[]:S;
var КартПолеСинт_[]:S=КартПолеСинт[$];
КартПолеАн[]:S;
var КартПолеАн_[]:S=КартПолеАн[$];
КартПолеДобАн[]:S;
var КартПолеДобАн_[]:S=КартПолеДобАн[$];
КартКонвСч[]:S;
var КартКонвСч_[]:S=КартКонвСч[$];
КартКонвАн[]:S;
var КартКонвАн_[]:S=КартКонвАн[$];
КартДопФ[]:S;

S3_1: Section;
S3_2: Section;
S3_3: Section;
--Картотеки
--Журналы
var СписокЖур_:S="Загрузить список журналов";
var ОчистЖур_:S="Очистить";
var ЖурТКС_:S="Выбрать...";
var ЖурТКА_:S="Выбрать...";

УпрЖур:I;

Жур[]:S;
ЖурНаим[]:S;
var ЖурПолеСинт:S="DEBET CREDIT";
var ЖурПолеАн:S="АНАЛИТИКА КОЛАНАЛИТИКА";
ЖурКонвСч[]:S;
var ЖурКонвСч_[]:S=ЖурКонвСч[$];
ЖурКонвАн[]:S;
var ЖурКонвАн_[]:S=ЖурКонвАн[$];
ЖурДопФ[]:S;
ЖурТип[]:S;

S4_1: Section;
S4_2: Section;
S4_3: Section;
--Картотеки
--Конвертация
S5_1: Section;
S5_2: Section;
S5_3: Section;
S5_4: Section;

var ВыполКартУпр:I;

var ВыполКарт[]:S;
var ВыполКартНаим[]:S;
var ВыполКартСтатус[]:I;
var ВыполКартВремя[]:S;
var ВыполКартСтатус_[]:S=if(ВыполКартСтатус[$]=1:"Конвертация завершена: "+ВыполКартВремя[$]|ВыполКартСтатус[$]=-1:"Ошибка конвертации: "+ВыполКартВремя[$]|True:"Ожидание");

var ВыполЖурУпр:I;

var ВыполЖур[]:S;
var ВыполЖурСтатус[]:I;
var ВыполЖурВремя[]:S;
var ВыполЖурСтатус_[]:S=if(ВыполЖурСтатус[$]=1:"Конвертация завершена: "+ВыполЖурВремя[$]|ВыполЖурСтатус[$]=-1:"Ошибка конвертации: "+ВыполЖурВремя[$]|True:"Ожидание");

var СумВыполКартВремя:S;
var ВыполКартТекст:S="Конвертация картотек "+СумВыполКартВремя;
var СумВыполЖурВремя:S;
var ВыполЖурТекст:S="Конвертация разделов табличного журнала "+СумВыполЖурВремя;

var hField:S;

var KeyСч[]:S;

var idxKeyСч[]:S;
var idxСч[]:I;
var not_idxТаблСч[]:S;
var idxKeyАн[]:S;
var idxАн[]:I;
var not_idxТаблАн[]:S;

var iСчДобАн:I;

fn:S;
--
--Процедуры и функции -------------
Proc ИндексироватьТабл;
var n,nn,z:i;
var БК,КОСГУ:s;
 ClearVariable(idxKeyСч);
 ClearVariable(idxСч);
 ClearVariable(not_idxТаблСч);
 ClearVariable(idxKeyАн);
 ClearVariable(idxАн);
 ClearVariable(not_idxТаблАн);
 nn=LengthOfArray(ТаблСч);
 for n=1..nn do
  Hint("Индексация таблиц счетов "+Str(n)+" из "+Str(nn));
  БК=Раб.Бюджет2005.ВзятьКодКБК(СчOld[n],"","КБК",False);
  КОСГУ=Раб.Бюджет2005.ВзятьКодКБК(СчOld[n],"","КОСГУ",False);
  if ТаблСчКБК[n]=0 and Pos("?",БК)=0 and Pos("*",БК)=0 and Pos("!",БК)=0 and (Pos("?",КОСГУ)=0 or Pos("???",КОСГУ)=1) and (Pos("*",КОСГУ)=0 or Pos("*",КОСГУ)=1) and Pos("!",КОСГУ)=0:
  --   if SearchInArray(idxKeyСч,ТаблСч[n]+"$"+БК+"$"+КОСГУ,True)=-1:
        z=InsertInArraySort(idxKeyСч,ТаблСч[n]+"$"+БК+"$"+КОСГУ);
        InsertInArray(idxСч,z,n);
    -- fi;
    else
     AddInArray(not_idxТаблСч,True,False,ТаблСч[n]);
  fi;
 od;
 nn=LengthOfArray(idxKeyСч);
 for n=1..nn do
  idxKeyСч[n]=ExtractWords(1,WordsCount(idxKeyСч[n],"$")-1,idxKeyСч[n],"$");
 od;
 --
 nn=LengthOfArray(ТаблАн);
 for n=1..nn do
  Hint("Индексация таблиц аналитики "+Str(n)+" из "+Str(nn));
  if Pos("?",АнOld[n])=0 and Pos("*",АнOld[n])=0 and Pos("!",АнOld[n])=0:
--     if SearchInArray(idxKeyАн,ТаблАн[n]+"$"+АнOld[n],True)=-1:
        z=InsertInArraySort(idxKeyАн,ТаблАн[n]+"$"+АнOld[n]);
        InsertInArray(idxАн,z,n);
--     fi;
    else
     AddInArray(not_idxТаблАн,True,False,ТаблАн[n]);
  fi;
 od;
end;

Proc Начать;
var OWA,n,nr,ww,w:I;
var v1,v2:S;
 ClearVariable(KeyСч);
 --OWA=OpenWorkArea("РПО_Бюдж_Класс","","Name_Voc='СЧ' and Pos('КУ',S04)>0 and Length(CODE)=10");
 OWA=OpenWorkArea("РПО_Бюдж_Класс","","Name_Voc='СЧ' and Length(CODE)=10");
 Try
  nr=Records(OWA);
  for n=1..nr do
   v1=GetFieldS(OWA,n,"CODE");
   v2=GetFieldS(OWA,n,"S03");--КОСГУ
   if not v2="":
      ww=WordsCount(v2,",");
      for w=1..ww do
       AddInArray(KeyСч,True,False,v1+"$"+ExtractWord(w,v2,","));
       AddInArray(KeyСч,True,False,v1+"$???");
      od;
   fi;
  od;
 Finally
  CloseWorkArea(OWA);
 end;
 Раб.КСА.Начать;
end;

Proc Закончить;
 Раб.КСА.Закончить(True);
end;

Func КонвСтрСимвол (Value1:S; Value2:S):S;
var w,ww:i;
var ch,ret:s;
var Flag:L;
 Flag=False;
 ret="";
 ww=Length(Value2);
 for w=1..ww do
  ch=SubStr(Value2,w,1);
  if ch="?": if not Flag: Ret=Ret+SubStr(Value1,w,1); fi;
    |ch="*": if not Flag: Ret=Ret+SubStr(Value1,w,255); Flag=True; fi;
    |True: Ret=Ret+Ch; 
  fi;
 od;
 ^Ret;
end;

Func КонвСтрГруппа (Value1:S; Value2:S):S;
--Value1:S; - кого
--Value2:S  - под какую маску
var ww1,w2,ww2:i;
var tmp1,tmp2:s;
var ret:s;
 Ret="";
 ww1=WordsCount(Value1,".");
 ww2=WordsCount(Value2,".");
 if ww2<ww1 and Pos("*",Value2)=1 then
    w2=ww2;
    while w2>1 do
     tmp1=ExtractWord(w2,Value1,".");
     tmp2=ExtractWord(w2,Value2,".");
     tmp1=КонвСтрСимвол(tmp1,tmp2);
     Ret=Раб.Бюджет2005.Объединить(tmp1,Ret,".");
    od;
    if not Pos("*",tmp2)=0: Ret=Раб.Бюджет2005.Объединить(Ret,ExtractWords(1,ww1-w2+1,Value1,"."),"."); fi;
   else
    for w2=1..ww2 do
     tmp1=ExtractWord(w2,Value1,".");
     tmp2=ExtractWord(w2,Value2,".");
     tmp1=КонвСтрСимвол(tmp1,tmp2);
     Ret=Раб.Бюджет2005.Объединить(Ret,tmp1,".");
    od;
    if w2<=ww1:
       if not Pos("*",tmp2)=0: Ret=Раб.Бюджет2005.Объединить(Ret,ExtractWords(w2,ww1-w2+1,Value1,"."),"."); fi;
    fi;
 fi;
 ^Ret;
end;

Func КонвСч_(vТаблСч:S; vСч:S; valueСч:S; valueАн:S; Idx:L):S;
--vТаблСч:S; -таблица конвертации
--vСч:S; - конвертируемый счет
--valueСч:S; valueАн:S;--все значения
-- Idx:L   --Не индексирована
var z,n,nn,i,x:i;
var vБК,vСч9,dБК,dСч9,СчOld_,СчNew_,vКОСГУ:S;
var vТипКБК,dТипКБК,Ret:S;
 if Idx:
    vБК=Раб.Бюджет2005.ВзятьКодСчета(vСч,"","КБК",False);
    i=SearchInArray(idxKeyСч,vТаблСч+"$"+vБК,True,1);
    While not i=-1 do
     if (СчУслСч[idxСч[i]]="" or Раб.Бюджет2005.ПроверитьНаборСлов(valueСч," ",СчУслСч[idxСч[i]],"|","")) and (СчУслАн[idxСч[i]]="" or Раб.Бюджет2005.ПроверитьНаборСлов(valueАн," ",СчУслАн[idxСч[i]],"|","")):
        vКОСГУ=Раб.Бюджет2005.ВзятьКодКБК(СчOld[idxСч[i]],"","КОСГУ",False);
        if vКОСГУ="???" or vКОСГУ="*" or vКОСГУ="!":
           Break;
          else
           x=SearchInArray(KeyСч,Раб.Бюджет2005.ВзятьКодСчета(vСч,"","СЧ8",False)+"$"+vКОСГУ,True);
           if x=-1: x=SearchInArray(KeyСч,Раб.Бюджет2005.ВзятьКодСчета(vСч,"","СЧ8",False)+"$000",True); fi;
           if not x=-1: Break; fi;
        fi;
     fi;
     i=SearchInArray(idxKeyСч,vТаблСч+"$"+vБК,True,i+1);
    od;
    if i=-1: ^""; else n=idxСч[i]; fi;
   else
    nn=LengthOfArray(ТаблСч);
    --Находим таблицу конвертации
    z=SearchInArray(ТаблСч,vТаблСч,True);
    if z=-1: ^""; fi;
    for n=z..nn do
     if ТаблСчКБК[n]<>0: --если по шаблону счета
        СчOld_=СчOld[n]; 
       else 
        СчOld_=Раб.Бюджет2005.ВзятьКодСчета(СчOld[n],"","КБК",False)+".?.???.??.???"; 
     fi;
     if vТаблСч=ТаблСч[n]:--проверяем соответстве нужной таблице
        if Match(vСч,СчOld_): --проверка соответствия счета шаблону
           --проверяем допусловия
           if (СчУслСч[n]="" or Раб.Бюджет2005.ПроверитьНаборСлов(valueСч," ",СчУслСч[n],"|","")) and (СчУслАн[n]="" or Раб.Бюджет2005.ПроверитьНаборСлов(valueАн," ",СчУслАн[n],"|","")):
              if ТаблСчКБК[n]<>0:
                 Break; --для шаблона счета пропускаем
                else
                 --для шаблона КБК находим соответствие ключевой таблице
                 i=SearchInArray(KeyСч,Раб.Бюджет2005.ВзятьКодСчета(vСч,"","СЧ8",False)+"$"+Раб.Бюджет2005.ВзятьКодКБК(СчOld[n],"","КОСГУ",False),True);
                 if i=-1: i=SearchInArray(KeyСч,Раб.Бюджет2005.ВзятьКодСчета(vСч,"","СЧ8",False)+"$000",True); fi;
                 if not i=-1: Break; fi;
              fi;
           fi;
        fi;
       else
        ^"";
     fi;
    od;
    if n>nn: ^""; fi;
 fi;-- if Idx:
 Ret="";
 vТипКБК=Раб.Бюджет2005.ТипКБКСчета(vСч);
 if not vТипКБК="":  --стандартный счет с кбк
    if ТаблСчКБК[n]<>0:
       СчNew_=СчNew[n]; 
      else --добавляем маску окончания для шаблона КБК
       СчNew_=Раб.Бюджет2005.ВзятьКодСчета(СчNew[n],"","КБК",False)+".?.???.??.???"; 
    fi;
    dТипКБК=Раб.Бюджет2005.ТипКБКСчета(СчNew_);
    if Match(СчNew_,"?.?.???.??.???") and Pos("*",СчNew_)=1:
       vБК=Раб.Бюджет2005.ВзятьКодСчета(vСч,vТипКБК,"КБК",False);
       vСч9=Раб.Бюджет2005.ВзятьКодСчета(vСч,vТипКБК,"Сч9",False);
       Ret=КонвСтрСимвол(vСч9,SubStr(СчNew_,3,255));
       Ret=vБК+"."+Ret;
      |vТипКБК=dТипКБК:
       Ret=КонвСтрСимвол(vСч,СчNew_);
      |not vТипКБК=dТипКБК and not dТипКБК="":
       vБК=Раб.Бюджет2005.ВзятьКодСчета(vСч,vТипКБК,"КБК",False);
       vСч9=Раб.Бюджет2005.ВзятьКодСчета(vСч,vТипКБК,"Сч9",False);
       dБК=Раб.Бюджет2005.ВзятьКодСчета(СчNew_,dТипКБК,"КБК",False);
       dСч9=Раб.Бюджет2005.ВзятьКодСчета(СчNew_,dТипКБК,"Сч9",False);
       Ret=КонвСтрСимвол(vСч9,dСч9);
       if Pos("?",dБК)>3: --Если есть маски в кбк (кроме ППП) то конвертим только сч9
          Ret=vБК+"."+Ret;
         else --Иначе меняем тип КБК в счете
          if Pos("?",dБК)=0: --меняем целиком код кбк
             Ret=dБК+"."+Ret;
            else --иначе оставляем ППП от исходного кода
             Ret=SubStr(vБК,1,3)+"."+Ret;
          fi;
       fi; --if Pos("?",dБК)>3:
      |True: Ret=КонвСтрГруппа(vСч,СчNew_);
    fi; --Match(СчNew_,"?.???.??.???"):
   else
    Ret=КонвСтрГруппа(vСч,СчNew_);
 fi; --if not vТипКБК="":
 iСчДобАн=n;
 ^Ret;
end;

Func КонвСч (vТаблСч:S; vСч:S; valueСч:S; valueАн:S):S;
--vТаблСч:S; - список таблиц конвертации
--vСч:S; -конвертируемое значение
-- valueСч:S; valueАн:S--Значения все
var w,ww:i;
var Ret,tmp:S;
var Flag:L;
 ww=WordsCount(vТаблСч," ");
 for w=1..ww do
  tmp=ExtractWord(w,vТаблСч," ");
  if ТаблСчКБК[SearchInArray(ТаблСч,tmp,True)]=2:
     Flag=False;
    else
     Flag=SearchInArray(not_idxТаблСч,tmp,True)=-1;
  fi;
  iСчДобАн=0;
  Ret=КонвСч_(tmp,vСч,valueСч,valueАн,Flag);
  if not Ret="": 
     if ТаблСчРежим[SearchInArray(ТаблСч,tmp,True)]=0:
        Break;
       else
        vСч=Ret;
     fi;
  fi;
 od;
 if w>ww: Ret=vСч; fi;
 if Match(Ret,"*.?.???.??.*"): Раб.КСА.Добавить(Ret); fi;
 ^Ret;
end;

Func КонвАн_(vТаблАн:S; vАн:S; valueСч:S; valueАн:S):S;
var z,n,nn:i;
var Ret:S;
 z=SearchInArray(ТаблАн,vТаблАн,True);
 if z=-1: ^vАн; fi;
 nn=LengthOfArray(ТаблАн);
 for n=z..nn do
  if vТаблАн=ТаблАн[n] and Match(vАн,АнOld[n]):
     if (АнУслСч[n]="" or Раб.Бюджет2005.ПроверитьНаборСлов(valueСч," ",АнУслСч[n],"|","")) and (АнУслАн[n]="" or Раб.Бюджет2005.ПроверитьНаборСлов(valueАн," ",АнУслАн[n],"|","")):
        Break;
     fi;
  fi;
 od;
 if n>nn: ^vАн; fi;
 Ret=КонвСтрГруппа(vАн,АнNew[n]);
 ^Ret;
end;

Func КонвАн (vТаблАн:S; vАн:S; valueСч:S; valueАн:S):S;
var w1,ww1,w2,ww2:i;
var Ret,tmp1,tmp2,tmp3:S;
 ww1=WordsCount(vТаблАн," ");
 ww2=WordsCount(vАн," ");
 for w1=1..ww1 do
  tmp1=ExtractWord(w1,vТаблАн," "); --Таблица
  Ret="";
  for w2=1..ww2 do
   tmp2=ExtractWord(w2,vАн," "); --Признак в наборе
   tmp3=КонвАн_(tmp1,tmp2,valueСч,valueАн);
   Ret=Раб.Бюджет2005.Объединить(Ret,tmp3," ");
  od;
  if not Ret=vАн:
     if ТаблАнРежим[SearchInArray(ТаблАн,tmp1,True)]=0:
        Break;
       else
        vАн=Ret;
     fi;
  fi;
 od;
 if ww1=0: Ret=vАн; fi;
 ^Ret;
end;

Proc SetToArray(vSet:S; Sp:S);
var w,ww:i;
var tmp:S;
 ClearVariable(Buf);
 ww=WordsCount(vSet,Sp);
 if ww=0: Exit; fi;
 for w=1..ww do
  tmp=ExtractWord(w,vSet,Sp);
  if Pos("@",tmp)=0: tmp="!@"+tmp; fi;
  InsertInArraySort(Buf,tmp);
 od;
end;

Func СформПакетПолей (vСинт:S; vАна:S):I;
var n,nn,z:i;
var tmp:s;
 ClearVariable(fldКлюч);
 ClearVariable(fldСинт);
 ClearVariable(fldАна);
 --
 SetToArray(vСинт," "); CopyArray(Buf,Buf1);
 SetToArray(vАна," "); CopyArray(Buf,Buf2);
 --
 nn=LengthOfArray(Buf1);
 for n=1..nn do
  tmp=ExtractWord(1,Buf1[n],"@");
  z=SearchInArray(fldКлюч,tmp,True);
  if z=-1:
     z=InsertInArraySort(fldКлюч,tmp);
     if Pos("!@",Buf1[n])=1: tmp=SubStr(Buf1[n],3,255); else tmp=Buf1[n]; fi;
     InsertInArray(fldСинт,z,tmp);
     InsertInArray(fldАна,z,"");
    else
     if Pos("!@",Buf1[n])=1: tmp=SubStr(Buf1[n],3,255); else tmp=Buf1[n]; fi;
     fldСинт[z]=Раб.Бюджет2005.Объединить(fldСинт[z],tmp," ");
  fi;
 od;
 --
 nn=LengthOfArray(Buf2);
 for n=1..nn do
  tmp=ExtractWord(1,Buf2[n],"@");
  z=SearchInArray(fldКлюч,tmp,True);
  if z=-1:
     z=InsertInArraySort(fldКлюч,tmp);
     if Pos("!@",Buf2[n])=1: tmp=SubStr(Buf2[n],3,255); else tmp=Buf2[n]; fi;
     InsertInArray(fldСинт,z,"");
     InsertInArray(fldАна,z,tmp);
    else
     if Pos("!@",Buf2[n])=1: tmp=SubStr(Buf2[n],3,255); else tmp=Buf2[n]; fi;
     fldАна[z]=Раб.Бюджет2005.Объединить(fldАна[z],tmp," ");
  fi;
 od;
 --
 nn=LengthOfArray(fldКлюч);
 for n=1..nn do
  if fldКлюч[n]="!": fldКлюч[n]=""; fi;
 od;
 --
 ^nn;
end;

Func ВзятьЗначПолей (vOWA:I; vN:I; vFields:S):S;
var w,ww:i;
var Ret,tmp,Field:S;
 Ret="";
 ww=WordsCount(vFields," ");
 for w=1..ww do
  Field=ExtractWord(w,vFields," ");
  if not Pos("@",Field)=0: Field=ExtractWord(2,Field,"@"); fi;
  tmp=GetFieldS(vOWA,vN,Field);
  Ret=Раб.Бюджет2005.Объединить(Ret,tmp," ");
 od;
 ^Ret;
end;

Func КонвКартПодТаб(vOWA:I; vN:i; vFieldsСинт:S; vFieldsАна:S; vFieldДобАна:S; vКартКонвСч:S; vКартКонвАн:S; vValueСинт:S; vValueАна:S):L;
var OA,nr,n,w,ww,w2,ww2:I;
var Struct,Field,ValueField,ValueField1,ValueСинт,ValueАна,Mask:S;
var Flag:L;
 Struct=ExtractWord(1,ExtractWord(1,vFieldsСинт," "),"@");
 if Struct="": Struct=ExtractWord(1,ExtractWord(1,vFieldsАна," "),"@"); fi;
 if Struct="": ^False; fi;
 OA=OpenArray(vOWA,vN,Struct,"");
  nr=Records(OA);
  for n=1..nr do
   ValueСинт=ВзятьЗначПолей(OA,n,vFieldsСинт);
   ValueСинт=Раб.Бюджет2005.Объединить(ValueСинт,vValueСинт," ");
   ValueАна=ВзятьЗначПолей(OA,n,vFieldsАна);
   ValueАна=Раб.Бюджет2005.Объединить(ValueАна,vValueАна," ");
   ww=WordsCount(vFieldsСинт," ");
   for w=1..ww do
    Field=ExtractWord(2,ExtractWord(w,vFieldsСинт," "),"@");
    ValueField1=GetFieldS(OA,n,Field);
    ValueField=КонвСч(vКартКонвСч,ValueField1,ValueСинт,ValueАна);
    if ValueField<>ValueField1 then
       n=PutFieldS(OA,n,Field,ValueField);
       if not iСчДобАн=0 and not vFieldДобАна="":
          if not СчДобАн[iСчДобАн]="":
             Mask=ExtractWord(1,СчДобАн[iСчДобАн],".");
             if not Pos(".",СчДобАн[iСчДобАн])=0: Mask=Mask+".*"; fi;
             Flag=False;
             ww2=WordsCount(vFieldsАна," ");
             for w2=1..ww2 do
              Field=ExtractWord(2,ExtractWord(w2,vFieldsАна," "),"@");
              ValueField1=GetFieldS(OA,n,Field);
              if not Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(ValueField1," ",Mask,"")="":
                 ValueField=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой (ValueField1," ",СчДобАн[iСчДобАн],Mask,"");
                 ValueField=Раб.Бюджет2005.СортироватьНаборСлов(ValueField," ",True);
                 if Trim(ValueField)<>Trim(ValueField1) then
                    n=PutFieldS(OA,n,Field,ValueField);
                 fi;
                 Flag=True;
                 Break;
              fi;
             od;
             if not Flag:
                Field=ExtractWord(2,vFieldДобАна,"@");
                ValueField=GetFieldS(OA,n,Field);
                ValueField=Раб.Бюджет2005.СортироватьНаборСлов(Trim(ValueField+" "+СчДобАн[iСчДобАн])," ",True);
                n=PutFieldS(OA,n,Field,ValueField);
             fi;
          fi;
       fi;

    fi;
   od;
   --
   ww=WordsCount(vFieldsАна," ");
   for w=1..ww do
    Field=ExtractWord(2,ExtractWord(w,vFieldsАна," "),"@");
    ValueField1=GetFieldS(OA,n,Field);
    ValueField=КонвАн(vКартКонвАн,ValueField1,ValueСинт,ValueАна);
    if ValueField<>ValueField1 then
       n=PutFieldS(OA,n,Field,ValueField);
    fi;
   od;
   --
  od;
  CloseWorkArea(OA);
 ^True;
end;

Proc КонвКарт (vКарт:S; Iter:I);
var OWA,n,nr,p,f,ff,w,ww,w2,ww2:I;
var Field,ValueСинт,ValueАна,ValueField,ValueField1,hint_,Mask:S;
var Flag:L;
 Iter=SearchInArray(Карт,vКарт,False,Iter);
 if Iter=-1: Message("Параметры конвертации картотеки "+vКарт+" не найдены",mtError); Exit; fi;
 ff=СформПакетПолей(КартПолеСинт[Iter],КартПолеАн[Iter]);
 Hint_="Конвертация картотеки "+vКарт+if(КартДопФ[Iter]="",""," ("+КартДопФ[Iter]+")")+"...";
 OWA=OpenWorkArea(Карт[Iter],"",КартДопФ[Iter]);
 Try
  nr=Records(OWA);
  BeginChanging(OWA);
  Try
   ValueАна="";
   for n=1..nr do
    p=Int(n*100/nr);
    Hint(Hint_+Str(p)+"%");
    for f=1..ff do
     if fldКлюч[f]="":
        --Берем значения синтетики и аналитики(все)
        ValueСинт=ВзятьЗначПолей(OWA,n,fldСинт[f]);
        ValueАна=ВзятьЗначПолей(OWA,n,fldАна[f]);
        --конвертим синтетикеу
        ww=WordsCount(fldСинт[f]," ");
        for w=1..ww do
         Field=ExtractWord(w,fldСинт[f]," ");
         --Берем значение
         ValueField1=GetFieldS(OWA,n,Field);
         --конвертируем значение
         ValueField=КонвСч(КартКонвСч[Iter],ValueField1,ValueСинт,ValueАна);
         if ValueField<>ValueField1 then
            n=PutFieldS(OWA,n,Field,ValueField);
            if not iСчДобАн=0 and not КартПолеДобАн[Iter]="":
               if not СчДобАн[iСчДобАн]="":
                  Mask=ExtractWord(1,СчДобАн[iСчДобАн],".");
                  if not Pos(".",СчДобАн[iСчДобАн])=0: Mask=Mask+".*"; fi;
                  Flag=False;
                  ww2=WordsCount(fldАна[f]," ");
                  for w2=1..ww2 do
                   Field=ExtractWord(w2,fldАна[f]," ");
                   ValueField1=GetFieldS(OWA,n,Field);
                   if not Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(ValueField1," ",Mask,"")="":
                      ValueField=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой (ValueField1," ",СчДобАн[iСчДобАн],Mask,"");
                      ValueField=Раб.Бюджет2005.СортироватьНаборСлов(ValueField," ",True);
                      if Trim(ValueField)<>Trim(ValueField1) then
                         n=PutFieldS(OWA,n,Field,ValueField);
                      fi;
                      Flag=True;
                      Break;
                   fi;
                  od;
                  if not Flag:
                     ValueField=GetFieldS(OWA,n,КартПолеДобАн[Iter]);
                     ValueField=Раб.Бюджет2005.СортироватьНаборСлов(Trim(ValueField+" "+СчДобАн[iСчДобАн])," ",True);
                     n=PutFieldS(OWA,n,КартПолеДобАн[Iter],ValueField);
                  fi;
               fi;
            fi;
         fi;
        od; --for w=1..ww do
        if Карт[Iter]="Table_Oper": -- а нужно или это здесь или это копипаста?
           ValueField=GetFieldS(OWA,n,"Операция");
           ValueField1=GetFieldS(OWA,n,"DEBET")+" "+GetFieldS(OWA,n,"CREDIT");
           if ValueField<>ValueField1 then
              n=PutFieldS(OWA,n,"Операция",ValueField);
           fi;
        fi;
        --конвертим аналитику
        ww=WordsCount(fldАна[f]," ");
        for w=1..ww do
         Field=ExtractWord(w,fldАна[f]," ");
         ValueField1=GetFieldS(OWA,n,Field);
         ValueField=КонвАн(КартКонвАн[Iter],ValueField1,ValueСинт,ValueАна);
         if Trim(ValueField)<>Trim(ValueField1) then
            n=PutFieldS(OWA,n,Field,ValueField);
         fi;
        od;
       else
        КонвКартПодТаб(OWA,n,fldСинт[f],fldАна[f],КартПолеДобАн[Iter],КартКонвСч[Iter],КартКонвАн[Iter],ValueСинт,ValueАна);
     fi; --if Pos("@",Buf[f])=0:
    od; --for f=1..ff do
   od; --for n=1..nr do
   EndChanging(OWA);
  Except
   CancelChanging(OWA);
   Raise;
  end;
 Finally
  CloseWorkArea(OWA);
 end;
 Iter=SearchInArray(Карт,vКарт,False,Iter+1);
 if not Iter=-1: КонвКарт (vКарт,Iter); fi;
end;

Func ВзятьКлючРаздела(vРаздел:S):Record;-- возвращает UKEY раздела
var OWA:i;
 OWA=OpenWorkArea('Table_Razd','','РАЗДЕЛ="'+vРаздел+'"');
 Try
  if Records(OWA)=0: ^nil; fi;
  ^GetRecordKey(OWA,1);
 Finally
  CloseWorkArea(OWA);
 end;
end;

Proc КонвЖур (vЖур:S; Iter:I);
var OWA,n,nr,p,f,ff,w,ww,w2,ww2:I;
var Field,ValueСинт,ValueАна,ValueField,ValueField1,hint_,Mask:S;
var Flag:L;
 Iter=SearchInArray(Жур,vЖур,False,Iter);
 if Iter=-1: Message("Параметры конвертации раздела "+vЖур+" не найдены",mtError); Exit; fi;
 ff=СформПакетПолей(ЖурПолеСинт,ЖурПолеАн);
 Hint_="Конвертация раздела "+vЖур+if(ЖурДопФ[Iter]="",""," ("+ЖурДопФ[Iter]+")")+"...";
 OWA=OpenWorkArea("Table_Oper","",Раб.Бюджет2005.Объединить("Раздел="+RecordToString(ВзятьКлючРаздела(Жур[Iter])),ЖурДопФ[Iter]," and "));
 Try
  nr=Records(OWA);
  BeginChanging(OWA);
  Try
   ValueАна="";
   for n=1..nr do
    p=Int(n*100/nr);
    Hint(Hint_+Str(p)+"%");
    for f=1..ff do
     if fldКлюч[f]="":
        --Бере значения синтетики и аналитики
        ValueСинт=ВзятьЗначПолей(OWA,n,fldСинт[f]);
        ValueАна=ВзятьЗначПолей(OWA,n,fldАна[f]);
        --конвертим синтетикеу
        ww=WordsCount(fldСинт[f]," ");
        for w=1..ww do
         Field=ExtractWord(w,fldСинт[f]," ");
         ValueField1=GetFieldS(OWA,n,Field);
         ValueField=КонвСч(ЖурКонвСч[Iter],ValueField1,ValueСинт,ValueАна);
         if ValueField<>ValueField1 then
            n=PutFieldS(OWA,n,Field,ValueField);
            if not iСчДобАн=0:
               if not СчДобАн[iСчДобАн]="":
                  Mask=ExtractWord(1,СчДобАн[iСчДобАн],".");
                  if not Pos(".",СчДобАн[iСчДобАн])=0: Mask=Mask+".*"; fi;
                  Flag=False;
                  ww2=WordsCount(fldАна[f]," ");
                  for w2=1..ww2 do
                   Field=ExtractWord(w2,fldАна[f]," ");
                   ValueField1=GetFieldS(OWA,n,Field);
                   if not Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(ValueField1," ",Mask,"")="":
                      ValueField=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой (ValueField1," ",СчДобАн[iСчДобАн],Mask,"");
                      ValueField=Раб.Бюджет2005.СортироватьНаборСлов(ValueField," ",True);
                      if Trim(ValueField)<>Trim(ValueField1) then
                         n=PutFieldS(OWA,n,Field,ValueField);
                      fi;
                      Flag=True;
                      Break;
                   fi;
                  od;
                  if not Flag:
                     ValueField=GetFieldS(OWA,n,"АНАЛИТИКА");
                     ValueField=Раб.Бюджет2005.СортироватьНаборСлов(Trim(ValueField+" "+СчДобАн[iСчДобАн])," ",True);
                     n=PutFieldS(OWA,n,"АНАЛИТИКА",ValueField);
                  fi;
               fi;
            fi;
         fi;
        od; --for w=1..ww do
        ValueField1=GetFieldS(OWA,n,"Операция");
        ValueField=GetFieldS(OWA,n,"DEBET")+" "+GetFieldS(OWA,n,"CREDIT");
        if ValueField<>ValueField1 then
           n=PutFieldS(OWA,n,"Операция",ValueField);
        fi;
        --конвертим аналитику
        ww=WordsCount(fldАна[f]," ");
        for w=1..ww do
         Field=ExtractWord(w,fldАна[f]," ");
         ValueField1=GetFieldS(OWA,n,Field);
         ValueField=КонвАн(ЖурКонвАн[Iter],ValueField1,ValueСинт,ValueАна);
         if Trim(ValueField)<>Trim(ValueField1) then
            n=PutFieldS(OWA,n,Field,ValueField);
         fi;
        od;
     fi; --if Pos("@",Buf[f])=0:
    od; --for f=1..ff do
   od; --for n=1..nr do
   EndChanging(OWA);
  Except
   CancelChanging(OWA);
   Raise;
  end;
 Finally
  CloseWorkArea(OWA);
 end;
 Iter=SearchInArray(Жур,vЖур,False,Iter+1);
 if not Iter=-1: КонвЖур(vЖур,Iter); fi;
end;

Func ЧитатьФайлВМассив(FName:S; IsAcc:L; Field:S):I;
var F,n,w,ww:i;
var tmp,Val,Name:S;
var Flag:L;
 Flag=ТекТаблСчКБК=0 and (not Field="ИстАнУслСч_" or not Field="ИстСчУслСч_");
 ClearVariable(Buf);
 if not ExistFile(FName): Message("Файл "+FName+" не найден",mtError); ^-1; fi;
 F=TextFileOpenRead(FName);
 Try
  n=0;
  While not TextFileEndOfFile(F) do
   tmp=TextFileReadLn(F);
   tmp=Trim(tmp);
   Hint("Чтение из файла: "+tmp);
   if not tmp="" and not Pos("--",tmp)=1:
      Val=Trim(SubStr(tmp,1,Pos("--",tmp)-1));
      Val=ExtractWord(1,Val," "); --обрезаем строки баланса в счетах
      Name=Trim(SubStr(tmp,Pos("--",tmp)+2,255));
      if not IsAcc or (IsAcc and Match(Val,"*.?.???.??.???")):
         if Flag: Val=Раб.Бюджет2005.ВзятьКодСчета(val,"","КБК",false); fi;
         ww=WordsCount(Val,".");
         for w=1..ww do
          tmp=if(ww=1," ","")+ExtractWords(1,w,Val,".")+if(w=ww,"",".")+" --"+if(w=ww and Flag,Name,"");
          AddInArray(Buf,True,False,tmp);
         od;
      fi;
   fi;
  od;
 Finally
  TextFileClose(F);
 end;
 ^LengthOfArray(Buf);
end;

Proc Оформление;
var Obj:Object;
var ТекНастр_,s:i;
 if ТекНастр=0: ТекНастр=1; fi;
 for ТекНастр_=1..5 do
  s=1;
  While FindObject("S"+Str(ТекНастр_)+"_"+Str(s),Obj) do
   Obj.Visible=(ТекНастр_=ТекНастр);
   s=s+1;
  od;
 od;
end;

Func ПолучитьВремя(t:i):S;
var hh,mm,ss:i;
var Ret:S;
 hh=Int(Trunc(t/3600));
 mm=Int(Trunc((t-(hh*3600))/60));
 ss=Int(Trunc(t-(hh*3600)-(mm*60)));
 Ret=if(hh<10,"0","")+Str(hh)+":"+if(mm<10,"0","")+Str(mm)+":"+if(ss<10,"0","")+Str(ss);
^Ret;
end;
--Параметры конвертации счетов
Proc ОчиститьСч;
 ClearVariable(УпрСч);
 ClearVariable(ТекСчOld);
 ClearVariable(ТекСчNew);
 ClearVariable(ТекСчУслСч);
 ClearVariable(ТекСчУслАн);
 ClearVariable(ТекСчДобАн);
end;

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

Proc УдалитьТаблСч (vТаблСч:S);
var z,n:i;
 if vТаблСч="": Exit; fi;
 n=0;
 z=SearchInArray(ТаблСч,vТаблСч,True);
 While not z=-1 do
  n=n+1;
  Hint(Str(n)+"....");
  DeleteFromArray(ТаблСч,z,False);
  DeleteFromArray(ТаблСчКмнт,z,False);
  DeleteFromArray(ТаблСчРежим,z,False);
  DeleteFromArray(ТаблСчКБК,z,False);
  DeleteFromArray(СчOld,z,False);
  DeleteFromArray(СчNew,z,False);
  DeleteFromArray(СчУслСч,z,False);
  DeleteFromArray(СчУслАн,z,False);
  DeleteFromArray(СчДобАн,z,False);
  z=SearchInArray(ТаблСч,vТаблСч,True);
 od;
end;

Proc СохрТекТаблСч (vТаблСч:S);
var z,iter:i;
 if vТаблСч="": Exit; fi;
 УдалитьТаблСч(vТаблСч);
 УдалитьПустыеСч;
 if УпрСч=0: Exit; fi;
 for Iter=1..УпрСч do
  Hint(Str(Iter)+" из "+Str(УпрСч));
  z=InsertInArraySort(ТаблСч,vТаблСч);
  InsertInArray(ТаблСчКмнт,z,if(Iter=УпрСч,ТекТаблСчКмнт,""));
  InsertInArray(ТаблСчРежим,z,ТекТаблСчРежим);
  InsertInArray(ТаблСчКБК,z,ТекТаблСчКБК);
  InsertInArray(СчOld,z,ТекСчOld[УпрСч+1-Iter]);
  InsertInArray(СчNew,z,ТекСчNew[УпрСч+1-Iter]);
  InsertInArray(СчУслСч,z,ТекСчУслСч[УпрСч+1-Iter]);
  InsertInArray(СчУслАн,z,ТекСчУслАн[УпрСч+1-Iter]);
  InsertInArray(СчДобАн,z,ТекСчДобАн[УпрСч+1-Iter]);
 od;
end;

Proc ЗагрТекТаблСч (vТаблСч:S);
var z,n:i;
 if vТаблСч="": Exit; fi;
 ОчиститьСч;
 n=0;
 z=SearchInArray(ТаблСч,vТаблСч,True);
 While not z=-1 do
  n=n+1;
  Hint(Str(n)+"....");
  InsertFrame(УпрСч,УпрСч+1);
  if УпрСч=1: ТекТаблСчКмнт=ТаблСчКмнт[z]; fi;
  ТекТаблСчРежим=ТаблСчРежим[z];
  ТекТаблСчКБК=ТаблСчКБК[z];
  ТекСчOld[УпрСч]=СчOld[z];
  ТекСчNew[УпрСч]=СчNew[z];
  ТекСчУслСч[УпрСч]=СчУслСч[z];
  ТекСчУслАн[УпрСч]=СчУслАн[z];
  ТекСчДобАн[УпрСч]=СчДобАн[z];
  z=SearchInArray(ТаблСч,vТаблСч,True,z+1);
 od;
end;

Func ВыбратьТаблСч(Msg:S):S;
var n,nn,z:i;
 СохрТекТаблСч(ТекТаблСч);
 ClearVariable(Buf);
 nn=LengthOfArray(ТаблСч);
 if nn=0: Message("Список таблиц пуст, добавте новую таблицу конвертации счетов"); Template.Field="ДобТаблСч_"; ^""; fi;
 for n=1..nn do
  if not ТаблСч[n]="":
     AddInArray(Buf,True,False,ТаблСч[n]);
  fi;
 od;
 nn=LengthOfArray(Buf);
 for n=1..nn do
  z=SearchInArray(ТаблСч,Buf[n],True);
  if not z=-1: Buf[n]=Buf[n]+" --"+ТаблСчКмнт[z]; fi;
 od;
 n=Alternate(Msg,Buf,-1,1,12);
 if n=0: ^""; fi;
 ^SubStr(Buf[n],1,Pos(" --",Buf[n])-1);
end;
--Параметры конвертации счетов
--Параметры конвертации аналитики
Proc ОчиститьАн;
 ClearVariable(УпрАн);
 ClearVariable(ТекАнOld);
 ClearVariable(ТекАнNew);
 ClearVariable(ТекАнУслСч);
 ClearVariable(ТекАнУслАн);
end;

Proc УдалитьПустыеАн;
var Iter:i;
 Iter=1;
 While Iter<=УпрАн do
  if ТекАнOld[Iter]="" and ТекАнNew[Iter]="": DeleteFrame(УпрАн,Iter); else Iter=Iter+1; fi;
 od;
end;

Proc УдалитьТаблАн (vТаблАн:S);
var z,n:i;
 if vТаблАн="": Exit; fi;
 n=0;
 z=SearchInArray(ТаблАн,vТаблАн,True);
 While not z=-1 do
  n=n+1;
  Hint(Str(n)+"....");
  DeleteFromArray(ТаблАн,z,False);
  DeleteFromArray(ТаблАнКмнт,z,False);
  DeleteFromArray(ТаблАнРежим,z,False);
  DeleteFromArray(АнOld,z,False);
  DeleteFromArray(АнNew,z,False);
  DeleteFromArray(АнУслСч,z,False);
  DeleteFromArray(АнУслАн,z,False);
  z=SearchInArray(ТаблАн,vТаблАн,True);
 od;
end;

Proc СохрТекТаблАн (vТаблАн:S);
var z,iter:i;
 if vТаблАн="": Exit; fi;
 УдалитьТаблАн(vТаблАн);
 УдалитьПустыеАн;
 if УпрАн=0: Exit; fi;
 for Iter=1..УпрАн do
  Hint(Str(Iter)+" из "+Str(УпрАн));
  z=InsertInArraySort(ТаблАн,vТаблАн);
  InsertInArray(ТаблАнКмнт,z,if(Iter=УпрАн,ТекТаблАнКмнт,""));
  InsertInArray(ТаблАнРежим,z,ТекТаблАнРежим);
  InsertInArray(АнOld,z,ТекАнOld[УпрАн+1-Iter]);
  InsertInArray(АнNew,z,ТекАнNew[УпрАн+1-Iter]);
  InsertInArray(АнУслСч,z,ТекАнУслСч[УпрАн+1-Iter]);
  InsertInArray(АнУслАн,z,ТекАнУслАн[УпрАн+1-Iter]);
 od;
end;

Proc ЗагрТекТаблАн (vТаблАн:S);
var z,n:i;
 if vТаблАн="": Exit; fi;
 ОчиститьАн;
 n=0;
 z=SearchInArray(ТаблАн,vТаблАн,True);
 While not z=-1 do
  n=n+1;
  Hint(Str(n)+"....");
  InsertFrame(УпрАн,УпрАн+1);
  if УпрАн=1: ТекТаблАнКмнт=ТаблАнКмнт[z]; fi;
  ТекТаблАнРежим=ТаблАнРежим[z];
  ТекАнOld[УпрАн]=АнOld[z];
  ТекАнNew[УпрАн]=АнNew[z];
  ТекАнУслСч[УпрАн]=АнУслСч[z];
  ТекАнУслАн[УпрАн]=АнУслАн[z];
  z=SearchInArray(ТаблАн,vТаблАн,True,z+1);
 od;
end;

Func ВыбратьТаблАн(Msg:S):S;
var n,nn,z:i;
 СохрТекТаблАн(ТекТаблАн);
 ClearVariable(Buf);
 nn=LengthOfArray(ТаблАн);
 if nn=0: Message("Список таблиц пуст, добавте новую таблицу конвертации признаков"); Template.Field="ДобТаблАн_"; ^""; fi;
 for n=1..nn do
  if not ТаблАн[n]="":
     AddInArray(Buf,True,False,ТаблАн[n]);
  fi;
 od;
 nn=LengthOfArray(Buf);
 for n=1..nn do
  z=SearchInArray(ТаблАн,Buf[n],True);
  if not z=-1: Buf[n]=Buf[n]+" --"+ТаблАнКмнт[z]; fi;
 od;
 n=Alternate(Msg,Buf,-1,1,12);
 if n=0: ^""; fi;
 ^SubStr(Buf[n],1,Pos(" --",Buf[n])-1);
end;
--Параметры конвертации аналитики
--Параметры конвертации картотек
Proc ОчиститьКарт;
 ClearVariable(УпрКарт);
 ClearVariable(Карт);
 ClearVariable(КартНаим);
 ClearVariable(КартПолеСинт);
 ClearVariable(КартПолеАн);
 ClearVariable(КартПолеДобАн);
 ClearVariable(КартКонвСч);
 ClearVariable(КартКонвАн);
 ClearVariable(КартДопФ);
end;

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

Func ВыбратьКарт:S;
var n,nn:i;
var tmp:S;
 nn=GetCardFileNames("*",Buf,False,True,"");
 if nn=0: Message("Список картотек пуст"); ^""; fi;
 for n=1..nn do
  if StoreCard=SubStr(Buf[n],1,Pos(" --",Buf[n])-1): Break; fi;
 od;
 if n>nn: n=0; fi;
 n=Alternate("Список картотек",Buf,-1,n,12);
 if n=0: ^""; fi;
 tmp=SubStr(Buf[n],1,Pos(" --",Buf[n])-1);
 StoreCard=tmp;
 ^Buf[n];
end;

Func ВыбратьКартЖ:S;
var j,jj,n,i:i;
var tmp,ТипЖур:S;
 ClearVariable(Buf);
 ClearVariable(Buf1);
 jj=JournalsCount;
 for j=0..jj do
  tmp=JournalName(j);
  ТипЖур=JournalType(tmp);
  if ТипЖур="КАРТ": 
     tmp=JournalCardFile(tmp);
     if SearchInArray(Buf,tmp)=-1 and not tmp="":
        InsertInArray(Buf,LengthOfArray(Buf)+1,tmp);
     fi;
  fi;
 od;
 i=SearchInArray(Buf,StoreCard);
 jj=LengthOfArray(Buf);
 for j=1..jj do
  n=GetCardFileNames(Buf[j],Buf1,False,True,"");
  Buf[j]=Buf1[n];
 od;
 if jj=0: Message("В данном плане бухгалтерии не описан ни один журнал картотека");  ^""; fi;
 n=Alternate("Список журналов картотек",Buf,-1,i,12);
 if n=0: ^""; fi;
 tmp=SubStr(Buf[n],1,Pos(" --",Buf[n])-1);
 StoreCard=tmp;
 ^Buf[n];
end;

Func ВыбратьКартПоле(vКарт:S):S;
var n,nn,z,zz:i;
var tmp:S;
 ClearVariable(Buf1);
 ClearVariable(Buf2);
 nn=GetCardFileFields(vКарт,Buf,mtlSUBTAB);
 for n=1..nn do
  zz=GetCardFileFields(vКарт+"@"+Buf[n],Buf1,mtlSTRING);
  InsertInArray(Buf2,1,Buf[n]+"@"+" --"+GetCardFileFieldComment(vКарт,Buf[n]));
  for z=1..zz do
   InsertInArray(Buf2,1,Buf[n]+"@"+Buf1[z]+" --"+GetCardFileFieldComment(vКарт+"@"+Buf[n],Buf1[z]));
  od;
 od;
 SortArray(Buf2);
 nn=GetCardFileFields(vКарт,Buf,mtlSTRING);
 for n=1..nn do
  Buf[n]=Buf[n]+" --"+GetCardFileFieldComment(vКарт,Buf[n]);
 od;
 CopyArray(Buf2,Buf,1,nn+1);
 z=0;
 tmp=ExtractWord(2,StoreCardField,":");
 if ExtractWord(1,StoreCardField,":")=vКарт and not tmp="":
    zz=LengthOfArray(Buf);
    for z=1..zz do
     if tmp=SubStr(Buf[z],1,Pos(" --",Buf[z])-1): Break; fi;
    od;
    if z>zz: z=0; fi;
 fi;
 n=AlternateTree("Список полей",Buf,-1,z,0,"@","Картотека","Наименование",-1,False);
 if n=0: ^""; fi;
 tmp=SubStr(Buf[n],1,Pos(" --",Buf[n])-1);
 StoreCardField=vКарт+":"+tmp;
 ^tmp;
end;

Func ТипКартПоле(vКарт:S; vПоле:S):S;
var Ret:S;
var Тип:I;
  Тип=GetCardFileFieldType(vКарт,vПоле);
  if Тип=mtlREAL: Ret="REAL";
    |Тип=mtlINTEGER: Ret="INTEGER";
    |Тип=mtlBOOLEAN: Ret="BOOLEAN";
    |Тип=mtlSTRING: Ret="STRING";
    |Тип=mtlDATE: Ret="DATE";
    |Тип=mtlSUBTAB: Ret="SUBTAB";
    |Тип=mtlREF: Ret=GetCardFileByRefField(vКарт,vПоле);
    |Тип=mtlTimed: Ret="TIMED";
    |True: Ret="";
  fi;
  ^Ret;
end;

Func ВыбратьКартПоле2(vКарт:S):S;
var n,nn,z,zz:i;
var tmp,tmp2:S;
 ClearVariable(Buf);
 ClearVariable(Buf1);
 ClearVariable(Buf2);
 nn=GetCardFileFields(vКарт,Buf,mtlSUBTAB);
 for n=1..nn do
  InsertInArray(Buf2,1,Buf[n]+"@"+" --"+GetCardFileFieldComment(vКарт,Buf[n]));
  zz=GetCardFileFields(vКарт+"@"+Buf[n],Buf1,mtlAll);
  for z=1..zz do
   InsertInArray(Buf2,1,Buf[n]+"@"+Buf1[z]+"  :"+ТипКартПоле(vКарт+"@"+Buf[n],Buf1[z])+" --"+GetCardFileFieldComment(vКарт+"@"+Buf[n],Buf1[z]));
  od;
 od;
 SortArray(Buf2);
 nn=GetCardFileFields(vКарт,Buf,mtlAll);
 n=1;
 While not Buf[n]="" do
  if GetCardFileFieldType(vКарт,Buf[n])=mtlSUBTAB:
     DeleteFromArray(Buf,n);
    else
     Buf[n]=Buf[n]+"  :"+ТипКартПоле(vКарт,Buf[n])+" --"+GetCardFileFieldComment(vКарт,Buf[n]);
     n=n+1;
  fi;
 od;
 nn=LengthOfArray(Buf);
 CopyArray(Buf2,Buf,1,nn+1);
 z=0;
 tmp=ExtractWord(2,hField,":");
 if ExtractWord(1,hField,":")=vКарт and not tmp="":
    zz=LengthOfArray(Buf);
    for z=1..zz do
     tmp2=SubStr(Buf[z],1,Pos(" --",Buf[z])-1);
     tmp2=SubStr(tmp2,1,Pos("  :",tmp2)-1);
     if tmp=tmp2: Break; fi;
    od;
    if z>zz: z=0; fi;
 fi;
 n=AlternateTree("Список полей картотеки "+vКарт,Buf,-1,z,12,"@","Картотека","Наименование",-1,False);
 if n=0: ^""; fi;
 tmp=SubStr(Buf[n],1,Pos(" --",Buf[n])-1);
 tmp=SubStr(tmp,1,Pos("  :",tmp)-1);
 hField=vКарт+":"+tmp;
 ^tmp;
end;
--Параметры конвертации картотек
--Параметры конвертации журналов
Proc ОчиститьЖур;
 ClearVariable(УпрЖур);
 ClearVariable(Жур);
 ClearVariable(ЖурКонвСч);
 ClearVariable(ЖурКонвАн);
 ClearVariable(ЖурДопФ);
 ClearVariable(ЖурТип);
end;

Proc УдалитьПустыеЖур;
var Iter:i;
 Iter=1;
 While Iter<=УпрЖур do
  if Жур[Iter]="": DeleteFrame(УпрЖур,Iter); else Iter=Iter+1; fi;
 od;
end;
--Параметры конвертации журналов
--Процедуры и функции -------------                           
--
--
--Обработчики событий полей шаблона-----
Func Настр_OnEnter(FieldName: String; Iter: Integer): logical;
 ТекНастр=Int(SubStr(FieldName,6,1));
 Оформление;
 Return False;
end;

Func ИстУслСч_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
var tmp:S;
 ClearVariable(Buf);
 Buf[1]="Текущий план счетов (счета)";
 Buf[2]="Импорт из файла";
 Buf[3]="Текущий план счетов (список)";
 n=Alternate("Источник счетов",Buf,-1,1,12);
 if n=0: ^False; fi;
 n=n-1;
 if FieldName="ИстСчУслСч_": ИстСчУслСч=n;
   |FieldName="ИстАнУслСч_": ИстАнУслСч=n;
 fi;
 if n=1:
    if ChooseFile(tmp,"Открыть...","Счета (*.lis)|*.lis")=cmCancel: ^False; fi;
    ЧитатьФайлВМассив(tmp,True,FieldName);
    if FieldName="ИстСчУслСч_": 
       ИстСчУслСчФайл=tmp;
       CopyArray(Buf,BufСчУслСч);
      |FieldName="ИстАнУслСч_": 
       ИстАнУслСчФайл=tmp;
       CopyArray(Buf,BufАнУслСч);
    fi;
 fi;
 Return False;
end;

Func ИстУслАн_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
var tmp:S;
 ClearVariable(Buf);
 Buf[1]="Текущий список признаков";
 Buf[2]="Импорт из файла";
 n=Alternate("Источник аналитических признаков",Buf,-1,1,12);
 if n=0: ^False; fi;
 n=n-1;
 if FieldName="ИстСчУслАн_": ИстСчУслАн=n;
   |FieldName="ИстАнУслАн_": ИстАнУслАн=n;
 fi;
 if n=1:
    if ChooseFile(tmp,"Открыть...","Признаки (*.sig)|*.sig")=cmCancel: ^False; fi;
    ЧитатьФайлВМассив(tmp,False,FieldName);
    if FieldName="ИстСчУслАн_":
       ИстСчУслАнФайл=tmp;
       CopyArray(Buf,BufСчУслАн);
      |FieldName="ИстАнУслАн_":
       ИстАнУслАнФайл=tmp;
       CopyArray(Buf,BufАнУслАн);
    fi;
 fi;
 Return False;
end;

Func ТекУслСч_OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
 if not Pos("~",Value)=0 or not Pos("&",Value)=0 or not Pos("/",Value)=0 or not Pos("(",Value)=0 or not Pos(")",Value)=0: Message("Недопустимо использовать символы ~ & / ( ) в данном условии",mtError); ^False; fi;
 Return True;
end;

Func ТекУслСч_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Iter,n,Val:I;
var FieldName,Ret:S;
 Template.HideEditor(False);
 FieldName=AsString(Template.Field);
 Iter=AsInteger(Template.Frame);
 Ret="";
 if FieldName="ТекСчУслСч":
    Val=ИстСчУслСч;
    if Val=1: CopyArray(BufСчУслСч,Buf); fi;
   |FieldName="ТекАнУслСч":
    Val=ИстАнУслСч;
    if Val=1: CopyArray(BufАнУслСч,Buf); fi;
 fi;
 if Val=0:
    Ret=AccountElection("*",True,"");
    if Ret="": ^Cur; fi;
    Ret=Раб.Бюджет2005.ПолучитьШаблонСчета(Ret,"СЧ20");
   |Val=1:
    n=AlternateTree("Список счетов",Buf,-1,1,0,".","Счет","Наименование",-1,True);
    if n=0: ^Cur; fi;
    Ret=Trim(SubStr(Buf[n],1,Pos("--",Buf[n])-1));
    Ret=Раб.Бюджет2005.ПолучитьШаблонСчета(Ret,"СЧ20");
   |Val=2:
    Ret=Раб.КБК.Список("","","КБК");
    if Ret="": ^Cur; fi;
    Ret=Раб.Бюджет2005.ПолучитьШаблонСчета(Ret+".","СЧ20");
 fi;
 if Ret="": ^Cur; fi;
 if SubStr(Ret,Length(Ret),1)=".": Ret=Ret+"*"; fi;
 FieldName=FieldName+"["+Str(Iter)+"]";
 PutVariableS(FieldName,Раб.Бюджет2005.Объединить(GetVariableS(FieldName),Ret,"|"));
 Return Cur;
end;

Func ТекУслАн_OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
 if not Pos("~",Value)=0 or not Pos("&",Value)=0 or not Pos("/",Value)=0 or not Pos("(",Value)=0 or not Pos(")",Value)=0: Message("Недопустимо использовать символы ~ & / ( ) в данном условии",mtError); ^False; fi;
 Return True;
end;

Func ТекУслАн_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Iter,n,Val:I;
var FieldName,tmp,Ret:S;
 Template.HideEditor(False);
 FieldName=AsString(Template.Field);
 Iter=AsInteger(Template.Frame);
 Ret="";
 if FieldName="ТекСчУслАн": 
    Val=ИстСчУслАн;
    if Val=1: CopyArray(BufСчУслАн,Buf); fi;
   |FieldName="ТекАнУслАн": 
    Val=ИстАнУслАн;
    if Val=1: CopyArray(BufАнУслАн,Buf); fi;
 fi;
 if Val=0:
    Ret=AnaElection(tmp,False,True,"");
    if Ret="": ^Cur; fi;
   |Val=1:
    n=AlternateTree("Список признаков",Buf,-1,1,0,".","Признак","Наименование",-1,True);
    if n=0: ^Cur; fi;
    Ret=Trim(SubStr(Buf[n],1,Pos("--",Buf[n])-1));
 fi;
 if Ret="": ^Cur; fi;
 if SubStr(Ret,Length(Ret),1)=".": Ret=Ret+"*"; fi;
 FieldName=FieldName+"["+Str(Iter)+"]";
 PutVariableS(FieldName,Раб.Бюджет2005.Объединить(GetVariableS(FieldName),Ret,"|"));
 Return Cur;
end;

Func ТекСчДобАн_OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
 if Name_A(Value)=" ": Message("Неизвестный идентификатор аналитического признака '"+Value+"'",mtError); ^False; fi;
 Return True;
end;

Func ТекСчДобАн_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Iter:I;
var tmp:S;
 Template.HideEditor(False);
 Iter=AsInteger(Template.Frame);
 tmp=AnaElection;
 if not tmp="":
    ТекСчДобАн[Iter]=tmp;
 fi;
 Return Cur;
end;
--Параметры конвертации счетов
Func A1_OnEnter(FieldName: String; Iter: Integer): logical;
 InsertFrame(УпрСч,Iter+1);
 Return False;
end;

Func D1_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=ВыбратьТаблСч("Список таблиц конвертаций счетов");
 if tmp="": ^False;  fi;
 СохрТекТаблСч(ТекТаблСч);
 ТекТаблСч=tmp;
 ЗагрТекТаблСч(ТекТаблСч);
 Return False;
end;

Func ДобТаблСч_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 СохрТекТаблСч(ТекТаблСч);
 While not Input(tmp,"Введите наименование таблицы")=cmCancel do
  if not Pos(" ",tmp)=0: Message("Наименование не должно содержать пробелов",mtError); 
    else 
     if SearchInArray(ТаблСч,tmp,True)=-1: 
        Break; 
       else
        Message("Повторный ввод наименования таблицы",mtError);
     fi;
  fi;
 od;
 if tmp="": ^False; fi;
 ТекТаблСч=tmp;
 ЗагрТекТаблСч(ТекТаблСч);
 Return False;
end;

Func УдалТаблСч_OnEnter(FieldName: String; Iter: Integer): logical;
 if not ТекТаблСч="" and not SearchInArray(КартКонвСч,ТекТаблСч)=-1: Message("Удаление таблицы невозможно, так как данная таблица используется при конвертации картотек",mtError); ^False; fi;
 if EnqOkCancel("Таблица будет удалена, продолжить ?",mtWarning)=cmCancel: ^False; fi;
 УдалитьТаблСч(ТекТаблСч);
 ТекТаблСч="";
 ОчиститьСч;
 Return False;
end;

Func КопТаблСч_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:s;
 if EnqOkCancel("Данные текущей таблицы будет удалены, продолжить ?",mtWarning)=cmCancel: ^False; fi;
 tmp=ВыбратьТаблСч("Выберите таблицу источник");
 if tmp="": ^False; fi;
 ЗагрТекТаблСч(tmp);
 if ТекТаблСч="": ТекТаблСч=tmp+" (копия)"; fi;
 Return False;
end;

Func ТекТаблСчРежим_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
 ClearVariable(Buf);
 Buf[1]="Закончить обработку";
 Buf[2]="Продолжить обработку";
 n=Alternate("Выбор режима обработки",buf,-1,1,12);
 if n=0: ^False; fi;
 ТекТаблСчРежим=n-1;
 Return False;
end;

Func ТекТаблСчКБК_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
 ClearVariable(Buf);
 Buf[1]="По шаблону КБК";
 Buf[2]="По шаблону счета";
 Buf[3]="По счету без КБК";
 n=Alternate("Выбор режима обработки",buf,-1,1,12);
 if n=0: ^False; fi;
 ТекТаблСчКБК=n-1;
 Return False;
end;

Func ЗагрТаблСч_OnEnter(FieldName: String; Iter: Integer): logical;
var F:I;
var FName,tmp:S;
 if ТекТаблСч="": Message("Выберите таблицу",mtError); Template.Field="ТекТаблСч_"; ^False; fi;
 if EnqOkCancel("Текущая таблица будет очищена, продолжить ?",mtWarning)=cmCancel: ^False; fi;
 if FieldName="СтдТаблСч_": FName=PlanVar("STD_RPO")+"\КонвOldн_Newн\"; fi;
 if ChooseFile(FName,"Загрузить...","Текстовые файлы(*.txt)|*.txt")=cmCancel: ^False; fi;
 ОчиститьСч;
 F=TextFileOpenRead(FName);
 Try
  Iter=-3;
  While not TextFileEndOfFile(F) do
   tmp=TextFilereadLn(F);
      if Iter=-3: if tmp="Счета": Iter=-2; else Message("Данный файл не содержит таблицу конвертации счетов",mtError); ^False; fi;
        |Iter=-2: ТекТаблСчКмнт=Trim(tmp); Iter=-1;
        |Iter=-1: ТекТаблСчРежим=Int(ExtractWord(1,tmp,"|")); ТекТаблСчКБК=Int(ExtractWord(2,tmp,"|")); Iter=0;
        |not tmp="":
         Iter=Iter+1;
         InsertFrame(УпрСч,Iter);
         ТекСчOld[Iter]=Trim(ExtractWord(1,tmp,"|"));
         ТекСчNew[Iter]=Trim(ExtractWord(2,tmp,"|"));
         ТекСчУслСч[Iter]=Trim(ExtractWord(3,tmp,"|"));
         ТекСчУслАн[Iter]=Trim(ExtractWord(4,tmp,"|"));
         ТекСчДобАн[Iter]=Trim(ExtractWord(5,tmp,"|"));
      fi;
  od;
 Finally
  TextFileClose(F);
 end;
 Message("Таблица успешно прочитана");
 Return False;
end;

Func СохрТаблСч_OnEnter(FieldName: String; Iter: Integer): logical;
var F:I;
var FName:S;
 УдалитьПустыеСч;
 FName="Табл_Конв_Сч("+ТекТаблСч+").txt";
 if ChooseSaveFile(FName,"Сохранить...","Текстовые файлы(*.txt)|*.txt")=cmCancel: ^False; fi;
 if ExistFile(FName):
    if EnqOkCancel("Файл "+FName+" уже существует, перезаписать ?",mtWarning)=cmCancel: ^False; fi;
 fi;
 F=TextFileCreate(FName);
 Try
  TextFileWriteLn(F,"Счета");
  TextFileWriteLn(F,if(ТекТаблСчКмнт="","",ТекТаблСчКмнт));
  TextFileWriteLn(F,Str(ТекТаблСчРежим)+"|"+Str(ТекТаблСчКБК));
  for Iter=1..УпрСч do
   TextFileWriteLn(F,if(ТекСчOld[Iter]=""," ",ТекСчOld[Iter])+"|"+if(ТекСчNew[Iter]=""," ",ТекСчNew[Iter])+"|"+if(ТекСчУслСч[Iter]=""," ",ТекСчУслСч[Iter])+"|"+if(ТекСчУслАн[Iter]=""," ",ТекСчУслАн[Iter])+"|"+if(ТекСчДобАн[Iter]=""," ",ТекСчДобАн[Iter]));
  od;
 Finally
  TextFileClose(F);
 end;
 Message("Таблица успешно сохранена");
 Return False;
end;

Func ОчистТаблСч_OnEnter(FieldName: String; Iter: Integer): logical;
 if EnqOkCancel("Текущая таблица будет очищена, продолжить ?",mtWarning)=cmCancel: ^False; fi;
 ОчиститьСч;
 Return False;
end;

Func ИстСч_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
var tmp:S;
 ClearVariable(Buf);
 Buf[1]="Текущий план счетов (счета)";
 Buf[2]="Импорт из файла";
 Buf[3]="Текущий план счетов (список)";
 n=Alternate("Источник счетов",Buf,-1,1,12);
 if n=0: ^False; fi;
 n=n-1;
 if FieldName="ИстСчOld_": 
    ИстСчOld=n;
    if ИстСчOld=1:
       tmp=ИстСчФайлOld;
       if ChooseFile(tmp,"Открыть...","Счета (*.lis)|*.lis")=cmCancel: ^False; fi;
       ИстСчФайлOld=tmp;
       ЧитатьФайлВМассив(tmp,True,FieldName);
       VerСчOld="";
       CopyArray(Buf,BufСчOld);
    fi;
   |FieldName="ИстСчNew_":
    ИстСчNew=n;
    if ИстСчNew=1:
       tmp=ИстСчФайлNew;
       if ChooseFile(tmp,"Открыть...","Счета (*.lis)|*.lis")=cmCancel: ^False; fi;
       ИстСчФайлNew=tmp;
       ЧитатьФайлВМассив(tmp,True,FieldName);
       VerСчNew="";
       CopyArray(Buf,BufСчNew);
    fi;
 fi;
 Return False;
end;

Func ТекСч_OnEnter(FieldName: String; Iter: Integer): logical;
 if ТекТаблСч="": Message("Выберите таблицу",mtError); Template.Field="ТекТаблСч_"; ^False; fi;
 Return True;
end;

Func ИстСчУслАн_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
var tmp:S;
 ClearVariable(Buf);
 Buf[1]="Текущий список признаков";
 Buf[2]="Импорт из файла";
 n=Alternate("Источник аналитических признаков",Buf,-1,1,12);
 if n=0: ^False; fi;
 n=n-1;
 ИстСчУслАн=n;
 if ИстСчУслАн=1:
    tmp=ИстСчУслАнФайл;
    if ChooseFile(tmp,"Открыть...","Признаки (*.sig)|*.sig")=cmCancel: ^False; fi;
    ИстСчУслАнФайл=tmp;
    ЧитатьФайлВМассив(tmp,False,FieldName);
    CopyArray(Buf,BufСчУслАн);
 fi;
 Return False;
end;

Func ТекСч_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var ИстСч,Iter,n:I;
var FieldName,tmp,Ret:S;
 Template.HideEditor(False);
 FieldName=AsString(Template.Field);
 Iter=AsInteger(Template.Frame);
 if FieldName="ТекСчOld": 
    ИстСч=ИстСчOld; 
    CopyArray(BufСчOld,Buf);
   |FieldName="ТекСчNew": 
    ИстСч=ИстСчNew; 
    CopyArray(BufСчNew,Buf);
 fi;
 Ret="";
 if ТекТаблСчКБК=0: tmp="БК23"; 
   |ТекТаблСчКБК=1: tmp="СЧ20";
   |ТекТаблСчКБК=2: tmp="СЧ9";
 fi;
 if ИстСч=0:
    Ret=AccountElection("*",True,"");
    if Ret="": ^Cur; fi;
    if tmp="СЧ9" then Ret=Раб.Бюджет2005.ВзятьКодСчета(Ret,"",tmp,False);fi;
    Ret=Раб.Бюджет2005.ПолучитьШаблонСчета(Ret,tmp);
   |ИстСч=1:
    n=AlternateTree("Список счетов",Buf,-1,1,0,".","Счет","Наименование",-1,True);
    if n=0: ^Cur; fi;
    Ret=Trim(SubStr(Buf[n],1,Pos("--",Buf[n])-1));
    if tmp="СЧ9" then Ret=Раб.Бюджет2005.ВзятьКодСчета(Ret,"",tmp,False);fi;
    Ret=Раб.Бюджет2005.ПолучитьШаблонСчета(Ret,tmp);
   |ИстСч=2:
    Ret=Раб.КБК.Список("","",if(tmp="СЧ9","СЧ9 ВД+? КОСГУ+? ИГ","КБК"));
    if Ret="": ^Cur; fi;
    Ret=Раб.Бюджет2005.ПолучитьШаблонСчета(Ret+if(tmp="СЧ9","","."),tmp);
    if tmp="СЧ9" then Ret=Раб.Бюджет2005.ВзятьКодСчета9(Ret,"АН",True)+"."+Раб.Бюджет2005.КосгуВМаску(Раб.Бюджет2005.ВзятьКодСчета9(Ret,"КОСГУ",False),"?"); fi;
 fi;
 if tmp="СЧ9": Ret="*."+Ret; fi;
 if Ret="": ^Cur; fi;
 PutVariableS(FieldName+"["+Str(Iter)+"]",Ret);
 Return Cur;
end;
--Параметры конвертации счетов
--Параметры конвертации аналитики
Func A2_OnEnter(FieldName: String; Iter: Integer): logical;
 InsertFrame(УпрАн,Iter+1);
 Return False;
end;

Func D2_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=ВыбратьТаблАн("Список таблиц конвертаций признаков");
 if tmp="": ^False;  fi;
 СохрТекТаблАн(ТекТаблАн);
 ТекТаблАн=tmp;
 ЗагрТекТаблАн(ТекТаблАн);
 Return False;
end;

Func ДобТаблАн_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 СохрТекТаблАн(ТекТаблАн);
 While not Input(tmp,"Введите наименование таблицы")=cmCancel do
  if not Pos(" ",tmp)=0: Message("Наименование не должно содержать пробелов",mtError); 
    else 
     if SearchInArray(ТаблАн,tmp,True)=-1: 
        Break; 
       else
        Message("Повторный ввод наименования таблицы",mtError);
     fi;
  fi;
 od;
 if tmp="": ^False; fi;
 ТекТаблАн=tmp;
 ЗагрТекТаблАн(ТекТаблАн);
 Return False;
end;

Func УдалТаблАн_OnEnter(FieldName: String; Iter: Integer): logical;
 if not ТекТаблАн="" and not SearchInArray(КартКонвАн,ТекТаблАн)=-1: Message("Удаление таблицы невозможно, так как данная таблица используется при конвертации картотек",mtError); ^False; fi;
 if EnqOkCancel("Таблица будет удалена, продолжить ?",mtWarning)=cmCancel: ^False; fi;
 УдалитьТаблАн(ТекТаблАн);
 ТекТаблАн="";
 ОчиститьАн;
 Return False;
end;

Func КопТаблАн_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:s;
 if EnqOkCancel("Данные текущей таблицы будет удалены, продолжить ?",mtWarning)=cmCancel: ^False; fi;
 tmp=ВыбратьТаблАн("Выберите таблицу источник");
 if tmp="": ^False; fi;
 ЗагрТекТаблАн(tmp);
 if ТекТаблАн="": ТекТаблАн=tmp+" (копия)"; fi;
 Return False;
end;

Func ТекТаблАнРежим_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
 ClearVariable(Buf);
 Buf[1]="Закончить обработку";
 Buf[2]="Продолжить обработку";
 n=Alternate("Выбор режима обработки",buf,-1,1,12);
 if n=0: ^False; fi;
 ТекТаблАнРежим=n-1;
 Return False;
end;

Func ЗагрТаблАн_OnEnter(FieldName: String; Iter: Integer): logical;
var F:I;
var FName,tmp:S;
 if ТекТаблАн="": Message("Выберите таблицу",mtError); Template.Field="ТекТаблАн_"; ^False; fi;
 if EnqOkCancel("Текущая таблица будет очищена, продолжить ?",mtWarning)=cmCancel: ^False; fi;
 if FieldName="СтдТаблАн_": FName=PlanVar("STD_RPO")+"\КонвOldн_Newн\"; fi;
 if ChooseFile(FName,"Загрузить...","Текстовые файлы(*.txt)|*.txt")=cmCancel: ^False; fi;
 ОчиститьАн;
 F=TextFileOpenRead(FName);
 Try
  Iter=-3;
  While not TextFileEndOfFile(F) do
   tmp=TextFilereadLn(F);
      if Iter=-3: if tmp="Признаки": Iter=-2; else Message("Файл не содержит таблицу конвретации признаков",mtError); ^False; fi;
        |Iter=-2: ТекТаблАнКмнт=Trim(tmp); Iter=-1;
        |Iter=-1: ТекТаблАнРежим=Int(tmp); Iter=0;
        |not tmp="":
         Iter=Iter+1;
         InsertFrame(УпрАн,Iter);
         ТекАнOld[Iter]=Trim(ExtractWord(1,tmp,"|"));
         ТекАнNew[Iter]=Trim(ExtractWord(2,tmp,"|"));
         ТекАнУслСч[Iter]=Trim(ExtractWord(3,tmp,"|"));
         ТекАнУслАн[Iter]=Trim(ExtractWord(4,tmp,"|"));
      fi;
  od;
 Finally
  TextFileClose(F);
 end;
 Message("Таблица успешно прочитана");
 Return False;
end;

Func СохрТаблАн_OnEnter(FieldName: String; Iter: Integer): logical;
var F:I;
var FName:S;
 УдалитьПустыеАн;
 FName="Табл_Конв_Ан("+ТекТаблАн+").txt";
 if ChooseSaveFile(FName,"Сохранить...","Текстовые файлы(*.txt)|*.txt")=cmCancel: ^False; fi;
 if ExistFile(FName):
    if EnqOkCancel("Файл "+FName+" уже существует, перезаписать ?",mtWarning)=cmCancel: ^False; fi;
 fi;
 F=TextFileCreate(FName);
 Try
  TextFileWriteLn(F,"Признаки");
  TextFileWriteLn(F,if(ТекТаблАнКмнт=""," ",ТекТаблАнКмнт));
  TextFileWriteLn(F,Str(ТекТаблАнРежим));
  for Iter=1..УпрАн do
   TextFileWriteLn(F,if(ТекАнOld[Iter]=""," ",ТекАнOld[Iter])+"|"+if(ТекАнNew[Iter]=""," ",ТекАнNew[Iter])+"|"+if(ТекАнУслСч[Iter]=""," ",ТекАнУслСч[Iter])+"|"+if(ТекАнУслАн[Iter]=""," ",ТекАнУслАн[Iter]));
  od;
 Finally
  TextFileClose(F);
 end;
 Message("Таблица успешно сохранена");
 Return False;
end;

Func ОчистТаблАн_OnEnter(FieldName: String; Iter: Integer): logical;
 if EnqOkCancel("Текущая таблица будет очищена, продолжить ?",mtWarning)=cmCancel: ^False; fi;
 ОчиститьАн;
 Return False;
end;

Func ИстАн_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
var tmp:S;
 ClearVariable(Buf);
 Buf[1]="Текущий список признаков";
 Buf[2]="Импорт из файла";
 n=Alternate("Источник аналитических признаков",Buf,-1,1,12);
 if n=0: ^False; fi;
 n=n-1;
 if FieldName="ИстАнOld_": 
    ИстАнOld=n;
    if ИстАнOld=1:
       tmp=ИстАнФайлOld;
       if ChooseFile(tmp,"Открыть...","Признаки (*.sig)|*.sig")=cmCancel: ^False; fi;
       ИстАнФайлOld=tmp;
       ЧитатьФайлВМассив(tmp,False,FieldName);
       CopyArray(Buf,BufАнOld);
    fi;
   |FieldName="ИстАнNew_":
    ИстАнNew=n;
    if ИстАнNew=1:
       tmp=ИстАнФайлNew;
       if ChooseFile(tmp,"Открыть...","Признаки (*.sig)|*.sig")=cmCancel: ^False; fi;
       ИстАнФайлNew=tmp;
       ЧитатьФайлВМассив(tmp,False,FieldName);
       CopyArray(Buf,BufАнNew);
    fi;
 fi;
 Return False;
end;

Func ТекАн_OnEnter(FieldName: String; Iter: Integer): logical;
 if ТекТаблАн="": Message("Выберите таблицу",mtError); Template.Field="ТекТаблАн_"; ^False; fi;
 Return True;
end;

Func ТекАн_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var ИстАн,Iter,n:I;
var FieldName,Ret:S;
 Template.HideEditor(False);
 FieldName=AsString(Template.Field);
 Iter=AsInteger(Template.Frame);
 if FieldName="ТекАнOld":
    ИстАн=ИстАнOld;
    if ИстАн=0:
      |ИстАн=1: CopyArray(BufАнOld,Buf);
    fi;
   |FieldName="ТекАнNew":
    ИстАн=ИстАнNew;
    if ИстАн=0:
      |ИстАн=1: CopyArray(BufАнNew,Buf);
    fi;
 fi;
 Ret="";
 if ИстАн=0:
    Ret=AnaElection("*",False,True,"");
    if Ret="": ^Cur; fi;
    Ret=Ret;
   |ИстАн=1:
    n=AlternateTree("Список признаков",Buf,-1,1,0,".","Признак","Наименование",-1,True);
    if n=0: ^Cur; fi;
    Ret=Trim(SubStr(Buf[n],1,Pos("--",Buf[n])-1));
 fi;
 if Ret="": ^Cur; fi;
 if SubStr(Ret,Length(Ret),1)=".": Ret=Ret+"*"; fi;
 if FieldName="ТекАнOld": ТекАнOld[Iter]=Ret;
   |FieldName="ТекАнNew": ТекАнNew[Iter]=Ret;
 fi;
 Return Cur;
end;
--Параметры конвертации счетов
--Параметры конвертации картотек
Func A3_OnEnter(FieldName: String; Iter: Integer): logical;
 InsertFrame(УпрКарт,Iter+1);
 Return False;
end;

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

Func СписокКарт_OnEnter(FieldName: String; Iter: Integer): logical;
var j,jj,n,ww,w:i;
var tmp,СчДеб,СчКре,Призн:S;
 if EnqOkCancel("Текущий список картотек будет очищен, продолжить ?",mtWarning)=cmCancel: ^False; fi;
 Раб.ИмяПолеКарт.Инициализация;
 ОчиститьКарт;
 jj=JournalsCount;
 for j=0..jj do
  tmp=JournalName(j);
  if JournalType(tmp)="КАРТ": 
     tmp=JournalCardfile(tmp); 
     if SearchInArray(Карт,tmp)=-1:
        InsertFrame(УпрКарт,УпрКарт+1);
        Карт[УпрКарт]=tmp;
        n=GetCardFileNames(Карт[УпрКарт],Buf1,False,True,"");
        КартНаим[УпрКарт]=SubStr(Buf1[n],Pos(" --",Buf1[n])+4,255);
        СчДеб=Раб.ИмяПолеКарт.ИмяПоля(Карт[УпрКарт],"СчДеб");
        СчКре=Раб.ИмяПолеКарт.ИмяПоля(Карт[УпрКарт],"СчКре");
        Призн=Раб.ИмяПолеКарт.ИмяПоля(Карт[УпрКарт],"Признаки");
        ww=Max(WordsCount(СчДеб,"|"),WordsCount(Призн,"|"));
        for w=1..ww do
         if w>1:
            InsertFrame(УпрКарт,УпрКарт+1);
            Карт[УпрКарт]=Карт[УпрКарт-1];
            КартНаим[УпрКарт]=КартНаим[УпрКарт-1];
         fi;
         КартПолеСинт[УпрКарт]=ExtractWord(w,СчДеб,"|")+" "+ExtractWord(w,СчКре,"|");
         КартПолеАн[УпрКарт]=ExtractWord(w,Призн,"|");
       od;
     fi;
  fi;
 od;
 ^False;
end;

Func ОчистКарт_OnEnter(FieldName: String; Iter: Integer): logical;
 if EnqOkCancel("Текущий список картотек будет очищен, продолжить ?",mtWarning)=cmCancel: ^False; fi;
 ОчиститьКарт;
 ^False;
end;

Func ЗагрСписокКарт_OnEnter(FieldName: String; Iter: Integer): logical;
var F,n,w:I;
var FName,tmp,s:S;
 if EnqOkCancel("Текущий список картотек будет очищен, продолжить ?",mtWarning)=cmCancel: ^False; fi;
 if ChooseSaveFile(FName,"Загрузить...","Текстовые файлы(*.txt)|*.txt")=cmCancel: ^False; fi;
 ОчиститьКарт;
 F=TextFileOpenRead(FName);
 Try
  if not TextFileEndOfFile(F):
     if not TextFileReadLn(F)="Картотеки": Message("Файл не содержит список картотек",mtError); ^False; fi;
  fi;
  InsertFrame(УпрКарт,УпрКарт+1);
  While not TextFileEndOfFile(F) do
   n=n+1;
   Hint(FName+":"+Str(n));
   S=TextFileRead(F,1);
   tmp="";
   w=1;
   While not S="" do
    if s="|":
       tmp=Trim(tmp);
       if w=1: Карт[УпрКарт]=tmp;
         |w=2: КартНаим[УпрКарт]=tmp;
         |w=3: КартПолеСинт[УпрКарт]=tmp;
         |w=4: КартПолеАн[УпрКарт]=tmp;
         |w=5: КартПолеДобАн[УпрКарт]=tmp;
         |w=6: КартКонвСч[УпрКарт]=tmp;
         |w=7: КартКонвАн[УпрКарт]=tmp;
         |w=8: КартДопФ[УпрКарт]=tmp;
       fi;
       tmp="";
       w=w+1;
      else
       tmp=tmp+s;
    fi;
    S=TextFileRead(F,1);
   od;
   tmp=Trim(tmp);
   if w=1: Карт[УпрКарт]=tmp;
     |w=2: КартНаим[УпрКарт]=tmp;
     |w=3: КартПолеСинт[УпрКарт]=tmp;
     |w=4: КартПолеАн[УпрКарт]=tmp;
     |w=5: КартПолеДобАн[УпрКарт]=tmp;
     |w=6: КартКонвСч[УпрКарт]=tmp;
     |w=7: КартКонвАн[УпрКарт]=tmp;
     |w=8: КартДопФ[УпрКарт]=tmp;
   fi;
   if not TextFileEndOfFile(F): 
      S=TextFileReadLn(F); 
      InsertFrame(УпрКарт,УпрКарт+1);
   fi;
  od;
 Finally
  TextFileClose(F);
 end;
 Message("Список картотек успешно прочитан");
 Return False;
end;

Func СохрСписокКарт_OnEnter(FieldName: String; Iter: Integer): logical;
var F:I;
var FName:S;
 УдалитьПустыеКарт;
 FName="Список картотек.txt";
 if ChooseSaveFile(FName,"Сохранить...","Текстовые файлы(*.txt)|*.txt")=cmCancel: ^False; fi;
 if ExistFile(FName):
    if EnqOkCancel("Файл "+FName+" уже существует, перезаписать ?",mtWarning)=cmCancel: ^False; fi;
 fi;
 F=TextFileCreate(FName);
 Try
  TextFileWriteLn(F,"Картотеки");
  for Iter=1..УпрКарт do
   TextFileAppendLn(F,if(Карт[Iter]=""," ",Карт[Iter])+"|");
   TextFileAppendLn(F,if(КартНаим[Iter]=""," ",КартНаим[Iter])+"|");
   TextFileAppendLn(F,if(КартПолеСинт[Iter]=""," ",КартПолеСинт[Iter])+"|");
   TextFileAppendLn(F,if(КартПолеАн[Iter]=""," ",КартПолеАн[Iter])+"|");
   TextFileAppendLn(F,if(КартПолеДобАн[Iter]=""," ",КартПолеДобАн[Iter])+"|");
   TextFileAppendLn(F,if(КартКонвСч[Iter]=""," ",КартКонвСч[Iter])+"|");
   TextFileAppendLn(F,if(КартКонвАн[Iter]=""," ",КартКонвАн[Iter])+"|");
   TextFileWriteLn(F,КартДопФ[Iter]);
  od;
 Finally
  TextFileClose(F);
 end;
 Message("Список картотек успешно сохранен");
 Return False;
end;

Func КартТКС_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 УдалитьПустыеКарт;
 tmp=ВыбратьТаблСч("Список таблиц конвертаций счетов");
 if tmp="": ^False; fi;
 for Iter=1..УпрКарт do
  if not КартПолеСинт[Iter]="":
     КартКонвСч[Iter]=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(КартКонвСч[Iter]," ",tmp,tmp,"");
  fi;
 od;
 Return False;
end;

Proc КартТКС_OnExit(FieldName: String; Iter: Integer);
var w,ww:i;
 УдалитьПустыеКарт;
 ClearVariable(Buf);
 for Iter=1..УпрКарт do
  ww=WordsCount(КартКонвСч[Iter]," ");
  for w=1..ww do
   AddInArray(Buf,True,False,ExtractWord(w,КартКонвСч[Iter]," "));
  od;
 od;
 InsertInArray(Buf,1,"Удалить все");
 w=Alternate("Выбор элемента",buf,-1,1,12);
 if w=0: Exit; fi;
 for Iter=1..УпрКарт do
  if w=1: КартКонвСч[Iter]=""; else КартКонвСч[Iter]=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(КартКонвСч[Iter]," ",Buf[w],""); fi;
 od;
end;

Func КартТКА_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 УдалитьПустыеКарт;
 tmp=ВыбратьТаблАн("Список таблиц конвертаций признаков");
 if tmp="": ^False; fi;
 for Iter=1..УпрКарт do
  if not КартПолеАн[Iter]="":
     КартКонвАн[Iter]=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(КартКонвАн[Iter]," ",tmp,tmp,"");
  fi;
 od;
 Return False;
end;

Proc КартТКА_OnExit(FieldName: String; Iter: Integer);
var w,ww:i;
 УдалитьПустыеКарт;
 ClearVariable(Buf);
 for Iter=1..УпрКарт do
  ww=WordsCount(КартКонвАн[Iter]," ");
  for w=1..ww do
   AddInArray(Buf,True,False,ExtractWord(w,КартКонвАн[Iter]," "));
  od;
 od;
 InsertInArray(Buf,1,"Удалить все");
 w=Alternate("Выбор элемента",buf,-1,1,12);
 if w=0: Exit; fi;
 for Iter=1..УпрКарт do
  if w=1: КартКонвАн[Iter]=""; else КартКонвАн[Iter]=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(КартКонвАн[Iter]," ",Buf[w],""); fi;
 od;
end;

Func Карт_OnEnter(FieldName: String; Iter: Integer): logical;
var n,j,jj:i;
var tmp,Карт_,СчДеб,СчКре,Призн,ДобПризн:S;
 if FieldName="Карт": tmp=ВыбратьКарт; else tmp=ВыбратьКартЖ; fi;
 if tmp="": ^False; fi;
 Карт_=SubStr(tmp,1,Pos(" --",tmp)-1);
 СчДеб=Раб.ИмяПолеКарт.ИмяПоля(Карт_,"СчДеб");
 СчКре=Раб.ИмяПолеКарт.ИмяПоля(Карт_,"СчКре");
 Призн=Раб.ИмяПолеКарт.ИмяПоля(Карт_,"Признаки");
 ДобПризн=Раб.ИмяПолеКарт.ИмяПоля(Карт_,"Признак");
 if not Карт[Iter]=Карт_:
    КартПолеСинт[Iter]="";
    КартПолеАн[Iter]="";
    КартПолеДобАн[Iter]="";
    КартКонвСч[Iter]="";
    КартКонвАн[Iter]="";
    КартДопФ[Iter]="";
 fi;
 Карт[Iter]=Карт_;
 КартНаим[Iter]=SubStr(tmp,Pos(" --",tmp)+4,255);
 n=SearchInArray(Карт,Карт[Iter]);
 if n=-1 or (n=Iter and SearchInArray(Карт,Карт[Iter],False,Iter+1)=-1):
    jj=WordsCount(СчДеб,"|");
    for j=1..jj do
     if j>1:
        Iter=Iter+1;
        InsertFrame(УпрКарт,Iter);
        Карт[Iter]=Карт[Iter-1];
        КартНаим[Iter]=КартНаим[Iter-1];
     fi;
     КартПолеСинт[Iter]=ExtractWord(j,СчДеб,"|")+" "+ExtractWord(j,СчКре,"|");
     КартПолеАн[Iter]=ExtractWord(j,Призн,"|");
     КартПолеДобАн[Iter]=ExtractWord(j,ДобПризн,"|");
    od;
 fi;
 Return False;
end;

Proc Карт_OnExit(FieldName: String; Iter: Integer);
 КартНаим[Iter]="";
end;

Func КартПолеСинт_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 if Карт[Iter]="": Message("Выберите картотеку",mtError); Template.Field="Карт"; Template.Frame=Iter; ^False; fi;
 tmp=ВыбратьКартПоле(Карт[Iter]);
 if tmp="": ^False; fi;
 if Length(КартПолеСинт[Iter])+Length(tmp)+1>255: Message("Слишком длинная строка. Обратитесь к разработчику",mtError); ^False; fi;
 if Раб.Бюджет2005.ПроверитьНаборСлов(КартПолеСинт[Iter]," ",tmp,"",""): Message("Повторный ввод поля "+tmp,mtError); ^False; 
   |Раб.Бюджет2005.ПроверитьНаборСлов(КартПолеАн[Iter]," ",tmp,"",""): Message("Поле "+tmp+" было выбрано ранее как поле аналитического учета",mtError); Template.Field="КартПолеАн_"; Template.Frame=Iter; ^False;
 fi;
 КартПолеСинт[Iter]=Раб.Бюджет2005.Объединить(КартПолеСинт[Iter],tmp," ");
 Return False;
end;

Proc КартПолеСинт_OnExit(FieldName: String; Iter: Integer);
 КартПолеСинт[Iter]=Раб.Бюджет2005.УдалитьСловоИзНабора_Диалог(КартПолеСинт[Iter]," ");
end;

Func КартПолеАн_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 if Карт[Iter]="": Message("Выберите картотеку",mtError); Template.Field="Карт"; Template.Frame=Iter; ^False; fi;
 tmp=ВыбратьКартПоле(Карт[Iter]);
 if tmp="": ^False; fi;
 if Length(КартПолеАн[Iter])+Length(tmp)+1>255: Message("Слишком длинная строка. Обратитесь к разработчику",mtError); ^False; fi;
 if Раб.Бюджет2005.ПроверитьНаборСлов(КартПолеАн[Iter]," ",tmp,"",""): Message("Повторный ввод поля "+tmp,mtError); ^False; 
   |Раб.Бюджет2005.ПроверитьНаборСлов(КартПолеСинт[Iter]," ",tmp,"",""): Message("Поле "+tmp+" было выбрано ранее как поле синтетического учета",mtError); Template.Field="КартПолеСинт_"; Template.Frame=Iter; ^False;
 fi;
 КартПолеАн[Iter]=Раб.Бюджет2005.Объединить(КартПолеАн[Iter],tmp," ");
 Return False;
end;

Proc КартПолеАн_OnExit(FieldName: String; Iter: Integer);
var w,ww:i;
 КартПолеАн[Iter]=Раб.Бюджет2005.УдалитьСловоИзНабора_Диалог(КартПолеАн[Iter]," ");
 ww=WordsCount(КартПолеАн[Iter]," ");
 for w=1..ww do
  if ExtractWord(w,КартПолеАн[Iter]," ")=КартПолеДобАн[Iter]: Break; fi;
 od;
 if w>ww:
    КартПолеДобАн[Iter]="";
 fi;
end;

Func КартПолеДопАн_OnEnter(FieldName: String; Iter: Integer): logical;
var w,ww:i;
 if КартПолеАн[Iter]="": Message("Выберите 'Поля аналитического учета'",mtError); Template.Field="КартПолеАн_"; Template.Frame=Iter; ^False; fi;
 ClearVariable(Buf);
 ww=WordsCount(КартПолеАн[Iter]," ");
 for w=1..ww do
  Buf[w]=ExtractWord(w,КартПолеАн[Iter]," ");
 od;
 w=Alternate("Выберите поле аналитического признака",Buf,-1,1,12);
 if not w=0:
    КартПолеДобАн[Iter]=Buf[w];
 fi;
 Return False;
end;

Proc КартПолеДопАн_OnExit(FieldName: String; Iter: Integer);
 КартПолеДобАн[Iter]="";
end;

Func КартКонвСч_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 if Карт[Iter]="": Message("Выберите картотеку",mtError); Template.Field="Карт"; Template.Frame=Iter; ^False; fi;
 if КартПолеСинт[Iter]="": Message("Выберите поля синтетического учета",mtError); Template.Field="КартПолеСинт_"; Template.Frame=Iter; ^False; fi;
 tmp=ВыбратьТаблСч("Список таблиц конвертаций счетов");
 if tmp="": ^False; fi;
 if Length(КартКонвСч[Iter])+Length(tmp)+1>255: Message("Слишком длинная строка. Обратитесь к разработчику",mtError); ^False; fi;
 if Раб.Бюджет2005.ПроверитьНаборСлов(КартКонвСч[Iter]," ",tmp,"",""): Message("Повторный ввод таблицы "+tmp,mtError); ^False; fi;
 КартКонвСч[Iter]=Раб.Бюджет2005.Объединить(КартКонвСч[Iter],tmp," ");
 Return False;
end;

Proc КартКонвСч_OnExit(FieldName: String; Iter: Integer);
 КартКонвСч[Iter]=Раб.Бюджет2005.УдалитьСловоИзНабора_Диалог(КартКонвСч[Iter]," ");
end;

Func КартКонвАн_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 if Карт[Iter]="": Message("Выберите картотеку",mtError); Template.Field="Карт"; Template.Frame=Iter; ^False; fi;
 if КартПолеАн[Iter]="": Message("Выберите поля аналитического учета",mtError); Template.Field="КартПолеАн_"; Template.Frame=Iter; ^False; fi;
 tmp=ВыбратьТаблАн("Список таблиц конвертаций признаков");
 if tmp="": ^False; fi;
 if Length(КартКонвАн[Iter])+Length(tmp)+1>255: Message("Слишком длинная строка. Обратитесь к разработчику",mtError); ^False; fi;
 if Раб.Бюджет2005.ПроверитьНаборСлов(КартКонвАн[Iter]," ",tmp,"",""): Message("Повторный ввод таблицы "+tmp,mtError); ^False; fi;
 КартКонвАн[Iter]=Раб.Бюджет2005.Объединить(КартКонвАн[Iter],tmp," ");
 Return False;
end;

Proc КартКонвАн_OnExit(FieldName: String; Iter: Integer);
 КартКонвАн[Iter]=Раб.Бюджет2005.УдалитьСловоИзНабора_Диалог(КартКонвАн[Iter]," ");
end;

Func КартДопФ_OnEnter(FieldName: String; Iter: Integer): logical;
 if Карт[Iter]="": Message("Выберите картотеку",mtError); Template.Field="Карт"; Template.Frame=Iter; ^False; fi;
 Return True;
end;

Func КартДопФ_OnVerify(FieldName: String; Iter: Integer; Value: S):L;
var OWA:I;
 OWA=OpenWorkArea(Карт[Iter],"",Value);
 Try
 Finally
  CloseWorkArea(OWA);
 end;
 Return True;
end;

Func КартДопФ_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Iter:I;
var tmp:S;
 Iter=AsInteger(Template.Frame);
 if Карт[Iter]="": Message("Выберите картотеку",mtError); Template.HideEditor(False); Template.Field="Карт"; ^Cur; fi;
 tmp=ВыбратьКартПоле2(Карт[Iter]);
 if tmp="": Template.HideEditor(False); ^Cur; fi;
 Cur=Cur+tmp;
 Return Cur;
end;
--Параметры конвертации картотек
--Параметры конвертации журналов
Func A4_OnEnter(FieldName: String; Iter: Integer): logical;
 InsertFrame(УпрЖур,Iter+1);
 Return False;
end;

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

Func СписокЖур_OnEnter(FieldName: String; Iter: Integer): logical;
var j,jj:i;
var tmp,ТЖ:s;
 if EnqOkCancel("Текущий список журналов будет очищен, продолжить ?",mtWarning)=cmCancel: ^False; fi;
 ОчиститьЖур;
 jj=JournalsCount;
 for j=0..jj do
  tmp=JournalName(j);
  ТЖ=JournalType(tmp);
--  if ТЖ="РАЗД" or ТЖ="ТЕКСТ":
  if ТЖ="РАЗД":
     InsertFrame(УпрЖур,УпрЖур+1);
     Жур[УпрЖур]=tmp;
     ЖурТип[УпрЖур]=ТЖ;
  fi;
 od;
 ^False;
end;

Func ОчистЖур_OnEnter(FieldName: String; Iter: Integer): logical;
 if EnqOkCancel("Текущий список журналов будет очищен, продолжить ?",mtWarning)=cmCancel: ^False; fi;
 ОчиститьЖур;
 ^False;
end;

Func ЖурТКС_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 УдалитьПустыеЖур;
 tmp=ВыбратьТаблСч("Список таблиц конвертаций счетов");
 if tmp="": ^False; fi;
 for Iter=1..УпрЖур do
  ЖурКонвСч[Iter]=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(ЖурКонвСч[Iter]," ",tmp,tmp,"");
 od;
 Return False;
end;

Proc ЖурТКС_OnExit(FieldName: String; Iter: Integer);
var w,ww:i;
 УдалитьПустыеЖур;
 ClearVariable(Buf);
 for Iter=1..УпрЖур do
  ww=WordsCount(ЖурКонвСч[Iter]," ");
  for w=1..ww do
   AddInArray(Buf,True,False,ExtractWord(w,ЖурКонвСч[Iter]," "));
  od;
 od;
 InsertInArray(Buf,1,"Удалить все");
 w=Alternate("Выбор элемента",buf,-1,1,12);
 if w=0: Exit; fi;
 for Iter=1..УпрЖур do
  if w=1: ЖурКонвСч[Iter]=""; else ЖурКонвСч[Iter]=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(ЖурКонвСч[Iter]," ",Buf[w],""); fi;
 od;
end;

Func ЖурТКА_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 УдалитьПустыеЖур;
 tmp=ВыбратьТаблАн("Список таблиц конвертаций признаков");
 if tmp="": ^False; fi;
 for Iter=1..УпрЖур do
  ЖурКонвАн[Iter]=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(ЖурКонвАн[Iter]," ",tmp,tmp,"");
 od;
 Return False;
end;

Proc ЖурТКА_OnExit(FieldName: String; Iter: Integer);
var w,ww:i;
 УдалитьПустыеЖур;
 ClearVariable(Buf);
 for Iter=1..УпрЖур do
  ww=WordsCount(ЖурКонвАн[Iter]," ");
  for w=1..ww do
   AddInArray(Buf,True,False,ExtractWord(w,ЖурКонвАн[Iter]," "));
  od;
 od;
 InsertInArray(Buf,1,"Удалить все");
 w=Alternate("Выбор элемента",buf,-1,1,12);
 if w=0: Exit; fi;
 for Iter=1..УпрЖур do
  if w=1: ЖурКонвАн[Iter]=""; else ЖурКонвАн[Iter]=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(ЖурКонвАн[Iter]," ",Buf[w],""); fi;
 od;
end;

Func Жур_OnEnter(FieldName: String; Iter: Integer): logical;
var j,jj,n:i;
var tmp,ТЖ:S;
 ClearVariable(Buf);
 ClearVariable(Buf2);
 jj=JournalsCount;
 n=0;
 for j=0..jj do
  tmp=JournalName(j);
  ТЖ=JournalType(tmp);
--  if ТЖ="РАЗД" or ТЖ="ТЕКСТ":
  if ТЖ="РАЗД":
     n=n+1;
     Buf[n]=tmp;
     Buf2[n]=ТЖ;
  fi;
 od;
 if n=0: Message("В данном плане бухгалтерии не описан ни один журнал");  ^False; fi;
 n=Alternate("Список журналов",Buf,-1,1,12);
 if n=0: ^False; fi;
 Жур[Iter]=Buf[n];
 if not Жур[Iter]=Buf[n]:
    ЖурКонвСч[Iter]="";
    ЖурКонвАн[Iter]="";
    ЖурДопФ[Iter]="";
 fi;
 Жур[Iter]=Buf[n];
 ЖурТип[Iter]=Buf2[n];
 if ЖурТип[Iter]="ТЕКСТ": ЖурДопФ[Iter]=""; fi;
 Return False;
end;

Proc Жур_OnExit(FieldName: String; Iter: Integer);
end;

Func ЖурКонвСч_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 if Жур[Iter]="": Message("Выберите раздел",mtError); Template.Field="Жур"; Template.Frame=Iter; ^False; fi;
 tmp=ВыбратьТаблСч("Список таблиц конвертаций счетов");
 if tmp="": ^False; fi;
 if Length(ЖурКонвСч[Iter])+Length(tmp)+1>255: Message("Слишком длинная строка. Обратитесь к разработчику",mtError); ^False; fi;
 if Раб.Бюджет2005.ПроверитьНаборСлов(ЖурКонвСч[Iter]," ",tmp,"",""): Message("Повторный ввод таблицы "+tmp,mtError); ^False; fi;
 ЖурКонвСч[Iter]=Раб.Бюджет2005.Объединить(ЖурКонвСч[Iter],tmp," ");
 Return False;
end;

Proc ЖурКонвСч_OnExit(FieldName: String; Iter: Integer);
 ЖурКонвСч[Iter]=Раб.Бюджет2005.УдалитьСловоИзНабора_Диалог(ЖурКонвСч[Iter]," ");
end;

Func ЖурКонвАн_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 if Жур[Iter]="": Message("Выберите раздел",mtError); Template.Field="Жур"; Template.Frame=Iter; ^False; fi;
 tmp=ВыбратьТаблАн("Список таблиц конвертаций признаков");
 if tmp="": ^False; fi;
 if Length(ЖурКонвАн[Iter])+Length(tmp)+1>255: Message("Слишком длинная строка. Обратитесь к разработчику",mtError); ^False; fi;
 if Раб.Бюджет2005.ПроверитьНаборСлов(ЖурКонвАн[Iter]," ",tmp,"",""): Message("Повторный ввод таблицы "+tmp,mtError); ^False; fi;
 ЖурКонвАн[Iter]=Раб.Бюджет2005.Объединить(ЖурКонвАн[Iter],tmp," ");
 Return False;
end;

Proc ЖурКонвАн_OnExit(FieldName: String; Iter: Integer);
 ЖурКонвАн[Iter]=Раб.Бюджет2005.УдалитьСловоИзНабора_Диалог(ЖурКонвАн[Iter]," ");
end;

Func ЖурДопФ_OnEnter(FieldName: String; Iter: Integer): logical;
 if Жур[Iter]="": Message("Выберите раздел",mtError); Template.Field="Жур"; Template.Frame=Iter; ^False; fi;
 Return True;
end;

Func ЖурДопФ_OnVerify(FieldName: String; Iter: Integer; Value: S):L;
var OWA:i;
var F:S;
 F=Раб.Бюджет2005.Объединить("Раздел="+RecordToString(ВзятьКлючРаздела(Жур[Iter])),Value," and ");
 OWA=OpenWorkArea("Table_Oper","",F);
 Try
 Finally
  CloseWorkArea(OWA);
 end;
 Return True;
end;

Func ЖурДопФ_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Iter:I;
var tmp:S;
 Iter=AsInteger(Template.Frame);
 if Жур[Iter]="": Message("Выберите раздел",mtError); Template.HideEditor(False); Template.Field="Жур"; ^Cur; fi;
 if not ЖурТип[Iter]="РАЗД": Message("Установка дополнительного фильтра возможна только для табличного журнала",mtError); Template.HideEditor(False); ^Cur; fi;
 tmp=ВыбратьКартПоле2("Table_Oper");
 if tmp="": Template.HideEditor(False); ^Cur; fi;
 Cur=Cur+tmp;
 Return Cur;
end;
--Обработчики событий полей шаблона-----
--
--
--Обработчики событий объектов шаблона-----
Proc btnВыпол_OnClick(Sender: String);
var Iter,b,e,t:i;
 СохрТекТаблСч(ТекТаблСч);
 СохрТекТаблАн(ТекТаблАн);
 ТекНастр=5;
 Оформление;
 ClearVariable(ВыполКартУпр);
 ClearVariable(ВыполКарт);
 ClearVariable(ВыполКартНаим);
 ClearVariable(ВыполКартСтатус);
 ClearVariable(ВыполКартВремя);
 ClearVariable(СумВыполКартВремя);
 ClearVariable(ВыполЖурУпр);
 ClearVariable(ВыполЖур);
 ClearVariable(ВыполЖурСтатус);
 ClearVariable(ВыполЖурВремя);
 ClearVariable(СумВыполЖурВремя);
 --
 OpenBlank("РАБ.ВСПОМ.ИНИЦИАЛИЗАЦИЯ",False);
 -- Заполнение списка прогресса именами картотек
 УдалитьПустыеКарт;
 for Iter=1..УпрКарт do
  if not Карт[Iter]="":
     if SearchInArray(ВыполКарт,Карт[Iter])=-1:
        InsertFrame(ВыполКартУпр,ВыполКартУпр+1);
        ВыполКарт[ВыполКартУпр]=Карт[Iter];
        ВыполКартНаим[ВыполКартУпр]=КартНаим[Iter];
     fi;
  fi;
 od;
 -- Заполнение списка прогресса именами журналов --
 УдалитьПустыеЖур;
 for Iter=1..УпрЖур do
  if not Жур[Iter]="":
     if SearchInArray(ВыполЖур,Жур[Iter])=-1:
        InsertFrame(ВыполЖурУпр,ВыполЖурУпр+1);
        ВыполЖур[ВыполЖурУпр]=Жур[Iter];
     fi;
  fi;
 od;
 --
 Начать; --Заполнить KeyСч счетами с соотв. КОСГУ + РАБ.КСА.НА
 ИндексироватьТабл;
 Try
  ShowProgress(ВыполКартУпр,"Конвертация картотек....");
  Try
   t=0;
   for Iter=1..ВыполКартУпр do
    ProgressPos(Iter);
    b=time;
    КонвКарт(ВыполКарт[Iter],1);
    ВыполКартСтатус[Iter]=1;
    e=time;
    ВыполКартВремя[Iter]=ПолучитьВремя(e-b);
    t=t+(e-b);
   od;
  Finally
   if Iter<=ВыполКартУпр: ВыполКартСтатус[Iter]=-1; fi;
   СумВыполКартВремя="("+ПолучитьВремя(t)+")";
   CloseProgress;
  end;
  --
  ShowProgress(ВыполЖурУпр,"Конвертация разделов табличного журнала....");
  Try
   t=0;
   for Iter=1..ВыполЖурУпр do
    ProgressPos(Iter);
    b=time;
    КонвЖур(ВыполЖур[Iter],1);
    ВыполЖурСтатус[Iter]=1;
    e=time;
    ВыполЖурВремя[Iter]=ПолучитьВремя(e-b);
    t=t+(e-b);
   od;
  Finally
   if Iter<=ВыполЖурУпр: ВыполЖурСтатус[Iter]=-1; fi;
   СумВыполЖурВремя="("+ПолучитьВремя(t)+")";
   CloseProgress;
  end;
 Finally
  Закончить;
 end;
 Message("Операция конвертации завершена");
end;

Proc btnСохр_OnClick(Sender: String);
var fn_:S;
 Fn_="Параметры конвертации КБК.dbt";
 if ChooseSaveFile(Fn_,"Выбор файла настроек","Файлы настроек(*.dbt)|*.dbt")=cmCancel: Message("Операция сохранения настроек отменена"); Exit; fi;
 if ExistFile(Fn_): if EnqOkCancel("Файл '"+Fn_+"' существует. Перезаписать ?",mtWarning)=cmCancel: Message("Операция сохранения настроек отменена"); Exit; fi; fi;
 if WriteVarInDBT(Fn_,True): Message("Параметры успешно сохранены",mtInformation); else Message("Ошибка сохранения параметров отчетов",mtError); fi;
end;

Proc btnЗагруз_OnClick(Sender: String);
 if EnqOkCancel("Текущая настройка будет утеряна, продолжить операцию чтения настроек ?",mtWarning)=cmCancel: Message("Операция чтения настроек отменена"); Exit; fi;
 if fn="": fn=PlanVar("STD_RPO")+"\КонвКБК13_14\"; fi;
 if ChooseFile(Fn,"Выбор файла настроек","Файлы настроек(*.dbt)|*.dbt")=cmCancel: Message("Операция чтения настроек отменена"); Exit; fi;
 if ReadVarFromDbt(Fn): Message("Найстроки успешно прочитаны"); else Message("Ошибка чтения настроек",mtError); fi;
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc AfterOpen(Destroy: Logical);
 Оформление;
 Раб.ИмяПолеКарт.Инициализация;
 Message("Внимание!^MИспользование функций данного бланка МОЖЕТ привести к потере данных^MПеред использованием данного бланка НЕОБХОДИМО создать резервную копию базы данных и табличных журналов",mtWarning);
end;
--Обработчики событий шаблона -----
--


Конец
