БЛАНКСШАБЛОНОМ [03.11.2005] "Погашение аванса", РЕДАКТОР РПО_ПОДОТЧ_ПОГАШЕН_АВАНС;
-- Редакция ЗАО "Агентство 'Русспромоценка'"
2-- Переменные
-- Секции
СекцОбщая:Object; СекцТаблЗ:Object; СекцТаблДМ:Object; СекцТаблДУ:Object; СекцТаблИ:Object; СекцHelpMsg:Object;
-- Объекты
cbEditState        :Object; 
cbФиксШапка        :Object;
cbFlagПО           :Object;   cbПроводить        :Object;
cbFlagПЛИМ         :Object;   cbВыборСЧ          :Object;
cbFlagФКР          :Object;   cbКомандировки     :Object;
cbFlagКОСГУ        :Object;   cbКакОстатки       :Object;
cbFlagСТАТЬЯ       :Object;   cbClosedModFob     :Object;
cbFlagПЕРИОД       :Object;
cbFlagТолькоКоманд :Object;
cbВыборПсМОЛ       :Object;
cbВставитьДолги    :Object;
cbНеПроверятьПерерасход :Object;
-- Данные по умолчанию обязательные
var УМ_USE_ПЕРИОД  :Logical;
var УМ_ЗАРПЛ       :String="304.03.730";
var УМ_СЧ208       :String;   var УМ_КАССА       :String;   var УМ_СЧ_ПОГ_АВ   :String;
var УМ_ссчСУТ      :String;   var УМ_КАССА_ДЕБ   :String;   var УМ_ФИН_РЕЗ     :String;
var УМ_ссчТРН      :String;   var УМ_КАССА_КРЕ   :String;
var УМ_ссчКВР      :String;   var УМ_КИВФ        :String;   var УМ_КОСГУ_СУТ   :String;
var УМ_сч208Д      :String;   var УМ_СПРАВрасх   :String;   var УМ_КОСГУ_ТРН   :String;
var УМ_сч208К      :String;                                 var УМ_КОСГУ_КВР   :String;
var УМ_счП_ВЕД     :String;
-- Данные по умолчанию прочие
var УМ_ИФД         :String;   var УМ_СТ_РАСХ     :String;   var УМ_ПРИЗН       :String;
var УМ_ФКР         :String;   var УМ_ТЕК_ПЕРИОД  :Integer;  var УМ_ВЫБОР_СЧ    :Logical;
--
var ВыборПсМОЛ     :Logical=[True];
var ВставитьДолги  :Logical=[True];
var НеПроверятьПерерасход :Logical=[False];
--
var addЗАРПЛ       :Logical=ДОКУМЕНТЫ.ПОДОТЧЕТ.НАСТР.addANAЗАРПЛ;
var First          :Logical;
var EditState      :Logical;
var ФиксШапка      :Logical;
FlagПО             :Logical=[True];
FlagПЛИМ           :Logical=[True];
FlagФКР            :Logical=[True];
FlagКОСГУ          :Logical=[True];
FlagСТАТЬЯ         :Logical=[True];
FlagПЕРИОД         :Logical=[True];
FlagТолькоКоманд   :Logical=[True];
var ВыборСЧ        :Logical=[УМ_ВЫБОР_СЧ];
var Команд_        :Logical=КОМАНД;
var NewREC         :Logical=(CurrentState=crdusInserted);
var SelfCRD        :String="РПО_ПОДОТЧ_ПОГАШЕН_АВАНС";
var кнОК           :String="ОК";
var кнНастр        :String="Настройка";
var кнЗкр          :String="Закрыть";
var HelpMsg        :String=if(ДатОпер=1.1.100, "Для погашения аванса МОЛа необходимо выбрать дату операции!", "");
var ВСЕ            :String="ВСЕ столбцы";
var ВидТ_МОЛ       :Integer=[0];
var ВидТ_ПО        :Integer=[0];
var ВидТ_ПОЛ       :Integer=[0];
var ВидТ_ФКР       :Integer=[1];
var ВидТ_КОСГУ     :Integer=[1];
var ВидТ_СЧЕТ      :Integer=[1];
var ВидТ_ГАШ       :Integer=[1];
var ВидТ_СТ        :Integer=[0];
var ВидТ_СЧКР      :Integer=[1];
var F:String="++"; var A:String="+"; var D:String="-"; var K:String="=";
var N[]            :String=Str($);
var Buf[]          :String;
var ИФД_[]         :String=if(Позиции[$].ИФД="1":"Бюджет"|Позиции[$].ИФД="2":"Доходы","");
var BufL[]         :Logical;
var Элемент[]      :Integer;
var BufAna[]       :String;
var BufAcc[]       :String;
var BufVocA[]      :String;
var BufVocO[]      :String;
var BufVocN[]      :String;

Func FormatAccКРЕ(ФКР:String; ИФД:String; Acc:String; Type:Integer; Zero:String; Raz:String) :String;
-- Acc - счет + субсчет СЧ5;
-- Type - тип форматирования - 0:код + наименование; 1:только код; 2:только наименование; 3: наименование + код
-- Zero - строка для вывода если пусто
-- mode - "СЧ5" - счет вида ???.??; "СЧ8" - счет вида ???.??.???
var tmp, счт, КИВФ :String;
 if Acc="": ^""; fi;
 if ФКР="" or ИФД="": ^Acc; fi;
 if УМ_КИВФ<>"": КИВФ=УМ_КИВФ; else КИВФ="01.05.02.01.01.0000"; fi;
 if Match(Acc, "201.??.???"): 
    счт=SubStr(ФКР, 1, 3)+"."+КИВФ+"."+ИФД+"."+SubStr(Acc, 1, 7);
    if not Match(счт, "???.??.??.??.??.??.????.?.???.??."): ^""; fi;
 else
    счт=ФКР+"."+ИФД+"."+SubStr(Acc, 1, 7);
    if not Match(счт, "???.????.???????.???.?.???.??."): ^""; fi;
 fi;
 tmp=Name_S(счт);
 if Type=0: ^("["+Acc+"] "+Raz+" "+if(tmp<>"" and tmp<>" ", tmp, Zero));
 |  Type=1: ^Acc;
 |  Type=2: ^(if(tmp<>"" and tmp<>" ", tmp, Zero));
 |  Type=3: ^(if(tmp<>"" and tmp<>" ", tmp, Zero)+" "+Raz+" ["+Acc+"]");
 else ^"";
 fi;
end;

var МОЛ_ИМЯ[]      :String=РАБ.УПП.LIB.FormatAna("МОЛ."  +Позиции[$].МОЛ_КОД , ВидТ_МОЛ  , "наименования нет", "-");
var ПО_ИМЯ[]       :String=РАБ.УПП.LIB.FormatAna("П."    +Позиции[$].ПО_КОД  , ВидТ_ПО   , "наименования нет", "-");
var ПО_Л_ИМЯ[]     :String=РАБ.УПП.LIB.FormatAna("П_ЛИМ."+Позиции[$].ПО_Л_КОД, ВидТ_ПОЛ  , "наименования нет", "-");
var ФКР_ИМЯ[]      :String=РАБ.УПП.LIB.FormatAna("ФКР."  +Позиции[$].ФКР     , ВидТ_ФКР  , "наименования нет", "-");
var КОСГУ_ИМЯ[]    :String=if(КОМАНД, "", РАБ.УПП.LIB.FormatAna("КОСГУ."+Позиции[$].КОСГУ   , ВидТ_КОСГУ, "наименования нет", "-"));
var СЧЕТ_ИМЯ[]     :String=if(КОМАНД, "", РАБ.УПП.LIB.FormatAcc(Позиции[$].ФКР, Позиции[$].ИФД, Позиции[$].СЧЕТ , ВидТ_СЧЕТ, "наименования нет", "-", "СЧ5"));
var ГАШ_ИМЯ[]      :String=if(КОМАНД, "", РАБ.УПП.LIB.FormatAcc(Позиции[$].ФКР, Позиции[$].ИФД, Позиции[$].СЧЕТП, ВидТ_ГАШ , "наименования нет", "-", "СЧ8"));
var СТ_ИМЯ[]       :String=РАБ.УПП.LIB.FormatAna(УМ_СПРАВрасх+"."+Позиции[$].СТАТЬЯ, ВидТ_СТ, "наименования нет", "-");
var СЧТКАС_ИМЯ[]   :String=FormatAccКРЕ(Позиции[$].ФКР, Позиции[$].ИФД, Позиции[$].СЧТКАС, ВидТ_СЧКР, "наименования нет", "-");
var ГГ[]           :String=if(Позиции[$].ПЕРИОД<>"" and ValidSign(Позиции[$].ПЕРИОД), SubStr(Позиции[$].ПЕРИОД,  8, 4), "");
var КВ[]           :String=if(Позиции[$].ПЕРИОД<>"" and ValidSign(Позиции[$].ПЕРИОД), SubStr(Позиции[$].ПЕРИОД, 13, 1), "");
--
var Title          :String=if(КОМАНД, "ПОГАШЕНИЕ АВАНСА - КОМАНДИРОВКИ материально ответственного лица", "ПОГАШЕНИЕ АВАНСА - ПРОЧИЙ РАСХОД материально ответственного лица");
var Пользов        :String;
-- Прочие расходы
var ИТпог          :Numeric=SumOfArray(Позиции[].СУММА_П);
var ИТост          :Numeric=SumOfArray(Позиции[].ОСТ_АВ);
var ИТрасх         :Numeric=SumOfArray(Позиции[].ПЕРЕРАСХ);
-- Погашенные командировки
var ИТсут_пог      :Numeric=SumOfArray(Позиции[].СУТОЧН);
var ИТтр_пог       :Numeric=SumOfArray(Позиции[].ПРОЕЗД);
var ИТкв_пог       :Numeric=SumOfArray(Позиции[].ПРОЖИВ);
var ИТсут_вед      :Numeric=SumOfArray(Позиции[].ВЕД_СУТ);
var ИТтр_вед       :Numeric=SumOfArray(Позиции[].ВЕД_ТР);
var ИТкв_вед       :Numeric=SumOfArray(Позиции[].ВЕД_КВ);
var ИТОГО_ПОГ[]    :Numeric=Позиции[$].СУТОЧН+Позиции[$].ПРОЕЗД+Позиции[$].ПРОЖИВ;
var ВСЕГО_ПОГ      :Numeric=SumOfArray(ИТОГО_ПОГ, Позиции);
var ИТОГО_ВЕД[]    :Numeric=Позиции[$].ВЕД_СУТ+Позиции[$].ВЕД_ТР+Позиции[$].ВЕД_КВ;
var ВСЕГО_ВЕД      :Numeric=SumOfArray(ИТОГО_ВЕД, Позиции);
var ИТОГО[]        :Numeric=ИТОГО_ПОГ[$]+ИТОГО_ВЕД[$];
var ВСЕГО          :Numeric=SumOfArray(Итого, Позиции);
-- Возврат командировок
var ИТсут_ост      :Numeric=SumOfArray(Позиции[].ОСТ_СУТ);
var ИТтр_ост       :Numeric=SumOfArray(Позиции[].ОСТ_ТР);
var ИТкв_ост       :Numeric=SumOfArray(Позиции[].ОСТ_КВ);
var ИТОГО_ОСТ[]    :Numeric=Позиции[$].ОСТ_СУТ+Позиции[$].ОСТ_ТР+Позиции[$].ОСТ_КВ;
var ВСЕГО_ОСТ      :Numeric=SumOfArray(ИТОГО_ОСТ, Позиции);
-- Перерасход командировок
var ИТсут_расх     :Numeric=SumOfArray(Позиции[].РАСХ_СУТ);
var ИТтр_расх      :Numeric=SumOfArray(Позиции[].РАСХ_ТР);
var ИТкв_расх      :Numeric=SumOfArray(Позиции[].РАСХ_КВ);
var ИТОГО_РАСХ[]   :Numeric=Позиции[$].РАСХ_СУТ+Позиции[$].РАСХ_ТР+Позиции[$].РАСХ_КВ;
var ВСЕГО_РАСХ     :Numeric=SumOfArray(ИТОГО_РАСХ, Позиции);

Func Объединить(Value1:String; Value2:String; Sep:String) :String;
var Ret :String;
 if Value1<>"" and Value2<>"": Ret=Value1+Sep+Value2;
 |  Value1= "" and Value2<>"": Ret=Value2;
 |  Value1<>"" and Value2="" : Ret=Value1;
 |  True: Ret="";
 fi;
 ^Ret;
end;

Func СформироватьАналитику(Iter:Integer; УчитМОЛ:Logical; УчитПО:Logical; УчитПЛИМ:Logical; УчитФКР:Logical; УчитКОСГУ:Logical; УчитСТАТЬЯ:Logical; УчитПериод:Logical) :String;
var ANA :String;
 ANA="";
 if УчитМОЛ   : ANA=Объединить(ANA,           "МОЛ."+Позиции[Iter].МОЛ_КОД , "&"); fi;
 if УчитПО    : ANA=Объединить(ANA,             "П."+Позиции[Iter].ПО_КОД  , "&"); fi;
 if УчитПЛИМ  : ANA=Объединить(ANA,         "П_ЛИМ."+Позиции[Iter].ПО_Л_КОД, "&"); fi;
 if УчитФКР   : ANA=Объединить(ANA,           "ФКР."+Позиции[Iter].ФКР     , "&"); fi;
 if УчитКОСГУ : ANA=Объединить(ANA,         "КОСГУ."+Позиции[Iter].КОСГУ   , "&"); fi;
 if УчитСТАТЬЯ: ANA=Объединить(ANA, УМ_СПРАВрасх+"."+Позиции[Iter].СТАТЬЯ  , "&"); fi;
 if УчитПЕРИОД: ANA=Объединить(ANA,                  Позиции[Iter].ПЕРИОД  , "&"); fi;
 ^ANA;
end;

Func ОстатокМОЛа(Iter:Integer; УчитПО:Logical; УчитПЛИМ:Logical; УчитФКР:Logical; УчитКОСГУ:Logical; УчитСТАТЬЯ:Logical; УчитПериод:Logical; УчитКОМАНД:Logical; СЧ5:String) :Numeric;
var OST, t, k :Numeric;
var ACC, ANAo, ANAt :String;
 OST=0;
 ACC="???.????.???????.???.?."+СЧ5+".???";
 Раб.Бюджет2005.РежимМаски="?";
 if not Match(ACC, Раб.Бюджет2005.МаскаСчетаФКР): ^0; fi;
 ANAo=СформироватьАналитику(Iter, True, УчитПО, УчитПЛИМ, УчитФКР, УчитКОСГУ, УчитСТАТЬЯ, УчитПериод);
 if ANAo="": ^0; fi;
 if КОМАНД:
   if УчитКОМАНД: ANAo=Объединить(ANAo, "КОМАНД", "&"); fi;
 else
   if УчитКОМАНД: ANAo=Объединить(ANAo, "~КОМАНД", "&"); fi;
 fi;
 ANAt="{"+Объединить(ANAo, "ТИТУЛ", "&")+"}";
 ANAo="{"+ANAo+"}";
 t=Saldo(ACC+ANAt, ДатОпер+1);
 k=Saldo(ACC+ANAo, ДатОпер+1);
 if Позиции[Iter].ТИТ_СТ: OST=t; else OST=(k-t); fi;
 ^OST;
end;

-- Непогашенный авансы
--var СУМ_НЕП_АВ[]   :Numeric=if(КОМАНД, 0, ОстатокМОЛа($, True, True, True, if(КОМАНД, False, True), True, if(УМ_USE_ПЕРИОД, True, False), True, Позиции[$].СЧЕТ)); -- непогашенный аванс
var СУМ_НЕП_АВ[]   :Numeric=ОстатокМОЛа($, True, True, True, if(КОМАНД, False, True), True, if(УМ_USE_ПЕРИОД, True, False), if(FlagТолькоКоманд, True, False), Позиции[$].СЧЕТ); -- непогашенный аванс
var СУМ_НЕП_СУТ[]  :Numeric=if(КОМАНД, ОстатокМОЛа($, True, True, True, if(КОМАНД, False, True), True, if(УМ_USE_ПЕРИОД, True, False), True, УМ_СЧ208+"."+УМ_ссчСУТ), 0); -- непогашенные суточные
var СУМ_НЕП_ТР[]   :Numeric=if(КОМАНД, ОстатокМОЛа($, True, True, True, if(КОМАНД, False, True), True, if(УМ_USE_ПЕРИОД, True, False), True, УМ_СЧ208+"."+УМ_ссчТРН), 0); -- непогашенные транспортные
var СУМ_НЕП_КВ[]   :Numeric=if(КОМАНД, ОстатокМОЛа($, True, True, True, if(КОМАНД, False, True), True, if(УМ_USE_ПЕРИОД, True, False), True, УМ_СЧ208+"."+УМ_ссчКВР), 0); -- непогашенные квартирные
var ИТОГО_НЕП[]    :Numeric=СУМ_НЕП_СУТ[$]+СУМ_НЕП_ТР[$]+СУМ_НЕП_КВ[$];
--
var ОСТ_МОЛ[]      :Numeric=if(КОМАНД, 0, ОстатокМОЛа($, FlagПО, FlagПЛИМ, FlagФКР, FlagКОСГУ, FlagСТАТЬЯ, FlagПЕРИОД, FlagТолькоКоманд, Позиции[$].СЧЕТ));
var ОСТ_МОЛ_СУТ[]  :Numeric=if(КОМАНД, ОстатокМОЛа($, FlagПО, FlagПЛИМ, FlagФКР, FlagКОСГУ, FlagСТАТЬЯ, FlagПЕРИОД, FlagТолькоКоманд, УМ_СЧ208+"."+УМ_ссчСУТ), 0);
var ОСТ_МОЛ_ТРН[]  :Numeric=if(КОМАНД, ОстатокМОЛа($, FlagПО, FlagПЛИМ, FlagФКР, FlagКОСГУ, FlagСТАТЬЯ, FlagПЕРИОД, FlagТолькоКоманд, УМ_СЧ208+"."+УМ_ссчТРН), 0);
var ОСТ_МОЛ_КВР[]  :Numeric=if(КОМАНД, ОстатокМОЛа($, FlagПО, FlagПЛИМ, FlagФКР, FlagКОСГУ, FlagСТАТЬЯ, FlagПЕРИОД, FlagТолькоКоманд, УМ_СЧ208+"."+УМ_ссчКВР), 0);
--
var КОМАНД_В[]     :Numeric=Deb(ИТОГО_ОСТ[$]-ИТОГО_РАСХ[$]);
var КОМАНД_П[]     :Numeric=Cre(ИТОГО_ОСТ[$]-ИТОГО_РАСХ[$]);
var ВСЕГО_К_В      :Numeric=SumOfArray(КОМАНД_В, Позиции);
var ВСЕГО_К_П      :Numeric=SumOfArray(КОМАНД_П, Позиции);
--
var ПРИЗН_[]       :String=Позиции[$].ПРИЗН;
var ИменаСекций[]  :String;
var BufField[]     :String;
var BufColorBg[]   :Integer;
var BufColorFo[]   :Integer;
-- Для формирования отчета
var BufПФ[]        :String;
var BufПЛ[]        :String;
var BufФКР[]       :String;
var BufКОСГУ[]     :String;
var BufСТ[]        :String;
var BufДАТА[]      :String;

