БЛАНКСШАБЛОНОМ[20.04.2006] "Карточка количественно-суммового учета";
-- Редакция ЗАО "Агентство 'Русспромоценка'"
--2 Переменные
BTNNAME_MENU  :String="форма ОКУД 0504041";
MaskVOC     :String="ВД.*|ВКЛ.*|П.*|ПГР.*|РБС.*";
MaskКолСч   :String="*";
СекцПО:Object; СекцМХЭ:Object; СекцМОЛ:Object; СекцТАБ:Object; СекцСЧТ:Object;
btnClose:Object; btnРасчет:Object; btnПечать:Object;
--
flgUseПО     :Logical=[False];
flgUseМХЭ    :Logical=[True];
flgUseМОЛ    :Logical=[True];
flgСинтСЧ    :Logical=[True];

--
ДатНП        :Date;
ДатКП        :Date;
ДОП          :String="";
ДатКП_       :Date=ДатКП;
var годотч   :Integer=if(ДатКП>1.1.100, Year(ДатКП), 0);
var датотч_текст :String=if(ДатНП>1.1.1900 and ДатКП>1.1.1900, "отчет за "+Str(годотч)+" год - с "+DateToString(ДатНП)+" по "+DateToString(ДатКП)+" включительно.", "");
var КОД_ПРИЗН_import:s;
var NN_NFA:s;
--
curсчтрчт    :Integer=[1];
var oldсчтрчт:Integer;
var OldНП    :Date;
var OldКП    :Date;
var StoreANA :String;
var StoreANA2:String;
flgСинтСЧ_:L=flgСинтСЧ and curсчтрчт<>3;
--
VOCFTR :String; var VOCFTR_ :String=VOCFTR; var VOCNAME :String=Name_A(VOCFTR+".");
ANAFTR :String; var ANAFTR_ :String=ANAFTR; var ANANAME :String=Name_A(ANAFTR);
var Пользов  :String;
var КН1      :String="&";
var Buf[]    :String;
--
-- ШАПКА
УЧРЕЖ_КОД     :String;
УЧРЕЖ_ИМЯ     :String;
ОКПО          :String;
КОД_ПО        :String=["П.*"];
var ИМЯ_ПО    :String=if(Name_A(КОД_ПО) <>"" and Name_A(КОД_ПО) <>" ", Name_A(КОД_ПО) , if(КОД_ПО ="П.*",   "Все структурные подразделения", КОД_ПО));
КОД_МОЛ       :String=["МОЛ.*"];
var ИМЯ_МОЛ   :String=if(Name_A(КОД_МОЛ)<>"" and Name_A(КОД_МОЛ)<>" ", Name_A(КОД_МОЛ), if(КОД_МОЛ="МОЛ.*", "Все материально ответственные лица", КОД_МОЛ));
КОД_МХЭ       :String=["М.*"];
var ИМЯ_МХЭ   :String=if(Name_A(КОД_МХЭ)<>"" and Name_A(КОД_МХЭ)<>" ", Name_A(КОД_МХЭ), if(КОД_МХЭ="М.*",   "Все местонахождения", КОД_МХЭ));
var Заб:logical;

Func ВзятьСчетИмя(КОДСЧТ :String) :String;
var Value :String;
 if Match(КОДСЧТ, "ЗАБ.*"):
   Value=Trim(Name_S(КОДСЧТ));
 else
   РАБ.БЮДЖЕТ.Начать_НаимКБК;
   Value=РАБ.БЮДЖЕТ.Взять_НаимКБК("СЧ", КОДСЧТ);
   РАБ.БЮДЖЕТ.Закончить_НаимКБК;
 fi;
 ^Value;
end;

--Func ВзятьСчетКод(КОДНФА:String; СЧСинт:Logical) :String;
--var msk, Путь :String;
--var Отч1 :Report;
--var j :Integer;
-- if not Match(КОДНФА, "НФА.10?.0?.*"): ^""; fi;
-- msk=ExecuteFuncS("Раб.НФА.B01.Соотв101_105поНФА",КОДНФА,true);
-- if not СЧСинт:
--    ClearVariable(Buf);
--    Путь=PlanVar("НФА")+"\ОТЧЕТЫ\НФАОТЧ2005.lst";
--    if not(ExistFile(Путь)): Message("Файл с отчетами отсутствует!", mtError); ^""; fi;
--    Отч1=RepOpen(Путь+"|НФА_СЧЕТА", "*.?."+msk+".???|ЗАБ.??."+SubStr(КОДНФА, 5, 6), КОДНФА, 1.1.100, ДатКП+1, "", "");
--    RepReset(Отч1);
--    ShowProgress(RepRowsCount(Отч1), "Обработка данных...");
--    j=0;
--    Try
--      while RepNext(Отч1) do
--        j=j+1;
--        ProgressPos(j);
--        Buf[j]=RepIdent(Отч1);
--      end;
--    Finally
--      Отч1=RepClose(Отч1);
--      CloseProgress;
--    end;
--    if LengthOfArray(Buf)>0:
--       j=Alternate("Выберите счет бюджетного учета...", Buf, -1, 1, 12);
--       if j<>0: ^(SubStr(Buf[j], 1, 29)+".???"); fi;
--    else
--       Message("Признак ["+КОДНФА+"]^Mза период по "+DateToString(ДатКП)+" (включительно)^Mне используется в проводках по группе счетов '"+msk+"'!", mtInformation);
--       ^"";
--    fi;
-- else
--    ^(msk+".???");
-- fi;
-- ^"";
--end;

КОД_СЧЕТА     :String;
var ИМЯ_СЧЕТА :String=ВзятьСчетИмя(КОД_СЧЕТА);
КОД_ПРИЗН     :String;
var ИМЯ_ПРИЗН :String=if(Name_A(КОД_ПРИЗН)<>"" and Name_A(КОД_ПРИЗН)<>" ", Name_A(КОД_ПРИЗН), КОД_ПРИЗН);

-- ТАБЛИЦА
Позиции      :Integer;
ДАТАЖО[] :Date;
НМР_ЖО[] :String;
СОДЕРЖ[] :String;
СРОКЭК[] :String;
Д_СПИС[] :Date;
ЕД_ИЗМ[] :String;
КОЛДЕБ[] :Numeric;
СУМДЕБ[] :Numeric;
КОЛКРЕ[] :Numeric;
СУМКРЕ[] :Numeric;
КОЛОСТ[] :Numeric;
СУМОСТ[] :Numeric;
CRDREF[] :String;
RECREF[] :Record;
var TRNREF[] :Integer;
var ЦЕНА[] :Numeric=if(КОЛОСТ[$]>0, Round(СУМОСТ[$]/КОЛОСТ[$], 4), 0.0000);
--
var NN[]     :Integer=$;
-- ПОДВАЛ
ИсполДОЛ     :String;
ИсполФИО     :String;
ДатЗАП       :Date;

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

Proc Очистить;
 ClearVariable(NN);
 ClearVariable(Buf);
 ClearVariable(ЦЕНА);
 ClearVariable(TRNREF);
