--
--
-- Разработка бланка: ТБ.БЮДЖЕТ
БЛАНКСШАБЛОНОМ "Корректировка амортизации";

2--0 НАСТРОЙКИ приложения
var cnstUseYYY     :Logical=True;
--var cnstUseYYY     :Logical=False;
--
var dflt_DopAnaVoc :String="";
--var dflt_DopAnaVoc :String="ВД М МОЛ П";
--
var cnstAccYYY     :String="401.20.271";
var cnstAcc401     :String="401.20.271";
var cnstAcc109     :String="109.60.271";
--
var use109to_1     :Logical=False;
var use109to_2     :Logical=True;
var use109to_4     :Logical=True;
var use109to_7     :Logical=False;

2--0 2Общие настроечные переменные
var btnName_Menu   :String="Журнал корректировки амортизации (исправительные проводки)";
var Фокус          :String="";
var SelfCRD_Z      :String="ТББ_АМТКОРР_З";
var SelfCRD_T      :String="ТББ_АМТКОРР_Т";
var ValidDate      :Date=1.1.1800;
var кнпМ01         :String="ВСЕ строки отчета";
var кнпМ02         :String="Откорректированные строки отчета";
var кнпМ03         :String="Строки отчета прошедшие проверку";
var кнпМ04         :String="Пропущенные, ошибочные строки отчета";
var искл_меню      :String="...";
var допА_меню      :String="...";
var currКнопка     :Integer=[1];

-- 2Объекты
btnCloseBln        :Object;
btn_NewKorr        :Object;
btnLoadKorr        :Object;
btnSaveKorr        :Object;
btn_DelKorr        :Object;
btnClearKor        :Object;

cb_Проводить       :Object;
cb_ТолькоОтчет     :Object;
lblWarning01       :Object;

sctШапка1          :Object;
sctШапка2          :Object;
sctШапка3          :Object;
sctШапка4          :Object;
sctWorkЗ_М         :Object;
sctWorkЗАГ         :Object;
sctWorkТБ1         :Object;
sctWorkТБ2         :Object;
sctWorkПД1         :Object;
sctWorkПД2         :Object;

var Позиции        :Integer;
var Позиции2       :Integer;
var Visible_Кнопки :Logical=if(Позиции>0, True, False);

2--0 2Переменные
var Flag_onEnter   :Logical;
var ДАТОТЧ         :Date;
var ДАТПРД         :Date;
var ДАТИСП         :Date;
var УЧТГОД         :Integer;
var SAVГОД         :Integer;
var ОТЧАНА         :String;
var SAVАНА         :String;
var УЧТМЕС         :Integer;
var МЕССТР         :String;
var МЕССТР_        :String=МЕССТР;
var SystemKeys     :String;
var countSAVE      :Integer;
var countELEM      :Integer;

var flgПроводить   :Logical=[False];
var flgТолькоОтчет :Logical=[False];

УЧР_SREC           :Record;
УЧР_НАИМ           :String;
УЧР_ОКПО           :String;

ИСПREC             :Record;
ИСПФИО             :String;
ИСПДОЛ             :String;

var sav_ДАТПРД     :Date;    --дата проводок (для контроля изменений)
var sav_Проводить  :Logical; --флаг проводить (для контроля изменений)
var sav_УЧР_SREC   :Record;  --учреждение - ссылка на контрагента (для контроля изменений)
var sav_УЧР_НАИМ   :String;  --учреждение - наименование (для контроля изменений)
var sav_УЧР_ОКПО   :String;  --учреждение - ОКПО (для контроля изменений)
--
var sav_ИСПREC     :Record;  --исполнитель - ссылка на сотрудника (для контроля изменений)
var sav_ИСПФИО     :String;  --исполнитель - Ф.И.О. (для контроля изменений)
var sav_ИСПДОЛ     :String;  --исполнитель - должность (для контроля изменений)
var sav_ДАТИСП     :Date;    --дата подписи (исполнения) (для контроля изменений)
var sav_ИСКЛЮЧ[]   :Logical; --исключить строку (пользователь) (для контроля изменений)
var sav__ДОПАН[]   :String;  --дополнительная аналитика (для контроля изменений)

2--0 2Массивы
var Buf[]           :String;
var aAna[]          :String;
var Lock[]          :Record;
var BufРЧТ[]        :String;
var TxtРЧТ[]        :String;
var VocMsk[]        :String;

var rep_UNIQUE_[]   :String;    -- инвентарные объекты (уникальные элементы)
var repСЧЕТАМРТ[]   :String;    -- счет учета амортизации
var rep_КОДМХЭ_[]   :String;    -- код местонахождения
var repБАЛСУМ_Y[]   :Numeric;   -- балансовая сумма на начало года
var repБАЛКОЛ_Y[]   :Numeric;   -- количество на начало года
var repАМТ104_Y[]   :Numeric;   -- амортизация на начало года (свертка по 104 инв.объекта)
var repБАЛСУМ_C[]   :Numeric;   -- балансовая сумма на отчетную дату
var repБАЛКОЛ_C[]   :Numeric;   -- количество на отчетную дату
var repАМТ104_C[]   :Numeric;   -- амортизация на отчетную дату (свертка по 104 инв.объекта)

-- таблица
var NN[]            :Numeric=$; -- номер по порядку
var тблКОДНФА[]     :String;    -- код НФА
var тблНМННФА[]     :String;    -- наименование НФА
var тблИНВНОМ[]     :String;    -- инвентарный номер
var тблУЧННОМ[]     :String;    -- учетный номер
var тблДАТУЧТ[]     :Date;      -- дата принятия к учету
var тблДАТЭКС[]     :Date;      -- дата ввода в эксплуатацию
var тблСРКНРМ[]     :String;    -- срок эксплутации - норма
var тблСРКФКТ[]     :String;    -- срок эксплутации - факт
var тбл_НОВОЕ[]     :Logical;   -- новое имущество или было в эксплуатации
var тблБЛСУМY[]     :Numeric;   -- балансовая сумма на начало года
var тблБЛСУМC[]     :Numeric;   -- балансовая сумма на отчетную дату
var тблАМФКТY[]     :Numeric;   -- начисленная амортизация факт   на начало года
var тблАМРЧТY[]     :Numeric;   -- начисленная амортизация расчет на начало года
var тблАМКОРY[]     :Numeric;   -- сумма корректировки амортизации на начало года
var тблАМФКТC[]     :Numeric;   -- начисленная амортизация факт   на отчетную дату
var тблАМРЧТC[]     :Numeric;   -- начисленная амортизация расчет на отчетную дату
var тблАМКОРC[]     :Numeric;   -- сумма корректировки амортизации на отчетную дату
var тбл_РЕЗУЛ[]     :Integer;   -- статус результата проверки
var тблКБКПРВ[]     :String;    -- КБК проводки
var тблДЕБПРY[]     :String;    -- дебет  проводки на начало года
var тблКРЕПРY[]     :String;    -- кредит проводки на начало года
var тблДЕБПРC[]     :String;    -- дебет  проводки на отчетную дату
var тблКРЕПРC[]     :String;    -- кредит проводки на отчетную дату
var тблПРИЧИН[]     :String;    -- метод исправления или описание ошибки (текст)
var тбл_STATE[]     :Integer;   -- классификация типа записи для возможных исправления
var тблИСКЛЮЧ[]     :Logical;   -- исключить строку (пользователь)
var тбл_TRANS[]     :Logical;   -- позиция с проводкой
var тбл_ДОПАН[]     :String;    -- дополнительная аналитика для проводки
--
var тбs_COUNT[]     :Integer;   -- счетчик сохранений
var тбs_TRKEY[]     :Record;    -- ссылка на проводку

var тб2_REFNN[]     :Integer;   -- ссылка на порядок строки в основной таблице
var тб2КОДНФА[]     :String;    -- код НФА
var тб2НМННФА[]     :String;    -- наименование НФА
var тб2ИНВНОМ[]     :String;    -- инвентарный номер
var тб2УЧННОМ[]     :String;    -- учетный номер
var тб2ДАТУЧТ[]     :Date;      -- дата принятия к учету
var тб2ДАТЭКС[]     :Date;      -- дата ввода в эксплуатацию
var тб2СРКНРМ[]     :String;    -- срок эксплутации - норма
var тб2СРКФКТ[]     :String;    -- срок эксплутации - факт
var тб2_НОВОЕ[]     :Logical;   -- новое имущество или было в эксплуатации
var тб2БЛСУМY[]     :Numeric;   -- балансовая сумма на начало года
var тб2БЛСУМC[]     :Numeric;   -- балансовая сумма на отчетную дату
var тб2АМФКТY[]     :Numeric;   -- начисленная амортизация факт   на начало года
var тб2АМРЧТY[]     :Numeric;   -- начисленная амортизация расчет на начало года
var тб2АМКОРY[]     :Numeric;   -- сумма корректировки амортизации на начало года
var тб2АМФКТC[]     :Numeric;   -- начисленная амортизация факт   на отчетную дату
var тб2АМРЧТC[]     :Numeric;   -- начисленная амортизация расчет на отчетную дату
var тб2АМКОРC[]     :Numeric;   -- сумма корректировки амортизации на отчетную дату
var тб2_РЕЗУЛ[]     :Integer;   -- статус результата проверки
var тб2КБКПРВ[]     :String;    -- КБК проводки
var тб2ДЕБПРY[]     :String;    -- дебет  проводки на начало года
var тб2КРЕПРY[]     :String;    -- кредит проводки на начало года
var тб2ДЕБПРC[]     :String;    -- дебет  проводки на отчетную дату
var тб2КРЕПРC[]     :String;    -- кредит проводки на отчетную дату
var тб2ПРИЧИН[]     :String;    -- метод исправления или описание ошибки (текст)
var тб2_STATE[]     :Integer;   -- классификация типа записи для возможных исправления
var тб2ИСКЛЮЧ[]     :Logical;   -- исключить строку (пользователь)
var тб2_TRANS[]     :Logical;   -- позиция с проводкой
var тб2_ДОПАН[]     :String;    -- дополнительная аналитика для проводки
var тб2ДОПАН_[]     :String=тб2_ДОПАН[$];

var итгБИСУМY       :Numeric=SumOfArray(тблБЛСУМY, Позиции); -- ИТОГО балансовая сумма на начало года (только инвентарные ОС)
var итгБИСУМC       :Numeric=SumOfArray(тблБЛСУМC, Позиции); -- ИТОГО балансовая сумма на отчетную дату (только инвентарные ОС)
var итгБНСУМY       :Numeric;                                -- ИТОГО балансовая сумма на начало года (только НЕинвентарные ОС)
var итгБНСУМC       :Numeric;                                -- ИТОГО балансовая сумма на отчетную дату (только НЕинвентарные ОС)
var итгБВСУМY       :Numeric=итгБИСУМY+итгБНСУМY;            -- ИТОГО балансовая сумма на начало года (ВСЕГО)
var итгБВСУМC       :Numeric=итгБИСУМC+итгБНСУМC;            -- ИТОГО балансовая сумма на отчетную дату (ВСЕГО)
var итгАМФКТY       :Numeric=SumOfArray(тблАМФКТY, Позиции); -- ИТОГО начисленная амортизация факт   на начало года
var итгАМРЧТY       :Numeric=SumOfArray(тблАМРЧТY, Позиции); -- ИТОГО начисленная амортизация расчет на начало года
var итгАМКОРY       :Numeric=SumOfArray(тблАМКОРY, Позиции); -- ИТОГО начисленная амортизация расчет на начало года
var итгАМФКТC       :Numeric=SumOfArray(тблАМФКТC, Позиции); -- ИТОГО начисленная амортизация факт   на отчетную дату
var итгАМРЧТC       :Numeric=SumOfArray(тблАМРЧТC, Позиции); -- ИТОГО начисленная амортизация расчет на отчетную дату
var итгАМКОРC       :Numeric=SumOfArray(тблАМКОРC, Позиции); -- ИТОГО начисленная амортизация расчет на отчетную дату

var ит2БИСУМY       :Numeric=SumOfArray(тб2БЛСУМY, Позиции2); -- ИТОГО балансовая сумма на начало года (только инвентарные ОС)
var ит2БИСУМC       :Numeric=SumOfArray(тб2БЛСУМC, Позиции2); -- ИТОГО балансовая сумма на отчетную дату (только инвентарные ОС)
var ит2АМФКТY       :Numeric=SumOfArray(тб2АМФКТY, Позиции2); -- ИТОГО начисленная амортизация факт   на начало года
var ит2АМРЧТY       :Numeric=SumOfArray(тб2АМРЧТY, Позиции2); -- ИТОГО начисленная амортизация расчет на начало года
var ит2АМКОРY       :Numeric=SumOfArray(тб2АМКОРY, Позиции2); -- ИТОГО начисленная амортизация расчет на начало года
var ит2АМФКТC       :Numeric=SumOfArray(тб2АМФКТC, Позиции2); -- ИТОГО начисленная амортизация факт   на отчетную дату
var ит2АМРЧТC       :Numeric=SumOfArray(тб2АМРЧТC, Позиции2); -- ИТОГО начисленная амортизация расчет на отчетную дату
var ит2АМКОРC       :Numeric=SumOfArray(тб2АМКОРC, Позиции2); -- ИТОГО начисленная амортизация расчет на отчетную дату

2--0 2Процедуры и функции

Proc ОчисткаRep;
 ClearVariable(rep_UNIQUE_); -- инвентарные объекты (уникальные элементы)
 ClearVariable(repСЧЕТАМРТ); -- счет учета амортизации
 ClearVariable(rep_КОДМХЭ_); -- код местонахождения
 ClearVariable(repБАЛСУМ_Y); -- балансовая сумма на начало года
 ClearVariable(repБАЛКОЛ_Y); -- количество на начало года
 ClearVariable(repАМТ104_Y); -- амортизация на начало года (свертка по 104 инв.объекта)
 ClearVariable(repБАЛСУМ_C); -- балансовая сумма на отчетную дату
 ClearVariable(repБАЛКОЛ_C); -- количество на отчетную дату
 ClearVariable(repАМТ104_C); -- амортизация на отчетную дату (свертка по 104 инв.объекта)
end;

Proc ОчисткаТаб2;
 ClearVariable(Позиции2);
 ClearVariable(тб2_REFNN);
 ClearVariable(тб2КОДНФА);
 ClearVariable(тб2НМННФА);
 ClearVariable(тб2ИНВНОМ);
 ClearVariable(тб2УЧННОМ);
 ClearVariable(тб2ДАТУЧТ);
 ClearVariable(тб2ДАТЭКС);
 ClearVariable(тб2СРКНРМ);
 ClearVariable(тб2СРКФКТ);
 ClearVariable(тб2_НОВОЕ);
 ClearVariable(тб2БЛСУМY);
 ClearVariable(тб2БЛСУМC);
 ClearVariable(тб2АМФКТY);
 ClearVariable(тб2АМРЧТY);
 ClearVariable(тб2АМКОРY);
 ClearVariable(тб2АМФКТC);
 ClearVariable(тб2АМРЧТC);
 ClearVariable(тб2АМКОРC);
 ClearVariable(тб2_РЕЗУЛ);
 ClearVariable(тб2КБКПРВ);
 ClearVariable(тб2ДЕБПРY);
 ClearVariable(тб2КРЕПРY);
 ClearVariable(тб2ДЕБПРC);
 ClearVariable(тб2КРЕПРC);
 ClearVariable(тб2ПРИЧИН);
 ClearVariable(тб2_STATE);
 ClearVariable(тб2ИСКЛЮЧ);
 ClearVariable(тб2_TRANS);
 ClearVariable(тб2_ДОПАН);
 ClearVariable(тб2ДОПАН_);
end;

Proc ОчисткаТаблицы(СброситьФлаги:Logical);
 ClearVariable(Позиции);
 ClearVariable(тблКОДНФА);
 ClearVariable(тблНМННФА);
 ClearVariable(тблИНВНОМ);
 ClearVariable(тблУЧННОМ);
 ClearVariable(тблДАТУЧТ);
 ClearVariable(тблДАТЭКС);
 ClearVariable(тблСРКНРМ);
 ClearVariable(тблСРКФКТ);
 ClearVariable(тбл_НОВОЕ);
 ClearVariable(тблБЛСУМY);
 ClearVariable(тблБЛСУМC);
 ClearVariable(тблАМФКТY);
 ClearVariable(тблАМРЧТY);
 ClearVariable(тблАМКОРY);
 ClearVariable(тблАМФКТC);
 ClearVariable(тблАМРЧТC);
 ClearVariable(тблАМКОРC);
 ClearVariable(тбл_РЕЗУЛ);
 ClearVariable(тблКБКПРВ);
 ClearVariable(тблДЕБПРY);
 ClearVariable(тблКРЕПРY);
 ClearVariable(тблДЕБПРC);
 ClearVariable(тблКРЕПРC);
 ClearVariable(тблПРИЧИН);
 ClearVariable(тбл_STATE);
 ClearVariable(тблИСКЛЮЧ);
 ClearVariable(тбл_TRANS);
 ClearVariable(тбл_ДОПАН);
 --
 ClearVariable(тбs_COUNT);
 ClearVariable(тбs_TRKEY);
 ClearVariable(sav_ИСКЛЮЧ);
 ClearVariable(sav__ДОПАН);
 итгБНСУМY=0.00;
 итгБНСУМC=0.00;
 ОчисткаТаб2;
 ClearVariable(NN);
 SystemKeys="";
 countSAVE=0;
 countELEM=0;
 --
 if СброситьФлаги:
   flgПроводить=False;
   flgТолькоОтчет=False;
 fi;
end;

Func СохраненныйОтчет(aSysKey:String) :Logical;
var RZ, RT, nn1, nn2 :Integer;
var Work :Logical;
 Work=False;
 if aSysKey<>"":
   RZ=OpenWorkArea(SelfCRD_Z, "", "SYSKEY_CLC='"+aSysKey+"'");
   RT=OpenWorkArea(SelfCRD_T, "", "1=0");
   Try
     nn1=Records(RZ);
     if nn1=1:
       SetFilter(RT, "R_HEAD="+RecordToString(GetRecordKey(RZ, 1)));
       nn2=Records(RT);
       if nn2>0: Work=True; fi;
     fi;
   Finally
     CloseWorkArea(RZ);
     CloseWorkArea(RT);
   end;
 fi;
 ^Work;
end;

Func НадоОчистить :Logical;
 if LengthOfArray(тбл_STATE)=0 or (LengthOfArray(тбл_STATE)>0 and тбл_STATE[1]=0): ^True; fi;
 if SystemKeys<>"": ^(not СохраненныйОтчет(SystemKeys)); fi;
 ^False;
end;

Proc Очистить;
 ClearVariable(Buf);
 ClearVariable(aAna);
 ClearVariable(Lock);
 ClearVariable(NN);
 ОчисткаRep;
 if НадоОчистить: ОчисткаТаблицы(True); fi;
 ClearVariable(BufРЧТ);
 ClearVariable(TxtРЧТ);
 --
 ClearVariable(VocMsk);
end;

Func ВыборДаты(srcDate:Date) :Date;
var memDate :Date;
 if srcDate>1.1.100: memDate=Calendar(srcDate); else memDate=Calendar(ToDay); fi;
 if not memDate<=1.1.100: ^memDate; else ^srcDate; fi;
end;

Func GetDate :Date;  -- считываем в заданном поле дату
var nameField :String;
var iterFrame :Integer;
 nameField= asString(Template.Field);
 iterFrame=asInteger(Template.Frame);
 if nameField="ДАТПРД" : ^ДАТПРД;
 |  nameField="ДАТИСП" : ^ДАТИСП;
 fi;
end;