2-- Общие процедуры и функции
-- є¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤џ
-- “ ПИФ ИНИЦИАЛИЗАЦИИ “
--  ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤№
Proc СчитатьЗначенияПоУмолчанию;
var REC :Record;
var RO :Integer;
 REC=ДОКУМЕНТЫ.ПОДОТЧЕТ.НАСТР.КлючЗаписиАктивныхНастроек;
 if REC<>NIL:
   RO=OpenWorkArea("РПО_ПОДОТЧ_НАСТР", "", "Ukey="+RecordToString(REC));
   Try
     if Records(RO)=1:
       -- Обязательные
       УМ_СЧ208      = GetFieldS(RO, 1, "СЧ_ПО"      );
       УМ_ссчСУТ     = GetFieldS(RO, 1, "СЧ_СУТ"     );
       УМ_ссчТРН     = GetFieldS(RO, 1, "СЧ_ТРН"     );
       УМ_ссчКВР     = GetFieldS(RO, 1, "СЧ_КВР"     );
       УМ_сч208Д     = GetFieldS(RO, 1, "СЧ_ПО_Д"    );
       УМ_сч208К     = GetFieldS(RO, 1, "СЧ_ПО_К"    );
       УМ_КАССА      = GetFieldS(RO, 1, "СЧ_КАССА"   );
       УМ_КАССА_ДЕБ  = УМ_КАССА+"."+GetFieldS(RO, 1, "СЧ_КАССА_Д");
       УМ_КАССА_КРЕ  = УМ_КАССА+"."+GetFieldS(RO, 1, "СЧ_КАССА_К");
       УМ_КИВФ       = GetFieldS(RO, 1, "КИВФ"       );
       УМ_СЧ_ПОГ_АВ  = GetFieldS(RO, 1, "СЧ_ПОГ_АВ"  );
       УМ_ФИН_РЕЗ    = GetFieldS(RO, 1, "СЧ_ФИНРЕЗ"  );
       УМ_СПРАВрасх  = GetFieldS(RO, 1, "СПРАВ"      );
       УМ_КОСГУ_СУТ  = GetFieldS(RO, 1, "СУТ"        );
       УМ_КОСГУ_ТРН  = GetFieldS(RO, 1, "ТРН"        );
       УМ_КОСГУ_КВР  = GetFieldS(RO, 1, "КВР"        );
       УМ_USE_ПЕРИОД = GetFieldL(RO, 1, "USE_ПЕРИОД" );
       УМ_счП_ВЕД    = "302.01.830";
       -- Прочие
       УМ_ИФД        = GetFieldS(RO, 1, "ИФД"        ); --Источник финансирования деятельности по умолчанию
       УМ_ФКР        = GetFieldS(RO, 1, "ФКР"        ); --Функциональная классификация расходов по умолчанию
       УМ_СТ_РАСХ    = GetFieldS(RO, 1, "СТ_РАСХ"    ); --Статья расходов по умолчанию
       УМ_ТЕК_ПЕРИОД = GetFieldI(RO, 1, "ТЕК_ПЕРИОД" ); --Текущий период по умолчанию
       УМ_ПРИЗН      = GetFieldS(RO, 1, "ДОП_АНА"    );
       УМ_ВЫБОР_СЧ   = GetFieldL(RO, 1, "ВЫБОР_СЧ"   ); --Если "Да" то счет выбирается, иначе формируется из аналитики по структуре учета
     fi                                                         ;
   Finally
     CloseWorkArea(RO);
   end;
 fi;
end;

Func ПроверкаЗначенийПоУмолчанию :Logical;
 if УМ_СЧ208     = "" or
   УМ_ссчСУТ    = "" or
   УМ_ссчТРН    = "" or
   УМ_ссчКВР    = "" or
   УМ_сч208Д    = "" or
   УМ_сч208К    = "" or
   УМ_счП_ВЕД   = "" or
   УМ_КАССА     = "" or
   УМ_КАССА_ДЕБ = "" or
   УМ_КАССА_КРЕ = "" or
   УМ_КИВФ      = "" or
   УМ_СЧ_ПОГ_АВ = "" or
   УМ_ФИН_РЕЗ   = "" or
   УМ_СПРАВрасх = "" or
   УМ_КОСГУ_СУТ = "" or
   УМ_КОСГУ_ТРН = "" or
   УМ_КОСГУ_КВР = ""  :
     Message("Ошибка считывания ключевых настроек!^MПроверьте картотеку настроек подсистемы.", mtError);
     ^False;
 fi;
 ^True;
end;

Proc ПрисвоитьУмолчания(Iter:Integer);
var tmp :String;
 Позиции[Iter].ИФД=УМ_ИФД;
 if УМ_ФКР<>""    : Позиции[Iter].ФКР=УМ_ФКР;        fi;
 if УМ_СТ_РАСХ<>"": Позиции[Iter].СТАТЬЯ=УМ_СТ_РАСХ; fi;
 if УМ_ПРИЗН  <>"": Позиции[Iter].ПРИЗН =УМ_ПРИЗН;   fi;
 if УМ_USE_ПЕРИОД:
   if УМ_ТЕК_ПЕРИОД=1: tmp="кв"; 
   |  УМ_ТЕК_ПЕРИОД=2: tmp="гг";
   else tmp="";
   fi;
   if tmp<>"": Позиции[Iter].ПЕРИОД=РАБ.УПП.LIB.ВзятьПериодПоДате(ДАТОПЕР, tmp); fi;
 fi;
 if УМ_КАССА<>"": Позиции[Iter].СЧТКАС=УМ_КАССА_КРЕ; fi;
end;

-- є¤¤¤¤¤¤¤¤¤¤¤¤¤¤џ
-- “ ПИФ ЗАЧИСТКИ “
--  ¤¤¤¤¤¤¤¤¤¤¤¤¤¤№
Proc ОчиститьДанныеДляПогашенияМОЛ;
 ClearVariable(BufAcc); ClearVariable(BufAna); ClearVariable(Buf); ClearVariable(ИФД_);
 ClearVariable(BufПФ);  ClearVariable(BufФКР);
 ClearVariable(BufПЛ);  ClearVariable(BufДАТА);
 ClearVariable(BufСТ);  ClearVariable(BufКОСГУ);
end;

Proc Очистить;
 ClearVariable(N); ClearVariable(Buf); ClearVariable(BufL);
 ClearVariable(BufAcc); ClearVariable(Элемент); ClearVariable(BufVocO);
 ClearVariable(BufAna); ClearVariable(BufVocA); ClearVariable(BufVocN);
 ClearVariable(СУМ_НЕП_АВ);  ClearVariable(ИТОГО);      ClearVariable(ОСТ_МОЛ);     ClearVariable(КОМАНД_В);
 ClearVariable(СУМ_НЕП_СУТ); ClearVariable(ИТОГО_НЕП);  ClearVariable(ОСТ_МОЛ_СУТ); ClearVariable(КОМАНД_П);
 ClearVariable(СУМ_НЕП_ТР);  ClearVariable(ИТОГО_ОСТ);  ClearVariable(ОСТ_МОЛ_ТРН); ClearVariable(ИТОГО_ВЕД);
 ClearVariable(СУМ_НЕП_КВ);  ClearVariable(ИТОГО_РАСХ); ClearVariable(ОСТ_МОЛ_КВР); ClearVariable(ИТОГО_ПОГ);
 ClearVariable(ГГ); ClearVariable(МОЛ_ИМЯ); ClearVariable(ПО_ИМЯ); ClearVariable(ПО_Л_ИМЯ); ClearVariable(КОСГУ_ИМЯ);
 ClearVariable(КВ); ClearVariable(ФКР_ИМЯ); ClearVariable(СТ_ИМЯ); ClearVariable(СЧЕТ_ИМЯ); ClearVariable(ГАШ_ИМЯ);
 ClearVariable(ПРИЗН_); ClearVariable(СЧТКАС_ИМЯ);
 ОчиститьДанныеДляПогашенияМОЛ;
end;

Proc УдалитьПустыеСтроки;
var nn :Integer;
 nn=1;
 while nn<=Позиции do 
   if Позиции[nn].МОЛ_КОД="" and if(КОМАНД, Итого[nn]=0, Позиции[nn].СУММА_П=0):
     Try DeleteFrame(Позиции, nn); Except end; else nn=nn+1;
   fi;
 od;
 if Позиции>0: Template.Frame=1; else Template.Field="F"; fi;
end;

Func ОчиститьЛишнее(onRead:Logical) :Logical;
var msg :String;
var nn, i :Integer;
var OK :Logical;
 OK=False;
 if onRead: ^True; fi;
 if Позиции>0:
   УдалитьПустыеСтроки;
   if Позиции>0:
     msg=if(КОМАНД, "прочих расходов", "командировок");
     nn=EnqOkCancel("Данные, характерные для "+msg+", будут очищены!^MВы уверены?", mtConfirmation);
     if nn=cmOk:
       nn=Позиции;
       if КОМАНД:
         for i=1 to nn do 
           Позиции[i].СЧЕТ="";
           Позиции[i].СЧЕТП="";
           Позиции[i].КОСГУ=""; 
           Позиции[i].СУММА_П =0;
           Позиции[i].ОСТ_АВ  =0;
           Позиции[i].ПЕРЕРАСХ=0;
         od;
       else
         for i=1 to nn do 
           Позиции[i].СУТОЧН  =0;
           Позиции[i].ПРОЖИВ  =0;
           Позиции[i].ПРОЕЗД  =0;
           Позиции[i].ВЕД_СУТ =0;
           Позиции[i].ВЕД_ТР  =0;
           Позиции[i].ВЕД_КВ  =0;
           Позиции[i].ОСТ_СУТ =0;
           Позиции[i].ОСТ_ТР  =0;
           Позиции[i].ОСТ_КВ  =0;
           Позиции[i].РАСХ_СУТ=0;
           Позиции[i].РАСХ_ТР =0;
           Позиции[i].РАСХ_КВ =0;
         od;
       fi;
       OK=True;
     fi;
   else OK=True;
   fi;
 fi;
 ^OK;
end;

--є¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤џ
--“ ПИФ ОФОРМЛЕНИЯ “
-- ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤№
Proc ЦветаПолей(ЦветКнопок:Integer);
var n,l :Integer;
 ClearVariable(BufField); ClearVariable(BufColorBg); ClearVariable(BufColorFo);
 n=InsertInArraySort(BufField,"КНОК");             InsertInArray(BufColorBg,n,ЦветКнопок);
 n=InsertInArraySort(BufField,"КННАСТР");          InsertInArray(BufColorBg,n,ЦветКнопок);
 n=InsertInArraySort(BufField,"ДАТОПЕР");          InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"НОМЕРБУМ");         InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"F");                InsertInArray(BufColorBg,n,coYellow);
 n=InsertInArraySort(BufField,"A");                InsertInArray(BufColorBg,n,coYellow);
 n=InsertInArraySort(BufField,"D");                InsertInArray(BufColorBg,n,coYellow);
 n=InsertInArraySort(BufField,"K");                InsertInArray(BufColorBg,n,coYellow);
 n=InsertInArraySort(BufField,"МОЛ_ИМЯ");          InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"ПО_ИМЯ");           InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"ПО_Л_ИМЯ");         InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"ИФД_");             InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"ФКР_ИМЯ");          InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"СЧЕТ_ИМЯ");         InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"ГАШ_ИМЯ");          InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"КОСГУ_ИМЯ");        InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"СТ_ИМЯ");           InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"ТИТ_СТ");           InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"ГГ");               InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"КВ");               InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"ПРИЗН_");           InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"СУММА_П");          InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"ОСТ_АВ");           InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"ПЕРЕРАСХ");         InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"СУТОЧН");           InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"ПРОЕЗД");           InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"ПРОЖИВ");           InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"ВЕД_СУТ");          InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"ВЕД_ТР");           InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"ВЕД_КВ");           InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"ОСТ_СУТ");          InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"ОСТ_ТР");           InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"ОСТ_КВ");           InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"РАСХ_СУТ");         InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"РАСХ_ТР");          InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"РАСХ_КВ");          InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"КОММЕН");           InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"СЧТКАС_ИМЯ");       InsertInArray(BufColorBg,n,coTeal);
 l=LengthOfArray(BufField);
 for n=1..l do
   if BufColorBg[n]=coTeal: BufColorFo[n]=coWhite;
   |  True: BufColorFo[n]=coBlack;
   fi;
 od;
end;

Proc ТолькоЧтение(Flag:Logical);
var len, k, i, j, ik, jk, n, цвFont, цвBack :Integer;
var ТЧ :Logical;
var tmp :String;
var СекцИмя : Object;
 ClearVariable(ИменаСекций);
 ИменаСекций[1]="СекцОбщая";
 ИменаСекций[2]="СекцТаблЗ";
 ИменаСекций[3]="СекцТаблДМ";
 ИменаСекций[4]="СекцТаблДУ";
 len=LengthOfArray(ИменаСекций);
 ShowProgress(len, "Обработка данных...");
 Try
   for k=1..len do
     ProgressPos(k);
     if FindObject(ИменаСекций[k], СекцИмя):
       ik=asInteger(СекцИмя.RowsCount); jk=asInteger(СекцИмя.ColsCount);
       for i=1 .. ik do
         for j=1 .. jk do
           tmp=Up(asString(СекцИмя.Cell(i, j, CellContents, ""))); n=SearchInArray(BufField, tmp, True);
           if n<>-1:
             if Flag: цвFont=coBlack; цвBack=coTransparent; ТЧ=True; else цвFont=BufColorFo[n]; цвBack=BufColorBg[n]; ТЧ=False; fi;
             СекцИмя.Cell(i, j, CellFontColor, цвFont); СекцИмя.Cell(i, j, CellBgColor, цвBack); СекцИмя.Cell(i, j, CellReadOnly, ТЧ);
           fi;
         od;
       od;
     fi;
   od;
 Finally
   CloseProgress;
 end;
 --cbКомандировки.Enabled=not(Flag);
 cbВыборСЧ.Enabled=not(Flag);
 cbВыборПсМОЛ.Enabled=not(Flag);
 cbВставитьДолги.Enabled=not(Flag);
 cbНеПроверятьПерерасход.Enabled=not(Flag);
 ClearVariable(ИменаСекций);
end; 

Func ВыборВидаТаблицы(State:Integer) :Integer;
var nn :Integer;
 ClearVariable(Buf);
 Buf[1]="код + наименование";
 Buf[2]="только код";
 Buf[3]="только наименование";
 Buf[4]="наименование + код";
 nn=Alternate("Выберите способ отображения аналитики", Buf, -1, State+1, 12);
 if nn=0: ^State; fi;
 ^(nn-1);
end;

Proc Перенумеровать;
var i, nn, first, last, k, stroka :Integer;
var F :Logical;
 first=6; -- 5 первых не учитываем
 stroka=5;
 nn=asInteger(СекцТаблЗ.ColsCount);
 if nn>first: last=nn-1; fi; -- последний не учитываем
 k=1;
 for i=first to last do
   F=asLogical(СекцТаблЗ.Column(i, ColVisible, ""));
   if F:
     СекцТаблЗ.Cell(stroka, i, CellContents, Str(k), True);
     k=k+1;
   else
     СекцТаблЗ.Cell(stroka, i, CellContents, "", True);
   fi;
 od;
end;

Proc INIColumn(Flag:Logical);
 ClearVariable(BufL);
 if Flag:
   BufL[1] =True; BufL[11]=True;  BufL[21]=False; BufL[31]=True;  BufL[41]=True;  BufL[51]=True;
   BufL[2] =True; BufL[12]=False; BufL[22]=False; BufL[32]=True;  BufL[42]=True;  BufL[52]=True;
   BufL[3] =True; BufL[13]=False; BufL[23]=False; BufL[33]=True;  BufL[43]=True;
   BufL[4] =True; BufL[14]=False; BufL[24]=False; BufL[34]=True;  BufL[44]=True;
   BufL[5] =True; BufL[15]=True;  BufL[25]=True;  BufL[35]=True;  BufL[45]=True;
   BufL[6] =True; BufL[16]=True;  BufL[26]=True;  BufL[36]=True;  BufL[46]=True;
   BufL[7] =True; BufL[17]=True;  BufL[27]=True;  BufL[37]=True;  BufL[47]=True;
   BufL[8] =True; BufL[18]=True;  BufL[28]=True;  BufL[38]=True;  BufL[48]=True;
   BufL[9] =True; BufL[19]=True;  BufL[29]=True;  BufL[39]=True;  BufL[49]=True;
   BufL[10]=True; BufL[20]=False; BufL[30]=True;  BufL[40]=True;  BufL[50]=True;
 else 
   BufL[1] =True; BufL[11]=True;  BufL[21]=True;  BufL[31]=False; BufL[41]=False; BufL[51]=True;
   BufL[2] =True; BufL[12]=True;  BufL[22]=True;  BufL[32]=False; BufL[42]=False; BufL[52]=True;
   BufL[3] =True; BufL[13]=True;  BufL[23]=True;  BufL[33]=False; BufL[43]=False;
   BufL[4] =True; BufL[14]=True;  BufL[24]=True;  BufL[34]=False; BufL[44]=False;
   BufL[5] =True; BufL[15]=True;  BufL[25]=False; BufL[35]=False; BufL[45]=False;
   BufL[6] =True; BufL[16]=True;  BufL[26]=False; BufL[36]=False; BufL[46]=False;
   BufL[7] =True; BufL[17]=True;  BufL[27]=False; BufL[37]=False; BufL[47]=False;
   BufL[8] =True; BufL[18]=True;  BufL[28]=False; BufL[38]=False; BufL[48]=False;
   BufL[9] =True; BufL[19]=True;  BufL[29]=False; BufL[39]=False; BufL[49]=False;
   BufL[10]=True; BufL[20]=True;  BufL[30]=False; BufL[40]=False; BufL[50]=False;
 fi;
end;

Proc ВнешнийВид;
 if УМ_USE_ПЕРИОД=False: FlagПЕРИОД=False; fi;
 cbFlagПЕРИОД.Enabled =УМ_USE_ПЕРИОД;
end;

Proc Iter_Validation;
var nn :Integer;
 if Позиции<1: Try nn=InsertFrame(Позиции, 1); ПрисвоитьУмолчания(nn); Except end; fi;
end;

Func СкрытыеСтолбцы(Flag:Logical; onRead:Logical) :Logical;
var i, len :Integer;
 if not(ОчиститьЛишнее(onRead)): ^False; fi;
 Iter_Validation;
 if not(Проводить):
   if Flag: ВыборСЧ=False; cbВыборСЧ.State=ВыборСЧ; fi;
   cbВыборСЧ.Enabled=not(Flag);
 fi;
 INIColumn(Flag);
 len=LengthOfArray(BufL);
 for i=1 to len do
   СекцТаблЗ.Column(i, ColVisible, BufL[i]); 
  СекцТаблДМ.Column(i, ColVisible, BufL[i]);
  СекцТаблДУ.Column(i, ColVisible, BufL[i]);
   СекцТаблИ.Column(i, ColVisible, BufL[i]); 
 od;
 ClearVariable(BufL);
 ^True;
end;

Proc ПоказатьТаблицу;
var Flag :Logical;
 Flag=True;
 if ДатОпер=1.1.100: Flag=False; Iter_Validation; fi;
 СекцТаблЗ.Visible=Flag;
СекцТаблДМ.Visible=Flag;
СекцТаблДУ.Visible=Flag;
 СекцТаблИ.Visible=Flag;
 СекцHelpMsg.Visible=not(Flag);
end;

Proc Пересчет(Field:String; Iter:Integer);
 if Field="СУММА_П" : 
   Позиции[Iter].ОСТ_АВ   = Deb(СУМ_НЕП_АВ[Iter]-Позиции[Iter].СУММА_П);
   Позиции[Iter].ПЕРЕРАСХ = Cre(СУМ_НЕП_АВ[Iter]-Позиции[Iter].СУММА_П);
 |  Field="СУТОЧН" or Field="ВЕД_СУТ":
   Позиции[Iter].ОСТ_СУТ  = Deb(СУМ_НЕП_СУТ[Iter]-(Позиции[Iter].СУТОЧН+Позиции[Iter].ВЕД_СУТ));
   Позиции[Iter].РАСХ_СУТ = Cre(СУМ_НЕП_СУТ[Iter]-(Позиции[Iter].СУТОЧН+Позиции[Iter].ВЕД_СУТ));
 |  Field="ПРОЕЗД" or Field="ВЕД_ТР":
   Позиции[Iter].ОСТ_ТР   = Deb( СУМ_НЕП_ТР[Iter]-(Позиции[Iter].ПРОЕЗД+Позиции[Iter].ВЕД_ТР ));
   Позиции[Iter].РАСХ_ТР  = Cre( СУМ_НЕП_ТР[Iter]-(Позиции[Iter].ПРОЕЗД+Позиции[Iter].ВЕД_ТР ));
 |  Field="ПРОЖИВ" or Field="ВЕД_КВ":
   Позиции[Iter].ОСТ_КВ   = Deb( СУМ_НЕП_КВ[Iter]-(Позиции[Iter].ПРОЖИВ+Позиции[Iter].ВЕД_КВ ));
   Позиции[Iter].РАСХ_КВ  = Cre( СУМ_НЕП_КВ[Iter]-(Позиции[Iter].ПРОЖИВ+Позиции[Iter].ВЕД_КВ ));
 fi;