end;

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

Func GetDate :Date;  -- считываем в заданном поле дату
var name :String;
 name=AsString(Template.Field);
 if name="ДатНП"  : ^ДатНП;
 |  name="ДатКП"  : ^ДатКП;
 |  name="ДатЗАП" : ^ДатЗАП;
 fi;
end;

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

Func GetDateOnField(Field:String) :Date;  -- считываем в заданном поле дату
 ^GetVariableD(Field);
end;

Proc SetDateOnField(Field:String; Value:Date); -- устанавливаем в заданном поле дату; Value - значение даты, которое необходимо присвоить
 PutVariableD(Field, Value);
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;

Func ВыборСправочникаФильтра(Value:String) :String;
var ANA :String;
 ANA=AnaElection(MaskVOC, True, False, Value+".");
 if ANA="": ^Value; else ^ANA; fi;
 ^"";
end;

Func ВыборЗначенияСправочникаФильтра(VOC:String; Value:String) :String;
var ANA :String;
 if VOC="": Message("Не выбран справочник для отбора!", mtWarning); Template.Field="VOCFTR_"; ^Value; fi;
 ANA=AnaElection(VOC+".*", False, False, Value);
 if ANA="": ^Value; else ^ANA; fi;
 ^"";
end;

Func ПроверкаДат :Logical;
 if ДатНП <1.1.100: Message("Не задана дата начала периода!",    mtWarning); Template.Field="ДатКП"; ^False; fi;
 if ДатКП<=1.1.100: Message("Не задана дата окончания периода!", mtWarning); Template.Field="ДатКП"; ^False; fi;
 if ДатНП>ДатКП:
   Message("Дата начала '"+DateToString(ДатНП)+"' периода позже даты окончания периода '"+DateToString(ДатКП)+"'!"+Chr(13)+
           "Необходимо скорректировать даты!", mtError);
   Template.Field="ДатаКП";
   ^False;
 fi;
 ^True;
end;

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

Proc Реквизиты;
var REC :Record;
var RO :Integer;
 REC=SignToRecord("К."+УЧРЕЖ_КОД);
 REC=OpenCardFile("КОНТРАГЕНТ", "НАШЕ", REC, crdRecordOnly);
 if REC=NIL: Exit; fi;
 RO=OpenWorkArea("КОНТРАГЕНТ", "", "Ukey="+RecordToString(REC));
 Try
   if Records(RO)=1:
     УЧРЕЖ_КОД = GetFieldS(RO, 1, "ПРИЗНАК");
     УЧРЕЖ_ИМЯ = GetFieldS(RO, 1, "КОРИМЯ");
     ОКПО      = GetFieldS(RO, 1, "ОКПО");
   fi;
 Finally
   CloseWorkArea(RO);
 end;
end;

Func ШапкаРасчетаЗаполнена :Logical;
var I:I;
 if not ПроверкаДат: ^False; fi;
 if Trim(КОД_МОЛ)="":
   Message("Не выбрано МАТЕРИАЛЬНО ОТВЕТСТВЕННОЕ ЛИЦО!", mtWarning);
   Template.Field="ИМЯ_МОЛ";
   ^False;
 fi;
 if Trim(КОД_МХЭ)="":
   Message("Не выбрано МЕСТОНАХОЖДЕНИЕ НФА!", mtWarning);
   Template.Field="ИМЯ_МХЭ";
   ^False;
 fi;
 if Trim(КОД_ПО)="" and flgUseПО:
   Message("Не выбрано структурное ПОДРАЗДЕЛЕНИЕ!", mtWarning);
   Template.Field="ИМЯ_ПО";
   ^False;
 fi;
 if Trim(КОД_ПРИЗН)="":
   Message("Не выбрано НАИМЕНОВАНИЕ ПРОДУКЦИИ, вида оборудования, детали, материала!", mtWarning);
   Template.Field="ИМЯ_ПРИЗН";
   ^False;
 fi;
 if Trim(КОД_СЧЕТА)="":
   Message("Не выбран СЧЕТ!", mtWarning);
   Template.Field="ИМЯ_СЧЕТА";
   ^False;
 fi;
 ^True;
end;

--Func СобратьМаскуСчета:S;      --сначала собирается маскасчета, а после по ней проверяется соответствие признака и счета через справочники.
--Var СписокСправ,Справ:S;
--var КолвоСправ:I;
--var СоотвСправ:L;
--var I:I;
--var MskACC:S;
--var tmp,tmp2:S;
-- tmp=КОД_СЧЕТА;
-- if Match(tmp,"???"): tmp="*."+tmp+".??.???";
--   |Match(tmp,"???.??"): tmp="*."+tmp+".???";
-- fi;
-- if Match(tmp,"*."): tmp=tmp+"*"; fi;
-- if Match(КОД_ПРИЗН, "НФА.???.??"): tmp2="ЗАБ.??."+SubStr(КОД_ПРИЗН, 5, 6);
--  else  tmp2="ЗАБ.??."+SubStr(КОД_СЧЕТА, 1, 3)+"!";
-- fi;
-- if not Match(КОД_СЧЕТА,"ЗАБ.*") and not Match(tmp2,"ЗАБ.*"): tmp2="ЗАБ.??."+SubStr(КОД_СЧЕТА, 1, 3)+"!"; fi;

-- if curсчтрчт=1: MskACC=tmp+"|"+tmp2;
-- |  curсчтрчт=2: MskACC=tmp;
-- |  curсчтрчт=3: MskACC=tmp2;
-- fi;
--^MskACC;
--end;

Func СобратьМаскуСчета(aInAcc:String) :String;
var RES :String;
 RES="";
 if Match(aInAcc, "ЗАБ.*"):
   RES = aInAcc+"!";
 else
   if Match(aInAcc, "???")    : RES = "*."+aInAcc+".??.???";
   |  Match(aInAcc, "???.??") : RES = "*."+aInAcc+".???";
   fi;
 fi;
 ^RES;
end;

Func СчетСоотвМаске(СЧ:String; УСЛсч:String) :Logical;
-- СЧ должно являтся полным значением, а не маской!
var Acc :String;
 if УСЛсч="": ^False; fi;
 if Name_S(СЧ)=" ": ^False; fi;
 if Length(СЧ)+Length(УСЛсч)+4<255:УСЛсч=СЧ+'&('+УСЛсч+')';fi;
 for Account Acc=УСЛсч, Sort do if СЧ=Acc: ^True; fi; od;
 ^False;
end;

Func ПризнакИзСтрокиАналитикиПроводки(x:Integer; VOC:String; ДебПров:Logical) :String;
-- x - номер проводки
var p :Integer;
var sep, ANA :String;
 sep=""; ANA="";
 p=TransNumSign(x, sep+VOC+".");
 if p>0: ANA=TransSignName(x, p); ^ANA; fi;
 if ДебПров: sep="+"; else sep="-"; fi;
 p=TransNumSign(x, sep+VOC+".");
 if p>0: ANA=TransSignName(x, p); ^(SubStr(ANA, 2, 255)); fi;
 ^ANA;