Proc SetDate(Value:Date); -- устанавливаем в заданном поле дату; Value - значение даты, которое необходимо присвоить
var nameField :String;
var iterFrame :Integer;
 nameField= asString(Template.Field);
 iterFrame=asInteger(Template.Frame);
 if nameField="ДАТПРД" : ДАТПРД=Value;
 |  nameField="ДАТИСП" : ДАТИСП=Value;
 fi;
end;

Func ОтменитьИзмененияУсловийОтчета :Logical;
var FF :Logical;
var qq :Integer;
 FF=False;
 if Позиции>0:
   qq=EnqOkCancel("Условия отбора данных для расчета изменились!^MОчистить таблицу?", mtConfirmation);
   if qq=cmOk:     ОчисткаТаблицы(True);
   |  qq=cmCancel: FF=True;
   fi;
 fi;
 ^FF;
end;

Func ИменаОтчетногоПериода(номерПериода:Integer) :String;
 if номерПериода>0 and номерПериода<13: ^Месяц(номерПериода); fi;
 ^"";
end;

Proc ReDrawДаты(флгВыбор:Logical);
 МЕССТР = ИменаОтчетногоПериода(УЧТМЕС);
 if not Позиции>0 or флгВыбор: if УЧТМЕС>0 and УЧТМЕС<13 and УЧТГОД>2000: ДАТОТЧ=Dat(1, УЧТМЕС, УЧТГОД); else ДАТОТЧ=1.1.100; fi; fi;
end;

Func ВыборОтчетногоПериода(номерПериода:Integer) :Integer;
var ii, newПериод :Integer;
 ClearVariable(Buf);
 for ii=1 to 12 do Buf[ii]=Месяц(ii); od;
 newПериод=Alternate('Период отчета...', Buf, 20, номерПериода, 12);
 if newПериод=0: ^номерПериода; fi;
 if newПериод<>номерПериода: if ОтменитьИзмененияУсловийОтчета: newПериод=номерПериода; fi; fi;
 ^newПериод;
end;

Proc ОтчетныйПериод_Get;
 УЧТМЕС = ВыборОтчетногоПериода(УЧТМЕС);
 ReDrawДаты(True);
end;

Func Оператор :String;
var nn :Integer;
 ClearVariable(Buf);
 Buf[1]="И";
 Buf[2]="ИЛИ";
 Buf[3]="И ИСКЛЮЧИТЬ";
 nn=Alternate("Выбор оператора",Buf, 20, 1, 12);
 if nn=1: ^"&";
   |nn=2: ^"|";
   |nn=3: ^"&~";
 fi;
 ^"";
end;

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

Proc ВидимостьОтчетныхТаблиц_Меню(TV1:Logical; TV2:Logical; TV3:Logical; TV4:Logical);
var sysTxt, sysShd :Integer;

 sysTxt=РАБ.ЦВЕТА.GetColor("coBtnText");
 sysShd=РАБ.ЦВЕТА.GetColor("coBtnShadow");

 sctШапка2.Cell(2, 3, CellFontColor, if(TV1, sysTxt, sysShd));
 sctШапка2.Cell(2, 5, CellFontColor, if(TV2, sysTxt, sysShd));
 sctШапка2.Cell(2, 7, CellFontColor, if(TV3, sysTxt, sysShd));
 sctШапка2.Cell(2, 9, CellFontColor, if(TV4, sysTxt, sysShd));

end;

Proc ФильтрацияТаблицы(currBtn:Integer);
var xx, ii :Integer;
var Work :Logical;
 ОчисткаТаб2;
 xx=0;
 if currBtn>1 and currBtn<5 and Позиции>0:
   ShowProgress(Позиции, "Фильтрация таблицы...");
   Try
     for ii=1 to Позиции do
       ProgressPos(ii);
       if тбл_РЕЗУЛ[ii]=1 and currBtn=3: Work=True; --Строки отчета прошедшие проверку
       |  тбл_РЕЗУЛ[ii]=2 and currBtn=2: Work=True; --Откорректированные строки отчета
       |  тбл_РЕЗУЛ[ii]=3 and currBtn=4: Work=True; --Пропущенные, ошибочные строки отчета
       else Work=False;
       fi;
       if Work:
         xx=xx+1;
         тб2КОДНФА[xx]=тблКОДНФА[ii];
         тб2НМННФА[xx]=тблНМННФА[ii];
         тб2ИНВНОМ[xx]=тблИНВНОМ[ii];
         тб2УЧННОМ[xx]=тблУЧННОМ[ii];
         тб2ДАТУЧТ[xx]=тблДАТУЧТ[ii];
         тб2ДАТЭКС[xx]=тблДАТЭКС[ii];
         тб2СРКНРМ[xx]=тблСРКНРМ[ii];
         тб2СРКФКТ[xx]=тблСРКФКТ[ii];
         тб2_НОВОЕ[xx]=тбл_НОВОЕ[ii];
         тб2БЛСУМY[xx]=тблБЛСУМY[ii];
         тб2БЛСУМC[xx]=тблБЛСУМC[ii];
         тб2АМФКТY[xx]=тблАМФКТY[ii];
         тб2АМРЧТY[xx]=тблАМРЧТY[ii];
         тб2АМКОРY[xx]=тблАМКОРY[ii];
         тб2АМФКТC[xx]=тблАМФКТC[ii];
         тб2АМРЧТC[xx]=тблАМРЧТC[ii];
         тб2АМКОРC[xx]=тблАМКОРC[ii];
         тб2_РЕЗУЛ[xx]=тбл_РЕЗУЛ[ii];
         тб2КБКПРВ[xx]=тблКБКПРВ[ii];
         тб2ДЕБПРY[xx]=тблДЕБПРY[ii];
         тб2КРЕПРY[xx]=тблКРЕПРY[ii];
         тб2ДЕБПРC[xx]=тблДЕБПРC[ii];
         тб2КРЕПРC[xx]=тблКРЕПРC[ii];
         тб2ПРИЧИН[xx]=тблПРИЧИН[ii];
         тб2_STATE[xx]=тбл_STATE[ii];
         тб2_ДОПАН[xx]=тбл_ДОПАН[ii];
         тб2ИСКЛЮЧ[xx]=тблИСКЛЮЧ[ii];
         тб2_TRANS[xx]=тбл_TRANS[ii];
         тб2_REFNN[xx]=ii;
       fi;
     od;
   Finally
     CloseProgress;
     Позиции2=LengthOfArray(тб2_REFNN);
   end;
 fi;
 ClearVariable(NN);
end;

Proc Кнопки_Validate(currBtn:Integer);
 btnSaveKorr.Enabled = if(Позиции>0 and SystemKeys<>"" and currBtn=1, True, False);
 btn_DelKorr.Enabled = if(Позиции>0 and SystemKeys<>""              , True, False);
end;

Proc КолонкиСекции_Validate(currBtn:Integer);
var FLG :Logical;
 FLG=if(Позиции>0 and currBtn=1, True, False);
 sctWorkЗ_М.Visible = FLG;

 FLG=if(Позиции>0 and (currBtn=1 or currBtn=2), True, False);
 sctWorkЗАГ.Column(15, ColVisible, FLG);
 sctWorkТБ1.Column(15, ColVisible, FLG);
 sctWorkТБ2.Column(15, ColVisible, FLG);
 sctWorkЗАГ.Column(16, ColVisible, FLG);
 sctWorkТБ1.Column(16, ColVisible, FLG);
 sctWorkТБ2.Column(16, ColVisible, FLG);

 FLG=if(Позиции>0, True, False);
 sctWorkЗАГ.Visible = FLG;

 FLG=if(Позиции>0 and currBtn=1, True, False);
 sctWorkТБ1.Visible = FLG;
 sctWorkПД1.Visible = FLG;

 FLG=if(Позиции>0 and currBtn>1, True, False);
 sctWorkТБ2.Visible = FLG;
 sctWorkПД2.Visible = FLG;
end;

Proc ВидимостьОтчетныхТаблиц_Work(p1v:Logical; p2v:Logical; p3v:Logical; p4v:Logical; curr_Btn:Integer);
 ShowProgress(0, "Обновление формы бланка...");
 Try
   КолонкиСекции_Validate(curr_Btn);
   Кнопки_Validate(curr_Btn);
   ВидимостьОтчетныхТаблиц_Меню(p1v, p2v, p3v, p4v);
 Finally
   CloseProgress;
 end;
 ФильтрацияТаблицы(curr_Btn);
end;

Proc ВидимостьОтчетныхТаблиц_Validate;
 if not (currКнопка>0 and currКнопка<5): currКнопка=1; fi;
 if currКнопка=1: ВидимостьОтчетныхТаблиц_Work(True , False, False, False, currКнопка);
 |  currКнопка=2: ВидимостьОтчетныхТаблиц_Work(False, True , False, False, currКнопка);
 |  currКнопка=3: ВидимостьОтчетныхТаблиц_Work(False, False, True , False, currКнопка);
 |  currКнопка=4: ВидимостьОтчетныхТаблиц_Work(False, False, False , True, currКнопка);
 else             ВидимостьОтчетныхТаблиц_Work(False, False, False, False, currКнопка);
 fi;
end;

Proc НеНоваяТаблица_Validate;
var цвFont, цвBack :Integer;
var Work, ТЧ :Logical;
 if countSAVE>0: Work=True; else Work=False; fi;
 --УЧТГОД
 if Work: цвFont=coBlack; цвBack=coTransparent; ТЧ=True; else цвFont=coBlack; цвBack=coAqua; ТЧ=False; fi;
 sctШапка3.Cell(2, 3, CellFontColor , цвFont);
 sctШапка3.Cell(2, 3, CellBgColor   , цвBack);
 sctШапка3.Cell(2, 3, CellReadOnly  , ТЧ);
 sctШапка3.Cell(2, 3, CellLookup    , not ТЧ);
 --МЕССТР_
 if Work: цвFont=coBlack; цвBack=coTransparent; ТЧ=True; else цвFont=coWhite; цвBack=coTeal; ТЧ=False; fi;
 sctШапка3.Cell(3, 3, CellFontColor , цвFont);
 sctШапка3.Cell(3, 3, CellBgColor   , цвBack);
 sctШапка3.Cell(3, 3, CellReadOnly  , ТЧ);
 --ОТЧАНА
 if Work: цвFont=coBlack; цвBack=coTransparent; ТЧ=True; else цвFont=coBlack; цвBack=coAqua; ТЧ=False; fi;
 sctШапка3.Cell(5, 3, CellFontColor , цвFont);
 sctШапка3.Cell(5, 3, CellBgColor   , цвBack);
 sctШапка3.Cell(5, 3, CellReadOnly  , ТЧ);
 --flgТолькоОтчет
 if not Work: flgТолькоОтчет=False; fi;
 cb_ТолькоОтчет.Enabled = not Work;
 --
 lblWarning01.Visible = if(countELEM>0 and Позиции>0 and countELEM<>Позиции, True, False);
end;

Proc ValidateSectionAll;
 ReDrawДаты(False);
 ВидимостьОтчетныхТаблиц_Validate;
 НеНоваяТаблица_Validate;
end;

Func СчетАмортизацииПоСчетуНФА(СЧТНФА:String) :String;
var sLeft, s1ACC, s2ACC, RES :String;
 RES="";
 if Match(СЧТНФА, "???.????.???????.???.?.101.??.???"):
    sLeft=SubStr(СЧТНФА, 1, 23);
    s1ACC=SubStr(СЧТНФА, 28, 1);
    s2ACC=SubStr(СЧТНФА, 29, 1);
    if s2ACC="1": RES=sLeft+"104."+s1ACC+"1.410";
    |  s2ACC="2": RES=sLeft+"104."+s1ACC+"2.410";
    |  s2ACC="3": RES=sLeft+"104."+s1ACC+"3.410";
    |  s2ACC="4": RES=sLeft+"104."+s1ACC+"4.410";
    |  s2ACC="5": RES=sLeft+"104."+s1ACC+"5.410";
    |  s2ACC="6": RES=sLeft+"104."+s1ACC+"6.410";
    |  s2ACC="7": RES=sLeft+"104."+s1ACC+"7.410";
    |  s2ACC="8": RES=sLeft+"104."+s1ACC+"8.410";
    else ^"";
    fi;
 |  Match(СЧТНФА, "???.????.???????.???.?.102.??.???"):
    sLeft=SubStr(СЧТНФА, 1, 23);
    s1ACC=SubStr(СЧТНФА, 28, 1);
    s2ACC=SubStr(СЧТНФА, 29, 1);
    if s2ACC="0": RES=sLeft+"104."+s1ACC+"9.420"; else ^""; fi;
 else ^"";
 fi;
 ^RES;
end;

Func СчетНФАпоСчетуАмортизации(СЧТАМТ:String) :String;
var sLeft, s1ACC, s2ACC, RES :String;
 RES="";
 if Match(СЧТАМТ, "???.????.???????.???.?.104.??.410"):
    sLeft=SubStr(СЧТАМТ, 1, 23);
    s1ACC=SubStr(СЧТАМТ, 28, 1);
    s2ACC=SubStr(СЧТАМТ, 29, 1);
    if s2ACC="1": RES=sLeft+"101."+s1ACC+"1.???";
    |  s2ACC="2": RES=sLeft+"101."+s1ACC+"2.???";
    |  s2ACC="3": RES=sLeft+"101."+s1ACC+"3.???";
    |  s2ACC="4": RES=sLeft+"101."+s1ACC+"4.???";
    |  s2ACC="5": RES=sLeft+"101."+s1ACC+"5.???";
    |  s2ACC="6": RES=sLeft+"101."+s1ACC+"6.???";
    |  s2ACC="7": RES=sLeft+"101."+s1ACC+"7.???";
    |  s2ACC="8": RES=sLeft+"101."+s1ACC+"8.???";
    else ^"";
    fi;
 |  Match(СЧТАМТ, "???.????.???????.???.?.104.?9.420"):
    sLeft=SubStr(СЧТАМТ, 1, 23);
    s1ACC=SubStr(СЧТАМТ, 28, 1);
    if s1ACC="2": RES=sLeft+"102.20.???";
    |  s1ACC="3": RES=sLeft+"102.30.???";
    |  s1ACC="4": RES=sLeft+"102.40.???";
    else ^"";
    fi;
 else ^"";
 fi;
 ^RES;
end;

Func Создать_СписокИнвентарныхОбъектов(aDatY:Date; aDatR:Date; НачалоГода:Logical; flgДОПАНА:Logical; ftrSVR:String; ftrДОП:String) :Integer;
var ВременныйФайл, КОДСЧТ, КОДАМТ, КОДНФА, КОДУЧН, КОДМХЭ, svrANA, svrSGN, aVal1, aVal2, aDeb, aCre, aComment :String;
var xx, len, ii, jj, pp :Integer;
var aSum1, aSum2, SUM, KOL, QUA :Numeric;
var aDate, WrkDat :Date;
var СЧДЕБ, Work :Logical;

 xx=LengthOfArray(rep_UNIQUE_);
 if xx>0:
   if not НачалоГода:
     if aDatY=aDatR: 
       CopyArray(repБАЛСУМ_Y, repБАЛСУМ_C); 
       CopyArray(repБАЛКОЛ_Y, repБАЛКОЛ_C); 
       ClearVariable(repБАЛСУМ_Y);
       ClearVariable(repБАЛКОЛ_Y);
       ^xx;
     fi;
   fi;
 fi;

 WrkDat=if(НачалоГода, aDatY, aDatR);
 ClearVariable(aAna);
 ВременныйФайл=PlanVar('CACHE')+"\"+GetGUID;
 xx=TujRepNoNullBal+TujRepCombinedAna+TujRepBalAccount;
 len=TujReport(ВременныйФайл, 1.1.100, WrkDat, "(*.101.*|*.102.*)&???.????.???????.???.?.???.??.???", ftrSVR, "ДНФА", "", "", xx, False);
 if len>0:
   ShowProgress(len, "Выборка инвентарных объектов учета на "+DateToString(WrkDat)+".");
   OpenTextJur(ВременныйФайл);
   Try
     ii=1;
     while not GetTransFromTextJur(aDate, aSum1, aVal1, aSum2, aVal2, aDeb, aCre, aAna, aComment) do
       ProgressPos(ii);
       ii=ii+1;
       КОДСЧТ=""; КОДАМТ=""; КОДНФА=""; КОДУЧН=""; КОДМХЭ=""; svrANA=""; svrSGN="";
       SUM=0.00; KOL=0.00; QUA=0.00;
       if aDeb="00": КОДСЧТ=aCre; СЧДЕБ=False; fi;
       if aCre="00": КОДСЧТ=aDeb; СЧДЕБ=True;  fi;
       if Match(КОДСЧТ, "???.????.???????.???.?.10?.??.???"): КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???"; else КОДСЧТ=""; fi;
       if КОДСЧТ<>"":
         if (aVal1="" or aVal1="РУБ") and aSum1<>0: if СЧДЕБ: SUM=aSum1; else SUM=-aSum1; fi;
         |  (aVal2="" or aVal2="РУБ") and aSum2<>0: if СЧДЕБ: SUM=aSum2; else SUM=-aSum2; fi;
         else SUM=0.00;
         fi;
         xx=LengthOfArray(aAna);
         if xx>0:
           for jj=1 to xx do
             pp=Pos(":", aAna[jj]);
             if pp>0:
               QUA=StringToNumeric(SubStr(aAna[jj], pp+1, Length(aAna[jj])-pp));
               svrANA=SubStr(aAna[jj], 1, pp-1);
             else
               svrANA=aAna[jj];
             fi;
             svrSGN=SubStr(svrANA, 1, 1);
             if svrSGN="+" or svrSGN="-": svrANA=SubStr(svrANA, 2, 255); fi;
             if Match(svrANA, "НФА.*"): КОДНФА=svrANA; KOL=if(СЧДЕБ, QUA, -QUA);
             |  Match(svrANA, "УЧН.*"): КОДУЧН=svrANA;
             |  Match(svrANA, "М.*"  ): КОДМХЭ=svrANA;
             fi;
           od; -- цикл по аналитике
         fi; --xx>0
         Work=True;
         if Work and flgДОПАНА: Work=РАБ.НФА.LIBREP.ПроводкаПроходитОтборПоАналитике(xx, ftrДОП, True); fi;
         if Work:
           if КОДСЧТ<>"" and КОДНФА<>"" and КОДУЧН<>"":
             svrANA=КОДСЧТ+"#"+КОДНФА+"#"+КОДУЧН;
             xx=SearchInArray(rep_UNIQUE_, svrANA, True, 1);
             if not xx>0:
               КОДАМТ=СчетАмортизацииПоСчетуНФА(КОДСЧТ);
               if КОДАМТ="": КОДАМТ="АМТ.$$$"; fi;
               pp=InsertInArraySort(rep_UNIQUE_, svrANA);
               InsertInArray(repСЧЕТАМРТ, pp, КОДАМТ);
               InsertInArray(rep_КОДМХЭ_, pp, КОДМХЭ);
               InsertInArray(repБАЛСУМ_Y, pp, if(НачалоГода, SUM, 0.00));
               InsertInArray(repБАЛКОЛ_Y, pp, if(НачалоГода, KOL, 0.00));
               InsertInArray(repБАЛСУМ_C, pp, if(НачалоГода, 0.00, SUM));
               InsertInArray(repБАЛКОЛ_C, pp, if(НачалоГода, 0.00, KOL));
               InsertInArray(repАМТ104_Y, pp, 0.00);
               InsertInArray(repАМТ104_C, pp, 0.00);
             else
               if НачалоГода:
                 repБАЛСУМ_Y[xx]=repБАЛСУМ_Y[xx]+SUM;
                 repБАЛКОЛ_Y[xx]=repБАЛКОЛ_Y[xx]+KOL;
               else
                 repБАЛСУМ_C[xx]=repБАЛСУМ_C[xx]+SUM;
                 repБАЛКОЛ_C[xx]=repБАЛКОЛ_C[xx]+KOL;
               fi;
               -- МХЭ нам нужно только для установления факта выдачи в эксплуатацию
               -- соотвественно сохраняется первое найденное значение и меняется только в случае когда оно из М.Х.* становится М.Э.*
               if КОДМХЭ<>"":
                 if rep_КОДМХЭ_[xx]<>"":
                   if not Match(rep_КОДМХЭ_[xx], "М.Э.*"): rep_КОДМХЭ_[xx]=КОДМХЭ; fi;
                 else
                   rep_КОДМХЭ_[xx]=КОДМХЭ;
                 fi;
               fi;
             fi; -- объект найден
           fi; --if КОДНФА<>"" and КОДУЧН<>"" and КОДАМТ<>""
         fi; --if Work
       fi; --if КОДСЧТ<>""
     end; -- while
   Finally
     CloseTextJur;
     CloseProgress;
   end; -- Try
   Try DeleteFile(ВременныйФайл); Except end;
 fi; -- len>0 (TujReport)
 ^LengthOfArray(rep_UNIQUE_);
