БЛАНКСШАБЛОНОМ[20.04.2006] "Карточка количественно-суммового учета материальных ценностей";
-- Редакция ЗАО "Агентство 'Русспромоценка'"
--2 Переменные
BTNNAME_MENU  :String="форма ОКУД 0504041";
MaskVOC     :String="ВД.*|ВКЛ.*|П.*|ПГР.*|РБС.*";
СекцПО:Object; СекцМХЭ:Object; СекцТАБ:Object; СекцСЧТ:Object;
cbUseМХЭ:Object; cbUseПО:Object; cbСинтСЧ:Object;
btnClose:Object; btnРасчет:Object; btnПечать:Object;
--
flgUseПО     :Logical=[False];
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;
--
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(КОД_МХЭ="М.*",   "Все местонахождения", КОД_МХЭ));

Func ВзятьСчетИмя(КОДСЧТ:String) :String;
var msk, КБК :String;
 if Match(КОДСЧТ, "10?.??.???"): msk=КОДСЧТ; КБК="";
 |  Match(КОДСЧТ, "???.????.???????.???.?.10?.??.???"): msk=SubStr(КОДСЧТ, 24, 4)+'?'+SubStr(КОДСЧТ, 29, 5); КБК=SubStr(КОДСЧТ, 1, 20)+". ";
 else msk="";
 fi;
 if not msk="":
    if msk="101.?1.???": ^(КБК+"Жилые помещения");
    |  msk="101.?2.???": ^(КБК+"Нежилые помещения");
    |  msk="101.?3.???": ^(КБК+"Сооружения");
    |  msk="101.?4.???": ^(КБК+"Машины и оборудование");
    |  msk="101.?5.???": ^(КБК+"Транспортные средства");
    |  msk="101.?6.???": ^(КБК+"Производственный и хозяйственный инвентарь");
    |  msk="101.?8.???": ^(КБК+"Прочие основные средства");
    |  msk="105.?1.???": ^(КБК+"Медикаменты и перевязочные средства");
    |  msk="105.?2.???": ^(КБК+"Продукты питания");
    |  msk="105.?3.???": ^(КБК+"Горюче-смазочные материалы");
    |  msk="105.?4.???": ^(КБК+"Строительные материалы");
    |  msk="105.?5.???": ^(КБК+"Мягкий инвентарь");
    |  msk="105.?6.???": ^(КБК+"Прочие материальные запасы");
    |  msk="105.?7.???": ^(КБК+"Готовая продукция");
    fi;
 fi;
 ^"";
end;

Func НомерСчета_Маску(StrAcc:String) :String;
var Work :Logical;
var RES, Value :String;
 Work=False;
 StrAcc=Trim(SubStr(StrAcc, 1, 6));
 if Match(StrAcc, "101.??"): Work=True;
 |  Match(StrAcc, "102.??"): Work=True;
 |  Match(StrAcc, "103.??"): Work=True;
 |  Match(StrAcc, "105.??"): Work=True;
 |  Match(StrAcc, "106.??"): Work=True;
 else ^"10?.??";
 fi;
 RES="";
 if Work:
   Value=StrAcc;
   if Match(StrAcc, "10?.0?"): StrAcc=SubStr(Value, 1, 4)+"?"+SubStr(Value, 6, 1); fi;
   if Work: 
     Value=SubStr(StrAcc, 5, 1);
     if not Pos(Value, "?1234")      > 0: Work=False; fi;
   fi;
   if Work: 
     Value=SubStr(StrAcc, 6, 1);
     if not Pos(Value, "?123456789") > 0: Work=False; fi;
   fi;
   if Work: RES=StrAcc; fi;
 fi;
 if RES="": RES=SubStr(StrAcc, 1, 4)+"??"; fi;
 ^RES;
end;

Func ВзятьСчетКод(КОДНФА:String; СЧСинт:Logical) :String;
var msk, Путь :String;
var Отч1 :Report;
var j :Integer;
 if not Match(КОДНФА, "НФА.10?.0?.*"): ^""; fi;
 msk=НомерСчета_Маску(SubStr(КОДНФА, 5, 6));
 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(КОД_ПРИЗН), КОД_ПРИЗН);