end;

Func ЕстьОстаткиИлиДвижение :Integer; -- =0:расчет не произведен; <0:данных нет; >0:данных есть;
var res, RO, Iter, num, len, k, Статус, Store :Integer;
var MskANA, MskACC, УслОтбр, СЧД, СЧК, CRD, tmp, oper :String;
var МОЛ_DEB, МОЛ_CRE, МХЭ_DEB, МХЭ_CRE, ПОД_DEB, ПОД_CRE :String;
var sumost, kolost, sumtrn, koltrn :Numeric;
var ddN, ddK :Date;
var REC :Record;
 res=0;
 Refresh(False);
 RO=OpenWorkArea("РПО_ОПЕРАЦИИДНФА", "", "");
 ShowProgress(0, "Подготовка...");
 Try
   if not ШапкаРасчетаЗаполнена: ^0; fi;
   MskANA=КОД_ПРИЗН;
   if Trim(КОД_МОЛ)<>"" and flgUseМОЛ: if КОД_МОЛ<>"МОЛ.*" : MskANA=Объединить(MskANA, КОД_МОЛ, "&"); fi; fi;
   if Trim(КОД_МХЭ)<>"" and flgUseМХЭ: if КОД_МХЭ<>"М.*"   : MskANA=Объединить(MskANA, КОД_МХЭ, "&"); fi; fi;
   if Trim(КОД_ПО)<>""  and flgUseПО:  if КОД_ПО<>"П.*"    : MskANA=Объединить(MskANA, КОД_ПО,  "&"); fi; fi;
   if Trim(ANAFTR)<>"" and ValidSign(ANAFTR): MskANA=Объединить(MskANA, ANAFTR, "&"); fi;
   MskACC=СобратьМаскуСчета(КОД_СЧЕТА);
   If MskACC="": ^0; fi;
   УслОтбр=MskACC+"{"+MskANA+"}";
   Try sumost=Saldo(УслОтбр, 1.1.100); Except Message("Ошибка в условии отбора!", mtError); ^0; end;
   ddN=ДатНП;
   ddK=ДатКП+1;
   Очистить;
   ОчиститьТаблицу;
   num=0;
   for Transaction Iter=УслОтбр, ddN, ddK do num=num+1; end;
   kolost=Saldo(УслОтбр, ddN, "КОЛ");
   sumost=Saldo(УслОтбр, ddN, "РУБ");
   if kolost=0 and sumost=0 and num=0: ^-1; fi;
   len=1;
   ДАТАЖО[len]=ddN;
   НМР_ЖО[len]="";
   СОДЕРЖ[len]="остатки БД на "+DateToString(ddN);
   ЕД_ИЗМ[len]=Trim(Unit(КОД_ПРИЗН));
   КОЛДЕБ[len]=0.00; СУМДЕБ[len]=0.00; КОЛКРЕ[len]=0.00; СУМКРЕ[len]=0.00;
   КОЛОСТ[len]=kolost;
   СУМОСТ[len]=sumost;
   CRDREF[len]="";
   RECREF[len]=NIL;
   if num>0 and MskACC<>"":
      ShowProgress(num, "Подготовка...");
      k=0;
      for Transaction Iter=УслОтбр, ddN, ddK do
        k=k+1;
        ProgressPos(k);
        СЧД=TransDeb(Iter);
        СЧК=TransCre(Iter);
        if     СчетСоотвМаске(СЧД, MskACC) and not СчетСоотвМаске(СЧК, MskACC): Статус=+1; -- приход
        |  not СчетСоотвМаске(СЧД, MskACC) and     СчетСоотвМаске(СЧК, MskACC): Статус=-1; -- расход
        |      СчетСоотвМаске(СЧД, MskACC) and     СчетСоотвМаске(СЧК, MskACC): if СЧД=СЧК : Статус=10; else Статус=0; fi; -- внутреннее перемещение
        else Статус=0;
        fi;
        if Статус<>0:
           CRD=Up(TransCardFile(Iter));
           REC=TransRecord(Iter);
           МОЛ_DEB=""; МОЛ_CRE=""; МХЭ_DEB=""; МХЭ_CRE=""; ПОД_DEB=""; ПОД_CRE="";
           МОЛ_DEB=ПризнакИзСтрокиАналитикиПроводки(Iter, "МОЛ", True);
           МОЛ_CRE=ПризнакИзСтрокиАналитикиПроводки(Iter, "МОЛ", False);
           if flgUseМХЭ:
              МХЭ_DEB=ПризнакИзСтрокиАналитикиПроводки(Iter, "М", True);
              МХЭ_CRE=ПризнакИзСтрокиАналитикиПроводки(Iter, "М", False);
           fi;
           if flgUseПО:
              ПОД_DEB=ПризнакИзСтрокиАналитикиПроводки(Iter, "П", True);
              ПОД_CRE=ПризнакИзСтрокиАналитикиПроводки(Iter, "П", False);
           fi;
           if Статус=10: -- внутреннее перемещение                                --  and МХЭ_CRE<>КОД_МХЭ:
              if МОЛ_DEB=КОД_МОЛ and if(flgUseМХЭ,if(КОД_МХЭ<>"М.*",МХЭ_DEB=КОД_МХЭ,true),true) and if(flgUseПО,if(КОД_ПО<>"П.*",ПОД_DEB=КОД_ПО,true),true):Store=1;

              |  МОЛ_CRE=КОД_МОЛ and if(flgUseМХЭ,if(КОД_МХЭ<>"М.*",МХЭ_CRE=КОД_МХЭ,true),true) and if(flgUseПО,if(КОД_ПО<>"П.*",ПОД_CRE=КОД_ПО,true),true):Store=-1;

              |  (not flgUseМХЭ or КОД_МХЭ="М.*") and соотв(МОЛ_DEB,КОД_МОЛ) and соотв(МОЛ_CRE,КОД_МОЛ) and if(flgUseПО,if(КОД_ПО<>"П.*",ПОД_CRE=КОД_ПО,true),true):Store=10;

              else --Store=0;

                  if (соотв(МОЛ_DEB,КОД_МОЛ)) and if(flgUseМХЭ,if(КОД_МХЭ<>"М.*",МХЭ_DEB=КОД_МХЭ,true),true) and if(flgUseПО,if(КОД_ПО<>"П.*",ПОД_DEB=КОД_ПО,true),true):Store=1;

                  |  (соотв(МОЛ_CRE,КОД_МОЛ)) and if(flgUseМХЭ,if(КОД_МХЭ<>"М.*",МХЭ_CRE=КОД_МХЭ,true),true) and if(flgUseПО,if(КОД_ПО<>"П.*",ПОД_CRE=КОД_ПО,true),true):Store=-1;

                  else Store=10;

                  fi;

              fi;
              if Store=1 :
                          if МОЛ_CRE<>КОД_МОЛ or (flgUseМХЭ and МХЭ_CRE<>КОД_МХЭ and КОД_МХЭ<>"М.*") or (flgUseПО and ПОД_CRE<>КОД_ПО and КОД_ПО<>"П.*"):Store=1;
                          | true:Store=0;
                          fi;
               | Store=-1:
                          if МОЛ_DEB<>КОД_МОЛ or (flgUseМХЭ and МХЭ_DEB<>КОД_МХЭ and КОД_МХЭ<>"М.*") or (flgUseПО and ПОД_DEB<>КОД_ПО and КОД_ПО<>"П.*"):Store=-1;
                          | true:Store=0;
                          fi;
              fi;
           |  Статус=+1:Store=1; -- приход
              if (МОЛ_DEB=КОД_МОЛ and КОД_МОЛ<>"МОЛ.*") or КОД_МОЛ="МОЛ.*": Store=1; else Store=0; fi;
              if Store=+1: if flgUseМХЭ and not КОД_МХЭ="М.*": if МХЭ_DEB=КОД_МХЭ: Store=1; else Store=0; fi; fi; fi;
              if Store=+1: if flgUseПО  and not КОД_ПО ="П.*": if ПОД_DEB=КОД_ПО : Store=1; else Store=0; fi; fi; fi;
           |  Статус=-1:Store=-1; -- расход
              if (МОЛ_CRE=КОД_МОЛ and КОД_МОЛ<>"МОЛ.*") or КОД_МОЛ="МОЛ.*": Store=-1; else Store=0; fi;
              if Store=-1: if flgUseМХЭ and not КОД_МХЭ="М.*": if МХЭ_CRE=КОД_МХЭ: Store=-1; else Store=0; fi; fi; fi;
              if Store=-1: if flgUseПО  and not КОД_ПО ="П.*": if ПОД_CRE=КОД_ПО:  Store=-1; else Store=0; fi; fi; fi;
           fi;
           if Store<>0:
             len=len+1;
             ДАТАЖО[len]=TransDate(Iter);
             if CRD="РПО_ОПЕРАЦИИДНФА" and REC<>NIL: НМР_ЖО[len]=GetFieldS(RO, GetRecordNumber(RO, REC), "НОМЕР"); else НМР_ЖО[len]=""; fi;
             CRDREF[len]=CRD;
             RECREF[len]=REC;
             TRNREF[len]=Iter;
             sumtrn=TransSum(Iter, "РУБ");
             koltrn=TransSum(Iter, "КОЛ");
             oper=ПризнакИзСтрокиАналитикиПроводки(Iter, "ДНФА", True);
             ЕД_ИЗМ[len]=Trim(Unit(КОД_ПРИЗН));
             if Store=+1:
                tmp='';
                if tmp='':tmp=trim(ПризнакИзСтрокиАналитикиПроводки(Iter, "ПБС", False));fi;
                if tmp='':tmp=trim(ПризнакИзСтрокиАналитикиПроводки(Iter, "К", False));fi;
                if tmp='':tmp=trim(ПризнакИзСтрокиАналитикиПроводки(Iter, "Ф", False));fi;
                if tmp='':
                   tmp=trim(ПризнакИзСтрокиАналитикиПроводки(Iter, "МОЛ", False));
                   if match(СЧК,'*.?.106.??.???') and Iter>1: -- попытка взять информацию из первой проводки или из договора в будующей доработке
                      if tmp='' or (tmp<>'' and (МОЛ_DEB=МОЛ_CRE and МОЛ_DEB=tmp) ): -- откуда непонятно=>ищем первую проводку
                         if CRD=Up(TransCardFile(Iter-1)) and REC=TransRecord(Iter-1):-- пред проводка в том же документе
                            if SubStr(TransDeb(Iter-1),1,30)=SubStr(СЧК,1,30):
                               if TransQuantSign(Iter-1)=КОД_ПРИЗН:
                                  tmp='';
                                  if tmp='':tmp=trim(ПризнакИзСтрокиАналитикиПроводки(Iter-1, "ПБС", False));fi;
                                  if tmp='':tmp=trim(ПризнакИзСтрокиАналитикиПроводки(Iter-1, "К", False));fi;
                                  if tmp='':tmp=trim(ПризнакИзСтрокиАналитикиПроводки(Iter-1, "Ф", False));fi;
                                  if tmp='':tmp=trim(ПризнакИзСтрокиАналитикиПроводки(Iter-1, "МОЛ", False));fi;
                               fi;
                            fi;
                         fi;
                      fi;
                   fi;
                fi;
                СОДЕРЖ[len]="Операция "+oper+". "+if(tmp<>"", "Принято от -"+Name_A(tmp)+" ["+tmp+"]. ", "")+'=>{'+Name_A(МОЛ_DEB)+'},{'+Name_A(МХЭ_DEB)+'}'+TransComment(Iter);
                КОЛДЕБ[len]=koltrn;
                СУМДЕБ[len]=sumtrn;
                КОЛКРЕ[len]=0.00;
                СУМКРЕ[len]=0.00;
                КОЛОСТ[len]=kolost+koltrn;
                kolost=kolost+koltrn;
                СУМОСТ[len]=sumost+sumtrn;
                sumost=sumost+sumtrn;

             |  Store=-1:
                tmp=trim(ПризнакИзСтрокиАналитикиПроводки(Iter, "МОЛ", True));
                if tmp='':tmp=trim(ПризнакИзСтрокиАналитикиПроводки(Iter, "ПБС", True));fi;
                if tmp='':tmp=trim(ПризнакИзСтрокиАналитикиПроводки(Iter, "К", True));fi;
                if tmp='':tmp=trim(ПризнакИзСтрокиАналитикиПроводки(Iter, "Ф", True));fi;
                СОДЕРЖ[len]='{'+Name_A(МОЛ_CRE)+'},{'+Name_A(МХЭ_CRE)+'}=>'+"Операция "+oper+". "+if(tmp<>"", "Передано -"+Name_A(tmp)+" ["+tmp+"]. ", "")+TransComment(Iter);
                КОЛДЕБ[len]=0.00;
                СУМДЕБ[len]=0.00;
                КОЛКРЕ[len]=koltrn;
                СУМКРЕ[len]=sumtrn;
                КОЛОСТ[len]=kolost-koltrn;
                kolost=kolost-koltrn;
                СУМОСТ[len]=sumost-sumtrn;
                sumost=sumost-sumtrn;
             |  Store=-10 или Store=10:
                tmp='';
                if МОЛ_DEB<>МОЛ_CRE:tmp='{'+Name_A(МОЛ_CRE)+'}=>{'+Name_A(МОЛ_DEB)+'}';fi;
                if МХЭ_DEB<>МХЭ_CRE:tmp=tmp+' {'+Name_A(МХЭ_CRE)+'}=>{'+Name_A(МХЭ_DEB)+'}';fi;
                СОДЕРЖ[len]="Операция "+oper+". "+tmp+' '+TransComment(Iter);
                КОЛДЕБ[len]=koltrn;
                СУМДЕБ[len]=sumtrn;
                КОЛКРЕ[len]=koltrn;
                СУМКРЕ[len]=sumtrn;
                КОЛОСТ[len]=kolost;
                СУМОСТ[len]=sumost;
             fi;
           fi;
        fi;
      end; -- Transaction
   fi;
 Finally
   CloseProgress;
   CloseWorkArea(RO);
 end;
 res=LengthOfArray(RECREF);
 ^res;