end;

Func Создать_СальдоАмортизации(aDatY:Date; aDatR:Date; НачалоГода:Logical) :Integer;
var ВременныйФайл, КОДСЧТ, КОДАМТ, КОДНФА, КОДУЧН, svrANA, svrSGN, aVal1, aVal2, aDeb, aCre, aComment :String;
var xx, len, ii, jj, pp :Integer;
var aSum1, aSum2, SUM :Numeric;
var aDate, WrkDat :Date;
var СЧДЕБ :Logical;

 xx=LengthOfArray(rep_UNIQUE_);
 if xx>0:
   if not НачалоГода:
     if aDatY=aDatR: 
       CopyArray(repАМТ104_Y, repАМТ104_C);
       ClearVariable(repАМТ104_Y);
       ^xx;
     fi;
   fi;
 fi;

 WrkDat=if(НачалоГода, aDatY, aDatR);
 ClearVariable(aAna);
 ВременныйФайл=PlanVar('CACHE')+"\"+GetGUID;
 xx=TujRepNoNullBal+TujRepCombinedAna+TujRepBalAccount;
 len=TujReport(ВременныйФайл, 1.1.100, WrkDat, "???.????.???????.???.?.104.??.???", "", "ДНФА", "", "", xx, False);
 if len>0:
   ShowProgress(len, "Подсчет амортизации на "+DateToString(WrkDat)+".");
   OpenTextJur(ВременныйФайл);
   Try
     ii=1;
     while not GetTransFromTextJur(aDate, aSum1, aVal1, aSum2, aVal2, aDeb, aCre, aAna, aComment) do
       ProgressPos(ii);
       ii=ii+1;
       КОДСЧТ=""; КОДАМТ=""; КОДНФА=""; КОДУЧН=""; svrANA=""; svrSGN=""; SUM=0.00;
       if aDeb="00": КОДАМТ=aCre; СЧДЕБ=False; fi;
       if aCre="00": КОДАМТ=aDeb; СЧДЕБ=True;  fi;
       if Match(КОДАМТ, "???.????.???????.???.?.104.??.???"): КОДСЧТ=СчетНФАпоСчетуАмортизации(КОДАМТ); else КОДАМТ=""; КОДСЧТ=""; fi;
       if КОДАМТ<>"":
         if (aVal1="" or aVal1="РУБ") and aSum1<>0: if СЧДЕБ: SUM=-aSum1; else SUM=aSum1; fi;
         |  (aVal2="" or aVal2="РУБ") and aSum2<>0: if СЧДЕБ: SUM=-aSum2; else SUM=aSum2; fi;
         else SUM=0.00;
         fi;
         xx=LengthOfArray(aAna);
         if xx>0:
           for jj=1 to xx do
             pp=Pos(":", aAna[jj]);
             if pp>0: svrANA=SubStr(aAna[jj], 1, pp-1); else svrANA=aAna[jj]; fi;
             svrSGN=SubStr(svrANA, 1, 1);
             if svrSGN="+" or svrSGN="-": svrANA=SubStr(svrANA, 2, 255); fi;
             if Match(svrANA, "НФА.*"): КОДНФА=svrANA;
             |  Match(svrANA, "УЧН.*"): КОДУЧН=svrANA;
             fi;
           od; -- цикл по аналитике
         fi; --xx>0
         if КОДСЧТ="": КОДСЧТ="БАЛ.$$$"; fi;
         if КОДНФА="": КОДНФА="НФА.$$$"; fi;
         if КОДУЧН="": КОДУЧН="УЧН.$$$"; fi;
         if КОДНФА<>"" and КОДУЧН<>"" and КОДСЧТ<>"":
           svrANA=КОДСЧТ+"#"+КОДНФА+"#"+КОДУЧН;
           xx=SearchInArray(rep_UNIQUE_, svrANA, True, 1);
           if not xx>0:
             pp=InsertInArraySort(rep_UNIQUE_, svrANA);
             InsertInArray(repСЧЕТАМРТ, pp, КОДАМТ);
             InsertInArray(rep_КОДМХЭ_, pp, "");
             InsertInArray(repАМТ104_Y, pp, if(НачалоГода, SUM, 0.00));
             InsertInArray(repАМТ104_C, pp, if(НачалоГода, 0.00, SUM));
             InsertInArray(repБАЛСУМ_Y, pp, 0.00);
             InsertInArray(repБАЛКОЛ_Y, pp, 0.00);
             InsertInArray(repБАЛСУМ_C, pp, 0.00);
             InsertInArray(repБАЛКОЛ_C, pp, 0.00);
           else
             if НачалоГода:
               repАМТ104_Y[xx]=repАМТ104_Y[xx]+SUM;
             else
               repАМТ104_C[xx]=repАМТ104_C[xx]+SUM;
             fi;
           fi; -- объект найден
         fi; --if КОДНФА<>"" and КОДУЧН<>"" and КОДСЧТ<>""
       fi; --if КОДАМТ<>""
     end; -- while
   Finally
     CloseTextJur;
     CloseProgress;
   end; -- Try
   Try DeleteFile(ВременныйФайл); Except end;
 fi; -- len>0 (TujReport)
 ^LengthOfArray(rep_UNIQUE_);
end;

Func ПроверкаЗаполнения :Logical;
 if ДАТОТЧ<ValidDate:
   Message('Не задана или некорректная дата периода для расчета-корректировки.', mtWarning);
   Template.Field="МЕССТР_";
   ^False;
 fi;
 if ДАТПРД<ValidDate:
   Message('Не задана или некорректная дата проводок документа.', mtWarning);
   Template.Field="ДАТПРД";
   ^False;
 fi;
 if ДАТПРД<ДАТОТЧ:
   if EnqOkCancel("Дата проводок документа раньше даты отчета.^MПродолжить?", mtWarning)=cmCancel:
     Template.Field="ДАТПРД";
     ^False;
   fi;
 fi;
 ^True;
end;

Func ВзятьДЭКСПЛ_КМНТ(КМНТ:String) :Date;
var ДЭКСПЛ :Date;
var pp :Integer;
 КМНТ=' '+КМНТ;
 pp=Pos(' ДЭКСПЛ=', КМНТ);
 if pp>0:
   КМНТ=Trim(SubStr(КМНТ, pp+8, 10));
   Try ДЭКСПЛ=StringToDate(КМНТ); Except ДЭКСПЛ=1.1.100; end;
 fi;
 ^ДЭКСПЛ;
end;

Func ВзятьДУЧЕТ_КМНТ(КМНТ:String):Date;
var ДУЧЕТ :Date;
var pp :Integer;
 КМНТ=' '+КМНТ;
 pp=Pos(' ДУЧЕТ=',  КМНТ);
 if pp>0:
   КМНТ=Trim(SubStr(КМНТ, pp+8, 10));
   if Match(КМНТ, '?.??.????'): КМНТ='1'+КМНТ; fi;
   Try ДУЧЕТ=StringToDate(КМНТ); Except ДУЧЕТ=1.1.100; end;
 fi;
 ^ДУЧЕТ;
end;

Func ВзятьДатуВводаЭксплуат_Сложный(Fnc_Date:Date; Crd_Date:Date; vКОДНФА:String; vКОДУЧН:String; vКОДСЧТ:String; vКОДМХЭ:String; ddEND:Date; vXconstНФА100П:Numeric) :Date;
var MskAna, СЧТКОД :String;
var dd_Null, Rep_Date :Date;
var Цена :Numeric;
var pp :Integer;
 dd_Null=1.1.1800;
 if Crd_Date > dd_Null and Fnc_Date > dd_Null : if Crd_Date<Fnc_Date: Rep_Date=Crd_Date; else Rep_Date=Fnc_Date; fi;
 |  Crd_Date > dd_Null and Fnc_Date = 1.1.100 : Rep_Date=Crd_Date;
 |  Crd_Date = 1.1.100 and Fnc_Date > dd_Null : Rep_Date=Fnc_Date;
 else Rep_Date=1.1.100;
 fi;
 if Rep_Date>dd_Null: ^Rep_Date; fi;
 --
 Rep_Date=1.1.100;
 MskAna=vКОДСЧТ+"/(*.?.???.??.???|00){"+vКОДНФА+"&"+vКОДУЧН+"}";
 for Transaction pp=MskAna, 1.1.100, ddEnd  do
   Rep_Date=ВзятьДЭКСПЛ_КМНТ(TransComment(pp));
   if Rep_Date>dd_Null: ^Rep_Date; fi;
   Try Цена=Abs(TransSum(pp, "РУБ"))/Abs(TransSum(pp, "КОЛ")); Except Цена=0.00; end;
   СЧТКОД=TransCre(pp);
   if Match(vКОДМХЭ, "М.Э.*") or (СЧТКОД="00" and TransCardFile(pp)="РПО_ОСТ_НФА"): Rep_Date=TransDate(pp); fi;
   if Rep_Date>dd_Null: ^Rep_Date; fi;
   if Rep_Date=1.1.100:
     if Match(СЧТКОД, "*.?.101.??.3?0") or -- внутренние перемещения
        Match(СЧТКОД, "*.?.106.??.3?0") or -- принятие к учету
        Match(СЧТКОД, "*.?.304.04.3?0") or -- централизованное снабжение
        Match(СЧТКОД, "*.?.401.10.14?") or
        Match(СЧТКОД, "*.?.401.10.15?") or
        Match(СЧТКОД, "*.?.401.10.180") or
        ((Match(СЧТКОД, "*.?.401.20.271") or Match(СЧТКОД, "*.?.109.??.271")) and Цена<=vXconstНФА100П):
          Rep_Date=TransDate(pp);
          if Rep_Date>dd_Null: ^Rep_Date; fi;
     fi;
   fi;
 end;
 ^Rep_Date;
end;

Func ВзятьДатуВводаЭксплуат_Сложный2(Fnc_Date:Date; Crd_Date:Date; vКОДНФА:String; vКОДУЧН:String; vКОДСЧТ:String; vКОДМХЭ:String; ddEND:Date) :Date;
var MskAna :String;
var dd_Null, Rep_Date :Date;
var pp :Integer;
 dd_Null=1.1.1800;
 if Crd_Date > dd_Null and Fnc_Date > dd_Null : if Crd_Date<Fnc_Date: Rep_Date=Crd_Date; else Rep_Date=Fnc_Date; fi;
 |  Crd_Date > dd_Null and Fnc_Date = 1.1.100 : Rep_Date=Crd_Date;
 |  Crd_Date = 1.1.100 and Fnc_Date > dd_Null : Rep_Date=Fnc_Date;
 else Rep_Date=1.1.100;
 fi;
 if Rep_Date>dd_Null: ^Rep_Date; fi;
 --
 Rep_Date=1.1.100;
 MskAna=vКОДСЧТ+"/(*.?.???.??.???|00){"+vКОДНФА+"&"+vКОДУЧН+"}";
 for Transaction pp=MskAna, 1.1.100, ddEnd  do
   Rep_Date=ВзятьДЭКСПЛ_КМНТ(TransComment(pp));
   if Rep_Date>dd_Null: ^Rep_Date; fi;
   if Match(vКОДМХЭ, "М.Э.*"): Rep_Date=TransDate(pp); fi;
   if Rep_Date>dd_Null: ^Rep_Date; fi;
 end;
 ^Rep_Date;
end;

Func ВзятьДатуПринятияУчету_Сложный(Fnc_Date:Date; Crd_Date:Date; vКОДНФА:String; vКОДУЧН:String; vКОДСЧТ:String; ddEND:Date) :Date;
var dd_Null, Rep_Date :Date;
var MskAna :String;
var pp :Integer;
 dd_Null=1.1.1800;
 if Crd_Date > dd_Null and Fnc_Date > dd_Null : if Crd_Date<Fnc_Date: Rep_Date=Crd_Date; else Rep_Date=Fnc_Date; fi;
 |  Crd_Date > dd_Null and Fnc_Date = 1.1.100 : Rep_Date=Crd_Date;
 |  Crd_Date = 1.1.100 and Fnc_Date > dd_Null : Rep_Date=Fnc_Date;
 else Rep_Date=1.1.100;
 fi;
 if Rep_Date>dd_Null: ^Rep_Date; fi;
 --
 Rep_Date=1.1.100;
 MskAna=vКОДСЧТ+"/(*.106.??.3?0|*.304.04.3?0|*.401.10.14?|*.401.10.15?|*.401.10.172|*.401.10.180|00)"+"{"+vКОДНФА+"&"+vКОДУЧН+"}";
 for Transaction pp=MskAna, 1.1.100, ddEnd  do
   Rep_Date=ВзятьДУЧЕТ_КМНТ(TransComment(pp));
   if Rep_Date>dd_Null: ^Rep_Date; fi;
   Rep_Date=TransDate(pp);
   if Rep_Date>dd_Null: ^Rep_Date; fi;
 end;
 ^Rep_Date;
end;

Func ВзятьДатуВводаЭксплуат_П_модиф(vR1:Integer; vIter:Integer; Сложный:Logical; rvКОДНФА:String; rvКОДУЧН:String; rvКОДСЧТ:String; rvКОДМХЭ:String; RddEND:Date; rXconstНФА100П:Numeric) :Date;
var dd_Null, Rep_Date, clcFnc_Date, clcCrd_Date :Date;
 dd_Null  = 1.1.1800;
 Rep_Date = 1.1.100;
 if Name_A(rvКОДНФА)=" " or Name_A(rvКОДУЧН)=" ": ^Rep_Date; fi;
 clcFnc_Date = 1.1.100+Int(Saldo("ЗАБ.НФА.ДЭКСПЛ{"+rvКОДНФА+"&"+rvКОДУЧН+"}", RddEND));
 if clcFnc_Date>dd_Null and Year(clcFnc_Date)<2100: ^clcFnc_Date; fi;
 if Сложный:
   clcCrd_Date = 1.1.100;
   if vIter>0 and Up(WorkAreaCardFile(vR1))="РПО_ИНВКАРТ_ОС": clcCrd_Date = GetFieldD(vR1, vIter, "ДАТ_ВЭКСП"); fi;
   --Rep_Date=ВзятьДатуВводаЭксплуат_Сложный(clcFnc_Date, clcCrd_Date, rvКОДНФА, rvКОДУЧН, rvКОДСЧТ, rvКОДМХЭ, RddEND, rXconstНФА100П);
   Rep_Date=ВзятьДатуВводаЭксплуат_Сложный2(clcFnc_Date, clcCrd_Date, rvКОДНФА, rvКОДУЧН, rvКОДСЧТ, rvКОДМХЭ, RddEND);
 else
   if clcFnc_Date>dd_Null and Year(clcFnc_Date)<2100: Rep_Date=clcFnc_Date; fi;
 fi;
 ^Rep_Date;
end;

Func ВзятьДатуПринятияУчету_П_модиф(vR1:Integer; vIter:Integer; Сложный:Logical; rvКОДНФА:String; rvКОДУЧН:String; rvКОДСЧТ:String; RddEND:Date) :Date;
var dd_Null, Rep_Date, clcFnc_Date, clcCrd_Date :Date;
 dd_Null=1.1.1800;
 Rep_Date=1.1.100;
 if Name_A(rvКОДНФА)=" " or Name_A(rvКОДУЧН)=" ": ^Rep_Date; fi;
 clcFnc_Date = 1.1.100+Int(Saldo("ЗАБ.НФА.ДУЧЕТ{"+rvКОДНФА+"&"+rvКОДУЧН+"}", RddEND));
 if clcFnc_Date>dd_Null and Year(clcFnc_Date)<2100: ^clcFnc_Date; fi;
 if Сложный:
   clcCrd_Date = 1.1.100;
   if vIter>0 and Up(WorkAreaCardFile(vR1))="РПО_ИНВКАРТ_ОС": clcCrd_Date = GetFieldD(vR1, vIter, "ОПРИХ_ДАТА"); fi;
   Rep_Date=ВзятьДатуПринятияУчету_Сложный(clcFnc_Date, clcCrd_Date, rvКОДНФА, rvКОДУЧН, rvКОДСЧТ, RddEND);
 else
   if clcFnc_Date>dd_Null and Year(clcFnc_Date)<2100: Rep_Date=clcFnc_Date; fi;
 fi;
 ^Rep_Date;
end;

Func ВзятьСрокЭксплуатМес(ddPU:Date; vRинв:Integer; vIинв:Integer; vRнфа:Integer; vIнфа:Integer) :Integer;
var srok1, srok2 :Numeric;
var Res, len, ii :Integer;
 Res=0; srok1=0.00; srok2=0.00;
 if vIинв>0 and Up(WorkAreaCardFile(vRинв))="РПО_ИНВКАРТ_ОС": Try srok1 = Int(12*GetFieldN(vRинв, vIинв, "АМОРТ_СРОК")); Except srok1=0; end; fi;
 if srok1=0.00:
   if vIнфа>0 and Up(WorkAreaCardFile(vRнфа))="РПО_НФА":
     ClearVariable(Buf);
     if ddPU>31.12.2008: len=3; Buf[1]=" 09"; Buf[2]="   "; Buf[3]=" 02";
     |  ddPU<01.01.2007: len=1; Buf[1]=" 02";
     else                len=2; Buf[1]="   "; Buf[2]=" 02";
     fi;
     srok2=0;
     for ii=1 to len do if srok2=0: Try srok2=Int(12*GetFieldN(vRнфа, vIнфа, "СРОКАМ"+Trim(Buf[ii]))); Except srok2=0; end; else Break; fi; od;
   fi;
 fi;
 Res=if(srok1>0.00, Int(srok1), Int(srok2));
 ^Abs(Res);
end;

Func КоличествоМесяцевАмортизацииФакт(ДНЭ:Date; ДФТ:Date) :Integer;
 if ДНЭ>ValidDate and ДФТ>ValidDate and ДНЭ<ДФТ: ^(12*(Year(ДФТ)-Year(ДНЭ))+(Mon(ДФТ)-Mon(ДНЭ))); else ^0; fi;
end;