end;

Proc ДобавитьСтрочкиВначало;
var q, i, num, nn :Integer;
  ClearVariable(Buf);
  Buf[1]="Добавить 01 строчку";
  Buf[2]="Добавить 10 строчек";
  Buf[3]="Добавить 20 строчек";
  Buf[4]="Добавить .. строчек";
  nn=Alternate("Добавление строчек в начало таблицы", Buf, -1, 1, 12);
  if nn=0: Exit; fi;
  num=0;
  if nn=1: num=1;
  |  nn=2: num=10;
  |  nn=3: num=20;
  |  nn=4: Try q=Input(num, "Введите количество строк для добавления"); Except Message("Неверный ввод!", mtError); end;
           if q=cmCancel: Exit; fi;
  fi;
  if num>0:
    for i=1 to num do
      Try nn=InsertFrame(Позиции, 1); Except end;
      ПрисвоитьУмолчания(nn);
    od;
    Template.Field="МОЛ_ИМЯ";
    Template.Frame=1;
  fi;
end;

--є¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤џ
--“ ПИФ ДЛЯ ВЫБОРА ДАННЫХ “
-- ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤№
Func ВыборДаты(srcDate:Date) :Date;
var dd :Date;
 if srcDate>1.1.100: dd=Calendar(srcDate); else dd=Calendar(ToDay); fi;
 if not(dd<=1.1.100): ^dd; else ^srcDate; fi;
end;

Func GetDate(Iter:Integer) :Date;  -- считываем в заданном поле дату
var name :String;
 name=AsString(Template.Field);
 if name="ДатОпер" : ^ДатОпер; fi;
end;

Proc SetDate(Value:Date; Iter:Integer); -- устанавливаем в заданном поле дату; Value - значение даты, которое необходимо присвоить
var name :String;
 name=AsString(Template.Field);
 if name="ДатОпер" : ДатОпер=Value; fi;
end;

Func ВыборИФД(StoreИФД:String) :String;
var nn:Integer;
 ClearVariable(Buf);
 Buf[1]="Бюджетная деятельность";
 Buf[2]="Приносящая доход деятельность";
 Buf[3]="Очистить значение";
 nn=Alternate("Выберите источник финансирования деятельности", Buf, -1, Int(StoreИФД), 12);
 if nn=0: ^StoreИФД; fi;
 if nn=3: ^""; else ^Str(nn); fi;
end;

Func ВыборЭКР(StoreЭКР:String) :String;
var i, k :Integer;
var tmp :String;
 ClearVariable(Buf);
 i=0; k=0;
 for Sign tmp="("+Раб.Бюджет2005.МаскаРасхКОСГУ+"|"+"КОСГУ.000)&КОСГУ.???", Sort do
   i=i+1;
   Buf[i]=SubStr(tmp,7,255)+" --"+Name_A(tmp);
   if StoreЭКР=SubStr(Buf[i],1,3): k=i; fi;
 od;
 i=0;
 i=Alternate("ЭКР", Buf, -1, k, 12);
 if i=0: ^""; fi;
 tmp=SubStr(Buf[i], 1, Pos(" --", Buf[i])-1);
 ^tmp;
end;

Proc ВыборСчетаСтруктуры(Iter:Integer; mode:String);
-- mode: "СЧПОДОТ" - счет подотчета; "СЧПОГАШ" -- счет подотчета
var tmp, СЧ, УслСЧ :String;
 ClearVariable(Buf);
 if mode="СЧПОДОТ":
   СЧ=Позиции[Iter].ФКР+"."+Позиции[Iter].ИФД+"."+Позиции[Iter].Счет+"."+УМ_сч208К;
   УслСЧ="*.?."+УМ_СЧ208+".??."+УМ_сч208К;
 |  mode="СЧПОГАШ":
   СЧ=Позиции[Iter].ФКР+"."+Позиции[Iter].ИФД+"."+Позиции[Iter].СчетП;
   УслСЧ=УМ_СЧ_ПОГ_АВ;
 fi;
 tmp=AccountElection(УслСЧ, False, СЧ);
 if tmp="": Exit; fi;
 Позиции[Iter].ФКР=SubStr(tmp, 1, 20);
 Позиции[Iter].ИФД=SubStr(tmp, 22, 1);
 if mode="СЧПОДОТ": Позиции[Iter].Счет=SubStr(tmp, 24,  6);
 |  mode="СЧПОГАШ": Позиции[Iter].Счет=SubStr(tmp, 24, 10);
 fi;
end;

Proc ВыборСчетаПодотчетаАналитика(Iter:Integer);
var Фильтр, КБК, tmp :String;
var RO, nn, len, i, k :Integer;
var Flag :Logical;
 ClearVariable(Buf);
 if Позиции[Iter].ИФД="" : Message("Сначала выберите источник финансирования!", mtWarning); Template.Field="ИФД_";     Template.Frame=Iter; Exit; fi;
 if Позиции[Iter].ФКР="": Message("Сначала выберите ФКР!", mtWarning);                     Template.Field="ФКР_ИМЯ"; Template.Frame=Iter; Exit; fi;
 КБК=Позиции[Iter].ФКР+"."+Позиции[Iter].ИФД;
 tmp=КБК+"."+УМ_СЧ208+".??."+УМ_сч208К;
 nn=GetGroupAccounts(tmp, Buf, 7);
 if nn=0:
   Фильтр=УМ_СЧ208+".??.???";
   RO=OpenWorkArea("РПО_БЮДЖ_КЛАСС","Code","Name_Voc='СЧ' and Match(CODE,'"+Фильтр+"')");
   Try
     len=Records(RO);
     if len=0: Message("Выполните обновление справочников и повторите выбор", mtWarning); OpenBlank("РАБ.ВСПОМ.ИМПОРТ_СПРАВ",True); Exit; fi;
     ClearVariable(Buf);
     РАБ.КСА.Начать;
     k=0;
     for i=1 to len do
       Buf[i]=КБК+"."+GetFieldS(RO,i,"CODE");   -- теперь КБК.?+???.??.???
       if Name_S(Buf[i])=" ":
          Flag=True;
          if not Match(Buf[i],Раб.Бюджет2005.МаскаСчетаФКР) and
             not Match(Buf[i],Раб.Бюджет2005.МаскаСчетаКД)  and
             not Match(Buf[i],Раб.Бюджет2005.МаскаСчетаКИВФ):
               if Enquiry("Ошибка!","Добавляемый счет "+Buf[i]+" не соотвествует структуре учета!", "Продолжить;Прервать", mtError)=2:
                 Exit;
               fi;
               k=k+1;
               Flag=False;
          fi;
          if Flag: Раб.КСА.Добавить(Buf[i]); fi;
       fi;
     od;
     if k<len: РАБ.КСА.Закончить(True); else Exit; fi;
   Finally
     CloseWorkArea(RO);
   end;
   ClearVariable(Buf);
   nn=GetGroupAccounts(tmp, Buf, 7);
   if nn=0: Message("Ошибка автоматического добавления счетов!", mtError); Exit; fi;
 fi;
 tmp=КБК+"."+УМ_СЧ208+".";
 for i=1 to nn do Buf[i]=Buf[i]+"--"+Name_S(tmp+Buf[i]+"."); od;
 nn=AlternateTree("Выберите субсчет "+УМ_СЧ208+" счета:", Buf, -1, -1, 12, ".", "Субсчет", "Наименование");
 if nn=0: Exit; fi;
 Позиции[Iter].СЧЕТ=УМ_СЧ208+"."+SubStr(Buf[nn], 1, 2);
end;

Proc ВыборСчетаПогашенияАналитика(Iter:Integer);
var КБК, ИФД, tmp1, tmp2, Фильтр :String;
var RO1, RO2, nn, len, i, k, z :Integer;
var Flag :Logical;
 if Позиции[Iter].ИФД="": Message("Сначала выберите источник финансирования!", mtWarning); Template.Field="ИФД_";     Template.Frame=Iter; Exit; fi;
 if Позиции[Iter].ФКР="": Message("Сначала выберите ФКР!", mtWarning);                     Template.Field="ФКР_ИМЯ"; Template.Frame=Iter; Exit; fi;
 ИФД=Позиции[Iter].ИФД;
 КБК=Позиции[Iter].ФКР;
 if УМ_СЧ_ПОГ_АВ="" : Message("Не заданы маски счетов погашения авансов!^MПроверьте настройки по умолчанию!", mtError); Exit; fi;
 nn=WordsCount(УМ_СЧ_ПОГ_АВ, "|");
 tmp2="";
 for i=1 to nn do
   tmp1=ExtractWord(i, УМ_СЧ_ПОГ_АВ, "|");
   tmp1=SubStr(tmp1, Length(tmp1)-10+1, 10);
   tmp2=Объединить(tmp2, "Match(CODE,'"+tmp1+"')", " or ");
 od;
 Фильтр=tmp2;
 РАБ.БЮДЖЕТ2005.РежимМаски="?";
 tmp2=РАБ.БЮДЖЕТ2005.Объединить("("+УМ_СЧ_ПОГ_АВ+")", РАБ.БЮДЖЕТ2005.МаскаСчетаФКР, "&");
 ClearVariable(Buf);
 len=GetGroupAccounts(tmp2, Buf, 6, 7, 8);
 if len=0: -- автоматическое добавление счетов
   RO1=OpenWorkArea("РПО_БЮДЖ_КЛАСС","Code", "Name_Voc='СЧ' and "+Фильтр);
   Try
     nn=Records(RO1);
     if nn=0: Message("Выполните обновление справочников и повторите выбор", mtWarning); OpenBlank("РАБ.ВСПОМ.ИМПОРТ_СПРАВ",True); Exit; fi;
     ClearVariable(Buf);
     РАБ.КСА.Начать;
     k=0;
     for i=1 to len do
       Buf[i]=КБК+"."+ИФД+"."+GetFieldS(RO1,i,"CODE");
       if Name_S(Buf[i])=" ":
          Flag=True;
          if not Match(Buf[i],Раб.Бюджет2005.МаскаСчетаФКР):
               if Enquiry("Ошибка!","Добавляемый счет "+Buf[i]+" не соотвествует структуре учета!", "Продолжить;Прервать", mtError)=2:
                 Exit;
               fi;
               k=k+1;
               Flag=False;
          fi;
          if Flag: Раб.КСА.Добавить(Buf[i]); fi;
       fi;
     od;
     if k<len: РАБ.КСА.Закончить(True); else Exit; fi;
   Finally
     CloseWorkArea(RO1);
   end;
   ClearVariable(Buf);
   nn=GetGroupAccounts(УМ_СЧ_ПОГ_АВ, Buf, 6, 7, 8);
   if nn=0: Message("Ошибка автоматического добавления счетов!", mtError); Exit; fi;
 fi;
 i=1;
 while not Buf[i]="" do
   tmp1=SubStr(Buf[i], 1, 4);
   tmp2=SubStr(Buf[i], 1, 7);
   if SearchInArray(Buf, tmp1, True)=-1: InsertInArraySort(Buf, tmp1); i=i+1; fi; --Добавление группы идет перед выбранным элементом (сортировка)
   if SearchInArray(Buf, tmp2, True)=-1: InsertInArraySort(Buf, tmp2); i=i+1; fi; --Добавление группы идет перед выбранным элементом (сортировка)
   i=i+1;
 od;
 RO1=OpenWorkArea("РПО_БЮДЖ_КЛАСС","CODE", Фильтр);
 RO2=OpenWorkArea("РПО_БЮДЖ_КЛАСС","CODE","1=0");
 Try
   nn=Records(RO1);
   if nn=0: Message("Выполните обновление справочников и повторите выбор", mtWarning); OpenBlank("РАБ.ВСПОМ.ИМПОРТ_СПРАВ",True); Exit; fi;
   ClearVariable(BufAcc); ClearVariable(BufAna);
   ShowProgress(nn, "Построение списка счетов...");
   Try
     for i=1 to nn do
       ProgressPos(i);
       BufAcc[i]=SubStr(GetFieldS(RO1, i, "CODE"), 1, 10);
       BufAna[i]=GetFieldS(RO1, i, "TXT");
     od;
   Finally
     CloseProgress;
   end;
   SetFilter(RO1, "NAME_VOC='СЧ' and Match(CODE,'???.??')");
   SetFilter(RO2, "NAME_VOC='СЧ' and Match(CODE,'???')");
   ShowProgress(nn, "Обработка счетов...");
   Try
     nn=LengthOfArray(Buf);
     for i=1 to nn do
       z=Length(Buf[i]);
       if SubStr(Buf[i], z, 1)=".":
         tmp1=SubStr(Buf[i], 1, z-1);
         if z=4: k=Search(RO2, 1, tmp1); if k>0: Buf[i]=Buf[i]+" --"+GetFieldS(RO2, k, "TXT"); fi;
         |  z=7: k=Search(RO1, 1, tmp1); if k>0: Buf[i]=Buf[i]+" --"+GetFieldS(RO1, k, "TXT"); fi;
         fi;
       else
         k=SearchInArray(BufAcc, Buf[i], True);
         if k>0: Buf[i]=BufAcc[k]+" --"+BufAna[k]; fi;
       fi;
     od;
   Finally
     CloseProgress;
   end;
 Finally
   CloseWorkArea(RO1);
   CloseWorkArea(RO2);
 end;
 nn=AlternateTree("Выберите счет погашения аванса...", Buf, -1, -1, 12, ".", "Счета", "Наименование", -1, False);
 if nn=0: Exit; fi;
 tmp1=SubStr(Buf[nn], 1, Pos(" --", Buf[nn])-1);
 Позиции[Iter].СЧЕТП=tmp1;
end;

--є¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤џ
--“ ПИФ ПРОВЕРКИ ДАННЫХ “
-- ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤№
Func ПроверитьСчета(Iter:Integer) :Logical;
 if Позиции[Iter].ИФД="":
   Message("Необходимо выбрать источник финансирования!", mtWarning);
   Template.Field="ИФД_";
   Template.Frame=Iter;
   ^False;
 fi;
 if Позиции[Iter].ФКР="":
   Message("Необходимо выбрать ФКР!", mtWarning);
   Template.Field="ФКР_ИМЯ";
   Template.Frame=Iter;
   ^False;
 fi;
 if Позиции[Iter].СЧТКАС="":
   Message("Необходимо выбрать счет перерасхода аванса (касса/банк)!", mtWarning);
   Template.Field="СЧТКАС_ИМЯ";
   Template.Frame=Iter;
   ^False;
 fi;
 if not(КОМАНД):
   if Позиции[Iter].СЧЕТ="":
     Message("Необходимо выбрать счет, субсчет расчетов с подотчетными лицами!", mtWarning);
     Template.Field="СЧЕТ_ИМЯ";
     Template.Frame=Iter;
     ^False;
   fi;
   if Позиции[Iter].СЧЕТП="":
     Message("Необходимо выбрать счет, субсчет погашения аванса!", mtWarning);
     Template.Field="ГАШ_ИМЯ";
     Template.Frame=Iter;
     ^False;
   fi;
   if Позиции[Iter].КОСГУ=""  : 
     Message('Необходимо выбрать КОСГУ!', mtWarning);
     Template.Field="КОСГУ_ИМЯ";
     Template.Frame=Iter; 
     ^False;
   fi;
 fi;
 ^True;
end;

Func TemplateSaveOK :Logical; -- проверка правильности ввода данных
var len, i :Integer;
var Долг :Numeric;
 if ДАТОПЕР=1.1.100 : Message('Не введена дата операции!', mtWarning); Template.Field="ДАТОПЕР";  ^False; fi;
 if НОМЕРБУМ="": Номер=РАБ.ОБЛ.СледСУчетомГода(SelfCrd,"НОМЕР","ДАТОПЕР"); НомерБум=Str(Номер); fi;
 УдалитьПустыеСтроки;
 if Позиции<1: 
   Message('Нет ненулевых проводок!', mtWarning);
   Iter_Validation;
   Template.Field="F";
   ^False;
 fi;
 len=Позиции;
 for i=1 to len do
   if Позиции[i].МОЛ_КОД=""  : Message('Не выбрано материально ответственное лицо!', mtWarning);             Template.Field="МОЛ_ИМЯ";   Template.Frame=i; ^False; fi;
   if Позиции[i].ПО_КОД=""   : Message('Не выбрано подразделение (факт)!', mtWarning);                       Template.Field="ПО_ИМЯ";    Template.Frame=i; ^False; fi;
   if Позиции[i].ПО_Л_КОД="" : Message('Не выбрано подразделение (план)!', mtWarning);                       Template.Field="ПО_Л_ИМЯ";  Template.Frame=i; ^False; fi;
   if Позиции[i].ИФД=""      : Message('Не выбран Источник Финансирования деятельности!', mtWarning);        Template.Field="ИФД_";       Template.Frame=i; ^False; fi;
   if Позиции[i].ФКР=""      : Message('Не выбрана Функциональная Классификация Расходов!', mtWarning);      Template.Field="ФКР_ИМЯ";   Template.Frame=i; ^False; fi;
   if КОМАНД=False:
     if Позиции[i].СЧЕТ=""   : Message('Не выбран счет/субсчет расчетов с подотчетными лицами!', mtWarning); Template.Field="СЧЕТ_ИМЯ";  Template.Frame=i; ^False; fi;
     if Позиции[i].СЧЕТП=""  : Message('Не выбран счет/субсчет погашения аванса!', mtWarning);               Template.Field="ГАШ_ИМЯ";   Template.Frame=i; ^False; fi;
     if Позиции[i].КОСГУ=""  : Message('Не выбран КОСГУ!', mtWarning);                                       Template.Field="КОСГУ_ИМЯ"; Template.Frame=i; ^False; fi;
   fi;
   if Позиции[i].СТАТЬЯ=""   : Message('Не выбрана статья расходов!', mtWarning);                            Template.Field="СТ_ИМЯ";    Template.Frame=i; ^False; fi;
   if УМ_USE_ПЕРИОД:
     if Позиции[i].ПЕРИОД="" : Message('Не выбран период лимита выданного аванса!', mtWarning);              Template.Field="ГГ";        Template.Frame=i; ^False; fi;
   fi;
   if КОМАНД:
     if (ИТОГО[i]+ИТОГО_ОСТ[i])=0 
                             : Message('Не задана сумма погашения аванса командировки!', mtWarning);
                               Template.Field="СУТОЧН";
                               Template.Frame=i;
                               ^False;
     fi;
   else
     if (Позиции[i].СУММА_П+Позиции[i].ОСТ_АВ)=0 
                             : Message('Не задана сумма погашения аванса (прочие расходы)^Mили возврата аванса!', mtWarning);  Template.Field="СУММА_П";   
                               Template.Frame=i; 
                               ^False;
     fi;
   fi;
   if Позиции[i].СЧТКАС=""   : Message('Не выбран счет перерасхода аванса (касса/банк)!', mtWarning); Template.Field="СЧТКАС_ИМЯ"; Template.Frame=i; ^False; fi;
   if НеПроверятьПерерасход=False:
     if КОМАНД:
       Долг=0;
       Долг=СУМ_НЕП_СУТ[i]-(Позиции[i].СУТОЧН+Позиции[i].ВЕД_СУТ)+Позиции[i].ОСТ_СУТ;
       if Долг>=0 and Позиции[i].РАСХ_СУТ>0:
         Message("За '"+Позиции[i].МОЛ_КОД+"' останется долг ["+Str(Долг+Позиции[i].РАСХ_СУТ, 2)+"]!"+Chr(13)+
                 "Оформление перерасхода невозможно."+Chr(13)+
                 "Для выдачи аванса используйте бланк 'Выдача аванса'.", mtWarning);
         Template.Field="РАСХ_СУТ";
         Template.Frame=i;
         ^False;
       fi;
       Долг=0;
       Долг=СУМ_НЕП_ТР[i]-(Позиции[i].ПРОЕЗД+Позиции[i].ВЕД_ТР)+Позиции[i].ОСТ_ТР;
       if Долг>=0 and Позиции[i].РАСХ_ТР>0:
         Message("За '"+Позиции[i].МОЛ_КОД+"' останется долг ["+Str(Долг+Позиции[i].РАСХ_ТР, 2)+"]!"+Chr(13)+
                 "Оформление перерасхода невозможно."+Chr(13)+
                 "Для выдачи аванса используйте бланк 'Выдача аванса'.", mtWarning);
         Template.Field="РАСХ_ТР";
         Template.Frame=i;
         ^False;
       fi;
       Долг=0;
       Долг=СУМ_НЕП_КВ[i]-(Позиции[i].ПРОЖИВ+Позиции[i].ВЕД_КВ)+Позиции[i].ОСТ_КВ;
       if Долг>=0 and Позиции[i].РАСХ_КВ>0:
         Message("За '"+Позиции[i].МОЛ_КОД+"' останется долг ["+Str(Долг+Позиции[i].РАСХ_КВ, 2)+"]!"+Chr(13)+
                 "Оформление перерасхода невозможно."+Chr(13)+
                 "Для выдачи аванса используйте бланк 'Выдача аванса'.", mtWarning);
         Template.Field="РАСХ_КВ";
         Template.Frame=i;
         ^False;
       fi;
     else
       Долг=0;
       Долг=СУМ_НЕП_АВ[i]-Позиции[i].СУММА_П+Позиции[i].ОСТ_АВ;
       if Долг>=0 and Позиции[i].ПЕРЕРАСХ>0:
         Message("За '"+Позиции[i].МОЛ_КОД+"' останется долг ["+Str(Долг+Позиции[i].ПЕРЕРАСХ, 2)+"]!"+Chr(13)+
                 "Оформление перерасхода невозможно."+Chr(13)+
                 "Для выдачи аванса используйте бланк 'Выдача аванса'.", mtWarning);
         Template.Field="ПЕРЕРАСХ";
         Template.Frame=i;
         ^False;
       fi;
     fi;
   fi;
 od;
 ^True;