end;

Func СформироватьКарточку :Logical;
var num :Integer;
 num=ЕстьОстаткиИлиДвижение;
 if num<0: Message("Данных по заданному условию отбора не найдено!^MПопробуйте изменить условия отбора.", mtInformation); ^False;
 |  num=0: ^False;
 fi;
 Позиции=num;
 ^True;
end;

Proc ПерейтиНаПроводку(Iter:Integer);
var fError :Logical;
var num :Integer;
var Путь, MskANA, MskACC, УслОтбр :String;
var sum :Numeric;
 ClearVariable(Buf);
 fError=False;
 Buf[1]="Найти ссылку и перейти на запись";
 Buf[2]="Составить отчет по операции";
 num=Alternate("Выберите действие...", Buf, -1, 1, 12);
 if num=1:
    if CRDREF[Iter]<>"" and RECREF[Iter]<>NIL:
       if CRDREF[Iter]="Table_OPER":
          if TRNREF[Iter]>0: TransOpenJur(TRNREF[Iter]); else fError=True; fi;
       else
          if ExistsCardFile(CRDREF[Iter]):
             if RecordExists(CRDREF[Iter], RECREF[Iter]):
                OpenCardFile(CRDREF[Iter], "", RECREF[Iter]);
             else
                fError=True;
             fi;
          else
             fError=True;
          fi;
       fi;
    else
       fError=True;
    fi;
 |  num=2: fError=True;
 else Exit;
 fi;
 if fError:
    --Message("Не найдена ссылка на проводку!", mtWarning);
    Путь=PlanVar("ОБЩИЕ")+"\ОТЧЕТЫ\Отч_набор_001.lst";
    if not(ExistFile(Путь)): Message("Файл с отчетами отсутствует!", mtError); Exit; fi;
    MskANA=КОД_ПРИЗН;
    if Trim(КОД_МОЛ)<>"" and flgUseМОЛ: if КОД_МОЛ<>"МОЛ.*" : MskANA=Объединить(MskANA, КОД_МОЛ, "&"); fi; fi;
    if Trim(КОД_МХЭ)<>"" and flgUseМХЭ: if КОД_МХЭ<>"М.*"   : MskANA=Объединить(MskANA, КОД_МХЭ, "&"); fi; fi;
    if Trim(КОД_ПО)<>""  and flgUseПО:  if КОД_ПО<>"П.*"    : MskANA=Объединить(MskANA, КОД_ПО,  "&"); fi; fi;
    if Trim(ANAFTR)<>"" and ValidSign(ANAFTR): MskANA=Объединить(MskANA, ANAFTR, "&"); fi;