Func ОценитьПозицию(BAL_C:Numeric; AMT_C:Numeric; KOL_C:Numeric; BAL_Y:Numeric; AMT_Y:Numeric; KOL_Y:Numeric; cnstНФА100П:Numeric; cnstНФА_ИНВ:Numeric; aNoOut:Logical; aNoAmt:Logical) :Integer;
var Цена :Numeric;
var cur_state :Integer;
 cur_state=0;
 if BAL_C<>0.00 or AMT_C<>0.00:
   if 2BAL_C>0.000:
     if KOL_C>0.00: Цена=BAL_C/KOL_C; else Цена=0.00; fi;
     if Цена > 0.00:
       if Цена >  cnstНФА100П                        : cur_state=+30; -- необходима проверка начислений амортизации по норме
       |  Цена <= cnstНФА100П and Цена > cnstНФА_ИНВ : cur_state=+20; -- необходима проверка 100% начисления амортизации при выдаче в эксплуатацию
       |  Цена <= cnstНФА_ИНВ                        : cur_state=+10; -- необходимо списание на забаланс - проверка 'зависшей' суммы амортизации
       fi;
       if aNoAmt and (cur_state=+30 or cur_state=+20): cur_state=+31; fi;
       if aNoOut and cur_state=+10: cur_state=+11; fi;
       if cur_state=+30: -- если тут проверка по норме, то...
         if KOL_Y>0.00: Цена=BAL_Y/KOL_Y; else Цена=0.00; fi;
         if Цена > 0.00 and Цена > cnstНФА100П: cur_state=+39; fi; -- необходима проверка начислений амортизации по норме на начало года
       fi;
     else
       cur_state=-12; -- отрицательное или нулевое количество, требуется дополнительная информация для анализа
     fi;
   | 2BAL_C=0.000: if AMT_C<>0.00: cur_state=+1; fi; -- необходимо списание 'зависшей' суммы амортизации для выбывшего НФА
   | 2BAL_C<0.000: cur_state=-11; -- отрицательная балансовая стоимость, требуется дополнительная информация для анализа
   fi;
 else
   cur_state=-1; -- НФА полностью списано (выбыло)
 fi; --if BAL_C<>0.00 or AMT_C<>0.00 (есть что проверять)
 ^cur_state;
end;

Func ТекстМетодаИсправленияИлиОшибки(cur_state:Integer) :String;
 if cur_state= +39: ^"Осуществлена проверка начислений амортизации по норме на отчетную дату и на начало года";
 |  cur_state= +31: ^"Осуществлена проверка начислений амортизации на отчетную дату (при флаге в карточке НФА 'не начислять амортизацию')";
 |  cur_state= +30: ^"Осуществлена проверка начислений амортизации по норме на отчетную дату";
 |  cur_state= +20: ^"Осуществлена проверка начислений амортизации для НФА выданных в эксплуатацию со 100% начислением амортизации";
 |  cur_state= +11: ^"Осуществлена проверка 'зависших' суммы амортизации для НФА в эксплуатации без инвентарного номера (при флаге 'не списывать при выдаче в эксплуатацию')";
 |  cur_state= +10: ^"Осуществлена проверка 'зависших' суммы амортизации для НФА в эксплуатации без инвентарного номера";
 |  cur_state=  +1: ^"Осуществлена проверка 'зависших' суммы амортизации (для выбывших НФА)";
 |  cur_state=  -1: ^"На отчетную дату НФА полностью списано с учета";
 |  cur_state= -11: ^"ОШИБКА. Отрицательная балансовая стоимость, требуется дополнительная информация для анализа";
 |  cur_state= -12: ^"ОШИБКА. Отрицательное или нулевое количество, требуется дополнительная информация для анализа";
 |  cur_state=-101: ^"ОШИБКА. Отсутствует или некорректна дата принятия к учету";
 |  cur_state=-102: ^"ОШИБКА. Отсутствует или некорректны данные о сроке эксплуатаци";
 else ^"";
 fi;
end;

Func ГОДМЕС_тестом(YYYY:Integer; aMon:Logical) :String;
var DDDD :Integer;
 if YYYY>0 and YYYY<101:
   if YYYY<10:
     if YYYY=1:                     ^(Str(YYYY)+if(aMon, " месяц"  , " год" ));
     |  YYYY=2 or YYYY=3 or YYYY=4: ^(Str(YYYY)+if(aMon, " месяца" , " года"));
     else                           ^(Str(YYYY)+if(aMon, " месяцев", " лет" ));
     fi;
   |  YYYY>20 and YYYY<100:
     DDDD=Int(SubStr(Str(YYYY), 2, 1));
     if DDDD=1:                     ^(Str(YYYY)+if(aMon, " месяц"  , " год" ));
     |  DDDD=2 or DDDD=3 or DDDD=4: ^(Str(YYYY)+if(aMon, " месяца" , " года"));
     else                           ^(Str(YYYY)+if(aMon, " месяцев", " лет" ));
     fi;
   else ^(Str(YYYY)+if(aMon, " месяцев", " лет" ));
   fi;
 fi;
 ^"";
end;

Func СрокТекстом(SROK:Integer) :String;
var YYYY, MMMM :Integer;
var RES :String;
 RES="";
 if SROK>0:
   if SROK>12:
     YYYY=Int(Trunc(SROK/12));
     if YYYY>0: RES=Объединить(RES, ГОДМЕС_тестом(YYYY, False), " "); fi;
     MMMM=SROK-YYYY*12;
     if MMMM>0: RES=Объединить(RES, ГОДМЕС_тестом(MMMM,  True), " "); fi;
   else
     RES=ГОДМЕС_тестом(SROK,  True);
   fi;
 fi;
 ^RES;
end;

Func СтатусПроверки_КОД(cur_state:Integer; СумКорр_Y:Numeric; СумКорр_C:Numeric) :Integer;
 if cur_state>0: if СумКорр_Y=0.00 and СумКорр_C=0.00: ^1; else ^2; fi;
 |  cur_state<0: ^3;
 else ^0;
 fi;
end;

Func МожноСохранить :Logical;
var lastRepDate :Date;
var RO, num :Integer;
 if not (CanInsert(SelfCRD_Z) and CanInsert(SelfCRD_T)) or not (CanUpdate(SelfCRD_Z) and CanUpdate(SelfCRD_T)):
   Message("В текущей схеме доступа редактирование^Mкартотеки корректровок амортизации запрещено.", mtError);
   ^False;
 fi;
 if not Позиции>0:
   Message("Нечего сохранять.^MСоздайте новый или считайте расчет.", mtError);
   ^False;
 fi;
 if SystemKeys="":
   Message("Ключ расчета пуст.^MСоздайте новый или считайте расчет.", mtError);
   ^False;
 fi;
 lastRepDate=1.1.100;
 RO=OpenWorkArea(SelfCRD_Z, "УЧТГОД; УЧТМЕС", "");
 Try
   num=Records(RO);
   if num>0: lastRepDate = GetFieldD(RO, num, "ДАТОТЧ"); fi;
 Finally
   CloseWorkArea(RO);
 end;
 if ДАТОТЧ>ValidDate and ДАТОТЧ<lastRepDate:
   Message("Дата отчета для его сохранения не должна быть ранее уже сохраненного отчета.^MУдалите предыдущий расчет(ы) или выберите более поздний период расчета.", mtError);
   ^False;
 fi;
 if currКнопка<>1:
   Message("Необходима синронизация.^MВыберите пункт 'ВСЕ строки отчета'.", mtWarning);
   ^False;
 fi;
 ^True;
end;

Func Монопольно(aRO:Integer; aNum:Integer; aRec:Record) :Logical;
var OK :Logical;
var pp :Integer;
 OK=False;
 pp=SearchInArray(Lock, aRec, True, 1);
 if pp>0: OK=True; else if LockRecord(aRO, aNum, 3): AddInArray(Lock, True, False, aRec); OK=True; fi; fi;
 ^OK;
end;

Proc Сохранить_РасчетКорректировка_Первичная(currentCalcKey:String);
var RZ, RT, len, pp, zz, ii, xx, yy, OA :Integer;
var First :Logical;
var REC :Record;
 if МожноСохранить:
   ClearVariable(Lock);
   REC=NIL;
   RT=OpenWorkArea(SelfCRD_T, "", "");
   RZ=OpenWorkArea(SelfCRD_Z, "", "SYSKEY_CLC='"+currentCalcKey+"'");
   ShowProgress(0, "Сохраняем шапку...");
   Try
     len=Records(RZ);
     if len=0:
       BeginChanging(RZ);
       Try
         pp=InsertRecord(RZ);
         zz=PutFieldL(RZ, pp, "ПРОВОДИТЬ" , False);                                            --флаг проводить
         countSAVE=1;
         zz=PutFieldI(RZ, pp, "COUNTSAVE" , countSAVE);                                        --флаг сохранения (для обновлений)
         zz=PutFieldI(RZ, pp, "ELEMENTS"  , Позиции);                                          --количество элементов (для контроля)
         zz=PutFieldS(RZ, pp, "SYSKEY_CLC", currentCalcKey);                                   --системный ключ расчета-корректировки
         zz=PutFieldD(RZ, pp, "ДАТОТЧ"    , ДАТОТЧ);                                           --дата отчета
         zz=PutFieldD(RZ, pp, "ДАТПРД"    , ДАТПРД);                                           --дата проводок
         zz=PutFieldS(RZ, pp, "ОТЧАНА"    , Trim(ОТЧАНА));                                     --дополнительный фильтр аналитики расчета
         zz=PutFieldI(RZ, pp, "УЧТГОД"    , УЧТГОД);                                           --учетный год
         zz=PutFieldI(RZ, pp, "УЧТМЕС"    , УЧТМЕС);                                           --учетный месяц
         --
         zz=PutFieldS(RZ, pp, "УЧР_SREF"  , if(УЧР_SREC<>NIL, RecordToString(УЧР_SREC), ""));  --учреждение - ссылка на контрагента
         zz=PutFieldS(RZ, pp, "УЧР_НАИМ"  , УЧР_НАИМ);                                         --учреждение - наименование
         zz=PutFieldS(RZ, pp, "УЧР_ОКПО"  , УЧР_ОКПО);                                         --учреждение - ОКПО
         zz=PutFieldS(RZ, pp, "ИСПREF"    , if(ИСПREC<>NIL, RecordToString(ИСПREC), ""));      --исполнитель - ссылка на сотрудника
         zz=PutFieldS(RZ, pp, "ИСПФИО"    , ИСПФИО);                                           --исполнитель - Ф.И.О.
         zz=PutFieldS(RZ, pp, "ИСПДОЛ"    , ИСПДОЛ);                                           --исполнитель - должность
         zz=PutFieldD(RZ, pp, "ДАТИСП"    , ДАТИСП);                                           --дата подписи (исполнения)
         zz=PutFieldN(RZ, pp, "ИТГБСУМY"  , итгБНСУМY);                                        --ИТОГО балансовая сумма на начало года   (только НЕинвентарные ОС)
         zz=PutFieldN(RZ, pp, "ИТГБСУМC"  , итгБНСУМC);                                        --ИТОГО балансовая сумма на отчетную дату (только НЕинвентарные ОС)
         EndChanging(RZ);
         REC=GetRecordKey(RZ, pp);
       Except
         Message("Ошибка "+Str(ErrorCode)+".", mtError);
         CancelChanging(RZ);
         Raise;
       end;
       if REC<>NIL:
         ShowProgress(Позиции, "Сохраняем таблицу...");
         First=False;
         BeginChanging(RT);
         First=True;
         Try
           xx=0; yy=0;
           for ii=1 to Позиции do
             ProgressPos(ii);
             if xx=0 and not First: BeginChanging(RT); fi;
             First=False;
             xx=xx+1;
             pp=InsertRecord(RT);
             --
             zz=PutFieldR(RT, pp, "R_HEAD" , REC);                --ссылка на заголовок
             zz=PutFieldD(RT, pp, "R_ДАТА" , ДАТПРД);             --дата проводки
             zz=PutFieldL(RT, pp, "R_УЧЕТ" , False);              --флаг проведения по учету
             zz=PutFieldI(RT, pp, "R_SAVE" , 1);                  --флаг сохранения
             --
             zz=PutFieldS(RT, pp, "КОДНФА" , тблКОДНФА[ii]);      --код НФА
             zz=PutFieldS(RT, pp, "НМННФА" , тблНМННФА[ii]);      --наименование НФА
             zz=PutFieldS(RT, pp, "ИНВНОМ" , тблИНВНОМ[ii]);      --инвентарный номер
             zz=PutFieldS(RT, pp, "УЧННОМ" , тблУЧННОМ[ii]);      --учетный номер
             zz=PutFieldD(RT, pp, "ДАТУЧТ" , тблДАТУЧТ[ii]);      --дата принятия к учету
             zz=PutFieldD(RT, pp, "ДАТЭКС" , тблДАТЭКС[ii]);      --дата ввода в эксплуатацию
             zz=PutFieldS(RT, pp, "СРКНРМ" , тблСРКНРМ[ii]);      --срок эксплутации - норма
             zz=PutFieldS(RT, pp, "СРКФКТ" , тблСРКФКТ[ii]);      --срок эксплутации - факт
             zz=PutFieldL(RT, pp, "НОВОЕ_" , тбл_НОВОЕ[ii]);      --новое имущество или было в эксплуатации
             zz=PutFieldN(RT, pp, "БЛСУМY" , тблБЛСУМY[ii]);      --балансовая сумма на начало года
             zz=PutFieldN(RT, pp, "БЛСУМC" , тблБЛСУМC[ii]);      --балансовая сумма на отчетную дату
             zz=PutFieldN(RT, pp, "АМФКТY" , тблАМФКТY[ii]);      --начисленная амортизация факт   на начало года
             zz=PutFieldN(RT, pp, "АМРЧТY" , тблАМРЧТY[ii]);      --начисленная амортизация расчет на начало года
             zz=PutFieldN(RT, pp, "АМКОРY" , тблАМКОРY[ii]);      --сумма корректировки амортизации на начало года
             zz=PutFieldN(RT, pp, "АМФКТC" , тблАМФКТC[ii]);      --начисленная амортизация факт   на отчетную дату
             zz=PutFieldN(RT, pp, "АМРЧТC" , тблАМРЧТC[ii]);      --начисленная амортизация расчет на отчетную дату
             zz=PutFieldN(RT, pp, "АМКОРC" , тблАМКОРC[ii]);      --сумма корректировки амортизации на отчетную дату
             zz=PutFieldI(RT, pp, "РЕЗУЛ_" , тбл_РЕЗУЛ[ii]);      --статус результата проверки
             zz=PutFieldS(RT, pp, "КБКПРВ" , тблКБКПРВ[ii]);      --КБК проводки
             zz=PutFieldS(RT, pp, "ДЕБПРY" , тблДЕБПРY[ii]);      --дебет  проводки на начало года
             zz=PutFieldS(RT, pp, "КРЕПРY" , тблКРЕПРY[ii]);      --кредит проводки на начало года
             zz=PutFieldS(RT, pp, "ДЕБПРC" , тблДЕБПРC[ii]);      --дебет  проводки на отчетную дату
             zz=PutFieldS(RT, pp, "КРЕПРC" , тблКРЕПРC[ii]);      --кредит проводки на отчетную дату
             zz=PutFieldS(RT, pp, "ПРИЧИН" , тблПРИЧИН[ii]);      --метод исправления или описание ошибки (текст)
             zz=PutFieldI(RT, pp, "STATE_" , тбл_STATE[ii]);      --классификация типа записи для возможных исправления
             zz=PutFieldS(RT, pp, "ДОПАНА" , тбл_ДОПАН[ii]);      --дополнительная аналитика
             zz=PutFieldL(RT, pp, "ИСКЛЮЧ" , тблИСКЛЮЧ[ii]);      --исключить строку (пользователь)
             zz=PutFieldL(RT, pp, "TRANS_" , тбл_TRANS[ii]);      --позиция с проводкой
             тбs_COUNT[ii] = 1;
             тбs_TRKEY[ii] = GetRecordKey(RT, pp);
             --
             if xx=500: --записываем очередную порцию записей
               EndChanging(RT);
               yy=yy+xx;
               xx=0;
             fi;
           od; --RT
           if xx>0: EndChanging(RT); yy=yy+xx; fi; --если последняя порция неполная
           -- запись тбs_TRKEY
           SetFilter(RZ, "SYSKEY_CLC='"+currentCalcKey+"'");
           if Records(RZ)=1:
             BeginChanging(RZ);
             Try
               ShowProgress(Позиции, "Сохраняем ссылки...");
               OA=OpenArray(RZ, 1, "Позиции", "", "");
               Try
                 for ii=1 to Позиции do
                   ProgressPos(ii);
                   pp=InsertRecord(OA);
                   zz=PutFieldR(OA, pp, "TRANS", тбs_TRKEY[ii]); --ссылка на проводку
                 od;
                 EndChanging(RZ);
               Finally
                 CloseWorkArea(OA);
               end;
             Except
               Message("Ошибка "+Str(ErrorCode)+".", mtError);
               CancelChanging(RZ);
               Raise;
             end;
           fi;
         Except
           Message("Ошибка "+Str(ErrorCode)+".", mtError);
           CancelChanging(RT);
           Raise;
         end;
       fi; --REC<>NIL
     else
       Message("Запись с ключом^M'"+currentCalcKey+"'^Mуже существует.", mtError);
     fi;
   Finally
     CloseProgress;
     CloseWorkArea(RZ);
     CloseWorkArea(RT);
   end;
 fi;
end; --Сохранить_РасчетКорректировка_Первичная;

Proc СохранитьКонтрольИзменений;
 sav_ДАТПРД    = ДАТПРД;        --дата проводок
 sav_Проводить = flgПроводить;  --флаг проводить
 sav_УЧР_SREC  = УЧР_SREC;      --учреждение - ссылка на контрагента
 sav_УЧР_НАИМ  = УЧР_НАИМ;      --учреждение - наименование
 sav_УЧР_ОКПО  = УЧР_ОКПО;      --учреждение - ОКПО
 sav_ИСПREC    = ИСПREC;        --исполнитель - ссылка на сотрудника
 sav_ИСПФИО    = ИСПФИО;        --исполнитель - Ф.И.О.
 sav_ИСПДОЛ    = ИСПДОЛ;        --исполнитель - должность
 sav_ДАТИСП    = ДАТИСП;        --дата подписи (исполнения)
 CopyArray(тблИСКЛЮЧ, sav_ИСКЛЮЧ);
 CopyArray(тбл_ДОПАН, sav__ДОПАН);
end;

Proc ОткатитьКонтрольИзменений;
 ДАТПРД       = sav_ДАТПРД    ;  --дата проводок
 flgПроводить = sav_Проводить ;  --флаг проводить
 УЧР_SREC     = sav_УЧР_SREC  ;  --учреждение - ссылка на контрагента
 УЧР_НАИМ     = sav_УЧР_НАИМ  ;  --учреждение - наименование
 УЧР_ОКПО     = sav_УЧР_ОКПО  ;  --учреждение - ОКПО
 ИСПREC       = sav_ИСПREC    ;  --исполнитель - ссылка на сотрудника
 ИСПФИО       = sav_ИСПФИО    ;  --исполнитель - Ф.И.О.
 ИСПДОЛ       = sav_ИСПДОЛ    ;  --исполнитель - должность
 ДАТИСП       = sav_ДАТИСП    ;  --дата подписи (исполнения)
 CopyArray(sav_ИСКЛЮЧ, тблИСКЛЮЧ);
 CopyArray(sav__ДОПАН, тбл_ДОПАН);
end;

Func СчетНФА_Восстановить(AccAmt:String) :String;
 if Match(AccAmt, "???.????.???????.???.?.101.??.???"): ^SubStr(AccAmt, 1, 30)+"310";
 |  Match(AccAmt, "???.????.???????.???.?.102.??.???"): ^SubStr(AccAmt, 1, 30)+"320";
 else ^AccAmt;
 fi;
end;