end;

Func ПроверитьДляСтроки(Field:String; Iter:Integer; Flag:Logical) :Logical;
 if Field="СУММА_П"  or Field="ОСТ_АВ"  or Field="ПЕРЕРАСХ" or
    Field="СУТОЧН"   or Field="ПРОЕЗД"  or Field="ПРОЖИВ" or
    Field="ОСТ_СУТ"  or Field="ОСТ_ТР"  or Field="ОСТ_КВ" or
    Field="РАСХ_СУТ" or Field="РАСХ_ТР" or Field="РАСХ_КВ" or Flag:

   if Позиции[Iter].МОЛ_КОД=""  : Message('Не выбрано материально ответственное лицо!', mtWarning);          Template.Field="МОЛ_ИМЯ";   Template.Frame=Iter; ^False; fi;
   if Позиции[Iter].ПО_КОД=""   : Message('Не выбрано подразделение (факт)!', mtWarning);                    Template.Field="ПО_ИМЯ";    Template.Frame=Iter; ^False; fi;
   if Позиции[Iter].ПО_Л_КОД="" : Message('Не выбрано подразделение (план)!', mtWarning);                    Template.Field="ПО_Л_ИМЯ";  Template.Frame=Iter; ^False; fi;
   if Позиции[Iter].ИФД=""      : Message('Не выбран Источник Финансирования деятельности!', mtWarning);     Template.Field="ИФД_";      Template.Frame=Iter; ^False; fi;
   if Позиции[Iter].ФКР=""      : Message('Не выбрана Функциональная Классификация Расходов!', mtWarning);   Template.Field="ФКР_ИМЯ";   Template.Frame=Iter; ^False; fi;
   if КОМАНД=False:
     if Позиции[Iter].СЧЕТ=""   : Message('Не выбран счет/субсчет учета подотчета!', mtWarning);             Template.Field="СЧЕТ_ИМЯ";  Template.Frame=Iter; ^False; fi;
     if Позиции[Iter].СЧЕТП=""  : Message('Не выбран счет/субсчет гашения аванса!', mtWarning);              Template.Field="ГАШ_ИМЯ";   Template.Frame=Iter; ^False; fi;
     if Позиции[Iter].КОСГУ=""  : Message('Не выбран КОСГУ!', mtWarning);                                    Template.Field="КОСГУ_ИМЯ"; Template.Frame=Iter; ^False; fi;
   fi;
   if Позиции[Iter].СТАТЬЯ=""   : Message('Не выбрана статья расходов!', mtWarning);                         Template.Field="СТ_ИМЯ";    Template.Frame=Iter; ^False; fi;
   if УМ_USE_ПЕРИОД:
     if Позиции[Iter].ПЕРИОД=""   : Message('Не выбран период лимита выданного аванса!', mtWarning);         Template.Field="ГГ";         Template.Frame=Iter; ^False; fi;
   fi;
   if Позиции[Iter].СЧТКАС=""   : Message('Не выбран счет перерасхода аванса (касса/банк)!', mtWarning);     Template.Field="СЧТКАС_ИМЯ"; Template.Frame=Iter; ^False; fi;
 fi;
 ^True;
end;

Func СчетДебета(Flag:Logical; mode:String; ИФД:String; ФКР:String; СЧ:String; КОСГУ:String) :String;
var tmp, adm :String;
 tmp="";
 СчитатьЗначенияПоУмолчанию;
 ВнешнийВид;
 if not(ПроверкаЗначенийПоУмолчанию): ^""; fi;
 if ИФД="" or ФКР="" or (СЧ="" and not(Flag)) or (КОСГУ="" and not(Flag)): ^""; fi;
 if СЧ="" and Flag: СЧ=УМ_СЧ208+".??"; fi;
 if КОСГУ="" and Flag: КОСГУ="???"; fi;
 if mode="208-201": 
   tmp=ФКР+"."+ИФД+"."+СЧ+"."+УМ_сч208Д;
 |  mode="401-208": 
   tmp=ФКР+"."+ИФД+"."+УМ_ФИН_РЕЗ+"."+КОСГУ;
 |  mode="201-208": 
   adm=SubStr(ФКР, 1, 3);
   tmp=adm+"."+УМ_КИВФ+"."+ИФД+"."+УМ_КАССА_ДЕБ;
 fi;
 ^tmp;
end;

Func СчетКредита(Flag:Logical; mode:String; ИФД:String; ФКР:String; СЧ:String; КОСГУ:String) :String;
var tmp, adm :String;
 tmp="";
 СчитатьЗначенияПоУмолчанию;
 ВнешнийВид;
 if not(ПроверкаЗначенийПоУмолчанию): ^""; fi;
 if ИФД="" or ФКР="" or (СЧ="" and not(Flag)) or (КОСГУ="" and not(Flag)): ^""; fi;
 if СЧ="" and Flag: СЧ=УМ_СЧ208+".??"; fi;
 if КОСГУ="" and Flag: КОСГУ="???"; fi;
 if mode="208-201": 
   adm=SubStr(ФКР, 1, 3);
   tmp=adm+"."+УМ_КИВФ+"."+ИФД+"."+УМ_КАССА_КРЕ;
 |  mode="401-208": 
   tmp=ФКР+"."+ИФД+"."+СЧ+"."+УМ_сч208К;
 |  mode="201-208": 
   tmp=ФКР+"."+ИФД+"."+СЧ+"."+УМ_сч208К;
 fi;
 ^tmp;
end;

Func МаскаСправочников0(Flag:Logical; Iter:Integer) :String;
-- Flag - командировки или нет
var mask, tmp, t1, t2 :String;
 mask="";
 if not(ПроверитьСчета(Iter)): ^" "; fi; -- чтобы возвратить False по OnEnter
 t1= СчетДебета(Flag, "401-208", Позиции[Iter].ИФД, Позиции[Iter].ФКР, Позиции[Iter].СЧЕТ, Позиции[Iter].КОСГУ);
 t2=СчетКредита(Flag, "401-208", Позиции[Iter].ИФД, Позиции[Iter].ФКР, Позиции[Iter].СЧЕТ, Позиции[Iter].КОСГУ);
 tmp="";
 tmp=РАБ.БЮДЖЕТ.НаборПризнаков(t1, t2,"КОСГУ.*|МОЛ.*|ФКР.*|"+УМ_СПРАВрасх+".*");
 if tmp<>"": mask=tmp; fi;
 t1= СчетДебета(Flag, "208-201", Позиции[Iter].ИФД, Позиции[Iter].ФКР, Позиции[Iter].СЧЕТ, Позиции[Iter].КОСГУ);
 t2=СчетКредита(Flag, "208-201", Позиции[Iter].ИФД, Позиции[Iter].ФКР, Позиции[Iter].СЧЕТ, Позиции[Iter].КОСГУ);
 tmp="";
 tmp=РАБ.БЮДЖЕТ.НаборПризнаков(t1, t2,"КОСГУ.*|МОЛ.*|ФКР.*|"+УМ_СПРАВрасх+".*");
 if tmp<>"": mask=mask+if(mask<>"","|","")+tmp; fi;
 t1= СчетДебета(Flag, "201-208", Позиции[Iter].ИФД, Позиции[Iter].ФКР, Позиции[Iter].СЧЕТ, Позиции[Iter].КОСГУ);
 t2=СчетКредита(Flag, "201-208", Позиции[Iter].ИФД, Позиции[Iter].ФКР, Позиции[Iter].СЧЕТ, Позиции[Iter].КОСГУ);
 tmp="";
 tmp=РАБ.БЮДЖЕТ.НаборПризнаков(t1, t2,"КОСГУ.*|МОЛ.*|ФКР.*|"+УМ_СПРАВрасх+".*");
 if tmp<>"": mask=mask+if(mask<>"","|","")+tmp; fi;
 ^mask;
end;

Func ПроверкаСчетов(Командировки:Logical; Iter:Integer) :Logical;
var Acc, tmp, adm, ИФД, КБК, СЧД, СЧК, СЧП, К3 :String;
var nn, k, len, z :Integer;
var Ошибка :Logical;
 if Iter>0:
   if not(ПроверитьСчета(Iter)): ^False; fi;
   nn=Iter; len=Iter;
 else
   if not(TemplateSaveOK): ^False; fi;
   nn=1; len=Позиции;
 fi;
 k=0; z=0; ClearVariable(Buf); ClearVariable(BufAcc); ClearVariable(Элемент);
 ShowProgress(len, "Проверка счетов бюджетного учета ...");
 Try
   Раб.Бюджет2005.РежимМаски="?";
   РАБ.КСА.Начать;
   for Iter=nn to len do
     Элемент[Iter]=z+1; -- здесь порядковый номер первого элемента набора счетов в массиве BufAcc относящийся к одной позиции
     ProgressPos(Iter);
     ИФД=Позиции[Iter].ИФД;
     КБК=Позиции[Iter].ФКР;
     СЧД=Позиции[Iter].СЧЕТ;
     СЧП=Позиции[Iter].СЧЕТП;
     СЧК=Позиции[Iter].СЧТКАС;
     К3=Позиции[Iter].КОСГУ;
     adm=SubStr(КБК, 1, 3);
     Ошибка=False;
     while Ошибка=False do
       if Командировки:
         -- *** 401-208 ***
--         Y=SubStr(Позиции[Iter].ПЕРИОД, 8, 255);
--         if (УМ_USE_ПЕРИОД=True and Int(Y)=Year(ДатОпер)) or УМ_USE_ПЕРИОД=False and (Y="" or Int(Y)=Year(ДатОпер)): F=True; else F=False; fi;
--         if F:
           tmp=КБК+"."+ИФД+"."+УМ_ФИН_РЕЗ;
           Acc=tmp+".???";
           if not Match(Acc, Раб.Бюджет2005.МаскаСчетаФКР): Ошибка=True; Break; fi;
           Acc=tmp+"."+УМ_КОСГУ_СУТ; --Д401
           z=z+1; BufAcc[z]=Acc;
           if Name_S(Acc)=" ": k=k+1; Buf[k]=Acc; Раб.КСА.Добавить(Acc); fi;
           Acc=tmp+"."+УМ_КОСГУ_ТРН; --Д401
           z=z+1; BufAcc[z]=Acc;
           if Name_S(Acc)=" ": k=k+1; Buf[k]=Acc; Раб.КСА.Добавить(Acc); fi;
           Acc=tmp+"."+УМ_КОСГУ_КВР; --Д401
           z=z+1; BufAcc[z]=Acc;
           if Name_S(Acc)=" ": k=k+1; Buf[k]=Acc; Раб.КСА.Добавить(Acc); fi;
--         else
--           Acc=КБК+"."+ИФД+"."+УМ_ФИН_ПРОШЛ+".000";
--           if not Match(Acc, Раб.Бюджет2005.МаскаСчетаФКР): Ошибка=True; Break; fi;
--           z=z+1; BufAcc[z]=Acc;
--         fi;
         if ИТОГО_ВЕД[Iter]>0:
           Acc=КБК+"."+ИФД+"."+УМ_счП_ВЕД; -- Погашение по ведомости
           if not Match(Acc, Раб.Бюджет2005.МаскаСчетаФКР): Ошибка=True; Break; fi;
           z=z+1; BufAcc[z]=Acc;
         fi;
         --
         tmp=КБК+"."+ИФД+"."+УМ_СЧ208+".";
         Acc=tmp+"??."+УМ_сч208К;
         if not Match(Acc, Раб.Бюджет2005.МаскаСчетаФКР): Ошибка=True; Break; fi;
         Acc=tmp+УМ_ссчСУТ+"."+УМ_сч208К; --К208
         z=z+1; BufAcc[z]=Acc;
         if Name_S(Acc)=" ": k=k+1; Buf[k]=Acc; Раб.КСА.Добавить(Acc); fi;
         Acc=tmp+УМ_ссчТРН+"."+УМ_сч208К; --К208
         z=z+1; BufAcc[z]=Acc;
         if Name_S(Acc)=" ": k=k+1; Buf[k]=Acc; Раб.КСА.Добавить(Acc); fi;
         Acc=tmp+УМ_ссчКВР+"."+УМ_сч208К; --К208
         z=z+1; BufAcc[z]=Acc;
         if Name_S(Acc)=" ": k=k+1; Buf[k]=Acc; Раб.КСА.Добавить(Acc); fi;
         -- *** 201-208 ***
         if ИТОГО_ОСТ[Iter]>0:
           Acc=adm+"."+УМ_КИВФ+"."+ИФД+"."+УМ_КАССА_ДЕБ; --Д201
           if not Match(Acc, Раб.Бюджет2005.МаскаСчетаКИВФ): Ошибка=True; Break; fi;
           z=z+1; BufAcc[z]=Acc;
           if Name_S(Acc)=" ": k=k+1; Buf[k]=Acc; Раб.КСА.Добавить(Acc); fi;
         fi;
         -- *** 208-201 ***
         if ИТОГО_РАСХ[Iter]>0:
           tmp=КБК+"."+ИФД+"."+УМ_СЧ208+".";
           Acc=tmp+"??."+УМ_сч208Д;
           if not Match(Acc, Раб.Бюджет2005.МаскаСчетаФКР): Ошибка=True; Break; fi;
           Acc=tmp+УМ_ссчСУТ+"."+УМ_сч208Д; --Д208
           z=z+1; BufAcc[z]=Acc;
           if Name_S(Acc)=" ": k=k+1; Buf[k]=Acc; Раб.КСА.Добавить(Acc); fi;
           Acc=tmp+УМ_ссчТРН+"."+УМ_сч208Д; --Д208
           z=z+1; BufAcc[z]=Acc;
           if Name_S(Acc)=" ": k=k+1; Buf[k]=Acc; Раб.КСА.Добавить(Acc); fi;
           Acc=tmp+УМ_ссчКВР+"."+УМ_сч208Д; --Д208
           z=z+1; BufAcc[z]=Acc;
           if Name_S(Acc)=" ": k=k+1; Buf[k]=Acc; Раб.КСА.Добавить(Acc); fi;
--           Acc=adm+"."+УМ_КИВФ+"."+ИФД+"."+УМ_КАССА_КРЕ; --К201
--           if not Match(Acc, Раб.Бюджет2005.МаскаСчетаКИВФ): Ошибка=True; Break; fi;
--           z=z+1; BufAcc[z]=Acc;
--           if Name_S(Acc)=" ": k=k+1; Buf[k]=Acc; Раб.КСА.Добавить(Acc); fi;
           if Match(СЧК, "201.?4.???"):
             Acc=adm+"."+УМ_КИВФ+"."+ИФД+"."+УМ_КАССА_КРЕ; --К201
             if not Match(Acc, Раб.Бюджет2005.МаскаСчетаКИВФ): Ошибка=True; Break; fi;
             z=z+1; BufAcc[z]=Acc;
             if Name_S(Acc)=" ": k=k+1; Buf[k]=Acc; Раб.КСА.Добавить(Acc); fi;
           else
             Acc=КБК+"."+ИФД+"."+УМ_ЗАРПЛ; --К304
             if not Match(Acc, Раб.Бюджет2005.МаскаСчетаФКР): Ошибка=True; Break; fi;
             z=z+1; BufAcc[z]=Acc;
             if Name_S(Acc)=" ": k=k+1; Buf[k]=Acc; Раб.КСА.Добавить(Acc); fi;
           fi;
         fi;
       else
         Acc=КБК+"."+ИФД+"."+СЧП; --Д401
         if not Match(Acc, Раб.Бюджет2005.МаскаСчетаФКР): Ошибка=True; Break; fi;
         z=z+1; BufAcc[z]=Acc;
         if Name_S(Acc)=" ": k=k+1; Buf[k]=Acc; Раб.КСА.Добавить(Acc); fi;
         Acc=КБК+"."+ИФД+"."+СЧД+"."+УМ_сч208К; --К208
         if not Match(Acc, Раб.Бюджет2005.МаскаСчетаФКР): Ошибка=True; Break; fi;
         z=z+1; BufAcc[z]=Acc;
         if Name_S(Acc)=" ": k=k+1; Buf[k]=Acc; Раб.КСА.Добавить(Acc); fi;
         if Позиции[Iter].ОСТ_АВ>0:
           Acc=adm+"."+УМ_КИВФ+"."+ИФД+"."+УМ_КАССА_ДЕБ; --Д201
           if not Match(Acc, Раб.Бюджет2005.МаскаСчетаКИВФ): Ошибка=True; Break; fi;
           z=z+1; BufAcc[z]=Acc;
           if Name_S(Acc)=" ": k=k+1; Buf[k]=Acc; Раб.КСА.Добавить(Acc); fi;
         fi;
         if Позиции[Iter].ПЕРЕРАСХ>0:
           Acc=КБК+"."+ИФД+"."+СЧД+"."+УМ_сч208Д; --Д208
           if not Match(Acc, Раб.Бюджет2005.МаскаСчетаФКР): Ошибка=True; Break; fi;
           z=z+1; BufAcc[z]=Acc;
           if Name_S(Acc)=" ": k=k+1; Buf[k]=Acc; Раб.КСА.Добавить(Acc); fi;