--    if curсчтрчт=2:
--      if Match(КОД_СЧЕТА, "10?.??.???"):                        MskACC="*.?."+КОД_СЧЕТА;
--      |  Match(КОД_СЧЕТА, "???.????.???????.???.?.10?.??.???"): MskACC=КОД_СЧЕТА;
--      else MskACC="";
--      fi;
--    |  curсчтрчт=3:
--      if Match(КОД_СЧЕТА, "10?.??.???"): MskACC="ЗАБ.??."+SubStr(КОД_ПРИЗН, 5, 6); else MskACC=""; fi;
--    else
--      if Match(КОД_СЧЕТА, "10?.??.???"):                        MskACC="*."+КОД_СЧЕТА+"|ЗАБ.??.???.??";
--      |  Match(КОД_СЧЕТА, "???.????.???????.???.?.10?.??.???"): MskACC=КОД_СЧЕТА+"|ЗАБ.??.???.??";
--      else MskACC="";
--      fi;
--    fi;
    MskACC=СобратьМаскуСчета(КОД_СЧЕТА);
    УслОтбр=MskACC+"{"+MskANA+"}";
    Try sum=Saldo(УслОтбр, 1.1.100); Except Message("Ошибка в условии отбора!", mtError); Exit; end;
    Report(Путь+"|По_проводкам_ВСЕ", if(Iter=1, ДАТАЖО[Iter]-1, ДАТАЖО[Iter]), if(Iter=1, ДАТАЖО[Iter], ДАТАЖО[Iter]+1), MskACC, MskANA);
 fi;
end;

var МассивСправ[]:S;

Func СобратьМаскуКолУч:s; --если счет заполнен и если нет.
var Msk,Код_СЧ:s;
var Справ,Справ_, СписокСправ:s;
var ДлМассива:I;
var i,j:I;
ClearVariable(МассивСправ);
if Match(КОД_СЧЕТА,"*."): КОД_СЧ=КОД_СЧЕТА+"*"; fi;
СписокСправ=Раб.Бюджет2005.СписокСправ(КОД_СЧ,0,"");
ДлМассива=WordsCount(СписокСправ,"|");
I=1;
For I=1..ДлМассива do
  Справ=Extractword(I,СписокСправ,"|");
  Справ_=substr(Справ,1,Length(Справ)-2);
  if СправИмеетКоличПризнак(Справ_):
     Msk=Msk+Справ+"|";
  fi;
od;
Msk=substr(Msk,1,Length(Msk)-1);
^Msk;
end;

var OpenGuid    :String;
WorkGuid        :String;
var oldWorkANA  :String;
var curWorkANA  :String=КОД_ПРИЗН;
var WrkAcc[]    :String;
var BufAcc[]    :String;
var BufTxt[]    :String;

Func ВзятьСправочникиКолУчета(DatEndTrans:Date) :String;
var ii, num :Integer;
var ANA : String;
 ClearVariable(Buf);
 if not DatEndTrans>1.1.1900: DatEndTrans=Dat(1, 1, Year(ToDay)+1); fi;
 for Transaction ii="*", 1.1.100,  DatEndTrans do
   ANA=TransQuantSign(ii);
   if ANA<>"" and not Match(ANA, "НФА.*"): AddInArray(Buf, True, False, ExtractWord(1, ANA, ".")); fi;
 end;
 ANA="";
 num=LengthOfArray(Buf);
 if num>0: for ii=1 to num do ANA=РАБ.Бюджет2005.Объединить(ANA, Buf[ii]+".*", "|"); od; fi;
 ^Trim(ANA);
end;