Func Взять_КоррСчет_Амортизации(КВФО:String) :String;
 if КВФО="1": ^if(use109to_1, cnstAcc109, cnstAcc401);
 |  КВФО="2": ^if(use109to_2, cnstAcc109, cnstAcc401);
 |  КВФО="4": ^if(use109to_4, cnstAcc109, cnstAcc401);
 |  КВФО="7": ^if(use109to_7, cnstAcc109, cnstAcc401);
 else ^cnstAcc401;
 fi;
 ^"";
end;

Proc Создать_РасчетКорректировка;
var КОДСЧТ, КОДАМТ, КОДНФА, КОДУЧН, КОДМХЭ, КОДИСТ, BaseMask, MaskAna :String;
var ROнфа, ROинв, len, ii, ppНФА, ppИНВ, srk, fsy, fsc, num, jj :Integer;
var ConstНФА100П, ConstНФА_ИНВ, SUM :Numeric;
var useДОПАНА, flgNoOut, flgNoAmt :Logical;
var ddYear, ddpu, ddve, dnna, dwrk :Date;
var REC :Record;

 if not 2ПроверкаЗаполнения0: Exit; fi;
 Refresh(False);
 ОчисткаRep;
 ddYear=Dat(1, 1, Year(ДАТОТЧ));
 BaseMask="(НФА.*)&(УЧН.*)";
 MaskAna="";
 ii=0;
 --
 отчАНА=Trim(отчАНА);
 if отчАНА<>"":
   if (Length(отчАНА)+2)<=(255-(Length(BaseMask)+7)): MaskAna=Объединить(BaseMask, "("+отчАНА+")",  "&"); ii=+1; else ii=-1; fi;
 fi;
 if РАБ.НФА.LIBREP.СправочникиСтруктурыПоМаскеСчетовПрогресс("*.?.101.??.???|*.?.102.??.???", 1.1.100, ДАТОТЧ, True, True)=" ": Exit; fi; -- если был Except
 if SearchInArray(РАБ.НФА.LIBREP.bindVOC, "НФА.*", True, 1)<1: Message("Справочник 'НФА' не привязан к 101, 102 счетам учета НФА.", mtError); Exit; fi;
 if ii<0:
   len=РАБ.НФА.LIBREP.ВсеСправочникиДопАналитикиПривязаны(отчАНА);
   if len>0: -- все ОК
   |  len=0: Message("Длинное условие отбора аналитики.^MИспользуется свертка...^M^MСправочник(и) из строки 'Дополнительный фильтр:' не привязан к 101, 102 счетам учета НФА.", mtError);
             Exit;
   |  len<0: Exit; -- для Exceptа
   fi;
 fi;
 useДОПАНА=if(ii<0, True, False);
 if РАБ.НФА.LIBREP.СправочникиСтруктурыПоМаскеСчетовПрогресс("*.?.104.??.???", 1.1.100, ДАТОТЧ, True, True)=" ": Exit; fi; -- если был Except
 if SearchInArray(РАБ.НФА.LIBREP.bindVOC, "НФА.*", True, 1)<1: Message("Справочник 'НФА' не привязан к 104 счету учета НФА.", mtError); Exit; fi;
 if MaskAna="": MaskAna=BaseMask; fi;
 SystemKeys="";
 --
 len=0;
 len=2Создать_СписокИнвентарныхОбъектов0(ddYear, ДАТОТЧ,  True, useДОПАНА, MaskAna, отчАНА);
 len=2Создать_СписокИнвентарныхОбъектов0(ddYear, ДАТОТЧ, False, useДОПАНА, MaskAna, отчАНА);
 len=2Создать_СальдоАмортизации0(        ddYear, ДАТОТЧ,  True);
 len=2Создать_СальдоАмортизации0(        ddYear, ДАТОТЧ, False);
 --
 len=LengthOfArray(rep_UNIQUE_);
 if not len>0:
   Message("Список инвентарных объектов не создан.^MВозможно картотека НФА пустая^Mили нет проведенных по учету проводок.", mtError);
   Exit;
 fi;
 --
 ShowProgress(0, "Анализ обязательной аналитики...");
 ROнфа=OpenWorkArea("РПО_НФА", "", "");
 ROинв=OpenWorkArea("РПО_ИНВКАРТ_ОС", "", "");
 Try
   ОчисткаТаблицы(False);
   Try SUM=Com_Var("ОС_100"  , ДАТОТЧ-1); Except SUM=0.00; end; if not SUM>0.00: if (ДАТОТЧ-1)>=1.1.2011: SUM=40000; else SUM=20000; fi; fi; ConstНФА100П=SUM;
   Try SUM=Com_Var("ОС_РАСХ" , ДАТОТЧ-1); Except SUM=0.00; end; if not SUM>0.00: if (ДАТОТЧ-1)>=1.1.2009: SUM=3000;  else SUM=1000;  fi; fi; ConstНФА_ИНВ=SUM;
   -- узнаем обязательные справочники
   ClearVariable(VocMsk);
   --for Account КОДСЧТ="*.104.??.???|*.106.??.???|*.109.??.271|*.401.20.271", Sort do
   for Account КОДСЧТ="*.104.??.???|*.109.??.271|*.401.20.271", Sort do
     BaseMask=SignsMask(КОДСЧТ, True);
     if BaseMask<>"":
       for ii=1 to WordsCount(BaseMask, "|") do
         MaskAna=Up(ExtractWord(1, ExtractWord(ii, BaseMask, "|"), "."));
         if MaskAna<>"" and MaskAna<>"КОСГУ" and MaskAna<>"НФА" and MaskAna<>"УЧН": AddInArray(VocMsk, True, False, MaskAna); fi;
       od;
     fi;
   od;
   if Trim(dflt_DopAnaVoc)<>"":
     for ii=1 to WordsCount(dflt_DopAnaVoc, " ") do
       AddInArray(VocMsk, True, False, Up(ExtractWord(ii, dflt_DopAnaVoc, " ")));
     od;
   fi;
   num=LengthOfArray(VocMsk);
   --
   ShowProgress(len, "Анализ собранных данных...");
   for ii=1 to len do
     ProgressPos(ii);
     КОДСЧТ=""; КОДАМТ=""; КОДНФА=""; КОДУЧН=""; КОДМХЭ=""; КОДИСТ=""; REC=NIL; ppНФА=0; ppИНВ=0;
     ddpu=1.1.100; ddve=1.1.100; dnna=1.1.100; dwrk=1.1.100; srk=0; fsy=0; fsc=0;
     flgNoOut=False; flgNoAmt=False;
     КОДАМТ=repСЧЕТАМРТ[ii];                      if КОДАМТ="АМТ.$$$": КОДАМТ=""; fi;
     КОДСЧТ=ExtractWord(1, rep_UNIQUE_[ii], "#"); if КОДСЧТ="БАЛ.$$$": КОДСЧТ=""; fi;
     КОДНФА=ExtractWord(2, rep_UNIQUE_[ii], "#"); if КОДНФА="НФА.$$$": КОДНФА=""; fi;
     КОДУЧН=ExtractWord(3, rep_UNIQUE_[ii], "#"); if КОДУЧН="УЧН.$$$": КОДУЧН=""; fi;
     КОДМХЭ=rep_КОДМХЭ_[ii];
     --
     if Name_A(КОДНФА)<>" ":
       REC=SignToRecord(КОДНФА, False);
       if REC<>NIL: ppНФА=GetRecordNumber(ROнфа, REC); fi;
       if Name_A(КОДУЧН)<>" ":
         REC=SignToRecord("ИНВВЕД."+КОДНФА+"."+КОДУЧН, False);
         if REC<>NIL: ppИНВ=GetRecordNumber(ROинв, REC); fi;
       fi;
     fi;
     if ppНФА>0:
       flgNoOut=GetFieldL(ROнфа, ppНФА, "НЕСПИСЫВАТЬДО1000");
       flgNoAmt=GetFieldL(ROнфа, ppНФА, "АМОРТ0");
     fi;
     --
     2тбл_STATE[ii]0=ОценитьПозицию(repБАЛСУМ_C[ii], repАМТ104_C[ii], repБАЛКОЛ_C[ii], repБАЛСУМ_Y[ii], repАМТ104_Y[ii], repБАЛКОЛ_Y[ii], ConstНФА100П, ConstНФА_ИНВ, flgNoOut, flgNoAmt);
     --
     тблКОДНФА[ii] = КОДНФА;
     тблНМННФА[ii] = Trim(Name_A(КОДНФА));
     тблИНВНОМ[ii] = Trim(Name_A("ИНВВЕД."+КОДНФА+"."+КОДУЧН));
     тблУЧННОМ[ii] = КОДУЧН;

     тблБЛСУМY[ii] = repБАЛСУМ_Y[ii];
     тблБЛСУМC[ii] = repБАЛСУМ_C[ii];

     тблАМФКТY[ii] = repАМТ104_Y[ii];
     тблАМФКТC[ii] = repАМТ104_C[ii];

     тблИСКЛЮЧ[ii] = False;
     тбл_ДОПАН[ii] = "";

     ddpu=2ВзятьДатуПринятияУчету_П_модиф0(ROинв, ppИНВ, True, КОДНФА, КОДУЧН, КОДСЧТ, ДАТОТЧ);
     ddve=2ВзятьДатуВводаЭксплуат_П_модиф0(ROинв, ppИНВ, True, КОДНФА, КОДУЧН, КОДСЧТ, КОДМХЭ, ДАТОТЧ, ConstНФА100П);
     if not (ddpu>ValidDate) and (ddve>ValidDate): ddpu=ddve; fi;

     if тбл_STATE[ii]=30 or тбл_STATE[ii]=39:

       if ddpu>ValidDate:

         if ddve>ValidDate and ddve<ddpu: dwrk=AddMon(ddve, 1); else dwrk=AddMon(ddpu, 1); fi;
         dnna=Dat(1, Mon(dwrk), Year(dwrk)); --дата начала действия начисления амортизации по сроку службы
       else
         тбл_STATE[ii]=-101; -- некорректная дата принятия к учету
       fi;

       srk=2ВзятьСрокЭксплуатМес0(ddpu, ROинв, ppИНВ, ROнфа, ppНФА);
       if not srk>0: тбл_STATE[ii]=-102; fi; -- некорректные данные о сроке эксплуатации

       if тбл_STATE[ii]>0:
         fsy=2КоличествоМесяцевАмортизацииФакт0(dnna, ddYear);
         fsc=2КоличествоМесяцевАмортизацииФакт0(dnna, ДАТОТЧ);
       fi;

     fi;

     тблДАТУЧТ[ii] = ddpu;
     тблДАТЭКС[ii] = ddve;
     тбл_НОВОЕ[ii] = if(not Match(КОДМХЭ, "М.Э.*") and ddve<ValidDate, True, False);

     тблСРКНРМ[ii] = СрокТекстом(srk);
     тблСРКФКТ[ii] = СрокТекстом(fsc);

     тблАМРЧТY[ii] = 0.00;
     тблАМКОРY[ii] = 0.00;
     тблАМРЧТC[ii] = 0.00;
     тблАМКОРC[ii] = 0.00;

     if тбл_STATE[ii]>0:
       -- 2ПРОВЕРЯЕМ ПРАВИЛЬНОСТЬ АМОРТИЗАЦИИ
       if _тбл_STATE[ii]=30. or _тбл_STATE[ii]=39.:

         --{30 и 39}расчитываем сумму амортизации по норме на дату отчета
         if srk>0 and fsc>0: SUM=Round(тблБЛСУМC[ii]/srk*fsc, 2); else SUM=0.00; fi;
         тблАМРЧТC[ii]=SUM;
         if Round(тблАМРЧТC[ii], 2) >Round(тблБЛСУМC[ii], 2): тблАМРЧТC[ii]=тблБЛСУМC[ii]; fi;
         if Round(тблАМРЧТC[ii], 2)<>Round(тблАМФКТC[ii], 2): тблАМКОРC[ii]=(Round(тблАМРЧТC[ii], 2)-Round(тблАМФКТC[ii], 2)); fi;

         --{только 39} расчитываем сумму амортизации по норме на начало года
         if _тбл_STATE[ii]=39. and not ddYear=ДАТОТЧ:
           if srk>0 and fsy>0: SUM=Round(тблБЛСУМY[ii]/srk*fsy, 2); else SUM=0.00; fi;
           тблАМРЧТY[ii]=SUM;
           if Round(тблАМРЧТY[ii], 2) >Round(тблБЛСУМY[ii], 2): тблАМРЧТY[ii]=тблБЛСУМY[ii]; fi;
           if Round(тблАМРЧТY[ii], 2)<>Round(тблАМФКТY[ii], 2): тблАМКОРY[ii]=(Round(тблАМРЧТY[ii], 2)-Round(тблАМФКТY[ii], 2)); fi;
           if тблАМКОРC[ii]<>0.00 and тблАМКОРY[ii]<>0.00: тблАМКОРC[ii]=тблАМКОРC[ii]-тблАМКОРY[ii]; fi; -- учитываем предыдущие исправления
         fi;

       |  _тбл_STATE[ii]=01. or _тбл_STATE[ii]=10. or _тбл_STATE[ii]=11. or _тбл_STATE[ii]=31.:

         --{01} исправляем наччисленную амортизацию для 'зависших' сумм амортизации выбывшего НФА
         --{10} проверяем начисленную амортизацию для НФА выданных в эксплуатацию без начисления амортизации (без инвентарного номера)
         --{11} проверяем начисленную амортизацию для НФА (с флагом 'не списывать при выдаче в эксплуатацию') выданных в эксплуатацию без начисления амортизации (без инвентарного номера)
         --{31} проверяем начисленную амортизацию при флаге в карточке НФА 'не начислять амортизацию'
         тблАМРЧТC[ii]=0.00;
         if Round(тблАМРЧТC[ii], 2)<>Round(тблАМФКТC[ii], 2): тблАМКОРC[ii]=(Round(тблАМРЧТC[ii], 2)-Round(тблАМФКТC[ii], 2)); fi;

       |  _тбл_STATE[ii]=20.:

         --{20} расчитываем НФА выданные в эксплуатацию со 100% начислением амортизации
         if тблАМФКТC[ii]>0.00: 
           if ddpu<1.1.2011 and тбл_НОВОЕ[ii] and (тблБЛСУМC[ii]>20000 and тблБЛСУМC[ii]<=40000):
             if Round(тблАМФКТC[ii], 2)>Round(тблБЛСУМC[ii], 2): тблАМРЧТC[ii]=тблБЛСУМC[ii]; fi;
           else
             тблАМРЧТC[ii]=тблБЛСУМC[ii];
           fi;
         else
           if Match(КОДМХЭ, "М.Э.*"): тблАМРЧТC[ii]=тблБЛСУМC[ii]; fi; -- если сумма = 0 или отрицательная, то проверяем не в эксплуатации ли она
         fi;
         if Round(тблАМРЧТC[ii], 2)<>Round(тблАМФКТC[ii], 2): тблАМКОРC[ii]=(Round(тблАМРЧТC[ii], 2)-Round(тблАМФКТC[ii], 2)); fi;

       fi;

       КОДИСТ=SubStr(КОДСЧТ, 22, 1);

       if тблАМКОРC[ii]<>0.00:
         тблКБКПРВ[ii]=SubStr(КОДСЧТ, 1, 20);
         тблДЕБПРC[ii]=КОДИСТ+"."+if(ddYear=ДАТОТЧ, if(cnstUseYYY, cnstAccYYY, Взять_КоррСчет_Амортизации(КОДИСТ)), Взять_КоррСчет_Амортизации(КОДИСТ));
         тблКРЕПРC[ii]=SubStr(КОДАМТ, 22, 12);
       fi;

       if тблАМКОРY[ii]<>0.00 and not ddYear=ДАТОТЧ:
         if тблКБКПРВ[ii]="": тблКБКПРВ[ii]=SubStr(КОДСЧТ, 1, 20); fi;
         тблДЕБПРY[ii]=КОДИСТ+"."+if(cnstUseYYY, cnstAccYYY, Взять_КоррСчет_Амортизации(КОДИСТ));
         тблКРЕПРY[ii]=SubStr(КОДАМТ, 22, 12);
       fi;

     fi; --тбл_STATE[ii]>0

     тблПРИЧИН[ii] = ТекстМетодаИсправленияИлиОшибки(тбл_STATE[ii]);
     тбл_РЕЗУЛ[ii] = СтатусПроверки_КОД(тбл_STATE[ii], тблАМКОРY[ii], тблАМКОРC[ii]);
     тбл_TRANS[ii] = if(тбл_РЕЗУЛ[ii]=2, True, False);
     тбs_COUNT[ii] = 0;
     тбs_TRKEY[ii] = NIL;

     -- добавление дополнительной аналитики - начало
     if тбл_TRANS[ii] and num>0: -- если есть у позиции проводка и есть обязательные признаки
       if тблАМКОРC[ii]<>0.00:
         BaseMask=""; MaskAna="";
         if Match(КОДСЧТ, "*.?.???.??.???") and Name_S(СчетНФА_Восстановить(КОДСЧТ))<>" " and Name_A(КОДНФА)<>" " and Name_A(КОДУЧН)<>" ":
           -- поиск по набору признаков код НФА и УЧН, а также счету учета НФА
           for jj=1 to num do
             BaseMask=РАБ.НФА.LIBREP.ПоследнийПризнакВПроводкахИзСправочника(КОДСЧТ, КОДНФА+"&"+КОДУЧН, 1.1.100, ДАТОТЧ, VocMsk[jj]);
             MaskAna=РАБ.НФА.LIBREP.Объединить(MaskAna, BaseMask, " ");
           od;
         fi;
         if MaskAna="":
           BaseMask=""; MaskAna="";
           if Match(КОДАМТ, "*.?.???.??.???") and Name_S(КОДАМТ)<>" " and Name_A(КОДНФА)<>" " and Name_A(КОДУЧН)<>" ":
             -- поиск по набору признаков код НФА и УЧН, а также счету амортизации НФА
             for jj=1 to num do
               BaseMask=РАБ.НФА.LIBREP.ПоследнийПризнакВПроводкахИзСправочника_для104(КОДАМТ, КОДНФА+"&"+КОДУЧН, 1.1.100, ДАТОТЧ, VocMsk[jj]);
               MaskAna=РАБ.НФА.LIBREP.Объединить(MaskAna, BaseMask, " ");
             od;
           fi;
         fi;
         тбл_ДОПАН[ii]=Trim(MaskAna);
       else
         if тблАМКОРY[ii]<>0.00:
           BaseMask=""; MaskAna="";
           if Match(КОДСЧТ, "*.?.???.??.???") and Name_S(СчетНФА_Восстановить(КОДСЧТ))<>" " and Name_A(КОДНФА)<>" " and Name_A(КОДУЧН)<>" ":
             -- поиск по набору признаков код НФА и УЧН, а также счету учета НФА
             for jj=1 to num do
               BaseMask=РАБ.НФА.LIBREP.ПоследнийПризнакВПроводкахИзСправочника(КОДСЧТ, КОДНФА+"&"+КОДУЧН, 1.1.100, ДАТОТЧ, VocMsk[jj]);
               MaskAna=РАБ.НФА.LIBREP.Объединить(MaskAna, BaseMask, " ");
             od;
           fi;
           if MaskAna="":
             BaseMask=""; MaskAna="";
             if Match(КОДАМТ, "*.?.???.??.???") and Name_S(КОДАМТ)<>" " and Name_A(КОДНФА)<>" " and Name_A(КОДУЧН)<>" ":
               -- поиск по набору признаков код НФА и УЧН, а также счету амортизации НФА
               for jj=1 to num do
                 BaseMask=РАБ.НФА.LIBREP.ПоследнийПризнакВПроводкахИзСправочника_для104(КОДАМТ, КОДНФА+"&"+КОДУЧН, 1.1.100, ДАТОТЧ, VocMsk[jj]);
                 MaskAna=РАБ.НФА.LIBREP.Объединить(MaskAna, BaseMask, " ");
               od;
             fi;
           fi;
           тбл_ДОПАН[ii]=Trim(MaskAna);
         fi; --if тблАМКОРY[ii]<>0.00:
       fi; --if тблАМКОРC[ii]<>0.00:
     fi; --тбл_TRANS[ii] and num>0
     -- добавление дополнительной аналитики - конец

   od;
 Finally
   CloseWorkArea(ROинв);
   CloseWorkArea(ROнфа);
   CloseProgress;
   Позиции=LengthOfArray(тбл_STATE);
 end;
 if Позиции>0:
   итгБНСУМY=Saldo("(*.101.*|*.102.*)&???.????.???????.???.?.???.??.???{~((НФА.*)&(УЧН.*))}", ddYear, "РУБ");
   итгБНСУМC=Saldo("(*.101.*|*.102.*)&???.????.???????.???.?.???.??.???{~((НФА.*)&(УЧН.*))}", ДАТОТЧ, "РУБ");
   СохранитьКонтрольИзменений;
   if not flgТолькоОтчет:
     SystemKeys=Str(УЧТГОД)+"#"+Str(УЧТМЕС)+"#"+Format("%.4d", Year(ToDay))+"."+Format("%.2d", Mon(ToDay))+"."+Format("%.2d", Day(ToDay))+"#"+РАБ.НФА.LIBREP.TimeToHMSstring_adv(Time, ":")+"#"+GetGUID;
     Сохранить_РасчетКорректировка_Первичная(SystemKeys);
   fi;
 fi;
 ClearVariable(NN);