--           Acc=adm+"."+УМ_КИВФ+"."+ИФД+"."+УМ_КАССА_КРЕ; --К201
--           if not Match(Acc, Раб.Бюджет2005.МаскаСчетаКИВФ): Ошибка=True; Break; fi;
--           z=z+1; BufAcc[z]=Acc;
--           if Name_S(Acc)=" ": k=k+1; Buf[k]=Acc; Раб.КСА.Добавить(Acc); fi;
           if Match(СЧК, "201.?4.???"):
             Acc=adm+"."+УМ_КИВФ+"."+ИФД+"."+УМ_КАССА_КРЕ; --К201
             if not Match(Acc, Раб.Бюджет2005.МаскаСчетаКИВФ): Ошибка=True; Break; fi;
             z=z+1; BufAcc[z]=Acc;
             if Name_S(Acc)=" ": k=k+1; Buf[k]=Acc; Раб.КСА.Добавить(Acc); fi;
           else
             Acc=КБК+"."+ИФД+"."+УМ_ЗАРПЛ; --К304
             if not Match(Acc, Раб.Бюджет2005.МаскаСчетаФКР): Ошибка=True; Break; fi;
             z=z+1; BufAcc[z]=Acc;
             if Name_S(Acc)=" ": k=k+1; Buf[k]=Acc; Раб.КСА.Добавить(Acc); fi;
           fi;
         fi;
       fi;
       Break;
     od; -- While
     if Ошибка:
       Message("Счет "+Acc+" не соотвествует структуре учета!", mtError);
       Template.Field="ФКР_ИМЯ"; Template.Frame=Iter;
       ^False;
     fi;
   od;
 Finally
   CloseProgress;
 end;
 if k>0:
   nn=EnqOkCancel("Были обнаружены счета отсутствующие в структуре учета!^MДобавить счета?", mtConfirmation);
   if nn=cmOk:
     РАБ.КСА.Закончить(False);
     Refresh(False);
     k=LengthOfArray(Buf);
     for z=1 to k do
       if Name_S(Buf[z])=" ":
         Message("Ошибка автоматического добавления счетов!", mtError);
         ^False;
       fi;
     od;
   else
     Message("Используются счета отсутствующие в структуре учета!^MНевозможно сформировать проводки", mtError);
     ^False;
   fi;
 fi;
 ^True;
end;

Proc АнализСправочников(Acc:String; ExclVoc:String);
var voc, tmp :String;
var nw, j :Integer;
 voc=SignsMask(Acc, True);
 if voc<>"": 
   nw=WordsCount(voc, "|"); 
   for j=1 to nw do 
     tmp=ExtractWord(j, voc, "|");
     if ExclVoc="" or not(РАБ.БЮДЖЕТ2005.MatchMask(tmp, ExclVoc)):
       if SearchInArray(BufVocO, tmp, True)<0: InsertInArraySort(BufVocO, tmp); fi;
       if SearchInArray(BufVocA, tmp, True)<0: InsertInArraySort(BufVocA, tmp); fi;
     fi;
   od;
 fi;
 voc=SignsMask(Acc, False);
 if voc<>"": 
   nw=WordsCount(voc, "|"); 
   for j=1 to nw do 
     tmp=ExtractWord(j, voc, "|");
     if ExclVoc="" or not(РАБ.БЮДЖЕТ2005.MatchMask(tmp, ExclVoc)):
       if SearchInArray(BufVocN, tmp, True)<0: InsertInArraySort(BufVocN, tmp); fi;
       if SearchInArray(BufVocA, tmp, True)<0: InsertInArraySort(BufVocA, tmp); fi;
     fi;
   od;
 fi;
end;

Func МаскаСправочников(Mode:Integer) :String;
-- -1 - необязательные справочники, 0 - все справочники, 1 - обязательные справочники
var len, i :Integer;
var mask :String;
 mask="";
 if Mode=-1: len=LengthOfArray(BufVocN); for i=1 to len do mask=mask+"|"+BufVocN[i]; od;
 |  Mode= 0: len=LengthOfArray(BufVocA); for i=1 to len do mask=mask+"|"+BufVocA[i]; od;
 |  Mode= 1: len=LengthOfArray(BufVocO); for i=1 to len do mask=mask+"|"+BufVocO[i]; od;
 fi;
 ^SubStr(mask, 2, 255);
end;

Func ПроверкаАналитики(Iter:Integer; Проверять:Logical; НужнаМаска:Logical; Mode:Integer) :String;
var q, k1, k2, i, j, lenBufAcc, nn, len :Integer;
var mask :String;
var Next :Logical;
 if Iter>0:
   if Проверять: if not(ПроверитьСчета(Iter)): ^" "; fi; fi;
   nn=Iter; len=Iter;
 else
   if Проверять: if not(TemplateSaveOK): ^" "; fi; fi;
   nn=1; len=Позиции;
 fi;
 lenBufAcc=LengthOfArray(BufAcc);
 if Элемент[len]>lenBufAcc: Message("Ошибка обработки аналитических признаков!", mtError); ^" "; fi;
 Next=False;
 for Iter=nn to len do
   k1=Элемент[Iter]; k2=if(Iter+1>len, lenBufAcc, Элемент[Iter+1]-1);
   ClearVariable(BufVocA); ClearVariable(BufVocO); ClearVariable(BufVocN);
   for i=k1 to k2 do j=j+1; АнализСправочников(BufAcc[i], "МОЛ.*|П.*|П_ЛИМ.*|ФКР.*|КД.*|КИФД.*|КОСГУ.*|"+УМ_СПРАВрасх+".*"); od;
   if НужнаМаска: ^МаскаСправочников(Mode); fi;
   mask=МаскаСправочников(1);
   if not(РАБ.БЮДЖЕТ2005.ПроверитьНаборСлов(Позиции[Iter].ПРИЗН, " ", mask, "|", "")):
     Message("Отсутствуют обязательные аналитические признаки!", mtError);
     Template.Field="ПРИЗН_";
     Template.Frame=Iter;
     ^" ";
   fi;
   if not(Next):
     mask=МаскаСправочников(-1);
     if not(РАБ.БЮДЖЕТ2005.ПроверитьНаборСлов(Позиции[Iter].ПРИЗН, " ", mask, "|", "")):
       q=Enquiry("Проверяется строка "+Str(Iter)+"...", "Отсутствуют необязательные аналитические признаки!", "Пропустить позицию;Пропустить ВСЕ;Исправить", mtWarning);
       if q=2: Next=True;
       |  q=3: Template.Field="ПРИЗН_"; Template.Frame=Iter; ^" ";
       fi;
     fi;
   fi;
 od;
 ClearVariable(Buf); ClearVariable(BufAcc); ClearVariable(Элемент); ClearVariable(BufVocA); ClearVariable(BufVocO); ClearVariable(BufVocN);
 ^mask;
end;

Func ПроверкаСтруктурыУчета(Командировки:Logical) :Logical;
 СчитатьЗначенияПоУмолчанию;
 ВнешнийВид;
 if not(ПроверкаЗначенийПоУмолчанию): ^False; fi;
 if not(ПроверкаСчетов(Командировки, -1)): ^False; fi;  -- -1 - проверяем ВСЕ
 if ПроверкаАналитики(-1, False, False, 0)=" ": ^False; fi;
 ^True;
end;

Func СправочникиСчетовПроверенные(Командировки:Logical; Iter:Integer) :String;
 СчитатьЗначенияПоУмолчанию;
 ВнешнийВид;
 if not(ПроверкаЗначенийПоУмолчанию): ^" "; fi;
 if not(ПроверкаСчетов(Командировки, Iter)): ^" "; fi;
 ^(ПроверкаАналитики(Iter, True, True, 0));
end;

Proc СформироватьПроводки(ПровестиПроводки:Logical);
-- перед формированием проводок ОБЯЗАТЕЛЬНО должна быть произведена проверка на ошибки
var i, k, len :Integer;
var счДЕБ, счКРЕ, ADM, ИФ, АНА_ОПЕР1, АНА_ОПЕР2 :String;
var A1, A2, A3, B1, B2, B3 :String;
 ClearVariable(БУХ_ПРОВОДКИ);
 if ПровестиПроводки:
   len=Позиции;
   if len>0: -- на всякий случай
     k=0;
     ShowProgress(len, "Формирование проводок...");
     Try
       for i=1 to len do
         ProgressPos(i);
         -- Формируем аналитику операции
         ИФ  = Позиции[i].ИФД;
         ADM = SubStr(Позиции[i].ФКР,1,3);
         АНА_ОПЕР1="";
         АНА_ОПЕР1=Объединить(АНА_ОПЕР1,       "П_ЛИМ."+Позиции[i].ПО_Л_КОД, " ");
         АНА_ОПЕР1=Объединить(АНА_ОПЕР1,              "ФКР."+Позиции[i].ФКР, " ");
         АНА_ОПЕР1=Объединить(АНА_ОПЕР1, УМ_СПРАВрасх+"."+Позиции[i].СТАТЬЯ, " ");
         АНА_ОПЕР1=Объединить(АНА_ОПЕР1,                  Позиции[i].ПЕРИОД, " ");
         АНА_ОПЕР1=Объединить(АНА_ОПЕР1,if(Позиции[i].ТИТ_СТ, "ТИТУЛ",  ""), " ");
         АНА_ОПЕР2=АНА_ОПЕР1;
         АНА_ОПЕР2=Объединить(АНА_ОПЕР2,          "МОЛ."+Позиции[i].МОЛ_КОД, " ");
         АНА_ОПЕР2=Объединить(АНА_ОПЕР2,             "П."+Позиции[i].ПО_КОД, " ");
         АНА_ОПЕР2=Объединить(АНА_ОПЕР2,                   Позиции[i].ПРИЗН, " ");
         АНА_ОПЕР2=Объединить(АНА_ОПЕР2,           if(КОМАНД, "КОМАНД", ""), " ");
         -- В аналитике пока нет КОСГУ
         if КОМАНД:
           -- погашение аванса 401-208
           A1=if(УМ_КОСГУ_СУТ="", АНА_ОПЕР2, АНА_ОПЕР2+" "+"КОСГУ."+УМ_КОСГУ_СУТ);
           B1=if(УМ_КОСГУ_СУТ="", АНА_ОПЕР1, АНА_ОПЕР1+" "+"КОСГУ."+УМ_КОСГУ_СУТ);
           A2=if(УМ_КОСГУ_ТРН="", АНА_ОПЕР2, АНА_ОПЕР2+" "+"КОСГУ."+УМ_КОСГУ_ТРН);
           B2=if(УМ_КОСГУ_ТРН="", АНА_ОПЕР1, АНА_ОПЕР1+" "+"КОСГУ."+УМ_КОСГУ_ТРН);
           A3=if(УМ_КОСГУ_КВР="", АНА_ОПЕР2, АНА_ОПЕР2+" "+"КОСГУ."+УМ_КОСГУ_КВР);
           B3=if(УМ_КОСГУ_КВР="", АНА_ОПЕР1, АНА_ОПЕР1+" "+"КОСГУ."+УМ_КОСГУ_КВР);
----           Y=SubStr(Позиции[i].ПЕРИОД, Length(GetAnaGlossary(Позиции[i].ПЕРИОД)+2, 255);
--           Y=SubStr(Позиции[i].ПЕРИОД, 8, 255);
--           if (УМ_USE_ПЕРИОД=True and Int(Y)=Year(ДатОпер)) or УМ_USE_ПЕРИОД=False and (Y="" or Int(Y)=Year(ДатОпер)): F=True; else F=False; fi;
--           F=(Int(Y)=Year(ДатОпер));
           if Позиции[i].СУТОЧН>0:
--             if F:
             счДЕБ=Позиции[i].ФКР+"."+ИФ+"."+УМ_ФИН_РЕЗ+"."+УМ_КОСГУ_СУТ;          -- Суточные
--             else
--               счДЕБ=Позиции[i].ФКР+"."+ИФ+"."+УМ_ФИН_ПРОШЛ+".000";
--             fi;
             счКРЕ=Позиции[i].ФКР+"."+ИФ+"."+УМ_СЧ208+"."+УМ_ссчСУТ+"."+УМ_сч208К; -- Суточные
             k=k+1;
             k=InsertFrame(БУХ_ПРОВОДКИ,k);
             БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].СУТОЧН;
             БУХ_ПРОВОДКИ[k].ДЕБ_П=счДЕБ;
             БУХ_ПРОВОДКИ[k].КРЕ_П=счКРЕ;
             БУХ_ПРОВОДКИ[k].АНА_П=A1;
             БУХ_ПРОВОДКИ[k].КОМ_П=Позиции[i].КОММЕН;
             k=k+1;
             k=InsertFrame(БУХ_ПРОВОДКИ,k);
             БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].СУТОЧН;
             БУХ_ПРОВОДКИ[k].ДЕБ_П="ЛИМ_ИСПОЛ";
             БУХ_ПРОВОДКИ[k].КРЕ_П="ЛИМ_ЗАДАН";
             БУХ_ПРОВОДКИ[k].АНА_П=B1;
             БУХ_ПРОВОДКИ[k].КОМ_П="погашение лимита";
           fi;
           if Позиции[i].ВЕД_СУТ>0:
             счДЕБ=Позиции[i].ФКР+"."+ИФ+"."+УМ_счП_ВЕД;
             счКРЕ=Позиции[i].ФКР+"."+ИФ+"."+УМ_СЧ208+"."+УМ_ссчСУТ+"."+УМ_сч208К; -- Суточные
             k=k+1;
             k=InsertFrame(БУХ_ПРОВОДКИ,k);
             БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].ВЕД_СУТ;
             БУХ_ПРОВОДКИ[k].ДЕБ_П=счДЕБ;
             БУХ_ПРОВОДКИ[k].КРЕ_П=счКРЕ;
             БУХ_ПРОВОДКИ[k].АНА_П=A1;
             БУХ_ПРОВОДКИ[k].КОМ_П=Позиции[i].КОММЕН;
             k=k+1;
             k=InsertFrame(БУХ_ПРОВОДКИ,k);
             БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].ВЕД_СУТ;
             БУХ_ПРОВОДКИ[k].ДЕБ_П="ЛИМ_ИСПОЛ";
             БУХ_ПРОВОДКИ[k].КРЕ_П="ЛИМ_ЗАДАН";
             БУХ_ПРОВОДКИ[k].АНА_П=B1;
             БУХ_ПРОВОДКИ[k].КОМ_П="погашение лимита";
           fi;
           if Позиции[i].ПРОЕЗД>0:
--             if F:
             счДЕБ=Позиции[i].ФКР+"."+ИФ+"."+УМ_ФИН_РЕЗ+"."+УМ_КОСГУ_ТРН;          -- Транспортные
--             else
--               счДЕБ=Позиции[i].ФКР+"."+ИФ+"."+УМ_ФИН_ПРОШЛ+".000";
--             fi;
             счКРЕ=Позиции[i].ФКР+"."+ИФ+"."+УМ_СЧ208+"."+УМ_ссчТРН+"."+УМ_сч208К; -- Транспортные
             k=k+1;
             k=InsertFrame(БУХ_ПРОВОДКИ,k);
             БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].ПРОЕЗД;
             БУХ_ПРОВОДКИ[k].ДЕБ_П=счДЕБ;
             БУХ_ПРОВОДКИ[k].КРЕ_П=счКРЕ;
             БУХ_ПРОВОДКИ[k].АНА_П=A2;
             БУХ_ПРОВОДКИ[k].КОМ_П=Позиции[i].КОММЕН;
             k=k+1;
             k=InsertFrame(БУХ_ПРОВОДКИ,k);
             БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].ПРОЕЗД;
             БУХ_ПРОВОДКИ[k].ДЕБ_П="ЛИМ_ИСПОЛ";
             БУХ_ПРОВОДКИ[k].КРЕ_П="ЛИМ_ЗАДАН";
             БУХ_ПРОВОДКИ[k].АНА_П=B2;
             БУХ_ПРОВОДКИ[k].КОМ_П="погашение лимита";
           fi;
           if Позиции[i].ВЕД_ТР>0:
             счДЕБ=Позиции[i].ФКР+"."+ИФ+"."+УМ_счП_ВЕД;
             счКРЕ=Позиции[i].ФКР+"."+ИФ+"."+УМ_СЧ208+"."+УМ_ссчТРН+"."+УМ_сч208К; -- Транспортные
             k=k+1;
             k=InsertFrame(БУХ_ПРОВОДКИ,k);
             БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].ВЕД_ТР;
             БУХ_ПРОВОДКИ[k].ДЕБ_П=счДЕБ;
             БУХ_ПРОВОДКИ[k].КРЕ_П=счКРЕ;
             БУХ_ПРОВОДКИ[k].АНА_П=A2;
             БУХ_ПРОВОДКИ[k].КОМ_П=Позиции[i].КОММЕН;
             k=k+1;
             k=InsertFrame(БУХ_ПРОВОДКИ,k);
             БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].ВЕД_ТР;
             БУХ_ПРОВОДКИ[k].ДЕБ_П="ЛИМ_ИСПОЛ";
             БУХ_ПРОВОДКИ[k].КРЕ_П="ЛИМ_ЗАДАН";
             БУХ_ПРОВОДКИ[k].АНА_П=B2;
             БУХ_ПРОВОДКИ[k].КОМ_П="погашение лимита";
           fi;
           if Позиции[i].ПРОЖИВ>0:
--             if F:
             счДЕБ=Позиции[i].ФКР+"."+ИФ+"."+УМ_ФИН_РЕЗ+"."+УМ_КОСГУ_КВР;          -- Проживание