Func ВзятьНужнуюМаскуСчета(Acc:String) :String;
 if Match(Acc,    "???.????.???????.???.?.???.??.???"): ^(SubStr(Acc, 24, 3)+"@"+SubStr(Acc, 28, 2));
 |  Match(Acc,  "???.?.??.?????.??.????.?.???.??.???"): ^(SubStr(Acc, 26, 3)+"@"+SubStr(Acc, 30, 2));
 |  Match(Acc, "???.??.??.??.??.??.????.?.???.??.???"): ^(SubStr(Acc, 27, 3)+"@"+SubStr(Acc, 31, 2));
 |  Match(Acc, "ЗАБ.*"): if not AccIsBalance(Acc): ^("ЗАБ@"+SubStr(Acc, 5, Length(Acc)-4)); fi;
 fi;
 ^"";
end;

Func ВзятьМаскуСчетаПоПризнаку(DatEndTrans:Date; WrkANA:String) :Integer;
var ii, num :Integer;
var ACC :String;
 ClearVariable(WrkAcc);
 if ValidSign(WrkANA):
   if not DatEndTrans>1.1.1900: DatEndTrans=Dat(1, 1, Year(ToDay)+1); fi;
   for Transaction ii="*{"+WrkANA+"}", 1.1.100,  DatEndTrans do
     ACC=ВзятьНужнуюМаскуСчета(TransDeb(ii)); if ACC<>"": AddInArray(WrkAcc, True, False, ACC); fi;
     ACC=ВзятьНужнуюМаскуСчета(TransCre(ii)); if ACC<>"": AddInArray(WrkAcc, True, False, ACC); fi;
   end;
 fi;
 ^LengthOfArray(WrkAcc);
end;

Func ВыборСчетаПоПризнаку(StoreValue:String; DatRep:Date) :String;
var RO, num, ii, len, pp, kk, jj :Integer;
var Value, Msg, Txt :String;
var OK :Logical;
 OK=True;
 num=LengthOfArray(WrkAcc);
 if num=0 or WorkGuid<>OpenGuid or curWorkANA<>oldWorkANA: 
   Refresh(False);
   OK=False;
   num=ВзятьМаскуСчетаПоПризнаку(DatRep, curWorkANA);
   WorkGuid=OpenGuid;
 fi;
 if num>0:
   if OK: Refresh(False); fi;
   ShowProgress(0, "Подготовка...");
   RO=OpenWorkArea("РПО_БЮДЖ_КЛАСС", "CODE", "NAME_VOC='СЧ' and Match(CODE,'???.??')");
   Try
     if num>1:
       ii=1;
       while not WrkAcc[ii]="" do
         Value=SubStr(WrkAcc[ii], 1, 3)+"@";
         if SearchInArray(WrkAcc, Value, True)=-1: InsertInArraySort(WrkAcc, Value); ii=ii+1; fi; --Добавление группы идет перед выбранным элементом (сортировка)
         ii=ii+1;
       od;
       len=Records(RO);
       if len=0: Message("Выполните обновление справочников и повторите выбор", mtWarning); OpenBlank("РАБ.ВСПОМ.ИМПОРТ_СПРАВ", True); ^StoreValue; fi;
       ClearVariable(BufAcc); ClearVariable(BufTxt);
       ShowProgress(len, "Построение списка счетов...");
       for ii=1 to len do 
         ProgressPos(ii);
         Value=GetFieldS(RO, ii, "CODE");
         BufAcc[ii]=ExtractWord(1, Value, ".")+"@"+ExtractWord(2, Value, ".");
         BufTxt[ii]=GetFieldS(RO, ii, "TXT");
       od;
       SetFilter(RO, "NAME_VOC='СЧ' and Match(CODE,'???')");
       len=LengthOfArray(WrkAcc);
       if Match(StoreValue,  "ЗАБ.*"): Txt="ЗАБ@"+SubStr(StoreValue, 5, Length(StoreValue)-4);
       |  Match(StoreValue, "???.??"): Txt=ExtractWord(1, StoreValue, ".")+"@"+ExtractWord(2, StoreValue, ".");
       else Txt="";
       fi;
       jj=0;
       ShowProgress(len, "Обработка счетов...");
       for ii=1 to len do
         pp=Length(WrkAcc[ii]);
         if SubStr(WrkAcc[ii], pp, 1)="@":
           Value=SubStr(WrkAcc[ii], 1, pp-1);
           kk=Search(RO, 1, Value);
           if kk>0: WrkAcc[ii]=WrkAcc[ii]+"--"+GetFieldS(RO, kk, "TXT"); fi;
         else
           if Match(WrkAcc[ii], "ЗАБ@*"):
             if Txt=WrkAcc[ii]: jj=ii; fi;
             Value="ЗАБ."+SubStr(WrkAcc[ii], 5, Length(WrkAcc[ii])-4);
             WrkAcc[ii]=WrkAcc[ii]+"--"+Trim(Name_S(Value));
           |  Match(WrkAcc[ii], "???@??"):
             kk=SearchInArray(BufAcc, WrkAcc[ii], True, 1);
             if kk>0: WrkAcc[ii]=BufAcc[kk]+"--"+BufTxt[kk]; if Txt=BufAcc[kk]: jj=ii; fi; fi;
           fi;
         fi;
       od;
     fi;
   Finally
     CloseWorkArea(RO);
     CloseProgress;
     ClearVariable(BufAcc);
     ClearVariable(BufTxt);
   end;
   if num>1:
     len=AlternateTree("Выберите счет...", WrkAcc, -1, jj, 12, "@", "Счета", "Наименование", -1, False);
     if len=0: ^StoreValue; fi;
     Value=SubStr(WrkAcc[len], 1, Pos("--", WrkAcc[len])-1);
   else
     Value=WrkAcc[1];
   fi;
   if Match(Value,  "ЗАБ@*"): Txt="ЗАБ."+SubStr(Value, 5, Length(Value)-4);
   |  Match(Value, "???@??"): Txt=ExtractWord(1, Value, "@")+"."+ExtractWord(2, Value, "@");
   else Txt="";
   fi;
   ^Txt;
 else 
   if ValidSign(curWorkANA): Msg="Признак '"+curWorkANA+"'^Mне задействован в проводках!"; else Msg="Некорректный признак '"+curWorkANA+"'!"; fi;
   Message(Msg, mtError);
   ^StoreValue;
 fi;
end;