end; --Создать_РасчетКорректировка

Proc Создать_РасчетКорректировка_Выполнить;
var начало :Integer;
 if EnqOkCancel("Будет произведен расчет-корректировка амортизации.^MПродолжить?", mtWarning)=cmOk:
   начало=Time;
   ClearTrace(True);
   currКнопка=1;
   Создать_РасчетКорректировка;
   if Позиции>0: 
     Message("Расчет завершен!^MВремя работы - "+РАБ.НФА.LIBREP.TimeToHMSstring_adv(Time-начало, ":"), mtInformation);
     ВидимостьОтчетныхТаблиц_Work(True, False, False, False, currКнопка);
     НеНоваяТаблица_Validate;
   fi;
 fi;
end; --Создать_РасчетКорректировка_Выполнить

Proc Чистить_РасчетКорректировка;
var Work :Logical;
 Work=False;
 if Позиции>0: if EnqOkCancel("Таблица расчета-корректировки амортизации будет очищена.^MПродолжить?", mtWarning)=cmOk: Work=True; fi; else Work=True; fi;
 if Work:
   ClearTrace(True);
   ОчисткаТаблицы(True);
   ValidateSectionAll;
 fi;
end;  --Чистить_РасчетКорректировка

Func Read_РасчетКорректировка(FlagUpdate:Logical) :Logical;
var RO, num, ii, pp :Integer;
var КОД, val1, val2, val3, val4, val5, kVal :String;
var УЧТ :Logical;
 if not FlagUpdate:
   if BufРЧТ[1]="" or LengthOfArray(BufРЧТ)<>LengthOfArray(TxtРЧТ) or not LengthOfArray(BufРЧТ)>0:
     FlagUpdate=True;
   fi;
 fi;
 if not FlagUpdate: ^True; fi;
 RO=OpenWorkArea(SelfCRD_Z, "SYSKEY_CLC", "SYSKEY_CLC<>''");
 Try
   num=Records(RO);
   if num>0:
      ClearVariable(BufРЧТ); ClearVariable(TxtРЧТ);
      ShowProgress(num, "Поиск сформированных расчетов-корректировок...");
      Try
        for ii=1 to num do
          ProgressPos(ii);
          КОД=GetFieldS(RO, ii, "SYSKEY_CLC");
          УЧТ=GetFieldL(RO, ii, "ПРОВОДИТЬ");
          if WordsCount(КОД, "#")=5:
            val1=ExtractWord(1, КОД, "#");
            val2=ExtractWord(2, КОД, "#");
            val3=ExtractWord(3, КОД, "#");
            val4=ExtractWord(4, КОД, "#");
            val5=ExtractWord(5, КОД, "#");
            kVal=val5+" --"+if(УЧТ, "Проведено "+DateToString(GetFieldD(RO, ii, "ДАТПРД"))+".", "Не проведено.")+" Расчет-корректировка на 1 "+Месяца(Int(val2))+" "+val1+" (создан "+val3+" - "+val4+")";
            if SearchInArray(BufРЧТ, КОД, True, 1)=-1: pp=InsertInArraySort(BufРЧТ, КОД); InsertInArray(TxtРЧТ, pp, kVal); fi;
          fi;
        od;
        InsertInArray(BufРЧТ, 1, "* --Обновить список");
        InsertInArray(TxtРЧТ, 1, "* --Обновить список");
      Finally
        CloseProgress;
      end;
   else
     Message("Сформированных расчетов-корректировок не найдено!", mtError);
     ^False;
   fi;
 Finally
   CloseWorkArea(RO);
 end;
 num=LengthOfArray(BufРЧТ);
 if num=LengthOfArray(TxtРЧТ) and num>0: ^True; fi;
 ^False;
end;  --Read_РасчетКорректировка

Proc СчитатьРасчетКорректировку(aCalcKey:String);
var RZ, RT, len, num, ii :Integer;
var Value :String;
var REC :Record;
 REC=NIL;
 RT=OpenWorkArea(SelfCRD_T, "", "1=0");
 RZ=OpenWorkArea(SelfCRD_Z, "", "SYSKEY_CLC='"+aCalcKey+"'");
 ShowProgress(0, "Считываем шапку...");
 Try
   len=Records(RZ);
   if len=1:
     ОчисткаТаблицы(False);
     flgТолькоОтчет=False;
     ii=1;
     flgПроводить = GetFieldL(RZ, ii, "ПРОВОДИТЬ"  );                             --флаг проводить
     countSAVE    = GetFieldI(RZ, ii, "COUNTSAVE"  );                             --флаг сохранения (для обновлений)
     if not countSAVE>0: countSAVE=1; fi;
     countELEM    = GetFieldI(RZ, ii, "ELEMENTS"   );                             --количество элементов (для контроля)
     SystemKeys   = GetFieldS(RZ, ii, "SYSKEY_CLC" );                             --системный ключ расчета-корректировки
     ДАТОТЧ       = GetFieldD(RZ, ii, "ДАТОТЧ"     );                             --дата отчета
     ДАТПРД       = GetFieldD(RZ, ii, "ДАТПРД"     );                             --дата проводок
     ОТЧАНА       = GetFieldS(RZ, ii, "ОТЧАНА"     );                             --дополнительный фильтр аналитики расчета
     УЧТГОД       = GetFieldI(RZ, ii, "УЧТГОД"     );                             --учетный год
     УЧТМЕС       = GetFieldI(RZ, ii, "УЧТМЕС"     );                             --учетный месяц
     --
     Value        = GetFieldS(RZ, ii, "УЧР_SREF"   );                             --учреждение - ссылка на контрагента
     if Value<>"": Try УЧР_SREC=StringToRecord(Value); Except УЧР_SREC=NIL; end; fi;
     УЧР_НАИМ     = GetFieldS(RZ, ii, "УЧР_НАИМ"   );                             --учреждение - наименование
     УЧР_ОКПО     = GetFieldS(RZ, ii, "УЧР_ОКПО"   );                             --учреждение - ОКПО
     --
     Value        = GetFieldS(RZ, ii, "ИСПREF"     );                             --исполнитель - ссылка на сотрудника
     if Value<>"": Try   ИСПREC=StringToRecord(Value); Except   ИСПREC=NIL; end; fi;
     ИСПФИО       = GetFieldS(RZ, ii, "ИСПФИО"     );                             --исполнитель - Ф.И.О.
     ИСПДОЛ       = GetFieldS(RZ, ii, "ИСПДОЛ"     );                             --исполнитель - должность
     ДАТИСП       = GetFieldD(RZ, ii, "ДАТИСП"     );                             --дата подписи (исполнения)
     --
     итгБНСУМY    = GetFieldN(RZ, ii, "ИТГБСУМY"   );                             --ИТОГО балансовая сумма на начало года   (только НЕинвентарные ОС)
     итгБНСУМC    = GetFieldN(RZ, ii, "ИТГБСУМC"   );                             --ИТОГО балансовая сумма на отчетную дату (только НЕинвентарные ОС)
     --
     REC=GetRecordKey(RZ, ii);
     --
     if REC<>NIL:
       SetFilter(RT, "R_HEAD="+RecordToString(REC));
       num=Records(RT);
       if num>0:
         ShowProgress(num, "Считываем таблицу...");
         for ii=1 to num do
           ProgressPos(ii);
           тбs_TRKEY[ii] = GetRecordKey(RT, ii);
           тбs_COUNT[ii] = GetFieldI(RT, ii, "R_SAVE" );      --флаг сохранения
           --
           тблКОДНФА[ii] = GetFieldS(RT, ii, "КОДНФА" );      --код НФА
           тблНМННФА[ii] = GetFieldS(RT, ii, "НМННФА" );      --наименование НФА
           тблИНВНОМ[ii] = GetFieldS(RT, ii, "ИНВНОМ" );      --инвентарный номер
           тблУЧННОМ[ii] = GetFieldS(RT, ii, "УЧННОМ" );      --учетный номер
           тблДАТУЧТ[ii] = GetFieldD(RT, ii, "ДАТУЧТ" );      --дата принятия к учету
           тблДАТЭКС[ii] = GetFieldD(RT, ii, "ДАТЭКС" );      --дата ввода в эксплуатацию
           тблСРКНРМ[ii] = GetFieldS(RT, ii, "СРКНРМ" );      --срок эксплутации - норма
           тблСРКФКТ[ii] = GetFieldS(RT, ii, "СРКФКТ" );      --срок эксплутации - факт
           тбл_НОВОЕ[ii] = GetFieldL(RT, ii, "НОВОЕ_" );      --новое имущество или было в эксплуатации
           тблБЛСУМY[ii] = GetFieldN(RT, ii, "БЛСУМY" );      --балансовая сумма на начало года
           тблБЛСУМC[ii] = GetFieldN(RT, ii, "БЛСУМC" );      --балансовая сумма на отчетную дату
           тблАМФКТY[ii] = GetFieldN(RT, ii, "АМФКТY" );      --начисленная амортизация факт   на начало года
           тблАМРЧТY[ii] = GetFieldN(RT, ii, "АМРЧТY" );      --начисленная амортизация расчет на начало года
           тблАМКОРY[ii] = GetFieldN(RT, ii, "АМКОРY" );      --сумма корректировки амортизации на начало года
           тблАМФКТC[ii] = GetFieldN(RT, ii, "АМФКТC" );      --начисленная амортизация факт   на отчетную дату
           тблАМРЧТC[ii] = GetFieldN(RT, ii, "АМРЧТC" );      --начисленная амортизация расчет на отчетную дату
           тблАМКОРC[ii] = GetFieldN(RT, ii, "АМКОРC" );      --сумма корректировки амортизации на отчетную дату
           тбл_РЕЗУЛ[ii] = GetFieldI(RT, ii, "РЕЗУЛ_" );      --статус результата проверки
           тблКБКПРВ[ii] = GetFieldS(RT, ii, "КБКПРВ" );      --КБК проводки
           тблДЕБПРY[ii] = GetFieldS(RT, ii, "ДЕБПРY" );      --дебет  проводки на начало года
           тблКРЕПРY[ii] = GetFieldS(RT, ii, "КРЕПРY" );      --кредит проводки на начало года
           тблДЕБПРC[ii] = GetFieldS(RT, ii, "ДЕБПРC" );      --дебет  проводки на отчетную дату
           тблКРЕПРC[ii] = GetFieldS(RT, ii, "КРЕПРC" );      --кредит проводки на отчетную дату
           тблПРИЧИН[ii] = GetFieldS(RT, ii, "ПРИЧИН" );      --метод исправления или описание ошибки (текст)
           тбл_STATE[ii] = GetFieldI(RT, ii, "STATE_" );      --классификация типа записи для возможных исправления
           тбл_ДОПАН[ii] = GetFieldS(RT, ii, "ДОПАНА" );      --дополнительная аналитика
           тблИСКЛЮЧ[ii] = GetFieldL(RT, ii, "ИСКЛЮЧ" );      --исключить строку (пользователь)
           тбл_TRANS[ii] = GetFieldL(RT, ii, "TRANS_" );      --позиция с проводкой
         od; --RT
       fi; --num>0
     fi; --REC<>NIL
   fi; --len=1
 Finally
   CloseProgress;
   CloseWorkArea(RZ);
   CloseWorkArea(RT);
 end;
 Позиции=LengthOfArray(тбл_STATE);
 ClearVariable(NN);
end;

Proc Выбрать_РасчетКорректировка(currentCalcKey:String);
var nn, pp :Integer;
var OK :Logical;
var ReadCalcKey :String;
  ClearTrace(True);
  nn=1;
  ReadCalcKey="";
  OK=Read_РасчетКорректировка(False);
  if not OK: Exit; fi;
  while nn=1 do
    pp=SearchInArray(BufРЧТ, currentCalcKey, True, 1);
    if not pp>0: pp=0; fi;
    nn=AlternateTree("Выберите сформированную расчет-корректировку...", TxtРЧТ, -1, pp, 12, "|", "Ключ", "Описание", -1, False);
    if nn=0: Exit; fi;
    if nn=1:
       OK=Read_РасчетКорректировка(True);
       if not OK: Exit; fi;
    fi;
  end; --while
  ReadCalcKey=BufРЧТ[nn];
  if EnqOkCancel("Вы действительно хотите загрузить выбранный расчет-корректировку^Mс ключом '"+ReadCalcKey+"'?", mtConfirmation)=cmOK:
    currКнопка=1;
    СчитатьРасчетКорректировку(ReadCalcKey);
    СохранитьКонтрольИзменений;
    if Позиции>0: Message("Загрузка расчета-корректировки успешно завершена!", mtInformation); fi;
    ВидимостьОтчетныхТаблиц_Work(True, False, False, False, currКнопка);
    НеНоваяТаблица_Validate;
    ReDrawДаты(False);
  fi;
end; --Выбрать_РасчетКорректировка;

Func ЕстьИзмененияШапке :Logical;
 if Позиции>0:
   if ДАТПРД       <> sav_ДАТПРД    : ^True; fi; --дата проводок
   if flgПроводить <> sav_Проводить : ^True; fi; --флаг проводить
   if УЧР_SREC     <> sav_УЧР_SREC  : ^True; fi; --учреждение - ссылка на контрагента
   if УЧР_НАИМ     <> sav_УЧР_НАИМ  : ^True; fi; --учреждение - наименование
   if УЧР_ОКПО     <> sav_УЧР_ОКПО  : ^True; fi; --учреждение - ОКПО
   if ИСПREC       <> sav_ИСПREC    : ^True; fi; --исполнитель - ссылка на сотрудника
   if ИСПФИО       <> sav_ИСПФИО    : ^True; fi; --исполнитель - Ф.И.О.
   if ИСПДОЛ       <> sav_ИСПДОЛ    : ^True; fi; --исполнитель - должность
   if ДАТИСП       <> sav_ДАТИСП    : ^True; fi; --дата подписи (исполнения)
 fi;
 ^False;
end;

Func ЕстьИзмененияТаблице :Logical;
var ii :Integer;
 if Позиции>0:
   ClearTrace(True);
   if LengthOfArray(sav_ИСКЛЮЧ)=Позиции and LengthOfArray(sav__ДОПАН)=Позиции:
     if ДАТПРД       <> sav_ДАТПРД    : ^True; fi; --дата проводок
     if flgПроводить <> sav_Проводить : ^True; fi; --флаг проводить
     ShowProgress(Позиции, "Проверка изменений в таблице...");
     Try
       for ii=1 to Позиции do
         ProgressPos(ii);
         if тблИСКЛЮЧ[ii] <> sav_ИСКЛЮЧ[ii] : ^True; fi;
         if тбл_ДОПАН[ii] <> sav__ДОПАН[ii] : ^True; fi;
       od;
     Finally
       CloseProgress;
     end;
   else
     --в реале не должно случиться так как у пользователя нет возможности добавлять удалять строки
     Trace("Размер копии данных не соответствует размеру текущей таблицы.");
   fi;
 fi;
 ^False;
end;