Func ВзятьКодСчетаДляШибкоУмных(ACCИСХ:String; РежимСчетов:Integer) :String;
var Value, Acc10 :String;
 if Match(ACCИСХ, "10?.??.???"):
   Value=SubStr(ACCИСХ, 1, 6);
   Acc10=SubStr(КОД_ПРИЗН, 5, 4)+"?"+SubStr(КОД_ПРИЗН, 10, 1);
   if РежимСчетов=1: ^("*.?."+ACCИСХ+Chr(13)+"ЗАБ.21."+Acc10+"|ЗАБ.??."+Acc10);
   |  РежимСчетов=3: ^("ЗАБ.21."+Acc10+"|ЗАБ.??."+Acc10);
   else ^("*.?."+ACCИСХ);
   fi;
 |  Match(ACCИСХ, "???.????.???????.???.?.10?.??.???"):
   Value=SubStr(ACCИСХ, 24, 6);
   if РежимСчетов=1: ^(ACCИСХ+Chr(13)+"ЗАБ.21."+Acc10+"|ЗАБ.??."+Acc10);
   |  РежимСчетов=3: ^("ЗАБ.21."+Acc10+"|ЗАБ.??."+Acc10);
   else ^("*.?."+ACCИСХ);
   fi;
 else
    ^"";
 fi;
end;

var КОД_СЧЕТА_VIS :String=ВзятьКодСчетаДляШибкоУмных(КОД_СЧЕТА, curсчтрчт);

-- ТАБЛИЦА
Позиции      :Integer;
ДАТАЖО[] :Date;
НМР_ЖО[] :String;
СОДЕРЖ[] :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(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;
 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 not Match(КОД_ПРИЗН, "НФА.10?.0?.*"):
   Message("Некорректный код НФА!", mtWarning);
   Template.Field="ИМЯ_ПРИЗН";
   ^False;
 fi;
 if Trim(КОД_СЧЕТА)="":
   Message("Не выбран СЧЕТ!", mtWarning);
   Template.Field="ИМЯ_СЧЕТА";
   ^False;
 fi;
 if not Match(КОД_СЧЕТА, "10?.??.???") and not Match(КОД_СЧЕТА, "???.????.???????.???.?.10?.??.???"):
   Message("Некорректный счет!", mtWarning);
   Template.Field="ИМЯ_СЧЕТА";
   ^False;
 fi;
 ^True;
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(КОД_МОЛ)<>"": MskANA=Объединить(MskANA, КОД_МОЛ, "&"); fi;
   if Trim(КОД_МХЭ)<>"" and flgUseМХЭ: MskANA=Объединить(MskANA, КОД_МХЭ, "&"); fi;
   if Trim(КОД_ПО)<>""  and flgUseПО:  MskANA=Объединить(MskANA, КОД_ПО, "&"); 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, 4)+"?"+SubStr(КОД_ПРИЗН, 10, 1); else MskACC=""; fi;
   else
     if Match(КОД_СЧЕТА, "10?.??.???"):                        MskACC="*."+КОД_СЧЕТА+"|ЗАБ.??."+SubStr(КОД_ПРИЗН, 5, 4)+"?"+SubStr(КОД_ПРИЗН, 10, 1);
     |  Match(КОД_СЧЕТА, "???.????.???????.???.?.10?.??.???"): MskACC=КОД_СЧЕТА+"|ЗАБ.??."+SubStr(КОД_ПРИЗН, 5, 4)+"?"+SubStr(КОД_ПРИЗН, 10, 1);
     else MskACC="";
     fi;
   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]=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     РАБ.НФА.FUNC_LIB.СчетСоотвМаске(СЧД, MskACC) and not РАБ.НФА.FUNC_LIB.СчетСоотвМаске(СЧК, MskACC): Статус=+1; -- приход
        |  not РАБ.НФА.FUNC_LIB.СчетСоотвМаске(СЧД, MskACC) and     РАБ.НФА.FUNC_LIB.СчетСоотвМаске(СЧК, MskACC): Статус=-1; -- расход
        |      РАБ.НФА.FUNC_LIB.СчетСоотвМаске(СЧД, MskACC) and     РАБ.НФА.FUNC_LIB.СчетСоотвМаске(СЧК, MskACC): if СЧД=СЧК : Статус=10; else Статус=0; fi; -- внутреннее перемещение