2-- События клеток
Func Field_onEnter(Field:String; Iter:Integer) :Logical; -- на входе в клетку
var tmp :String;
var kk :Integer;
var МаскаКолУч:s;
 StoreANA=""; StoreANA2="";
 if Field="УЧРЕЖ_ИМЯ" or
    Field="ОКПО"    : Реквизиты;
                      ^False;
 |  Field="ИМЯ_ПО"  : StoreANA=КОД_ПО;
                      ClearVariable(Buf);
                      Buf[1]="Все структурные подразделения";
                      Buf[2]="Выбрать структурное подразделение";
                      kk=Alternate("Выберите действие...", Buf, -1, 2, 12);
                      if kk=1:
                        КОД_ПО="П.*";
                        if flgUseПО and КОД_ПО<>StoreANA: if ОтменитьИзмененияУсловийОтчета: КОД_ПО=StoreANA; fi; fi;
                      |  kk=2:
                        tmp=AnaElection("П.*", False, False, КОД_ПО);
                        if tmp="": ^False; fi;
                        КОД_ПО=tmp;
                        if flgUseПО and КОД_ПО<>StoreANA: if ОтменитьИзмененияУсловийОтчета: КОД_ПО=StoreANA; fi; fi;
                      fi;
                      ^False;
 |  Field="ИМЯ_МХЭ" : StoreANA=КОД_МХЭ;
                      ClearVariable(Buf);
                      Buf[1]="Все местонахождения";
                      Buf[2]="Выбрать местонахождение";
                      kk=Alternate("Выберите действие...", Buf, -1, 2, 12);
                      if kk=1:
                        КОД_МХЭ="М.*";
                        if КОД_МХЭ<>StoreANA: if ОтменитьИзмененияУсловийОтчета: КОД_МХЭ=StoreANA; fi; fi;
                      |  kk=2:
                        tmp=AnaElection("М.Х.*|М.Э.*", False, False, КОД_МХЭ);
                        if tmp="": ^False; fi;
                        КОД_МХЭ=tmp;
                        if КОД_МХЭ<>StoreANA: if ОтменитьИзмененияУсловийОтчета: КОД_МХЭ=StoreANA; fi; fi;
                      fi;
                      ^False;
 |  Field="ИМЯ_МОЛ" : StoreANA=КОД_МОЛ;
                      ClearVariable(Buf);
                      Buf[1]="Все материально ответственные лица";
                      Buf[2]="Выбрать материально ответственное лицо";
                      kk=Alternate("Выберите действие...", Buf, -1, 2, 12);
                      if kk=1:
                        КОД_МОЛ="МОЛ.*";
                        if КОД_МОЛ<>StoreANA: if ОтменитьИзмененияУсловийОтчета: КОД_МОЛ=StoreANA; fi; fi;
                      |  kk=2:
                        tmp=AnaElection("МОЛ.*", False, False, КОД_МОЛ);
                        if tmp="": ^False; fi;
                        КОД_МОЛ=tmp;
                        if КОД_МОЛ<>StoreANA: if ОтменитьИзмененияУсловийОтчета: КОД_МОЛ=StoreANA; fi; fi;
                      fi;
                      ^False;
|  Field="ИМЯ_ПРИЗН": StoreANA=КОД_ПРИЗН;
                      ClearVariable(Buf);
                      Buf[1]="Выбрать признак (наименование продукции...)";
                      Buf[2]="Очистить значение";
                      kk=Alternate("Выберите действие...", Buf, -1, 1, 12);
                      if kk=1:
                        МаскаКолУч=ВзятьСправочникиКолУчета(if(ДатКП>1.1.1900, Dat(1, 1, Year(ДатКП)+1), 1.1.100));
                        if МаскаКолУч="": Message("Справочников количественного учета в проводках не найдено", mtError); ^False; fi;
                        tmp=AnaElection(МаскаКолУч, False, False, КОД_ПРИЗН);
                        if tmp="": ^False; fi;
                        КОД_ПРИЗН=tmp;
                      |  kk=2:
                        КОД_ПРИЗН="";
                      else ^False;
                      fi;
                      if КОД_ПРИЗН<>StoreANA: if ОтменитьИзмененияУсловийОтчета: КОД_ПРИЗН=StoreANA; else КОД_СЧЕТА=""; fi; fi;
                      ^False;
|  Field="ИМЯ_СЧЕТА": StoreANA=КОД_СЧЕТА;
                      if КОД_ПРИЗН="": Message("Выберите признак"); ^False; fi;
                      ClearVariable(Buf);
                      Buf[1]="Выбрать счет учета";
                      Buf[2]="Очистить значение";
                      kk=Alternate("Выберите действие...", Buf, -1, 1, 12);
                      if kk=1: КОД_СЧЕТА=ВыборСчетаПоПризнаку(КОД_СЧЕТА, ДатКП+1);
                      |  kk=2: КОД_СЧЕТА="";
                      fi;
                      if КОД_СЧЕТА<>StoreANA: if ОтменитьИзмененияУсловийОтчета: КОД_СЧЕТА=StoreANA; fi; fi;
                      ^False;
 |  Field="ДатКП_"  : OldКП=ДатКП; OldНП=ДатНП;
 |  Field="VOCFTR_" : StoreANA=VOCFTR;
                      StoreANA2=ANAFTR;
                      VOCFTR=ВыборСправочникаФильтра(VOCFTR);
                      if VOCFTR<>StoreANA:
                         if ОтменитьИзмененияУсловийОтчета:
                            VOCFTR=StoreANA; ANAFTR=StoreANA2;
                         else
                            ANAFTR="";
                         fi;
                      fi;
                      if ANAFTR<>StoreANA2: if ОтменитьИзмененияУсловийОтчета: VOCFTR=StoreANA; ANAFTR=StoreANA2; fi; fi;
                      ^False;
 |  Field="ANAFTR_" : StoreANA=ANAFTR;
                      ANAFTR=ВыборЗначенияСправочникаФильтра(VOCFTR, ANAFTR);
                      if ANAFTR<>StoreANA: if ОтменитьИзмененияУсловийОтчета: ANAFTR=StoreANA; fi; fi;
                      ^False;
 |  Field="КН1":      ПерейтиНаПроводку(Iter);
                      ^False;
 fi;
 ^True;
end; 

Proc Field_onExit(Field:String; Iter:Integer); -- на выходе из клетки
 if Field="УЧРЕЖ_ИМЯ": if УЧРЕЖ_ИМЯ="": УЧРЕЖ_КОД=""; ОКПО=""; fi;
 |  Field="ОКПО":      if УЧРЕЖ_ИМЯ="": УЧРЕЖ_КОД=""; ОКПО=""; fi;
 |  Field="ДатКП_":    if ДатКП<>OldКП or ДатНП<>OldНП: if ОтменитьИзмененияУсловийОтчета: ДатКП=OldКП; ДатНП=OldНП; fi; fi;
 |  Field="VOCFTR_":   StoreANA=VOCFTR;
                       StoreANA2=ANAFTR;
                       VOCFTR="";
                       ANAFTR="";
                       if ANAFTR<>StoreANA2 or VOCFTR<>StoreANA: if ОтменитьИзмененияУсловийОтчета: VOCFTR=StoreANA; ANAFTR=StoreANA2; fi; fi;
 |  Field="ANAFTR_":   StoreANA=ANAFTR;
                       ANAFTR="";
                       if ANAFTR<>StoreANA: if ОтменитьИзмененияУсловийОтчета: ANAFTR=StoreANA; fi; fi;
 |  Field="ИСПОЛФИО":  if ИСПОЛФИО="": ИСПОЛДОЛ=""; fi;
 fi;
end;

Func Дата_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var dd :Date;
 Template.HideEditor(False);
 dd=ВыборДаты(GetDate);
 SetDate(dd);
 ^"";
end;