Proc ПроверитьСохранить_РасчетКорректировка(aOZ:Logical; aOT:Logical; aCalcKey:String);
var RZ, RT, nnz, nnt, zz, ii, xx, yy :Integer;
var First, ToExit, SaveOK :Logical;
var REC :Record;
 ClearVariable(Lock);
 ClearTrace(True);
 REC=NIL;
 ToExit=False;
 RT=OpenWorkArea(SelfCRD_T, "", "1=0");
 RZ=OpenWorkArea(SelfCRD_Z, "", "SYSKEY_CLC='"+aCalcKey+"'");
 ShowProgress(0, "Подготовка...");
 Try
   nnz=Records(RZ);
   if nnz=1:
     REC=GetRecordKey(RZ, 1);
   else
     Message("Запись с ключом^M'"+aCalcKey+"'^Mне найдена в таблице.", mtError);
     ToExit=True;
   fi;
   if not ToExit and aOT and REC<>NIL:
     SetFilter(RT, "R_HEAD="+RecordToString(REC));
     nnt=Records(RT);
     if nnt<>Позиции:
       Message("Количество позиций отчета для ключа '"+aCalcKey+"'^Mне совпадает с количеством записей в таблице.^MПеречитайте отчет.", mtError);
       ToExit=True;
     fi;
     if not ToExit:
       ShowProgress(Позиции, "Проверяем и сохраняем таблицу...");
       First=False;
       BeginChanging(RT);
       First=True;
       Try
         xx=0; yy=0;
         for ii=1 to Позиции do
           ProgressPos(ii);
           if xx=0 and not First: BeginChanging(RT); fi;
           First=False;
           xx=xx+1;
           --
           SaveOK=False;
           if ДАТПРД<>sav_ДАТПРД:
             SaveOK=True;
             zz=PutFieldD(RT, ii, "R_ДАТА" , ДАТПРД);             --дата проводки
           fi;
           if flgПроводить<>sav_Проводить:
             SaveOK=True;
             zz=PutFieldL(RT, ii, "R_УЧЕТ" , flgПроводить);       --флаг проведения по учету
           fi;
           if GetRecordKey(RT, ii)=тбs_TRKEY[ii]:
             if тбл_ДОПАН[ii]<>sav__ДОПАН[ii]:
               SaveOK=True;
               zz=PutFieldS(RT, ii, "ДОПАНА" , тбл_ДОПАН[ii]);    --дополнительная аналитика для проводки
             fi;
             if тблИСКЛЮЧ[ii]<>sav_ИСКЛЮЧ[ii]:
               SaveOK=True;
               zz=PutFieldL(RT, ii, "ИСКЛЮЧ" , тблИСКЛЮЧ[ii]);    --исключить строку (пользователь)
             fi;
           fi;
           if SaveOK:
             тбs_COUNT[ii]=тбs_COUNT[ii]+1;
             zz=PutFieldI(RT, ii, "R_SAVE" , тбs_COUNT[ii]);      --флаг сохранения
           fi;
           --
           if xx=500: --записываем очередную порцию записей
             EndChanging(RT);
             yy=yy+xx;
             xx=0;
           fi;
         od; --RT
         if xx>0: EndChanging(RT); yy=yy+xx; fi; --если последняя порция неполная
       Except
         Message("Ошибка "+Str(ErrorCode)+".", mtError);
         CancelChanging(RT);
         Raise;
       end;
     fi; -- if not ToExit:
   fi; -- if aOT and REC<>NIL:
   if not ToExit and aOZ and nnz=1:
     BeginChanging(RZ);
     Try
       SaveOK=False;
       if flgПроводить<>sav_Проводить:
         SaveOK=True;
         zz=PutFieldL(RZ, 01, "ПРОВОДИТЬ" , flgПроводить);                                    --флаг проведения по учету
       fi;
       if ДАТПРД<>sav_ДАТПРД:
         SaveOK=True;
         zz=PutFieldD(RZ, 01, "ДАТПРД"    , ДАТПРД);                                          --дата проводки
       fi;
       if УЧР_SREC<>sav_УЧР_SREC:
         SaveOK=True;
         zz=PutFieldS(RZ, 01, "УЧР_SREF"  , if(УЧР_SREC<>NIL, RecordToString(УЧР_SREC), ""));  --учреждение - ссылка на контрагента
       fi;
       if УЧР_НАИМ<>sav_УЧР_НАИМ:
         SaveOK=True;
         zz=PutFieldS(RZ, 01, "УЧР_НАИМ"  , УЧР_НАИМ);                                         --учреждение - наименование
       fi;
       if УЧР_ОКПО<>sav_УЧР_ОКПО:
         SaveOK=True;
         zz=PutFieldS(RZ, 01, "УЧР_ОКПО"  , УЧР_ОКПО);                                         --учреждение - ОКПО
       fi;
       if ИСПREC<>sav_ИСПREC:
         SaveOK=True;
         zz=PutFieldS(RZ, 01, "ИСПREF"    , if(ИСПREC<>NIL, RecordToString(ИСПREC), ""));      --исполнитель - ссылка на сотрудника
       fi;
       if ИСПФИО<>sav_ИСПФИО:
         SaveOK=True;
         zz=PutFieldS(RZ, 01, "ИСПФИО"    , ИСПФИО);                                           --исполнитель - Ф.И.О.
       fi;
       if ИСПДОЛ<>sav_ИСПДОЛ:
         SaveOK=True;
         zz=PutFieldS(RZ, 01, "ИСПДОЛ"    , ИСПДОЛ);                                           --исполнитель - должность
       fi;
       if ДАТИСП<>sav_ДАТИСП:
         SaveOK=True;
         zz=PutFieldD(RZ, 01, "ДАТИСП"    , ДАТИСП);                                           --дата подписи (исполнения)
       fi;
       if SaveOK:
         countSAVE=countSAVE+1;
         zz=PutFieldI(RZ, 01, "COUNTSAVE" , countSAVE);                                        --флаг сохранения
       fi;
       EndChanging(RZ);
     Except
       Message("Ошибка "+Str(ErrorCode)+".", mtError);
       CancelChanging(RZ);
       Raise;
     end;
   fi; -- if aOZ:
 Finally
   CloseProgress;
   CloseWorkArea(RZ);
   CloseWorkArea(RT);
 end;
end; --ПроверитьСохранить_РасчетКорректировка

Func ПроверкаНаличияНеобходимыхСчетов(НужнаПроверка:logical) :Logical;
var len, ii, addacc_count :Integer;
var Work, Ошибка, Режим :Logical;
var AccToAdd :String;
 if Позиции>0:
   len=Позиции;
   addacc_count=0;
   if (flgПроводить<>sav_Проводить and flgПроводить) or НужнаПроверка: Work=True; else Work=False; fi;
   if Work:
     ShowProgress(len, "Проверка на наличие необходимых счетов в структуре учета...");
     Try
       ClearVariable(Buf);
       РАБ.БЮДЖЕТ2005.РежимМаски="?";
       РАБ.КСА.Начать;
       for ii=1 to len do
         ProgressPos(ii);
         if тбл_TRANS[ii]: -- если есть у позиции проводки
           if тблАМКОРY[ii]<>0.00:
             Ошибка=False;
             while not Ошибка do
               AccToAdd=тблКБКПРВ[ii]+"."+тблДЕБПРY[ii];
               if not Match(AccToAdd, РАБ.БЮДЖЕТ2005.МаскаСчетаФКР): Ошибка=True; Break; fi;
               if Name_S(AccToAdd)=" ": addacc_count=addacc_count+1; Buf[addacc_count]=AccToAdd; РАБ.КСА.Добавить(AccToAdd); fi;
               AccToAdd=тблКБКПРВ[ii]+"."+тблКРЕПРY[ii];
               if not Match(AccToAdd, РАБ.БЮДЖЕТ2005.МаскаСчетаФКР): Ошибка=True; Break; fi;
               if Name_S(AccToAdd)=" ": addacc_count=addacc_count+1; Buf[addacc_count]=AccToAdd; РАБ.КСА.Добавить(AccToAdd); fi;
               Break;
             end; -- while
             if Ошибка:
               Message("Счет "+AccToAdd+" не соотвествует структуре учета!", mtError);
               Template.Field="NN";
               Template.Frame=ii;
               ^False;
             fi;
           fi; --if тблАМКОРY[ii]<>0.00:
           if тблАМКОРC[ii]<>0.00:
             Ошибка=False;
             while not Ошибка do
               AccToAdd=тблКБКПРВ[ii]+"."+тблДЕБПРC[ii];
               if not Match(AccToAdd, РАБ.БЮДЖЕТ2005.МаскаСчетаФКР): Ошибка=True; Break; fi;
               if Name_S(AccToAdd)=" ": addacc_count=addacc_count+1; Buf[addacc_count]=AccToAdd; РАБ.КСА.Добавить(AccToAdd); fi;
               AccToAdd=тблКБКПРВ[ii]+"."+тблКРЕПРC[ii];
               if not Match(AccToAdd, РАБ.БЮДЖЕТ2005.МаскаСчетаФКР): Ошибка=True; Break; fi;
               if Name_S(AccToAdd)=" ": addacc_count=addacc_count+1; Buf[addacc_count]=AccToAdd; РАБ.КСА.Добавить(AccToAdd); fi;
               Break;
             end; -- while
             if Ошибка:
               Message("Счет "+AccToAdd+" не соотвествует структуре учета!", mtError);
               Template.Field="NN";
               Template.Frame=ii;
               ^False;
             fi;
           fi; --if тблАМКОРC[ii]<>0.00:
         fi; --if тбл_TRANS[ii]:
       od;
     Finally
       CloseProgress;
     end;
   fi;
   if addacc_count>0:
     Режим=AutoRefresh;
     ToggleAutoRefresh(True);
     len=EnqOkCancel("Были обнаружены счета отсутствующие в структуре учета!^MДобавить счета?", mtConfirmation);
     if len=cmOk:
       РАБ.КСА.Закончить(False);
       Refresh(False);
       len=LengthOfArray(Buf);
       for ii=1 to len do
         if Name_S(Buf[ii])=" ":
           Message("Ошибка автоматического добавления счетов!", mtError);
           ^False;
         fi;
       od;
     else
       Message("Используются счета отсутствующие в структуре учета!^MНевозможно сформировать проводки", mtError);
       ^False;
     fi;
     ToggleAutoRefresh(Режим);
   fi;
 fi;
 ^True;
end;

Func ПроверкаНаличияОбязательнойАналитики :Logical;
var MskAcc, ACC, SetVoc, VOC :String;
var ii, len, jj, num :Integer;
 if Позиции>0:
   len=Позиции;
   ShowProgress(len, "Проверка присутствия обязательных для учета справочников...");
   Try
     for ii=1 to len do
       ProgressPos(ii);
       MskAcc="";
       ClearVariable(Buf);
       if тбл_TRANS[ii]: -- если есть у позиции проводки
         if тблАМКОРY[ii]<>0.00:
           MskAcc=РАБ.НФА.LIBREP.Объединить(MskAcc, тблКБКПРВ[ii]+"."+тблДЕБПРY[ii], "|");
           MskAcc=РАБ.НФА.LIBREP.Объединить(MskAcc, тблКБКПРВ[ii]+"."+тблКРЕПРY[ii], "|");
         fi; --if тблАМКОРY[ii]<>0.00:
         if тблАМКОРC[ii]<>0.00:
           MskAcc=РАБ.НФА.LIBREP.Объединить(MskAcc, тблКБКПРВ[ii]+"."+тблДЕБПРC[ii], "|");
           MskAcc=РАБ.НФА.LIBREP.Объединить(MskAcc, тблКБКПРВ[ii]+"."+тблКРЕПРC[ii], "|");
         fi; --if тблАМКОРC[ii]<>0.00:
       fi; --if тбл_TRANS[ii]:
       if MskAcc<>"":
         for Account ACC=MskAcc, Sort do
           SetVoc=SignsMask(ACC, True);
           if SetVoc<>"":
             num=WordsCount(SetVoc, "|");
             if num>0:
               for jj=1 to num do
                 VOC=ExtractWord(jj, SetVoc, "|");
                 if not РАБ.НФА.LIBREP.MatchMask(VOC, РАБ.НФА.LIBREP.Объединить("КОСГУ.*|НФА.*|УЧН.*", РАБ.НФА.LIBREP.НаборСлов_Маску(тбл_ДОПАН[ii], " ", "|", True), "|"), "|"):
                   AddInArray(Buf, True, False, VOC);
                 fi;
               od;
             fi;
           fi;
         od;
       fi;
       MskAcc="";
       num=LengthOfArray(Buf);
       if num>0: for jj=1 to num do MskAcc=РАБ.НФА.LIBREP.Объединить(MskAcc, Buf[jj], "|"); od; fi;
       if MskAcc<>"":
         if not РАБ.НФА.LIBREP.ПроверитьНаборСлов(тбл_ДОПАН[ii], " ", MskAcc, "|", ""):
           Message("Отсутствуют обязательные аналитические признаки!^M[признак из набора "+MskAcc+"]", mtError);
           Template.Field="NN";
           Template.Frame=ii;
           ^False;
         fi;
       fi;
     od;
   Finally
     CloseProgress;
   end;
 fi;
 ^True;
end;

Proc ПроверитьСохранить_РасчетКорректировка_Выполнить;
var OKZ, OKT :Logical;
var num :Integer;
 if МожноСохранить:
   OKZ=ЕстьИзмененияШапке;
   OKT=ЕстьИзмененияТаблице;
   if OKZ or OKT:
     if ПроверкаНаличияНеобходимыхСчетов(False):
       num=Enquiry("Сохранение...", "Обнаружены изменения данных расчета", "Сохранить;Откатить;Редактировать", mtWarning);
       if num=1: ПроверитьСохранить_РасчетКорректировка(OKZ, OKT, SystemKeys); СохранитьКонтрольИзменений;
       |  num=2: ОткатитьКонтрольИзменений;
       fi;
       ValidateSectionAll;
     fi;
   else
     Message("Изменения не обнаружены.^MСохранение не произведено.", mtInformation);
   fi;
 fi;
end;

Proc Удалить_РасчетКорректировка(aCalcKey:String);
var RT, RZ, OA, nnt, nnz, nna, ii, zz :Integer;
var del1, del2 :Logical;
var REC :Record;
 if aCalcKey<>"":
   del1=False; del2=False;
   ShowProgress(0, "Подготовка...");
   RT=OpenWorkArea(SelfCRD_T, "", "1=0");
   RZ=OpenWorkArea(SelfCRD_Z, "", "SYSKEY_CLC='"+aCalcKey+"'");
   Try
     nnz=Records(RZ);
     if nnz=1:
       REC=GetRecordKey(RZ, 1);
       BeginChanging(RZ);
       Try
         OA=OpenArray(RZ, 1, "Позиции", "", "");
         nna=Records(OA);
         ShowProgress(nna, "Проверяем ссылки...");
         Try
           if nna>0:
             for ii=1 to nna do
               ProgressPos(ii);
               zz=PutFieldR(OA, ii, "TRANS", NIL);
             od;
           fi;
           EndChanging(RZ);
           del1=True;
         Finally
           CloseWorkArea(OA);
         end;
       Except
         Message("Ошибка "+Str(ErrorCode)+".", mtError);
         CancelChanging(RZ);
         Raise;
       end;
       if del1 and REC<>NIL:
         SetFilter(RT, "R_HEAD="+RecordToString(REC));
         nnt=Records(RT);
         if nnt>0:
           BeginChanging(RT);
           Try
             ShowProgress(nnt, "Удаляем таблицу...");
             DeleteAllRecords(RT);
             EndChanging(RT);
             del2=True;
           Except
             Message("Ошибка "+Str(ErrorCode)+".", mtError);
             CancelChanging(RT);
             Raise;
           end;
         fi;
       fi; --del1 and REC<>NIL:
       if del2:
         BeginChanging(RZ);
         Try
           ShowProgress(nnz, "Удаляем заголовок...");
           DeleteAllRecords(RZ);
           EndChanging(RZ);
         Except
           Message("Ошибка "+Str(ErrorCode)+".", mtError);
           CancelChanging(RZ);
           Raise;
         end;
       fi;
     fi;
   Finally
     CloseWorkArea(RZ);
     CloseWorkArea(RT);
     CloseProgress;
   end;
 fi;
end; --Удалить_РасчетКорректировка;

Proc Удалить_РасчетКорректировка_Выполнить;
 if Позиции>0 and СохраненныйОтчет(SystemKeys):
   if EnqOkCancel("Расчет-корректировка амортизации будет удалена из базы данных.^MПродолжить?", mtWarning)=cmOk:
     if not (CanDelete(SelfCRD_Z) and CanDelete(SelfCRD_T)):
       Message("В текущей схеме доступа удаление записей^Mв картотеке корректровок амортизации запрещено.", mtError);
       Exit;
     fi;
     Удалить_РасчетКорректировка(SystemKeys);
     ClearVariable(BufРЧТ);
     ClearVariable(TxtРЧТ);
   fi;
 else
   Message("Ошибка поиска сохраненного отчета.", mtError);
 fi;
 ClearTrace(True);
 ОчисткаТаблицы(True);
 ValidateSectionAll;
end; --Удалить_РасчетКорректировка_Выполнить;

Proc Инициализация;
 currКнопка=1;
 ValidateSectionAll;
 if УЧТГОД=0: УЧТГОД=Year(ToDay); fi;
 SAVГОД=УЧТГОД;
 SAVАНА=ОТЧАНА;
end;

Proc ВзятьРеквизиты(saveREC:Record; Auto:Logical);
var RO, num :Integer;
var REC :Record;
 if Auto:
   if Trim(УЧР_НАИМ)="":
     RO=OpenWorkArea("КОНТРАГЕНТ", "", "НАШЕ and GroupAttr=0");
     Try
       num=Records(RO);
       if num<1: REC=NIL;
       |  num=1: REC=GetRecordKey(RO, 1);
       |  num>1: REC=GetRecordKey(RO, 1);
                 SetFilter(RO, "НАШЕ and GroupAttr=0 and РПО_УМОЛЧАНИЕ");
                 if Records(RO)>0: REC=GetRecordKey(RO, 1); fi;
       fi;
       if REC=NIL and saveREC<>NIL: REC=saveREC; fi;
       if REC<>NIL:
         SetFilter(RO, "UKey="+RecordToString(REC));
         if Records(RO)=1:
           УЧР_SREC = REC;
           УЧР_НАИМ = GetFieldS(RO, 1, "КОРИМЯ");
           УЧР_ОКПО = GetFieldS(RO, 1, "ОКПО");
         fi;
       fi;
     Finally
       CloseWorkArea(RO);
     end;
   fi;
 else
   REC=OpenCardFile("КОНТРАГЕНТ", "НАШЕ", saveREC, crdRecordOnly);
   if REC=NIL: Exit; fi;
   RO=OpenWorkArea("КОНТРАГЕНТ", "", "UKey="+RecordToString(REC));
   Try
     if Records(RO)=1:
       УЧР_SREC = REC;
       УЧР_НАИМ = GetFieldS(RO, 1, "КОРИМЯ");
       УЧР_ОКПО = GetFieldS(RO, 1, "ОКПО");
     fi;
   Finally
     CloseWorkArea(RO);
   end;
 fi;
end;

Proc ИсключитьПроводку(Iter:Integer);
 тб2ИСКЛЮЧ[Iter] = not тб2ИСКЛЮЧ[Iter];
 if not (тб2_REFNN[Iter]>LengthOfArray(тблИСКЛЮЧ)): тблИСКЛЮЧ[тб2_REFNN[Iter]]=тб2ИСКЛЮЧ[Iter]; fi;
end;

Proc Исключить_меню_Выполнить;
var num, ii :Integer;
 if Позиции>0:
   ClearVariable(Buf);
   Buf[1]="Сбросить флаг исключения со всех позиций";
   Buf[2]="Исключить корректировку амортизации по норме";
   Buf[3]="Исключить корректировку амортизации при выдаче в эксплуатацию";
   Buf[4]="Исключить корректировку 'зависших' сумм амортизации";
   Buf[5]="Поставить флаг исключения на все позиции";
   Buf[6]="Сбросить флаг исключения для амортизации по норме";
   Buf[7]="Сбросить флаг исключения для амортизации при выдаче в эксплуатацию";
   Buf[8]="Сбросить флаг исключения для 'зависших' сумм амортизации";
   num=Alternate("Выберите действие...", Buf, -1, 1, 12);
   if num>0:
     ShowProgress(Позиции, "Действие выполняется...");
     Try
       for ii=1 to Позиции do
         ProgressPos(ii);
         if тбл_TRANS[ii]: --если у позиции расчета есть сумма корректировки
           if num=1:                                                               тблИСКЛЮЧ[ii]=False;
           |  num=2: if тбл_STATE[ii]=39 or тбл_STATE[ii]=31 or тбл_STATE[ii]=30 : тблИСКЛЮЧ[ii]=True;  fi;
           |  num=3: if тбл_STATE[ii]=20                                         : тблИСКЛЮЧ[ii]=True;  fi;
           |  num=4: if тбл_STATE[ii]=11 or тбл_STATE[ii]=10 or тбл_STATE[ii]=01 : тблИСКЛЮЧ[ii]=True;  fi;
           |  num=5:                                                               тблИСКЛЮЧ[ii]=True;
           |  num=6: if тбл_STATE[ii]=39 or тбл_STATE[ii]=31 or тбл_STATE[ii]=30 : тблИСКЛЮЧ[ii]=False; fi;
           |  num=7: if тбл_STATE[ii]=20                                         : тблИСКЛЮЧ[ii]=False; fi;
           |  num=8: if тбл_STATE[ii]=11 or тбл_STATE[ii]=10 or тбл_STATE[ii]=01 : тблИСКЛЮЧ[ii]=False; fi;
           fi;
         fi;
       od;
     Finally
       CloseProgress;
     end;
   fi;
 else
   Message("Таблица расчета пустая.^MВыполните расчет.", mtInformation);
 fi;
end;