--        |      РАБ.НФА.FUNC_LIB.СчетСоотвМаске(СЧД, MskACC) and     РАБ.НФА.FUNC_LIB.СчетСоотвМаске(СЧК, MskACC): if СЧД=СЧК and not КОД_МОЛ="МОЛ.*": Статус=10; else Статус=0; fi; -- внутреннее перемещение
        else Статус=0;
        fi;
        if Статус<>0:
           CRD=Up(TransCardFile(Iter));
           REC=TransRecord(Iter);
           МОЛ_DEB=""; МОЛ_CRE=""; МХЭ_DEB=""; МХЭ_CRE=""; ПОД_DEB=""; ПОД_CRE="";
           МОЛ_DEB=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(Iter, "МОЛ", True);
           МОЛ_CRE=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(Iter, "МОЛ", False);
           if flgUseМХЭ:
              МХЭ_DEB=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(Iter, "М", True);
              МХЭ_CRE=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(Iter, "М", False);
           fi;
           if flgUseПО:
              ПОД_DEB=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(Iter, "П", True);
              ПОД_CRE=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(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=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(Iter, "ДНФА", True);
             if Store=+1:
                tmp='';
                if tmp='':tmp=trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(Iter, "ПБС", False));fi;
                if tmp='':tmp=trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(Iter, "К", False));fi;
                if tmp='':tmp=trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(Iter, "Ф", False));fi;
                if tmp='':
                   tmp=trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(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(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(Iter-1, "ПБС", False));fi;
                                  if tmp='':tmp=trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(Iter-1, "К", False));fi;
                                  if tmp='':tmp=trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(Iter-1, "Ф", False));fi;
                                  if tmp='':tmp=trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(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(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(Iter, "МОЛ", True));
                if tmp='':tmp=trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(Iter, "ПБС", True));fi;
                if tmp='':tmp=trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(Iter, "К", True));fi;
                if tmp='':tmp=trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(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("НФА")+"\ОТЧЕТЫ\НФАОТЧ2007.lst";
    if not(ExistFile(Путь)): Message("Файл с отчетами отсутствует!", mtError); Exit; fi;
    MskANA=КОД_ПРИЗН;
    if Trim(КОД_МОЛ)<>"": MskANA=Объединить(MskANA, КОД_МОЛ, "&"); fi;
    if Trim(КОД_МХЭ)<>"" and flgUseМХЭ: MskANA=Объединить(MskANA, КОД_МХЭ, "&"); fi;
    if Trim(КОД_ПО)<>""  and flgUseПО:  MskANA=Объединить(MskANA, КОД_ПО, "&"); 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, 4)+"?"+SubStr(КОД_ПРИЗН, 10, 1); else MskACC=""; fi;
    else
      if Match(КОД_СЧЕТА, "10?.??.???"):                        MskACC="*."+КОД_СЧЕТА+"|ЗАБ.??."+SubStr(КОД_ПРИЗН, 5, 4)+"?"+SubStr(КОД_ПРИЗН, 10, 1);
      |  Match(КОД_СЧЕТА, "???.????.???????.???.?.10?.??.???"): MskACC=КОД_СЧЕТА+"|ЗАБ.??."+SubStr(КОД_ПРИЗН, 5, 4)+"?"+SubStr(КОД_ПРИЗН, 10, 1);
      else MskACC="";
      fi;
    fi;
    УслОтбр=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;

2-- События клеток
Func Field_onEnter(Field:String; Iter:Integer) :Logical; -- на входе в клетку
var tmp :String;
var qq :Integer;
 StoreANA=""; StoreANA2="";
 if Field="УЧРЕЖ_ИМЯ" or
    Field="ОКПО"    : Реквизиты;
                      ^False;
 |  Field="ИМЯ_ПО"  : StoreANA=КОД_ПО;
                      ClearVariable(Buf);
                      Buf[1]="Все структурные подразделения";
                      Buf[2]="Выбрать структурное подразделение";
                      qq=Alternate("Выберите действие...", Buf, -1, 2, 12);
                      if qq=1:
                        КОД_ПО="П.*";
                        if flgUseПО and КОД_ПО<>StoreANA: if ОтменитьИзмененияУсловийОтчета: КОД_ПО=StoreANA; fi; fi;
                      |  qq=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]="Выбрать местонахождение";
                      qq=Alternate("Выберите действие...", Buf, -1, 2, 12);
                      if qq=1:
                        КОД_МХЭ="М.*";
                        if КОД_МХЭ<>StoreANA: if ОтменитьИзмененияУсловийОтчета: КОД_МХЭ=StoreANA; fi; fi;
                      |  qq=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]="Выбрать материально ответственное лицо";
                      qq=Alternate("Выберите действие...", Buf, -1, 2, 12);
                      if qq=1:
                        КОД_МОЛ="МОЛ.*";
                        if КОД_МОЛ<>StoreANA: if ОтменитьИзмененияУсловийОтчета: КОД_МОЛ=StoreANA; fi; fi;
                      |  qq=2:
                        tmp=AnaElection("МОЛ.*", False, False, КОД_МОЛ);
                        if tmp="": ^False; fi;
                        КОД_МОЛ=tmp;
                        if КОД_МОЛ<>StoreANA: if ОтменитьИзмененияУсловийОтчета: КОД_МОЛ=StoreANA; fi; fi;
                      fi;
                      ^False;
 |  Field="ИМЯ_СЧЕТА" : StoreANA=КОД_СЧЕТА;
                        КОД_СЧЕТА=ВзятьСчетКод(КОД_ПРИЗН, flgСинтСЧ);
                        ^False;
 |  Field="ИМЯ_ПРИЗН" : StoreANA=КОД_ПРИЗН;
                        tmp=AnaElection("НФА.10?.??.*", False, False, КОД_ПРИЗН);
                        if tmp="": ^False; fi;
                        if not SignUsed(tmp): Message("Признак ["+tmp+"]^Mне используется в проводках!", mtInformation); ^False; fi;
                        КОД_ПРИЗН=tmp;
                        if КОД_ПРИЗН<>StoreANA: if ОтменитьИзмененияУсловийОтчета: КОД_ПРИЗН=StoreANA; fi; fi;
                        if Match(КОД_ПРИЗН, "НФА.???.??.*") and flgСинтСЧ:
                           КОД_СЧЕТА=ВзятьСчетКод(КОД_ПРИЗН, flgСинтСЧ);
                        else
                           КОД_СЧЕТА="";
                        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 cbUseМХЭ_onChange(Sender:String);