--             else
--               счДЕБ=Позиции[i].ФКР+"."+ИФ+"."+УМ_ФИН_ПРОШЛ+".000";
--             fi;
             счКРЕ=Позиции[i].ФКР+"."+ИФ+"."+УМ_СЧ208+"."+УМ_ссчКВР+"."+УМ_сч208К; -- Проживание
             k=k+1;
             k=InsertFrame(БУХ_ПРОВОДКИ,k);
             БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].ПРОЖИВ;
             БУХ_ПРОВОДКИ[k].ДЕБ_П=счДЕБ;
             БУХ_ПРОВОДКИ[k].КРЕ_П=счКРЕ;
             БУХ_ПРОВОДКИ[k].АНА_П=A3;
             БУХ_ПРОВОДКИ[k].КОМ_П=Позиции[i].КОММЕН;
             k=k+1;
             k=InsertFrame(БУХ_ПРОВОДКИ,k);
             БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].ПРОЖИВ;
             БУХ_ПРОВОДКИ[k].ДЕБ_П="ЛИМ_ИСПОЛ";
             БУХ_ПРОВОДКИ[k].КРЕ_П="ЛИМ_ЗАДАН";
             БУХ_ПРОВОДКИ[k].АНА_П=B3;
             БУХ_ПРОВОДКИ[k].КОМ_П="погашение лимита";
           fi;
           if Позиции[i].ВЕД_КВ>0:
             счДЕБ=Позиции[i].ФКР+"."+ИФ+"."+УМ_счП_ВЕД;
             счКРЕ=Позиции[i].ФКР+"."+ИФ+"."+УМ_СЧ208+"."+УМ_ссчКВР+"."+УМ_сч208К; -- Проживание
             k=k+1;
             k=InsertFrame(БУХ_ПРОВОДКИ,k);
             БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].ВЕД_КВ;
             БУХ_ПРОВОДКИ[k].ДЕБ_П=счДЕБ;
             БУХ_ПРОВОДКИ[k].КРЕ_П=счКРЕ;
             БУХ_ПРОВОДКИ[k].АНА_П=A3;
             БУХ_ПРОВОДКИ[k].КОМ_П=Позиции[i].КОММЕН;
             k=k+1;
             k=InsertFrame(БУХ_ПРОВОДКИ,k);
             БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].ВЕД_КВ;
             БУХ_ПРОВОДКИ[k].ДЕБ_П="ЛИМ_ИСПОЛ";
             БУХ_ПРОВОДКИ[k].КРЕ_П="ЛИМ_ЗАДАН";
             БУХ_ПРОВОДКИ[k].АНА_П=B3;
             БУХ_ПРОВОДКИ[k].КОМ_П="погашение лимита";
           fi;
           -- возврат остатка аванса 201-208
           if (Позиции[i].ОСТ_СУТ+Позиции[i].ОСТ_ТР+Позиции[i].ОСТ_КВ)>0:
             счДЕБ=ADM+"."+УМ_КИВФ+"."+ИФ+"."+УМ_КАССА_ДЕБ;
             if Позиции[i].ОСТ_СУТ>0:
               счКРЕ=Позиции[i].ФКР+"."+ИФ+"."+УМ_СЧ208+"."+УМ_ссчСУТ+"."+УМ_сч208К; -- Суточные
               k=k+1;
               k=InsertFrame(БУХ_ПРОВОДКИ,k);
               БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].ОСТ_СУТ;
               БУХ_ПРОВОДКИ[k].ДЕБ_П=счДЕБ;
               БУХ_ПРОВОДКИ[k].КРЕ_П=счКРЕ;
               БУХ_ПРОВОДКИ[k].АНА_П=A1;
               БУХ_ПРОВОДКИ[k].КОМ_П=Позиции[i].КОММЕН;
               k=k+1;
               k=InsertFrame(БУХ_ПРОВОДКИ,k);
               БУХ_ПРОВОДКИ[k].СУМ_П=-(Позиции[i].ОСТ_СУТ);
               БУХ_ПРОВОДКИ[k].ДЕБ_П="ЗАБАЛАНС";
               БУХ_ПРОВОДКИ[k].КРЕ_П="ЛИМ_ИСПОЛ";
               БУХ_ПРОВОДКИ[k].АНА_П=B1;
               БУХ_ПРОВОДКИ[k].КОМ_П="возврат лимита";
             fi;
             if Позиции[i].ОСТ_ТР>0:
               счКРЕ=Позиции[i].ФКР+"."+ИФ+"."+УМ_СЧ208+"."+УМ_ссчТРН+"."+УМ_сч208К; -- Транспортные
               k=k+1;
               k=InsertFrame(БУХ_ПРОВОДКИ,k);
               БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].ОСТ_ТР;
               БУХ_ПРОВОДКИ[k].ДЕБ_П=счДЕБ;
               БУХ_ПРОВОДКИ[k].КРЕ_П=счКРЕ;
               БУХ_ПРОВОДКИ[k].АНА_П=A2;
               БУХ_ПРОВОДКИ[k].КОМ_П=Позиции[i].КОММЕН;
               k=k+1;
               k=InsertFrame(БУХ_ПРОВОДКИ,k);
               БУХ_ПРОВОДКИ[k].СУМ_П=-(Позиции[i].ОСТ_ТР);
               БУХ_ПРОВОДКИ[k].ДЕБ_П="ЗАБАЛАНС";
               БУХ_ПРОВОДКИ[k].КРЕ_П="ЛИМ_ИСПОЛ";
               БУХ_ПРОВОДКИ[k].АНА_П=B2;
               БУХ_ПРОВОДКИ[k].КОМ_П="возврат лимита";
             fi;
             if Позиции[i].ОСТ_КВ>0:
               счКРЕ=Позиции[i].ФКР+"."+ИФ+"."+УМ_СЧ208+"."+УМ_ссчКВР+"."+УМ_сч208К; -- Проживание
               k=k+1;
               k=InsertFrame(БУХ_ПРОВОДКИ,k);
               БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].ОСТ_КВ;
               БУХ_ПРОВОДКИ[k].ДЕБ_П=счДЕБ;
               БУХ_ПРОВОДКИ[k].КРЕ_П=счКРЕ;
               БУХ_ПРОВОДКИ[k].АНА_П=A3;
               БУХ_ПРОВОДКИ[k].КОМ_П=Позиции[i].КОММЕН;
               k=k+1;
               k=InsertFrame(БУХ_ПРОВОДКИ,k);
               БУХ_ПРОВОДКИ[k].СУМ_П=-(Позиции[i].ОСТ_КВ);
               БУХ_ПРОВОДКИ[k].ДЕБ_П="ЗАБАЛАНС";
               БУХ_ПРОВОДКИ[k].КРЕ_П="ЛИМ_ИСПОЛ";
               БУХ_ПРОВОДКИ[k].АНА_П=B3;
               БУХ_ПРОВОДКИ[k].КОМ_П="возврат лимита";
             fi;
           fi;
           -- перерасход аванса 208-201
           if (Позиции[i].РАСХ_СУТ+Позиции[i].РАСХ_ТР+Позиции[i].РАСХ_КВ)>0:
             if Match(Позиции[i].СЧТКАС, "201.?4.???"):
               счКРЕ=ADM+"."+УМ_КИВФ+"."+ИФ+"."+УМ_КАССА_КРЕ;
             else
               счКРЕ=Позиции[i].ФКР+"."+ИФ+"."+УМ_ЗАРПЛ;
             fi;
             --счКРЕ=ADM+"."+УМ_КИВФ+"."+ИФ+"."+УМ_КАССА_КРЕ;
             if Позиции[i].РАСХ_СУТ>0:
               счДЕБ=Позиции[i].ФКР+"."+ИФ+"."+УМ_СЧ208+"."+УМ_ссчСУТ+"."+УМ_сч208Д; -- Суточные
               k=k+1;
               k=InsertFrame(БУХ_ПРОВОДКИ,k);
               БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].РАСХ_СУТ;
               БУХ_ПРОВОДКИ[k].ДЕБ_П=счДЕБ;
               БУХ_ПРОВОДКИ[k].КРЕ_П=счКРЕ;
               БУХ_ПРОВОДКИ[k].АНА_П=A1;
               БУХ_ПРОВОДКИ[k].КОМ_П=Позиции[i].КОММЕН;
               k=k+1;
               k=InsertFrame(БУХ_ПРОВОДКИ,k);
               БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].РАСХ_СУТ;
               БУХ_ПРОВОДКИ[k].ДЕБ_П="ЗАБАЛАНС";
               БУХ_ПРОВОДКИ[k].КРЕ_П="ЛИМ_ИСПОЛ";
               БУХ_ПРОВОДКИ[k].АНА_П=B1;
               БУХ_ПРОВОДКИ[k].КОМ_П="использование лимита";
             fi;
             if Позиции[i].РАСХ_ТР>0:
               счДЕБ=Позиции[i].ФКР+"."+ИФ+"."+УМ_СЧ208+"."+УМ_ссчТРН+"."+УМ_сч208Д; -- Транспортные
               k=k+1;
               k=InsertFrame(БУХ_ПРОВОДКИ,k);
               БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].РАСХ_ТР;
               БУХ_ПРОВОДКИ[k].ДЕБ_П=счДЕБ;
               БУХ_ПРОВОДКИ[k].КРЕ_П=счКРЕ;
               БУХ_ПРОВОДКИ[k].АНА_П=A2;
               БУХ_ПРОВОДКИ[k].КОМ_П=Позиции[i].КОММЕН;
               k=k+1;
               k=InsertFrame(БУХ_ПРОВОДКИ,k);
               БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].РАСХ_ТР;
               БУХ_ПРОВОДКИ[k].ДЕБ_П="ЗАБАЛАНС";
               БУХ_ПРОВОДКИ[k].КРЕ_П="ЛИМ_ИСПОЛ";
               БУХ_ПРОВОДКИ[k].АНА_П=B2;
               БУХ_ПРОВОДКИ[k].КОМ_П="использование лимита";
             fi;
             if Позиции[i].РАСХ_КВ>0:
               счДЕБ=Позиции[i].ФКР+"."+ИФ+"."+УМ_СЧ208+"."+УМ_ссчКВР+"."+УМ_сч208Д; -- Проживание
               k=k+1;
               k=InsertFrame(БУХ_ПРОВОДКИ,k);
               БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].РАСХ_КВ;
               БУХ_ПРОВОДКИ[k].ДЕБ_П=счДЕБ;
               БУХ_ПРОВОДКИ[k].КРЕ_П=счКРЕ;
               БУХ_ПРОВОДКИ[k].АНА_П=A3;
               БУХ_ПРОВОДКИ[k].КОМ_П=Позиции[i].КОММЕН;
               k=k+1;
               k=InsertFrame(БУХ_ПРОВОДКИ,k);
               БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].РАСХ_КВ;
               БУХ_ПРОВОДКИ[k].ДЕБ_П="ЗАБАЛАНС";
               БУХ_ПРОВОДКИ[k].КРЕ_П="ЛИМ_ИСПОЛ";
               БУХ_ПРОВОДКИ[k].АНА_П=B3;
               БУХ_ПРОВОДКИ[k].КОМ_П="использование лимита";
             fi;
           fi;
         else -- если не командировка
           -- погашение аванса 401-208
           A1=if(Позиции[i].КОСГУ="", АНА_ОПЕР2, АНА_ОПЕР2+" "+"КОСГУ."+Позиции[i].КОСГУ);
           B1=if(Позиции[i].КОСГУ="", АНА_ОПЕР1, АНА_ОПЕР1+" "+"КОСГУ."+Позиции[i].КОСГУ);
           if Позиции[i].СУММА_П>0:
             счДЕБ=Позиции[i].ФКР+"."+ИФ+"."+Позиции[i].СЧЕТП;
             счКРЕ=Позиции[i].ФКР+"."+ИФ+"."+Позиции[i].СЧЕТ+"."+УМ_сч208К;
             k=k+1;
             k=InsertFrame(БУХ_ПРОВОДКИ,k);
             БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].СУММА_П;
             БУХ_ПРОВОДКИ[k].ДЕБ_П=счДЕБ;
             БУХ_ПРОВОДКИ[k].КРЕ_П=счКРЕ;
             БУХ_ПРОВОДКИ[k].АНА_П=A1;
             БУХ_ПРОВОДКИ[k].КОМ_П=Позиции[i].КОММЕН;
             k=k+1;
             k=InsertFrame(БУХ_ПРОВОДКИ,k);
             БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].СУММА_П;
             БУХ_ПРОВОДКИ[k].ДЕБ_П="ЛИМ_ИСПОЛ";
             БУХ_ПРОВОДКИ[k].КРЕ_П="ЛИМ_ЗАДАН";
             БУХ_ПРОВОДКИ[k].АНА_П=B1;
             БУХ_ПРОВОДКИ[k].КОМ_П="погашение лимита";
           fi;
           -- возврат остатка аванса 201-208
           if Позиции[i].ОСТ_АВ>0:
             счДЕБ=ADM+"."+УМ_КИВФ+"."+ИФ+"."+УМ_КАССА_ДЕБ;
             счКРЕ=Позиции[i].ФКР+"."+ИФ+"."+Позиции[i].СЧЕТ+"."+УМ_сч208К;
             k=k+1;
             k=InsertFrame(БУХ_ПРОВОДКИ,k);
             БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].ОСТ_АВ;
             БУХ_ПРОВОДКИ[k].ДЕБ_П=счДЕБ;
             БУХ_ПРОВОДКИ[k].КРЕ_П=счКРЕ;
             БУХ_ПРОВОДКИ[k].АНА_П=A1;
             БУХ_ПРОВОДКИ[k].КОМ_П=Позиции[i].КОММЕН;
             k=k+1;
             k=InsertFrame(БУХ_ПРОВОДКИ,k);
             БУХ_ПРОВОДКИ[k].СУМ_П=-(Позиции[i].ОСТ_АВ);
             БУХ_ПРОВОДКИ[k].ДЕБ_П="ЗАБАЛАНС";
             БУХ_ПРОВОДКИ[k].КРЕ_П="ЛИМ_ИСПОЛ";
             БУХ_ПРОВОДКИ[k].АНА_П=B1;
             БУХ_ПРОВОДКИ[k].КОМ_П="возврат лимита";
           fi;
           -- перерасход аванса 208-201
           if Позиции[i].ПЕРЕРАСХ>0:
             счДЕБ=Позиции[i].ФКР+"."+ИФ+"."+Позиции[i].СЧЕТ+"."+УМ_сч208Д;
             if Match(Позиции[i].СЧТКАС, "201.?4.???"):
               счКРЕ=ADM+"."+УМ_КИВФ+"."+ИФ+"."+УМ_КАССА_КРЕ;
             else
               счКРЕ=Позиции[i].ФКР+"."+ИФ+"."+УМ_ЗАРПЛ;
             fi;
             --счКРЕ=ADM+"."+УМ_КИВФ+"."+ИФ+"."+УМ_КАССА_КРЕ;
             k=k+1;
             k=InsertFrame(БУХ_ПРОВОДКИ,k);
             БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].ПЕРЕРАСХ;
             БУХ_ПРОВОДКИ[k].ДЕБ_П=счДЕБ;
             БУХ_ПРОВОДКИ[k].КРЕ_П=счКРЕ;
             БУХ_ПРОВОДКИ[k].АНА_П=A1;
             БУХ_ПРОВОДКИ[k].КОМ_П=Позиции[i].КОММЕН;
             k=k+1;
             k=InsertFrame(БУХ_ПРОВОДКИ,k);
             БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].ПЕРЕРАСХ;
             БУХ_ПРОВОДКИ[k].ДЕБ_П="ЗАБАЛАНС";
             БУХ_ПРОВОДКИ[k].КРЕ_П="ЛИМ_ИСПОЛ";
             БУХ_ПРОВОДКИ[k].АНА_П=B1;
             БУХ_ПРОВОДКИ[k].КОМ_П="использование лимита";
           fi;
         fi;
       od;
     Finally
       CloseProgress;
     end;
   fi;
 fi;
end;

Func ПогашениеМОЛ(Iter: Integer) :Logical;
var tmp, OUT, ACC, ANA, УслАН, УслСЧ, A1, A2 :String;
var sum, sumT, sumN :Numeric;
var dd :Date;
var k, len, i, j, z, num :Integer;
var Lпф, Lпл, Lфкр, Lкосгу, Lст, Lдата :Integer;
var Kпф, Kпл, Kфкр, Kкосгу, Kст, Kдата :Integer;
var Отч1 :Report;
var Режим, OK :Logical;
 СчитатьЗначенияПоУмолчанию;
 ВнешнийВид;
 if not(ПроверкаЗначенийПоУмолчанию): ^False; fi;
 if Позиции[Iter].МОЛ_КОД="":
   Message('Не выбрано материально ответственное лицо!', mtWarning);
   Template.Field="МОЛ_ИМЯ";
   Template.Frame=Iter;
   ^False;
 fi;
 Refresh(False);
 Режим=AutoRefresh;
 ToggleAutoRefresh(False);
 ОчиститьДанныеДляПогашенияМОЛ;
 dd=ДатОпер+1;
 УслАН="МОЛ."+Позиции[Iter].МОЛ_КОД;
 if КОМАНД:
   УслСЧ = "*.?."+УМ_СЧ208+"."+УМ_ссчСУТ+".???"+"|"+"*.?."+УМ_СЧ208+"."+УМ_ссчТРН+".???"+"|"+"*.?."+УМ_СЧ208+"."+УМ_ссчКВР+".???";
   УслАН=Объединить(УслАН, "КОМАНД", "&");
 else
   УслСЧ = "*.?."+УМ_СЧ208+".??.???";
   if FlagТолькоКоманд: УслАН=Объединить(УслАН, "~КОМАНД", "&"); fi;
 fi;
 OUT=PlanVar("ПОДОТЧ")+"\ОТЧЕТЫ\Подотчет.lst";
 Отч1=RepOpen(OUT+"|По_счетам", УслСЧ, УслАН, 1.1.100, dd);
 Try
   RepReset(Отч1);
   while RepNext(Отч1) do
     tmp=RepIdent(Отч1);
     tmp=SubStr(tmp, 1, 30)+"???";
     k=SearchInArray(BufAcc, tmp, True);
     if k<0: k=InsertInArraySort(BufAcc, tmp); fi;
   end;
 Finally
   Отч1=RepClose(Отч1);
 end;
 k=0; Отч1=RepOpen(OUT+"|По_признакам", УслСЧ, УслАН, 1.1.100, dd, "", "П");
 Try RepReset(Отч1); while RepNext(Отч1) do tmp=RepIdent(Отч1); if tmp<>"": k=k+1; BufПФ[k]    = tmp; fi; od; Finally Отч1=RepClose(Отч1); end;
 k=0; Отч1=RepOpen(OUT+"|По_признакам", УслСЧ, УслАН, 1.1.100, dd, "", "П_ЛИМ");
 Try RepReset(Отч1); while RepNext(Отч1) do tmp=RepIdent(Отч1); if tmp<>"": k=k+1; BufПЛ[k]    = tmp; fi; od; Finally Отч1=RepClose(Отч1); end;
 k=0; Отч1=RepOpen(OUT+"|По_признакам", УслСЧ, УслАН, 1.1.100, dd, "", "ФКР");
 Try RepReset(Отч1); while RepNext(Отч1) do tmp=RepIdent(Отч1); if tmp<>"": k=k+1; BufФКР[k]   = tmp; fi; od; Finally Отч1=RepClose(Отч1); end;
 k=0; Отч1=RepOpen(OUT+"|По_признакам", УслСЧ, УслАН, 1.1.100, dd, "", "КОСГУ");
 Try RepReset(Отч1); while RepNext(Отч1) do tmp=RepIdent(Отч1); if tmp<>"": k=k+1; BufКОСГУ[k] = tmp; fi; od; Finally Отч1=RepClose(Отч1); end;
 k=0; Отч1=RepOpen(OUT+"|По_признакам", УслСЧ, УслАН, 1.1.100, dd, "", УМ_СПРАВрасх);
 Try RepReset(Отч1); while RepNext(Отч1) do tmp=RepIdent(Отч1); if tmp<>"": k=k+1; BufСТ[k]    = tmp; fi; od; Finally Отч1=RepClose(Отч1); end;
 k=0; Отч1=RepOpen(OUT+"|По_признакам", УслСЧ, УслАН, 1.1.100, dd, "", "ПЕРИОД");
 Try RepReset(Отч1); while RepNext(Отч1) do tmp=RepIdent(Отч1); if tmp<>"": k=k+1; BufДАТА[k]  = tmp; fi; od; Finally Отч1=RepClose(Отч1); end;
 len=LengthOfArray(BufAcc);
 Lпф=LengthOfArray(BufПФ);
 Lпл=LengthOfArray(BufПЛ);
 Lфкр=LengthOfArray(BufФКР);
 Lст=LengthOfArray(BufСТ);
 Lкосгу=LengthOfArray(BufКОСГУ);
 Lдата=LengthOfArray(BufДАТА);
 if len>0:
   ShowProgress(len, "Сбор данных для отчета ...");
   Try
     k=0;
     for i=1 to len do
       ProgressPos(i);
       ACC=BufAcc[i];
       sum=Saldo(ACC+"{"+УслАН+"}", dd);
       if sum>0 and Lпф>0:
         for Kпф=1 to Lпф do
           ANA=УслАН+"&"+BufПФ[Kпф];
           sum=Saldo(ACC+"{"+ANA+"}", dd);
           if sum>0 and Lпл>0:
             for Kпл=1 to Lпл do
               ANA=УслАН+"&"+BufПФ[Kпф]+"&"+BufПЛ[Kпл];
               sum=Saldo(ACC+"{"+ANA+"}", dd);
               if sum>0 and Lфкр>0:
                 for Kфкр=1 to Lфкр do
                   ANA=УслАН+"&"+BufПФ[Kпф]+"&"+BufПЛ[Kпл]+"&"+BufФКР[Kфкр];
                   sum=Saldo(ACC+"{"+ANA+"}", dd);
                   if sum>0 and Lст>0:
                     for Kст=1 to Lст do
                       ANA=УслАН+"&"+BufПФ[Kпф]+"&"+BufПЛ[Kпл]+"&"+BufФКР[Kфкр]+"&"+BufСТ[Kст];
                       sum=Saldo(ACC+"{"+ANA+"}", dd);
                       if sum>0 and Lкосгу>0:
                         for Kкосгу=1 to Lкосгу do
                           ANA=УслАН+"&"+BufПФ[Kпф]+"&"+BufПЛ[Kпл]+"&"+BufФКР[Kфкр]+"&"+BufСТ[Kст]+"&"+BufКОСГУ[Kкосгу];
                           sum=Saldo(ACC+"{"+ANA+"}", dd);
                           if sum>0:
                             if УМ_USE_ПЕРИОД:
                               if Lдата>0:
                                 for Kдата=1 to Lдата do
                                   ANA=УслАН+"&"+BufПФ[Kпф]+"&"+BufПЛ[Kпл]+"&"+BufФКР[Kфкр]+"&"+BufСТ[Kст]+"&"+BufКОСГУ[Kкосгу]+"&"+BufДАТА[Kдата];
                                   sum=Saldo(ACC+"{"+ANA+"}", dd);
                                   if sum>0:
                                     A1=ANA; A2=Объединить(ANA, "ТИТУЛ", "&");
                                     sumN=0;
                                     sumT=Saldo(ACC+"{"+A2+"}", dd);
                                     sumN=sum-sumT;
                                     OUT="--СЧЕТ6_"+if(КОМАНД, SubStr(ACC, 22, 1)+".???.??", SubStr(ACC, 22, 8));
                                     if sumT>0: k=k+1; BufAna[k]=Объединить(A2, OUT, "&"); fi;
                                     if sumN>0: k=k+1; BufAna[k]=Объединить(A1, OUT, "&"); fi;
                                   fi;
                                 od; -- цикл по периодам
                               fi;
                             else
                               A1=ANA; A2=Объединить(ANA, "ТИТУЛ", "&");
                               sumN=0;
                               sumT=Saldo(ACC+"{"+A2+"}", dd);
                               sumN=sum-sumT;
                               OUT="--СЧЕТ6_"+if(КОМАНД, SubStr(ACC, 22, 1)+".???.??", SubStr(ACC, 22, 8));
                               if sumT>0: k=k+1; BufAna[k]=Объединить(A2, OUT, "&"); fi;
                               if sumN>0: k=k+1; BufAna[k]=Объединить(A1, OUT, "&"); fi;
                             fi;
                           fi;
                         od; -- цикл по КОСГУ
                       fi;
                     od; -- цикл по статьям расхода
                   fi;
                 od; -- цикл ФКР.*
               fi;
             od; -- цикл П_ЛИМ.*
           fi;
         od; -- цикл П.*
       fi;
     od; -- цикл по счетам
   Finally
     CloseProgress;
   end;
 fi;
 len=LengthOfArray(BufAna);
 if len=0: 
   Message("Непогашенных остатков по "+Позиции[Iter].МОЛ_КОД+" не найдено!", mtInformation);
   ToggleAutorefresh(Режим);
   ^False;
 fi;
 if КОМАНД:
   ShowProgress(len, "Обработка полученных данных...");
   Try
     for k=1 to len do
       ProgressPos(k);
       num=WordsCount(BufAna[k], "&");
       if num>0:
         for i=1 to num do
           OUT=ExtractWord(i, BufAna[k], "&");
           if Match(OUT, "КОСГУ.*"):
             BufAna[k]=РАБ.УПП.LIB.DeleteWord(BufAna[k], i, "&");
             Break;
           fi;
         od;
       fi;
     od;
   Finally
     CloseProgress;
   end;
   len=LengthOfArray(BufAna);
   if len>0:
     SortArray(BufAna, True);
     ANA=""; OK=False; k=0;
     ShowProgress(len, "Обработка полученных данных...");
     Try
       for i=1 to len do
         ProgressPos(i);
         if ANA<>BufAna[i]: OK=False; fi; -- одинаковых нет
         if OK=False: -- если не одинаковый, то запоминаем...
           ANA=BufAna[i];
           k=k+1;
           BufAna[k]=ANA;
           OK=True; --... следующий элемент (до проверки) считаем одинаковым
         fi;
       od;
     Finally
       CloseProgress;
     end;
     k=k+1; len=i-1;
     if k<=len:
       i=len;
       while i>=k do DeleteFromArray(BufAna, i); i=i-1; od;
     fi; -- удаляем лишнее
   fi;
 fi;
 k=1;
 ANA=Позиции[Iter].МОЛ_КОД;
 while k<=Позиции do
   if Позиции[k].МОЛ_КОД="" or Позиции[k].МОЛ_КОД=ANA: Try DeleteFrame(Позиции, k); Except end; else k=k+1; fi;
 od;
 len=LengthOfArray(BufAna);
 if len=0: 
   Message("Ошибка формирования результата!", mtError);
   ToggleAutorefresh(Режим);
   ^False;
 fi;
 ShowProgress(len, "Формирование результата...");
 Try
   for k=1 to len do
     ProgressPos(k);
     Try z=InsertFrame(Позиции, Позиции+1); Except Message("Ошибка создания записи!", mtError); Raise; end;
     ANA=BufAna[k];
     num=WordsCount(ANA, "&");
     if num>0:
       for i=1 to num do
         OUT=ExtractWord(i, ANA, "&");
         tmp=GetAnaGlossary(OUT);
         j=Length(tmp)+2;
         if tmp="МОЛ"        : Позиции[z].МОЛ_КОД  = SubStr(OUT, j, 255);
         |  tmp="П"          : Позиции[z].ПО_КОД   = SubStr(OUT, j, 255);
         |  tmp="П_ЛИМ"      : Позиции[z].ПО_Л_КОД = SubStr(OUT, j, 255);
         |  tmp="ФКР"        : Позиции[z].ФКР      = SubStr(OUT, j, 255);
         |  tmp=УМ_СПРАВрасх : Позиции[z].СТАТЬЯ   = SubStr(OUT, j, 255);
         |  tmp="КОСГУ"      : if КОМАНД: Позиции[z].КОСГУ = ""; else Позиции[z].КОСГУ = SubStr(OUT, j, 255); fi;
         |  tmp="ПЕРИОД"     : Позиции[z].ПЕРИОД   = OUT;
         |  tmp=""           : if OUT="ТИТУЛ":
                                 Позиции[z].ТИТ_СТ=True;
                               |  Match(OUT, "--СЧЕТ6_*"):
                                 Позиции[z].ИФД=SubStr(OUT, 9, 1);
                                 if КОМАНД: Позиции[z].СЧЕТ=""; else Позиции[z].СЧЕТ=SubStr(OUT, 11, 6); fi;
                               fi;
         fi;
       od;
       if УМ_ПРИЗН<>"": Позиции[z].ПРИЗН=УМ_ПРИЗН; fi;
     fi;
   od;
 Finally
   CloseProgress;
 end;
 ToggleAutorefresh(Режим);
 ^True;