Proc Дополнительная_аналитика_меню_Выполнить;
var num, ii, jj :Integer;
var Acc, TMP, Val01, Val02 :String;
 if Позиции>0:
   ii=0;
   ClearVariable(Buf);
   ii=ii+1; Buf[ii]="Проверить на присутствие в проводке обязательной аналитики";
   if Trim(dflt_DopAnaVoc)<>"": ii=ii+1; Buf[ii]="Добавить в проводку дополнительную аналитику по шаблону затрат"; fi;
   num=Alternate("Выберите действие...", Buf, -1, 1, 12);
   if not num>0: Exit; fi;
   ClearVariable(Buf);
   ShowProgress(0, "Подготовка...");
   Try
     -- узнаем обязательные справочники
     TMP="*.104.??.???|*.106.??.???|*.109.??.271|*.401.20.271";
     for Account Acc=TMP, Sort do
       Val01=SignsMask(Acc, True);
       if Val01<>"":
         for ii=1 to WordsCount(Val01, "|") do
           Val02=Up(ExtractWord(1, ExtractWord(ii, Val01, "|"), "."));
           if Val02<>"" and Val02<>"КОСГУ" and Val02<>"НФА" and Val02<>"УЧН": AddInArray(Buf, True, False, Val02); fi;
         od;
       fi;
     od;
     -- узнаем справочники по шаблону
     if Trim(dflt_DopAnaVoc)<>"":
       for ii=1 to WordsCount(dflt_DopAnaVoc, " ") do
         AddInArray(Buf, True, False, Up(ExtractWord(ii, dflt_DopAnaVoc, " ")));
       od;
     fi;
     --
   Finally
     CloseProgress;
   end;
   ShowProgress(Позиции, "Работаем...");
   Try
     num=LengthOfArray(Buf);
     if num>0:
       for ii=1 to Позиции do
         ProgressPos(ii);
         if тбл_TRANS[ii]: -- если есть у позиции проводки
           if тблАМКОРC[ii]<>0.00:
             Val01=""; TMP="";
             Acc=СчетНФАпоСчетуАмортизации(тблКБКПРВ[ii]+"."+тблКРЕПРC[ii]);
             if Match(Acc, "*.?.???.??.???") and Name_S(СчетНФА_Восстановить(Acc))<>" " and Name_A(тблКОДНФА[ii])<>" " and Name_A(тблУЧННОМ[ii])<>" ":
               -- поиск по набору признаков код НФА и УЧН, а также счету учета НФА
               for jj=1 to num do
                 Val01=РАБ.НФА.LIBREP.ПоследнийПризнакВПроводкахИзСправочника(Acc, тблКОДНФА[ii]+"&"+тблУЧННОМ[ii], 1.1.100, ДАТОТЧ, Buf[jj]);
                   TMP=РАБ.НФА.LIBREP.Объединить(TMP, Val01, " ");
               od;
             fi;
             if TMP="":
               Val01=""; TMP="";
               Acc=тблКБКПРВ[ii]+"."+тблКРЕПРC[ii];
               if Match(Acc, "*.?.???.??.???") and Name_S(Acc)<>" " and Name_A(тблКОДНФА[ii])<>" " and Name_A(тблУЧННОМ[ii])<>" ":
                 -- поиск по набору признаков код НФА и УЧН, а также счету амортизации НФА
                 for jj=1 to num do
                   Val01=РАБ.НФА.LIBREP.ПоследнийПризнакВПроводкахИзСправочника_для104(Acc, тблКОДНФА[ii]+"&"+тблУЧННОМ[ii], 1.1.100, ДАТОТЧ, Buf[jj]);
                     TMP=РАБ.НФА.LIBREP.Объединить(TMP, Val01, " ");
                 od;
               fi;
             fi;
             if TMP<>"": тбл_ДОПАН[ii]=РАБ.НФА.LIBREP.ОбъединитьНаборПризнаков(тбл_ДОПАН[ii], " ", TMP, " ", " "); fi;
           else
             if тблАМКОРY[ii]<>0.00:
               Val01=""; TMP="";
               Acc=СчетНФАпоСчетуАмортизации(тблКБКПРВ[ii]+"."+тблКРЕПРY[ii]);
               if Match(Acc, "*.?.???.??.???") and Name_S(СчетНФА_Восстановить(Acc))<>" " and Name_A(тблКОДНФА[ii])<>" " and Name_A(тблУЧННОМ[ii])<>" ":
                 -- поиск по набору признаков код НФА и УЧН, а также счету учета НФА
                 for jj=1 to num do
                   Val01=РАБ.НФА.LIBREP.ПоследнийПризнакВПроводкахИзСправочника(Acc, тблКОДНФА[ii]+"&"+тблУЧННОМ[ii], 1.1.100, ДАТОТЧ, Buf[jj]);
                     TMP=РАБ.НФА.LIBREP.Объединить(TMP, Val01, " ");
                 od;
               fi;
               if TMP="":
                 Val01=""; TMP="";
                 Acc=тблКБКПРВ[ii]+"."+тблКРЕПРY[ii];
                 if Match(Acc, "*.?.???.??.???") and Name_S(Acc)<>" " and Name_A(тблКОДНФА[ii])<>" " and Name_A(тблУЧННОМ[ii])<>" ":
                   -- поиск по набору признаков код НФА и УЧН, а также счету амортизации НФА
                   for jj=1 to num do
                     Val01=РАБ.НФА.LIBREP.ПоследнийПризнакВПроводкахИзСправочника_для104(Acc, тблКОДНФА[ii]+"&"+тблУЧННОМ[ii], 1.1.100, ДАТОТЧ, Buf[jj]);
                       TMP=РАБ.НФА.LIBREP.Объединить(TMP, Val01, " ");
                   od;
                 fi;
               fi;
               if TMP<>"": тбл_ДОПАН[ii]=РАБ.НФА.LIBREP.ОбъединитьНаборПризнаков(тбл_ДОПАН[ii], " ", TMP, " ", " "); fi;
             fi; --if тблАМКОРY[ii]<>0.00:
           fi; --if тблАМКОРC[ii]<>0.00:
         fi;
       od;
     else
       TMP=if(Trim(dflt_DopAnaVoc)<>"", "Некорректно заданы справочники для дополнительной аналитики.", "Обязательная аналитика не требуется.");
       Message(TMP, mtWarning);
     fi;
     --
   Finally
     CloseProgress;
   end;
 else
   Message("Таблица расчета пустая.^MВыполните расчет.", mtInformation);
 fi;
end;

Proc ДобавитьОбязательныеСправочникиСчета(sКБК:String; sСЧ6:String);
var Val01, Val02 :String;
var ii :Integer;
 Val02=sКБК+"."+sСЧ6;
 if Name_S(Val02)<>" ":
   Val01=SignsMask(Val02, True);
   if Val01<>"":
     for ii=1 to WordsCount(Val01, "|") do
       Val02=Up(ExtractWord(ii, Val01, "|"));
       if Val02<>"" and Val02<>"КОСГУ.*" and Val02<>"НФА.*" and Val02<>"УЧН.*": AddInArray(Buf, True, False, Val02); fi;
     od;
   fi;
 fi;
end;

Proc ДополнительнаяАналитикаOnEnter(Iter:Integer);
var Value, TMP :String;
var num, ii, len :Integer;
 if Iter>0:
   ClearVariable(Buf);
   ii=ii+1; Buf[ii]="Выбрать из обязательных, для проводок позиции, справочников";
   ii=ii+1; Buf[ii]="Выбрать из всего списка аналитических справочников";
   if Trim(dflt_DopAnaVoc)<>"": ii=ii+1; Buf[ii]="Выбрать из шаблона справочников для затрат (+ обязательные)"; fi;
   num=Alternate("Выберите набор справочников...", Buf, -1, 1, 12);
   if num>0:
     ClearVariable(Buf);
     TMP="";
     if num=1 or num=3:
       ДобавитьОбязательныеСправочникиСчета(тб2КБКПРВ[Iter], тб2ДЕБПРY[Iter]);
       ДобавитьОбязательныеСправочникиСчета(тб2КБКПРВ[Iter], тб2КРЕПРY[Iter]);
       ДобавитьОбязательныеСправочникиСчета(тб2КБКПРВ[Iter], тб2ДЕБПРC[Iter]);
       ДобавитьОбязательныеСправочникиСчета(тб2КБКПРВ[Iter], тб2КРЕПРC[Iter]);
       if num=3 and Trim(dflt_DopAnaVoc)<>"":
         for ii=1 to WordsCount(dflt_DopAnaVoc, " ") do
           Value=Up(ExtractWord(ii, dflt_DopAnaVoc, " "))+".*";
           AddInArray(Buf, True, False, Value);
         od;
       fi;
       len=LengthOfArray(Buf);
       if len>0:
         for ii=1 to len do
           TMP=РАБ.НФА.LIBREP.Объединить(TMP, Buf[ii], "|");
         od;
       fi;
     fi; --num=1 or num=3:
     TMP=Trim(TMP);
     if TMP="": TMP="*"; fi;
     Value=AnaElection(TMP);
     if Value="": Exit; fi;
     тб2_ДОПАН[Iter]=РАБ.НФА.LIBREP.ДобавитьПризнак(тб2_ДОПАН[Iter], Value);
     тб2_ДОПАН[Iter]=РАБ.НФА.LIBREP.СортироватьНаборСлов(тб2_ДОПАН[Iter], " ", True);
     if not (тб2_REFNN[Iter]>LengthOfArray(тбл_ДОПАН)): тбл_ДОПАН[тб2_REFNN[Iter]]=тб2_ДОПАН[Iter]; fi;
   fi;
 fi;
end;

Proc ДополнительнаяАналитикаOnExit(Iter:Integer);
 if Iter>0:
   тб2_ДОПАН[Iter] = РАБ.НФА.LIBREP.УдалитьСловоИзНабора_Диалог(тб2_ДОПАН[Iter], " ");
   if not (тб2_REFNN[Iter]>LengthOfArray(тбл_ДОПАН)): тбл_ДОПАН[тб2_REFNN[Iter]]=тб2_ДОПАН[Iter]; fi;
 fi;
end;

2-- События клеток
Func Field_onEnter(nameField:String; iterFrame:Integer): Logical; -- на входе в клетку
 Flag_onEnter=False;
 if nameField="УЧТГОД"    : SAVГОД=УЧТГОД; Flag_onEnter=True;
 |  nameField="ОТЧАНА"    : SAVАНА=ОТЧАНА; Flag_onEnter=True;
 |  nameField="МЕССТР_"   : ОтчетныйПериод_Get; ValidateSectionAll; ^False;
 |  nameField="тб2ИСКЛЮЧ" : ИсключитьПроводку(iterFrame); ^False;
 |  nameField="искл_меню" : Исключить_меню_Выполнить; ^False;
 |  nameField="допА_меню" : Дополнительная_аналитика_меню_Выполнить; ^False;
 |  nameField="тб2ДОПАН_" : ДополнительнаяАналитикаOnEnter(iterFrame); ^False;
 |  nameField="УЧР_НАИМ"  : ВзятьРеквизиты(УЧР_SREC, False); ^False;
 |  nameField="кнпМ01"    : currКнопка=1; ВидимостьОтчетныхТаблиц_Work(True , False, False, False, currКнопка); ^False;
 |  nameField="кнпМ02"    : currКнопка=2; ВидимостьОтчетныхТаблиц_Work(False, True , False, False, currКнопка); ^False;
 |  nameField="кнпМ03"    : currКнопка=3; ВидимостьОтчетныхТаблиц_Work(False, False, True , False, currКнопка); ^False;
 |  nameField="кнпМ04"    : currКнопка=4; ВидимостьОтчетныхТаблиц_Work(False, False, False, True , currКнопка); ^False;
 fi;
 ^True;
end;

Proc Field_onExit(nameField:String; iterFrame:Integer); -- на выходе из клетки
 if nameField="УЧТГОД"    : if Flag_onEnter and УЧТГОД<>SAVГОД     : if ОтменитьИзмененияУсловийОтчета: УЧТГОД=SAVГОД; fi; fi;
                            if УЧТГОД=0: УЧТГОД=SAVГОД; fi;
                            ValidateSectionAll;
 |  nameField="ОТЧАНА"    : if     Flag_onEnter and ОТЧАНА<>SAVАНА : if ОтменитьИзмененияУсловийОтчета: ОТЧАНА=SAVАНА; fi; fi;
                            if not Flag_onEnter and ОТЧАНА=""      : if ОтменитьИзмененияУсловийОтчета: ОТЧАНА=SAVАНА; fi; fi;
                            ValidateSectionAll;
 |  nameField="тб2ДОПАН_" : ДополнительнаяАналитикаOnExit(iterFrame);
 |  nameField="УЧР_НАИМ"  : if Trim(УЧР_НАИМ)="": УЧР_ОКПО=""; fi;
 |  nameField="ИСПФИО"    : if Trim(ИСПФИО)="": ИСПДОЛ=""; fi;
 fi;
 Flag_onEnter=False;
end;

Func Field_OnValidateI(Field:String; Iter:Integer; Value:Integer): Logical;
 if Value<0: Message("Нельзя вводить отрицательное число.", mtError); ^False; fi;
 if Field="УЧТГОД":
   if Value<2000 or Value>2100: Message("Отчетный год задан вне допустимого диапазона.^M[2000-2100 гг.]", mtError); ^False; fi;
 fi;
 ^True;
end;

Func Field_OnValidateS(Field:String; Iter:Integer; Value:String) :Logical;
var Res :Numeric;
 if Field="ОТЧАНА":
   if Length(Value)>253: Message("Строка доп. аналитики не может быть больше 253 символов!", mtWarning); ^False; fi;
   Try Res=Saldo("{"+Value+"}", 1.1.100); Except ^False; end;
 fi;
 ^True;
end;

Func Дата_ПростойВыбор_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
 Template.HideEditor(False);
 SetDate(ВыборДаты(GetDate));
 ^"";
end;

Func Год_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var ii :Integer;
 Template.HideEditor(False);
 ClearVariable(Buf);
 SAVГОД=УЧТГОД;
 for ii=1 to 5 do Buf[ii]=Str(Year(ToDay)+ii-4); od;
 ii=Alternate("Год расчета", Buf, 20, if(УЧТГОД>2000, 4-(Year(ToDay)-УЧТГОД), 4), 12);
 if ii=0: ^Cur; fi;
 УЧТГОД=Int(Buf[ii]);
 if УЧТГОД<>SAVГОД: if ОтменитьИзмененияУсловийОтчета: УЧТГОД=SAVГОД; fi; ValidateSectionAll; fi;
 SAVГОД=УЧТГОД;
 ^"";
end;

Func Сотрудники_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
var FieldName, СТРФИО, СТРДОЛ, tmp1, tmp2 :String;
var REC :Record;
 Template.HideEditor(False);
 if not AutoRefresh: RefreshAna; fi;
 FieldName=asString(Template.Field);
 REC=OpenCardFile("СОТРУДНИКИ", "", ИСПREC, crdRecordOnly);
 if REC=NIL: ^Cur; fi;
 tmp1=GetCardFieldS("СОТРУДНИКИ", REC, "ИНИЦИАЛЫ");
 tmp2=GetCardFieldS("СОТРУДНИКИ", REC, "ФАМИЛИЯ");
 СТРФИО=if(tmp2="", GetCardFieldS("СОТРУДНИКИ", REC, "ФИОТ"), tmp2+" "+if(tmp1<>"..", tmp1, ""));
 Try СТРДОЛ=GetCardFieldS("СОТРУДНИКИ", REC, "ДОЛЖНОСТЬ.ДОЛЖ"); Except СТРДОЛ=""; end;
 if FieldName="ИСПФИО": ИСПФИО=СТРФИО; ИСПДОЛ=СТРДОЛ;
 |  FieldName="ИСПДОЛ": ИСПФИО=СТРФИО; ИСПДОЛ=СТРДОЛ;
 fi;
 ^"";
end;

Func ДопАналитика_OnLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
var Value :String;
 Template.HideEditor(False);
 SAVАНА=ОТЧАНА;
 Value=Up(AnaElection(""));
 if Value="": ^Cur; fi;
 if ОТЧАНА="":
   ОТЧАНА=Value;
 else 
   if Pos(Value, Up(ОТЧАНА))=0:
     ОТЧАНА=Объединить(ОТЧАНА, Value, Оператор);
     if Length(ОТЧАНА)>253:
       Message("Строка доп. аналитики не может быть больше 253 символов.^MВыбор отменен!", mtWarning);
       ОТЧАНА=SAVАНА;
       ^Cur;
     fi;
   fi;
 fi;
 if ОТЧАНА<>SAVАНА: if ОтменитьИзмененияУсловийОтчета: ОТЧАНА=SAVАНА; fi; ValidateSectionAll; fi;
 SAVАНА=ОТЧАНА;
 ^Cur;
end;

2-- События объектов
Proc btnOnClick(Sender:String); -- объекты при нажатии
 if Sender="btnCloseBln" : Close;
 |  Sender="btn_NewKorr" : Создать_РасчетКорректировка_Выполнить;
 |  Sender="btnLoadKorr" : Выбрать_РасчетКорректировка(SystemKeys);
 |  Sender="btnSaveKorr" : ПроверитьСохранить_РасчетКорректировка_Выполнить;
 |  Sender="btn_DelKorr" : Удалить_РасчетКорректировка_Выполнить;
 |  Sender="btnClearKor" : Чистить_РасчетКорректировка;
 fi;

end;

Proc Проводить_onChange(Sender:String);
var OK :Logical;
 OK=True;
 if flgПроводить:
   if OK: if not ПроверкаНаличияНеобходимыхСчетов(True) : OK=False; fi; fi;
   if OK: if not ПроверкаНаличияОбязательнойАналитики   : OK=False; fi; fi;
   if not OK:
     flgПроводить=sav_Проводить;
     cb_Проводить.State=sav_Проводить;
   fi;
 fi;
end;

--Proc Флаги_onChange(Sender:String);
--var NewFlag, OldFlag :Logical;
--var ОбъектИмя :Object;
--var nameVar :String;
-- if FindObject(Sender, ОбъектИмя):
--   nameVar="flg"+SubStr(Sender, 4, Length(Sender)-3); -- вычисляем имя переменной - 3=cb_
--   NewFlag=GetVariableL(nameVar); -- текущий статус;
--   OldFlag = not NewFlag;         -- предыдущий статус
--   if ОтменитьИзмененияУсловийОтчета: NewFlag=OldFlag; fi;
--   PutVariableL(nameVar, NewFlag);
--   ОбъектИмя.State=NewFlag;
--   if NewFlag<>OldFlag:
--     ValidateSectionAll;
--   fi;
-- fi;
--end;

2-- События шаблона
Proc CopyCfgPrn(Cfg:String);
var OK :Logical;
 OK=ExistFile(РАБ.БЮДЖЕТ2005.Контроль2Слэш(PlanVar("INI")+"\"+Cfg));
 if OK: 
   Try 
     DeleteFile(РАБ.БЮДЖЕТ2005.Контроль2Слэш(PlanVar("INI")+"\"+Cfg));
     РАБ.НАСТР_ПЕЧАТЬ.CreateCfg(PlanVar('Общие')+'\Настройки\', Cfg);
   Except
   end;
 else
   РАБ.НАСТР_ПЕЧАТЬ.CreateCfg(PlanVar('Общие')+'\Настройки\', Cfg);
 fi;
end;

Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
 Очистить;
 CopyCfgPrn("ТББ_STD_Album10_000.cfg");
end;

Proc Template_AfterOpen(Create:Logical); -- после открытия шаблона
 Инициализация;
 ВзятьРеквизиты(УЧР_SREC, True);
 Позиции=LengthOfArray(тбл_STATE);
end;

Proc Template_OnClose(Destroy:Logical); -- при закрытии шаблона
var OKZ, OKT :Logical;
 OKZ=ЕстьИзмененияШапке;
 OKT=ЕстьИзмененияТаблице;
 if OKZ or OKT:
   if EnqOkCancel("Есть изменения в таблице.^MСохранить?", mtWarning)=cmOk:
     ПроверитьСохранить_РасчетКорректировка(OKZ, OKT, SystemKeys);
     СохранитьКонтрольИзменений;
   else
     ОткатитьКонтрольИзменений;
   fi;
 fi;
 Очистить;
end;

КОНЕЦ --бланка