Func ДНДК_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var ddДН, ddДК, saveДН, saveДК : Date;
 Template.HideEditor(False);
 saveДН=GetDateOnField("ДатНП");
 saveДК=GetDateOnField("ДатКП");
 ddДК=ВыборДаты(saveДК);
 ddДН=Dat(1, 1, Year(ddДК));
 if ddДК<>saveДК: if ОтменитьИзмененияУсловийОтчета: ddДК=saveДК; ddДН=saveДН; fi; fi;
 SetDateOnField("ДатНП", ddДН);
 SetDateOnField("ДатКП", ddДК);
 ^"";
end;

Func Период_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var ddДН, ddДК, saveДН, saveДК : Date;
var j, YY, MM :Integer;
 Template.HideEditor(False);
 saveДН=GetDateOnField("ДатНП");
 saveДК=GetDateOnField("ДатКП");
 ClearVariable(Buf);
 for j=1 to 12 do Buf[j]=Месяц(j); od;
 YY=Year(if(saveДК>1.1.100, saveДК, ToDay));
 MM=Mon(if(saveДК>1.1.100, saveДК, ToDay));
 j=Alternate("Месяц расчета для "+Str(YY)+" года.", Buf, -1, MM, 12);
 if j>0:
   ddДН=Dat(1, j, YY);
   ddДК=Dat(1, if(j=12, 1, j+1), if(j=12, YY+1, YY))-1;
   if ddДК<>saveДК: if ОтменитьИзмененияУсловийОтчета: ddДК=saveДК; ddДН=saveДН; fi; fi;
   SetDateOnField("ДатНП", ddДН);
   SetDateOnField("ДатКП", ddДК);
 fi;
 ^"";
end;

Func Исполнитель_OnLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
var REC: Record;
var tmp, tmp2, стрДОЛ, стрФИО: String;
 Template.HideEditor(False);
 стрДОЛ=""; стрФИО="";
 REC=OpenCardFile("СОТРУДНИКИ", "", REC, crdRecordOnly);
 if REC=NIL: ^Cur; fi;
 стрДОЛ=GetCardFieldS("СОТРУДНИКИ", REC, "ДОЛЖНОСТЬ.ДОЛЖ");
 tmp=GetCardFieldS("СОТРУДНИКИ", REC, "ИНИЦИАЛЫ");
 tmp2=GetCardFieldS("СОТРУДНИКИ", REC, "ФАМИЛИЯ");
 стрФИО=if(tmp2="", GetCardFieldS("СОТРУДНИКИ", REC, "ФИОТ"), tmp2+" "+if(tmp<>"..", tmp, ""));
 ИсполДОЛ=стрДОЛ;
 ИсполФИО=стрФИО;
 ^"";
end;

Func Field_OnValidateD(Field:String; Iter:Integer; Value:Date) :Logical;
 if not Value>1.1.100 : Message('Необходимо задать дату.', mtError); ^False; fi;
 if Field="ДатКП_": 
    ДатКП=Value;
    ДатНП=Dat(1, 1, Year(Value));
 fi;
 ^True;
end;

2-- События объектов
Proc btnOnClick(Sender:String); -- объекты при нажатии
 if Sender="btnClose"   : Close;
 |  Sender="btnПечать"  : РАБ.НАСТР_ПЕЧАТЬ.Prn("", "", "RPO_STD_ALBUM.cfg", "", 1);
 |  Sender="btnРасчет"  : if СформироватьКарточку: Message("Формирование карточки количественно-суммового^Mучета материальных ценностей успешно завершено!", mtInformation); fi;
 fi;
end;

Proc РазрешенВыборБюджСчета(Разрешено:Logical);
var ТЧ :Logical;
var цвFont, цвBack :Integer;
 if Разрешено: цвFont=coBlack; цвBack=coTransparent; ТЧ=True; else цвFont=coWhite; цвBack=coTeal; ТЧ=False; fi;
 СекцСЧТ.Cell(1, 3, CellFontColor, цвFont);
 СекцСЧТ.Cell(1, 3, CellBgColor,   цвBack);
 СекцСЧТ.Cell(1, 3, CellReadOnly,  ТЧ);
end;

2-- События шаблона
Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
var tmp :String;
var num, wrkYear :Integer;
var Clear :Logical;
var rec:record;
 Очистить;
 tmp=UserName(AliasName("РПО_БЮДЖ_КЛАСС"));
 Пользов=if(tmp<>"", "Пользователь - "+tmp, "Пользователь локальной версии");
 РАБ.НАСТР_ПЕЧАТЬ.Cfg(PlanVar("ОБЩИЕ")+"\Настройки\","ТББ_STD_Album10_000.cfg"); -- стандартная настройка
 Clear=False;
 КОД_ПРИЗН_import=trim(КОД_ПРИЗН_import);
 if match(КОД_ПРИЗН_import,'НФА.???.??.*'): -- вызов из другого бланка
    rec=ПризнакВзапись(КОД_ПРИЗН_import,false);
    if rec<>nil:
       if КартотекаПризнака(КОД_ПРИЗН_import,false)='РПО_НФА':
          NN_NFA=GetCardFields('РПО_НФА',rec,'NN_NFA');
       fi;
    fi;
    КОД_ПРИЗН=КОД_ПРИЗН_import;КОД_ПРИЗН_import='';
--    if flgСинтСЧ:
--       КОД_СЧЕТА=ВзятьСчетКод(КОД_ПРИЗН, flgСинтСЧ);
--    else
--       КОД_СЧЕТА="";
--    fi;
  | true:
    if Позиции>0:
       num=EnqOkCancel("Обнаружены данные предыдущего расчета!^MСформировать карточку?", mtConfirmation);
       if num=cmCancel: Clear=True; fi;
    else
       Clear=True;
    fi;
 fi;
 if Clear:
    Очистить;
    ОчиститьТаблицу;
    flgUseПО=False;
    flgUseМХЭ=True;
    flgUseМОЛ=True;
    flgСинтСЧ=True;
    Try wrkYear=Int(PlanVar("ГОД")); Except wrkYear=Year(ToDay); end;
    if wrkYear>1900:
      if ToDay<Dat(1, 1, wrkYear+1): ДатНП=Dat(1, 1, wrkYear); ДатКП=Today; else ДатНП=Dat(1, 1, wrkYear); ДатКП=Dat(1, 1, wrkYear+1)-1; fi;
    else
      ДатКП=ToDay; ДатНП=Dat(1, 1, Year(ДатКП));
    fi;
    if ДатЗАП=1.1.100: ДатЗАП=ToDay; fi;
    КОД_ПО ="П.*";
    КОД_МОЛ="МОЛ.*";
    КОД_МХЭ="М.*";
    КОД_ПРИЗН="";
    КОД_СЧЕТА="";
    curсчтрчт=1;
 fi;
 if curсчтрчт<1: curсчтрчт=1; fi;
 СекцПО.Cell(1, 1, CellContents, if(flgUseПО, "фильтр", " ")); -- проверять адрес!!!
 oldсчтрчт=curсчтрчт;
 Template.Object="btnClose";
end;

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



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