end;

Proc РежимБыстрогоВвода(flg:Logical);
 if Позиции>0:
   СекцТаблДУ.Visible = flg;
   СекцТаблДМ.Visible = not flg;
 fi;
end;

Proc ФиксироватьШапку(flg:Logical);
   Template.Field="кнЗкр";
   if flg:
      Template.Freeze(asInteger(СекцТаблЗ.Column(8, ColLeft, "")), asInteger(СекцТаблЗ.Row(5, RowTop, "")));
   else
      Template.Freeze(0, 0);
   fi;
   Template.Field="кнЗкр";
end;

Func ВзятьСчет_Косгу(Kosgu:String; oldСчет:String) :String;
 if Kosgu="211": ^"208.11";
 |  Kosgu="212": ^"208.12";
 |  Kosgu="213": ^"208.13";
 |  Kosgu="221": ^"208.21";
 |  Kosgu="222": ^"208.22";
 |  Kosgu="223": ^"208.23";
 |  Kosgu="224": ^"208.24";
 |  Kosgu="225": ^"208.25";
 |  Kosgu="226": ^"208.26";
-- |  Kosgu="241": ^"208.10";
-- |  Kosgu="242": ^"208.11";
-- |  Kosgu="251": ^"208.12";
-- |  Kosgu="252": ^"208.13";
-- |  Kosgu="253": ^"208.14";
 |  Kosgu="261": ^"208.61";
 |  Kosgu="262": ^"208.62";
 |  Kosgu="263": ^"208.63";
 |  Kosgu="290": ^"208.91";
 |  Kosgu="310": ^"208.31";
 |  Kosgu="320": ^"208.32";
 |  Kosgu="330": ^"208.33";
 |  Kosgu="340": ^"208.34";
-- |  Kosgu="520": ^"208.23";
-- |  Kosgu="530": ^"208.24";
 else ^oldСчет;
 fi;
end;

Func ВзятьКосгу_Счет(Acc:String; oldКосгу:String) :String;
 if Acc="208.11": ^"211";
 |  Acc="208.12": ^"212";
 |  Acc="208.13": ^"213";
 |  Acc="208.21": ^"221";
 |  Acc="208.22": ^"222";
 |  Acc="208.23": ^"223";
 |  Acc="208.24": ^"224";
 |  Acc="208.25": ^"225";
 |  Acc="208.26": ^"226";
-- |  Acc="208.10": ^"241";
-- |  Acc="208.11": ^"242";
-- |  Acc="208.12": ^"251";
-- |  Acc="208.13": ^"252";
-- |  Acc="208.14": ^"253";
 |  Acc="208.61": ^"261";
 |  Acc="208.62": ^"262";
 |  Acc="208.63": ^"263";
 |  Acc="208.91": ^"290";
 |  Acc="208.31": ^"310";
 |  Acc="208.32": ^"320";
 |  Acc="208.33": ^"330";
 |  Acc="208.34": ^"340";
-- |  Acc="208.23": ^"520";
-- |  Acc="208.24": ^"530";
 else ^oldКосгу;
 fi;
end;

2-- События клеток
Func Field_onEnter(Field:String; Iter:Integer) :Logical; -- на входе в клетку
var tmp, mask :String;
var nn, old :Integer;
var Flag :Logical;
var REC :Record;
 СчитатьЗначенияПоУмолчанию;
 ВнешнийВид;
 if not(ПроверкаЗначенийПоУмолчанию): ^False; fi;
 if Field="кнОк"      : EditorApply; Close; ^False;
 |  Field="кнНастр"   : REC=ДОКУМЕНТЫ.ПОДОТЧЕТ.НАСТР.КлючЗаписиАктивныхНастроек;
                        OpenBlank("ДОКУМЕНТЫ.ПОДОТЧЕТ.НАСТР", True, REC);
                        СчитатьЗначенияПоУмолчанию;
                        ВнешнийВид;
                        ^False;
 |  Field="кнЗкр"     : EditorCancel; Close; ^False;
 |  Field="F"         : ДобавитьСтрочкиВначало;
                        ^False;
 |  Field="A"         : Try nn=InsertFrame(Позиции, Iter+1); Except end;
                        ПрисвоитьУмолчания(nn);
                        Template.Field="МОЛ_ИМЯ";
                        Template.Frame=Iter+1; 
                        ^False;
 |  Field="D"         : if EnqOkCancel("Вы уверены что хотите удалить данную строчку?", mtConfirmation)=cmOk:
                          Try
                            DeleteFrame(Позиции, Iter);
                            if Позиции>0: Iter=if(Iter>1,Iter-1,1); Template.Frame=Iter; else Template.Field="F"; fi;
                          Except end;
                        fi;
                        ^False;
 |  Field="K"         : old=Iter;
                        Try nn=InsertFrame(Позиции, old+1); Except Raise; end;
                        Позиции[nn].МОЛ_КОД  = Позиции[old].МОЛ_КОД  ;
                        Позиции[nn].ПО_КОД   = Позиции[old].ПО_КОД   ;
                        Позиции[nn].ПО_Л_КОД = Позиции[old].ПО_Л_КОД ;
                        Позиции[nn].ИФД      = Позиции[old].ИФД      ;
                        Позиции[nn].ФКР      = Позиции[old].ФКР      ;
                        Позиции[nn].КОСГУ    = Позиции[old].КОСГУ    ;
                        Позиции[nn].СТАТЬЯ   = Позиции[old].СТАТЬЯ   ;
                        Позиции[nn].СЧЕТ     = Позиции[old].СЧЕТ     ;
                        Позиции[nn].ПЕРИОД   = Позиции[old].ПЕРИОД   ;
                        Позиции[nn].ПРИЗН    = Позиции[old].ПРИЗН    ;
                        Template.Field="МОЛ_ИМЯ";
                        Template.Frame=nn;
                        ^False;
 |  Field="ВСЕ"       : nn=ВыборВидаТаблицы(-1); 
                        if nn>=0:
                          ВидТ_МОЛ   =nn;
                          ВидТ_ПО    =nn;
                          ВидТ_ПОЛ   =nn;
                          ВидТ_ФКР   =nn;
                          ВидТ_КОСГУ =nn;
                          ВидТ_СЧЕТ  =nn;
                          ВидТ_СТ    =nn;
                        fi;
                        ^False;
 |  Field="ВидТ_МОЛ"  : ВидТ_МОЛ   = ВыборВидаТаблицы(ВидТ_МОЛ  ); ^False;
 |  Field="ВидТ_ПО"   : ВидТ_ПО    = ВыборВидаТаблицы(ВидТ_ПО   ); ^False;
 |  Field="ВидТ_ПОЛ"  : ВидТ_ПОЛ   = ВыборВидаТаблицы(ВидТ_ПОЛ  ); ^False;
 |  Field="ВидТ_ФКР"  : ВидТ_ФКР   = ВыборВидаТаблицы(ВидТ_ФКР  ); ^False;
 |  Field="ВидТ_КОСГУ": ВидТ_КОСГУ = ВыборВидаТаблицы(ВидТ_КОСГУ); ^False;
 |  Field="ВидТ_СЧЕТ" : ВидТ_СЧЕТ  = ВыборВидаТаблицы(ВидТ_СЧЕТ ); ^False;
 |  Field="ВидТ_ГАШ"  : ВидТ_ГАШ   = ВыборВидаТаблицы(ВидТ_ГАШ  ); ^False;
 |  Field="ВидТ_СТ"   : ВидТ_СТ    = ВыборВидаТаблицы(ВидТ_СТ   ); ^False;
 |  Field="ВидТ_СЧКР" : ВидТ_СЧКР  = ВыборВидаТаблицы(ВидТ_СЧКР ); ^False;
 |  Field="МОЛ_ИМЯ"   : tmp=AnaElection('МОЛ.*', False, False, Позиции[Iter].МОЛ_КОД);
                        if tmp="": ^False; fi;
                        Позиции[Iter].МОЛ_КОД=SubStr(tmp, 5, 255);
                        Flag=False;
                        if ВставитьДолги: Flag=ПогашениеМОЛ(Iter); fi;
                        if Flag=False:
                          if ВыборПсМОЛ:
                            if not(AutoRefresh): RefreshAna; fi;
                            REC=SignToRecord(tmp, False);
                            if REC<>NIL:
                              -- Подразделение
                              REC=GetCardFieldR("СОТРУДНИКИ", REC, "ПОДРАЗДЕЛЕНИЕ");
                              if REC<>NIL:
                                tmp=GetCardFieldS("ПОДРАЗДЕЛЕНИЯ", REC, "КОД");
                                if tmp<>"":
                                  Позиции[Iter].ПО_КОД=tmp;
                                  Позиции[Iter].ПО_Л_КОД=tmp;
                                fi;
                              fi;
                            fi;
                          fi;
                        fi;
                        ^False;
 |  Field="ПО_ИМЯ"    : tmp=AnaElection('П.*', False, False, Позиции[Iter].ПО_КОД);
                        if tmp="": ^False; fi;
                        Позиции[Iter].ПО_КОД=SubStr(tmp, 3, 255);
                        Позиции[Iter].ПО_Л_КОД=Позиции[Iter].ПО_КОД;
                        ^False;
 |  Field="ПО_Л_ИМЯ"  : tmp=AnaElection('П_ЛИМ.*', False, False, Позиции[Iter].ПО_Л_КОД);
                        if tmp="": ^False; fi;
                        Позиции[Iter].ПО_Л_КОД=SubStr(tmp, 7, 255);
                        ^False;
 |  Field="ИФД_"      : if ВыборСЧ:
                          ВыборСчетаСтруктуры(Iter, "СЧПОДОТ");
                        else
                          Позиции[Iter].ИФД=ВыборИФД(Позиции[Iter].ИФД);
                          tmp=Позиции[Iter].ИФД;
                          Flag=Match(Позиции[Iter].ФКР, "???.0000.0000000.000");
                          if tmp="1": if Flag: Позиции[Iter].ФКР=""; fi;
                          |  tmp="2" or tmp="3": if not(Flag): Позиции[Iter].ФКР=""; fi;
                          else Позиции[Iter].ФКР="";
                          fi;
                        fi;
                        ^False;
 |  Field="ФКР_ИМЯ"   : if ВыборСЧ:
                          ВыборСчетаСтруктуры(Iter, "СЧПОДОТ");
                        else
                          if Позиции[Iter].ИФД="": Message("Сначала выберите источник финансирования!", mtWarning); Template.Field="ИФД_"; Template.Frame=Iter; ^False; fi;
                          if Позиции[Iter].ИФД="1":                        tmp=AnaElection("ФКР!&~ФКР.???.????.0000000.000!", False, False, "ФКР."+Позиции[Iter].ФКР);
                          |  Позиции[Iter].ИФД="2" or Позиции[Iter].ИФД="3": tmp=AnaElection("ФКР.???.0000.0000000.000!",       False, False, "ФКР."+Позиции[Iter].ФКР);
                          fi;
                          if tmp="": ^False; fi;
                          Позиции[Iter].ФКР=SubStr(tmp, 5, 255);
                        fi;
                        ^False;
 |  Field="СЧЕТ_ИМЯ"  : if ВыборСЧ: ВыборСчетаСтруктуры(Iter, "СЧПОДОТ"); else ВыборСчетаПодотчетаАналитика(Iter); fi;
                        Позиции[Iter].КОСГУ=ВзятьКосгу_Счет(Позиции[Iter].СЧЕТ, Позиции[Iter].КОСГУ);
                        ^False;
 |  Field="ГАШ_ИМЯ"   : if ВыборСЧ: ВыборСчетаСтруктуры(Iter, "СЧПОГАШ"); else ВыборСчетаПогашенияАналитика(Iter); fi;
                        ^False;
 |  Field="КОСГУ_ИМЯ" : tmp=ВыборЭКР(Позиции[Iter].КОСГУ);
                        if tmp="": ^False; fi;
                        Позиции[Iter].КОСГУ=tmp;
                        Позиции[Iter].СЧЕТ=ВзятьСчет_Косгу(Позиции[Iter].КОСГУ, Позиции[Iter].СЧЕТ);
                        ^False;
 |  Field="СТ_ИМЯ"    : tmp=AnaElection(УМ_СПРАВрасх, False, False, УМ_СПРАВрасх+"."+Позиции[Iter].СТАТЬЯ);
                        if tmp="": ^False; fi;
                        Позиции[Iter].СТАТЬЯ=SubStr(tmp, Length(GetAnaGlossary(tmp))+2, 255);
                        ^False;
 |  Field="ТИТ_СТ"    : Позиции[Iter].ТИТ_СТ=not(Позиции[Iter].ТИТ_СТ); ^False;
 |  Field="ГГ" or Field="КВ"
                      : tmp=AnaElection('ПЕРИОД.????.?', False, True, Позиции[Iter].ПЕРИОД);
                        if tmp<>"":
                          if Match(tmp,"ПЕРИОД."): tmp=""; fi;
                          if Match(tmp,"ПЕРИОД.????."): tmp=SubStr(tmp,1,Length(tmp)-1); fi;
                          Позиции[Iter].ПЕРИОД=tmp;
                        fi;
                        ^False;
 |  Field="ПРИЗН_"    : mask=СправочникиСчетовПроверенные(КОМАНД, Iter);
                        if mask=" ": ^False; fi;
                        if mask="": Message("Аналитические признаки не требуются!", mtInformation); ^False; fi;
                        tmp=AnaElection(mask);
                        if tmp="": ^False; fi;
                        Позиции[Iter].Призн=РАБ.БЮДЖЕТ.ДобавитьПризнак(Позиции[Iter].Призн, tmp);
                        Позиции[Iter].Призн=Раб.Бюджет2005.СортироватьНаборСлов(Позиции[Iter].Призн," ",True);
                        ^False;
 |  Field="СЧТКАС_ИМЯ": ClearVariable(Buf);
                        Buf[1]="Счет перерасхода аванса: касса [201.34]";
                        Buf[2]="Счет перерасхода аванса: банк_ [304.03]";
                        nn=Alternate("Выберите счет...", Buf, -1, 1, 12);
                        if nn=1: Позиции[Iter].СЧТКАС=УМ_КАССА_КРЕ;
                        |  nn=2: Позиции[Iter].СЧТКАС=УМ_ЗАРПЛ;
                                 if addЗАРПЛ:
                                   Позиции[Iter].Призн=РАБ.БЮДЖЕТ.ДобавитьПризнак(Позиции[Iter].Призн, "БУХ.КОМАНД");
                                   Позиции[Iter].Призн=РАБ.БЮДЖЕТ.ДобавитьПризнак(Позиции[Iter].Призн, "БАЗА.КОМАНД");
                                   Позиции[Iter].Призн=РАБ.БЮДЖЕТ.ДобавитьПризнак(Позиции[Iter].Призн, "УДЕРЖ.ВКЛАД");
                                   Позиции[Iter].Призн=Раб.Бюджет2005.СортироватьНаборСлов(Позиции[Iter].Призн," ",True);
                                 fi;
                        fi;
                        ^False;
 fi;
 if ПроверитьДляСтроки(Field, Iter, False)=False: ^False; fi;
 ^True;