var flag, old :Logical;
 StoreANA=КОД_МХЭ;
 flag=flgUseМХЭ;
 old=not flag;
 if ОтменитьИзмененияУсловийОтчета: КОД_МХЭ=StoreANA; flag=old; fi;
 flgUseМХЭ=flag;
 cbUseМХЭ.State=flag;
 if flag<>old: if not flag: КОД_МХЭ="М.*"; fi; fi;
 СекцМХЭ.CanPrint = flag;
 СекцМХЭ.Visible  = flag;
end;

Proc cbUseПО_onChange(Sender:String);
var flag, old :Logical;
 flag=flgUseПО;
 old=not flag;
 if ОтменитьИзмененияУсловийОтчета: flag=old; fi;
 flgUseПО=flag;
 cbUseПО.State=flag;
 СекцПО.Cell(1, 1, CellContents, if(flag, "фильтр", " ")); -- проверять адрес!!!
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;

Proc cbСинтСЧ_onChange(Sender:String);
var flag, old :Logical;
 flag=flgСинтСЧ;
 old = not flag;
 if ОтменитьИзмененияУсловийОтчета: flag=old; fi;
 flgСинтСЧ=flag;
 cbСинтСЧ.State=flag;
 КОД_СЧЕТА=ВзятьСчетКод(КОД_ПРИЗН, flag);
 РазрешенВыборБюджСчета(flag);
end;

Proc РазрешенВыборСчетов(Разрешено:Integer);
 if Разрешено=3:
   flgСинтСЧ=True;
   cbСинтСЧ.State=True;
   cbСинтСЧ.Enabled=False;
 else
   cbСинтСЧ.Enabled=True;
 fi;
end;

Proc ФлагиСчета_onChange(Sender:String);
var curFlag, oldFlag :Integer;
 curFlag=curсчтрчт; -- текущий статус
 oldFlag=oldсчтрчт; -- предыдущий статус
 if ОтменитьИзмененияУсловийОтчета: curFlag=oldFlag; fi;
 curсчтрчт=curFlag;
 if curFlag<>oldFlag: 
   РазрешенВыборСчетов(curFlag);
   РазрешенВыборБюджСчета(flgСинтСЧ);
   oldсчтрчт=curFlag;
 fi;
end;  

2-- События шаблона
Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
var tmp :String;
var num :Integer;
var Clear :Logical;
var rec:record;
 Очистить;
 tmp=UserName(AliasName("РПО_НФА"));
 Пользов=if(tmp<>"", "Пользователь - "+tmp, "Пользователь локальной версии");
 РАБ.НАСТР_ПЕЧАТЬ.Cfg(PlanVar("НФА")+"\Настройки\","RPO_STD_ALBUM.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;
    flgСинтСЧ=True;
    if ДатКП=1.1.100: ДатКП=ToDay; ДатНП=Dat(1, 1, Year(ДатКП)); fi;
    if ДатЗАП=1.1.100: ДатЗАП=ToDay; fi;
    КОД_ПО ="П.*";
    КОД_МОЛ="МОЛ.*";
    КОД_МХЭ="М.*";
    КОД_ПРИЗН="";
    КОД_СЧЕТА="";
    curсчтрчт=1;
 fi;
 if curсчтрчт<1: curсчтрчт=1; fi;
 РазрешенВыборСчетов(curсчтрчт);
 РазрешенВыборБюджСчета(flgСинтСЧ);
 СекцМХЭ.CanPrint = flgUseМХЭ;
 СекцМХЭ.Visible  = flgUseМХЭ;
 СекцПО.Cell(1, 1, CellContents, if(flgUseПО, "фильтр", " ")); -- проверять адрес!!!
 oldсчтрчт=curсчтрчт;
 Template.Object="btnClose";
end;

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

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