end; 

Proc Field_onExit(Field:String; Iter:Integer); -- на выходе из клетки
 if Field="ДатОпер"   : ПоказатьТаблицу;
                        РежимБыстрогоВвода(EditState);
                        ФиксироватьШапку(ФиксШапка);
 |  Field="МОЛ_ИМЯ"   : Позиции[Iter].МОЛ_КОД="";
 |  Field="ПО_ИМЯ"    : Позиции[Iter].ПО_КОД="";
 |  Field="ПО_Л_ИМЯ"  : Позиции[Iter].ПО_Л_КОД="";
 |  Field="ИФД_"      : if Позиции[Iter].ИФД="": Позиции[Iter].ФКР=""; fi;
 |  Field="ФКР_ИМЯ"   : Позиции[Iter].ФКР="";
 |  Field="СЧЕТ_ИМЯ"  : Позиции[Iter].СЧЕТ="";
 |  Field="ГАШ_ИМЯ"   : Позиции[Iter].СЧЕТП="";
 |  Field="КОСГУ_ИМЯ" : Позиции[Iter].КОСГУ="";
 |  Field="СТ_ИМЯ"    : Позиции[Iter].СТАТЬЯ="";
 |  Field="ГГ"        : Позиции[Iter].ПЕРИОД="";
 |  Field="КВ"        : Позиции[Iter].ПЕРИОД="";
 |  Field="ПРИЗН_"    : Позиции[Iter].Призн=РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабора_Диалог(Позиции[Iter].Призн, " ");
                        Exit;
 |  Field="СЧТКАС_ИМЯ" : Позиции[Iter].СЧТКАС="";
 fi;
-- if ПроверитьДляСтроки(Field, Iter, True)=False: Exit; fi;
 if ПроверитьДляСтроки(Field, Iter, False)=False: Exit; fi;
 Пересчет(Field, Iter);
end;

Func Дата_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var dd :Date;
 Template.HideEditor(False);
 dd=ВыборДаты(GetDate(Row));
 SetDate(dd, Row);
 ПоказатьТаблицу;
 РежимБыстрогоВвода(EditState);
 ФиксироватьШапку(ФиксШапка);
 ^"";
end;

Func НомерБум_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
 Template.HideEditor(False);
 Номер=РАБ.ОБЛ.СледСУчетомГодаФ(SelfCrd,"НОМЕР","ДАТОПЕР","UKey<>"+RecordToString(Current));
 НомерБум=Str(Номер);
 ^"";
end;

Func Расшифровка_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Путь, name, МаскаСЧ :String;
var dd1 :Date;
 Template.HideEditor(False);
 СчитатьЗначенияПоУмолчанию;
 ВнешнийВид;
 if not(ПроверкаЗначенийПоУмолчанию): ^""; fi;
 if Позиции[Row].МОЛ_КОД="":
   Message('Не выбрано материально ответственное лицо!', mtWarning);
   Template.Field="МОЛ_ИМЯ";
   Template.Frame=Row;
   ^"";
 fi;
 name=asString(Template.Field);
 if name="ОСТ_МОЛ"     : МаскаСЧ="*.?."+УМ_СЧ208+".??.???";
 |  name="ОСТ_МОЛ_СУТ" : МаскаСЧ="*.?."+УМ_СЧ208+"."+УМ_ссчСУТ+".???";
 |  name="ОСТ_МОЛ_ТРН" : МаскаСЧ="*.?."+УМ_СЧ208+"."+УМ_ссчТРН+".???";
 |  name="ОСТ_МОЛ_КВР" : МаскаСЧ="*.?."+УМ_СЧ208+"."+УМ_ссчКВР+".???";
 fi;
 Путь=PlanVar("ПОДОТЧ")+"\ОТЧЕТЫ\Подотчет.lst";
 dd1=Dat(1, if(Mon(ДАТОПЕР)>6,7,1), Year(ДАТОПЕР)-1);
 Report(Путь+"|Отчет по МОЛу", dd1, ДАТОПЕР+1, МаскаСЧ, "МОЛ."+Позиции[Row].МОЛ_КОД);
 ^"";
end;

Func Сумма_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var name :String;
 Template.HideEditor(False);
 name=asString(Template.Field);
 if ПроверитьДляСтроки(name, Row, False)=False: ^""; fi;
 if name="СУММА_П" : Позиции[Row].СУММА_П  = Calculator(Позиции[Row].СУММА_П );
                     Позиции[Row].ОСТ_АВ   = Deb(СУМ_НЕП_АВ[Row]-Позиции[Row].СУММА_П);
                     Позиции[Row].ПЕРЕРАСХ = Cre(СУМ_НЕП_АВ[Row]-Позиции[Row].СУММА_П);
 |  name="ОСТ_АВ"  : Позиции[Row].ОСТ_АВ   = Calculator(Позиции[Row].ОСТ_АВ  );
 |  name="ПЕРЕРАСХ": Позиции[Row].ПЕРЕРАСХ = Calculator(Позиции[Row].ПЕРЕРАСХ);
 |  name="СУТОЧН"  : Позиции[Row].СУТОЧН   = Calculator(Позиции[Row].СУТОЧН  );
                     Позиции[Row].ОСТ_СУТ  = Deb(СУМ_НЕП_СУТ[Row]-(Позиции[Row].СУТОЧН+Позиции[Row].ВЕД_СУТ));
                     Позиции[Row].РАСХ_СУТ = Cre(СУМ_НЕП_СУТ[Row]-(Позиции[Row].СУТОЧН+Позиции[Row].ВЕД_СУТ));
 |  name="ПРОЕЗД"  : Позиции[Row].ПРОЕЗД   = Calculator(Позиции[Row].ПРОЕЗД  );
                     Позиции[Row].ОСТ_ТР   = Deb(СУМ_НЕП_ТР[Row]-(Позиции[Row].ПРОЕЗД+Позиции[Row].ВЕД_ТР));
                     Позиции[Row].РАСХ_ТР  = Cre(СУМ_НЕП_ТР[Row]-(Позиции[Row].ПРОЕЗД+Позиции[Row].ВЕД_ТР));
 |  name="ПРОЖИВ"  : Позиции[Row].ПРОЖИВ   = Calculator(Позиции[Row].ПРОЖИВ  );
                     Позиции[Row].ОСТ_КВ   = Deb(СУМ_НЕП_КВ[Row]-(Позиции[Row].ПРОЖИВ+Позиции[Row].ВЕД_КВ));
                     Позиции[Row].РАСХ_КВ  = Cre(СУМ_НЕП_КВ[Row]-(Позиции[Row].ПРОЖИВ+Позиции[Row].ВЕД_КВ));
 |  name="ВЕД_СУТ" : Позиции[Row].ВЕД_СУТ  = Calculator(Позиции[Row].ВЕД_СУТ );
                     Позиции[Row].ОСТ_СУТ  = Deb(СУМ_НЕП_СУТ[Row]-(Позиции[Row].СУТОЧН+Позиции[Row].ВЕД_СУТ));
                     Позиции[Row].РАСХ_СУТ = Cre(СУМ_НЕП_СУТ[Row]-(Позиции[Row].СУТОЧН+Позиции[Row].ВЕД_СУТ));
 |  name="ВЕД_ТР"  : Позиции[Row].ВЕД_ТР   = Calculator(Позиции[Row].ВЕД_ТР  );
                     Позиции[Row].ОСТ_ТР   = Deb(СУМ_НЕП_ТР[Row]-(Позиции[Row].ПРОЕЗД+Позиции[Row].ВЕД_ТР));
                     Позиции[Row].РАСХ_ТР  = Cre(СУМ_НЕП_ТР[Row]-(Позиции[Row].ПРОЕЗД+Позиции[Row].ВЕД_ТР));
 |  name="ВЕД_КВ"  : Позиции[Row].ВЕД_КВ   = Calculator(Позиции[Row].ВЕД_КВ  );
                     Позиции[Row].ОСТ_КВ   = Deb(СУМ_НЕП_КВ[Row]-(Позиции[Row].ПРОЖИВ+Позиции[Row].ВЕД_КВ));
                     Позиции[Row].РАСХ_КВ  = Cre(СУМ_НЕП_КВ[Row]-(Позиции[Row].ПРОЖИВ+Позиции[Row].ВЕД_КВ));
 |  name="ОСТ_СУТ" : Позиции[Row].ОСТ_СУТ  = Calculator(Позиции[Row].ОСТ_СУТ );
 |  name="ОСТ_ТР"  : Позиции[Row].ОСТ_ТР   = Calculator(Позиции[Row].ОСТ_ТР  );
 |  name="ОСТ_КВ"  : Позиции[Row].ОСТ_КВ   = Calculator(Позиции[Row].ОСТ_КВ  );
 |  name="РАСХ_СУТ": Позиции[Row].РАСХ_СУТ = Calculator(Позиции[Row].РАСХ_СУТ);
 |  name="РАСХ_ТР" : Позиции[Row].РАСХ_ТР  = Calculator(Позиции[Row].РАСХ_ТР );
 |  name="РАСХ_КВ" : Позиции[Row].РАСХ_КВ  = Calculator(Позиции[Row].РАСХ_КВ );
 fi;
 ^"";
end;

Func Field_OnValidateN(Field:String; Iter:Integer; Value:Numeric) :Logical;
 if Value<0 : Message('Нельзя вводить отрицательное число.', mtError); ^False; fi;
 if Field="СУММА_П" : 
   Позиции[Iter].СУММА_П  = Value;
   Позиции[Iter].ОСТ_АВ   = Deb(СУМ_НЕП_АВ[Iter]-Value);
   Позиции[Iter].ПЕРЕРАСХ = Cre(СУМ_НЕП_АВ[Iter]-Value);
 |  Field="СУТОЧН"  : 
   Позиции[Iter].СУТОЧН   = Value;
   Позиции[Iter].ОСТ_СУТ  = Deb(СУМ_НЕП_СУТ[Iter]-(Value+Позиции[Iter].ВЕД_СУТ));
   Позиции[Iter].РАСХ_СУТ = Cre(СУМ_НЕП_СУТ[Iter]-(Value+Позиции[Iter].ВЕД_СУТ));
 |  Field="ПРОЕЗД"  :
   Позиции[Iter].ПРОЕЗД   = Value;
   Позиции[Iter].ОСТ_ТР   = Deb(СУМ_НЕП_ТР[Iter]-(Value+Позиции[Iter].ВЕД_ТР));
   Позиции[Iter].РАСХ_ТР  = Cre(СУМ_НЕП_ТР[Iter]-(Value+Позиции[Iter].ВЕД_ТР));
 |  Field="ПРОЖИВ"  :
   Позиции[Iter].ПРОЖИВ   = Value;
   Позиции[Iter].ОСТ_КВ   = Deb(СУМ_НЕП_КВ[Iter]-(Value+Позиции[Iter].ВЕД_КВ));
   Позиции[Iter].РАСХ_КВ  = Cre(СУМ_НЕП_КВ[Iter]-(Value+Позиции[Iter].ВЕД_КВ));
 |  Field="ВЕД_СУТ" :
   Позиции[Iter].ВЕД_СУТ  = Value;
   Позиции[Iter].ОСТ_СУТ  = Deb(СУМ_НЕП_СУТ[Iter]-(Позиции[Iter].СУТОЧН+Value));
   Позиции[Iter].РАСХ_СУТ = Cre(СУМ_НЕП_СУТ[Iter]-(Позиции[Iter].СУТОЧН+Value));
 |  Field="ВЕД_ТР"  :
   Позиции[Iter].ВЕД_ТР   = Value;
   Позиции[Iter].ОСТ_ТР   = Deb( СУМ_НЕП_ТР[Iter]-(Позиции[Iter].ПРОЕЗД+Value));
   Позиции[Iter].РАСХ_ТР  = Cre( СУМ_НЕП_ТР[Iter]-(Позиции[Iter].ПРОЕЗД+Value));
 |  Field="ВЕД_КВ"  :
   Позиции[Iter].ВЕД_КВ   = Value;
   Позиции[Iter].ОСТ_КВ   = Deb( СУМ_НЕП_КВ[Iter]-(Позиции[Iter].ПРОЖИВ+Value));
   Позиции[Iter].РАСХ_КВ  = Cre( СУМ_НЕП_КВ[Iter]-(Позиции[Iter].ПРОЖИВ+Value));
 fi;
 ^True;
end;

2-- События объектов
Proc cbПроводить_onChange(Sender:String);
var Flag, SaveOK :Logical;
var n :Integer;
 if Проводить=False:
    SaveOK=True; -- если защита 'снимается' значит проверка данных уже производилась
    n=EnqOkCancel("Вы действительно хотите исключить данный документ из обработки?", mtConfirmation);
    if n=cmCancel: Flag=True; else Flag=False; fi;
   else
    SaveOK=ПроверкаСтруктурыУчета(КОМАНД); 
    СформироватьПроводки(SaveOK); 
    Flag=SaveOK;
 fi;
 Проводить=Flag; cbПроводить.State=Проводить;
 ТолькоЧтение(Flag);
 if not(SaveOK): Exit; fi; -- Избегаем двойных сообщений
 EditorApply;
end;

Proc cbClosedModFob_onChange(Sender:String);
var Flag :Logical;
var q :Integer;
 if ClosedModFob=True:
    q=EnqOkCancel("Вы действительно хотите заблокировать документ?"+Chr(13)+Chr(13)+
                  "Дальнейшие изменения документа будут невозможны."+Chr(13)+
                  "Разблокировать документ сможет только пользователь наделенный соответствующими правами.", mtConfirmation);
    if q=cmCancel: Flag=False; else Flag=True; fi;
   else
    q=EnqOkCancel("Вы действительно хотите разблокировать документ?", mtConfirmation);
    if q=cmCancel: Flag=True; else Flag=False; fi;
 fi;
 ClosedModFob=Flag; cbClosedModFob.State=ClosedModFob;
end;

Proc cbEditState_onChange(Sender:String);
 РежимБыстрогоВвода(EditState);
end;

Proc cbФиксШапка_onChange(Sender:String);
 ФиксироватьШапку(ФиксШапка);
end;

2-- События шаблона
Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
var Цв :Integer;
var tmp :String;
 if GetScheme="": cbClosedModFob.Visible=False; else cbClosedModFob.Visible=True; fi;
 EnableCommands(False, cmDublRec);
 Цв=РАБ.УПП.LIB.Цвет(236, 233, 216);
 СекцОбщая.Cell(2, 2, CellBgColor, Цв);
 СекцОбщая.Cell(2, 4, CellBgColor, Цв);
 СекцОбщая.Cell(2, 7, CellBgColor, Цв);
-- РАБ.НАСТР_ПЕЧАТЬ.Cfg("","Rpo_погашение_аванса_000.cfg");
 РАБ.НАСТР_ПЕЧАТЬ.Cfg(PlanVar("ПОДОТЧ")+"\Настройки\","Rpo_погашение_аванса_000.cfg");
 ЦветаПолей(Цв);
 tmp=UserName(AliasName("РПО_ПОДОТЧ_ЛИМИТ"));
 Пользов=if(tmp<>"", "Пользователь - "+tmp, "Пользователь локальной версии");
 First=True;
end;

Proc Template_OnClose(Destroy:Logical); -- при закрытии шаблона
 ClearVariable(BufField); ClearVariable(BufColorBg); ClearVariable(BufColorFo);
 Очистить;
 if CurrentState=CrdusUndefined: Destroy=True; fi;
end;

Proc Template_onRead; -- при считывании шаблона
var nn :Integer;
 Очистить;
 if not First:
   if NewREC:
     ClearVariable(Buf); nn=0; Buf[1]="Погашение командировок МОЛа"; Buf[2]="Погашение прочего расхода МОЛа";
     while nn=0 do nn=Alternate("Выберите тип операции...", Buf, -1, 1, 12); od;
     if nn=1: КОМАНД=True; else КОМАНД=False; fi;
     cbКомандировки.State=КОМАНД;
     if Номер=0: ДАТОПЕР=ToDay; fi;
     Номер=РАБ.ОБЛ.СледСУчетомГода(SelfCrd,"НОМЕР","ДАТОПЕР");
     НомерБум=Str(Номер);
     Проводить=False;
   fi;
   if КОМАНД: FlagКОСГУ=False; fi;
   cbFlagКОСГУ.Enabled=not(КОМАНД);
   СчитатьЗначенияПоУмолчанию;
   ВнешнийВид;
   ВыборСЧ=УМ_ВЫБОР_СЧ;
   Iter_Validation;
   ТолькоЧтение(Проводить);
   СкрытыеСтолбцы(КОМАНД, True);
   Перенумеровать;
   ПоказатьТаблицу;
   РежимБыстрогоВвода(EditState);
   ФиксироватьШапку(ФиксШапка);
   НеПроверятьПерерасход=False;
   Template.Field="кнЗкр";
 fi;
end;

Proc Template_AfterOpen(Create:Logical); -- при открытии шаблона
var nn :Integer;
 if First:
   if NewREC:
     ClearVariable(Buf); nn=0; Buf[1]="Погашение командировок МОЛа"; Buf[2]="Погашение прочего расхода МОЛа";
     while nn=0 do nn=Alternate("Выберите тип операции...", Buf, -1, 1, 12); od;
     if nn=1: КОМАНД=True; else КОМАНД=False; fi;
     cbКомандировки.State=КОМАНД;
     if Номер=0: ДАТОПЕР=ToDay; fi;
     Номер=РАБ.ОБЛ.СледСУчетомГода(SelfCrd,"НОМЕР","ДАТОПЕР");
     НомерБум=Str(Номер);
     Проводить=False;
   fi;
   if КОМАНД: FlagКОСГУ=False; fi;
   cbFlagКОСГУ.Enabled=not(КОМАНД);
   СчитатьЗначенияПоУмолчанию;
   ВнешнийВид;
   ВыборСЧ=УМ_ВЫБОР_СЧ;
   Iter_Validation;
   ТолькоЧтение(Проводить);
   СкрытыеСтолбцы(КОМАНД, True);
   Перенумеровать;
   ПоказатьТаблицу;
   РежимБыстрогоВвода(EditState);
   ФиксироватьШапку(ФиксШапка);
   НеПроверятьПерерасход=False;
   Template.Field="кнЗкр";
 fi;
 First=False;
end;

Proc Template_onCancel; -- при отмене редактирования шаблона
 Очистить;
 if CurrentState=CrdusUndefined: 
   Message("Была произведена отмена редактирования!^MВ картотеке нет записей, бланк будет закрыт.", mtInformation);
   Close;
 fi;
 ПоказатьТаблицу; 
 РежимБыстрогоВвода(EditState);
 ФиксироватьШапку(ФиксШапка);
end;

Func Template_OnValidate: Logical; -- при проверке шаблона
var n :Integer;
var SaveOK :Logical;
 if not(NewREC): if not(TemplateSaveOK): ^False; fi; fi;
 if NewREC and not(Проводить):
   if not(TemplateSaveOK): ^False; fi;
   n=EnqOkCancel("Провести данный документ по учету?", mtConfirmation);
   if n=cmOk: 
     SaveOK=ПроверкаСтруктурыУчета(КОМАНД); 
     СформироватьПроводки(SaveOK);
     Проводить=SaveOK;
     cbПроводить.State=Проводить;
     ТолькоЧтение(SaveOK);
   fi;
 fi;
 ^True;
end;

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