Страница 1 из 1

нужен исходник интерфейса REP_PLV_BYDGV !!!!!!!

Добавлено: 04 дек 2008, 18:30
Гаврилюк Марина
Здравствуйте!
Пользователи требуют изменить отчет, который идет через шаблон EXel. Чтобы его изменить, нужен исходник
интерфейса REP_PLV_BYDGV - "Акт сверки взаиморасчетов с контрагентом по договорам"

Нужно дополнить данные в поток.

Есть ли у кого исходник?
Помогите, пжлста!

Добавлено: 05 дек 2008, 06:11
Алексей
1. если есть нрек в потоке - делайте свою ЛТ в отчете
2. напишите свой отчет

Re: нужен исходник интерфейса REP_PLV_BYDGV !!!!!!!

Добавлено: 24 янв 2012, 11:36
Den_Is
up-ну тему, может у кого есть исходник

Re: нужен исходник интерфейса REP_PLV_BYDGV !!!!!!!

Добавлено: 24 янв 2012, 13:05
m0p3e
Rep_plv_dgv.vip 17.12.2010

Код: Выделить всё

//********************************************************************************
//                                                        (c) корпорация Галактика
// Галактика 7.12 - логистика
// Акт сверки взаиморасчетов с контрагентом в разрезе договоров
//********************************************************************************

#include CalcOper.vih     // Объектный интерфейс для расчета баланса
#include xlReport.Vih     // Объектный интерфейс для работы с Excel
#include PickBuh.vih      // Объектный интерфейс для работы с таблицей PickBuh
#include pMarkFun.vih     // Функции для работы с маркерами и Pick-таблицами
#include KatOrg.vih       // Объектный интерфейс для работы с каталогом организаций
#include GetKau.vih

#doc
 Акт сверки взаиморасчетов с контрагентом в разрезе договоров
#end

Interface Rep_plv_ByDgv 'Акт сверки в разрезе договоров' (,hcPs_PlARepAktSverkiParam,) EscClose, Gray;
  show at (, , 110, 27);

#include GetKau.var

// Для сортировки договоров
table struct tmpDogovor
(
  cDogovor     : Comp       "Договор",
  cAppDogovor  : Comp       "Соглашение",
  SortName     : String[80] "Для сортировки, номер и дата договора",
  cVal         : Comp       "Код валюты",
  SumDebet     : Double     "Сумма дебетовая",
  SumKredit    : Double     "Сумма кредитовая",
  BegSumDebet  : Double     "Входящее сальдо дебетовое",
  BegSumKredit : Double     "Входящее сальдо кредитовое",
  wDeleting    : Word       "Служебное, для удаления"
)
with index
(
  tmpDogovor01 = cDogovor + cAppDogovor,
  tmpDogovor02 = cVal + SortName,
  tmpDogovor03 = wDeleting
);

// Для сортировки договоров по валюте
table struct tmpValSort
(
  cValut    : Comp       "Код валюты",
  SumValD   : Double     "Сумма дебетовая",
  SumValK   : Double     "Сумма кредитовая",
  BegValD   : Double     "Сумма дебетовая",
  BegValK   : Double     "Сумма кредитовая",
  wDeleting : Word       "Служебное, для удаления"
)
with index
(
  tmpValSort01 = cValut,
  tmpValSort02 = wDeleting

);

// Для сортировки документов по договорам
table struct tmpDocSort
(
  cDogovor    : Comp       "Договор",
  cAppDogovor : Comp       "Соглашение",
  cDoc        : Comp       "Документ",      // сопроводительный или финансовый
  TypeDoc     : Word       "Тип документа", // 1 - BaseFin, 2 - KatSopr, 3 - RzDoc, 4 - PlPor
  // Дополнительные поля. Сохраняю, чтобы при выгрузке в форму не искать документы в базе
  SummaDb     : Double     "Сумма дебетовая",
  SummaKr     : Double     "Сумма кредитовая",
//  SummaType : Word       "Тип суммы",     // 1 - дебетовая, 2 - кредитовая
  dDoc        : Date       "Дата документа",
  NoDoc       : String     "Номер и тип документа",
  TiDkGal     : Word       "Тип документа системный",
  Name        : String[80] "Наименование",
  dProv       : Date       "Дата проведения",
  NameR       : String[80] "Наименование МЦ, работ, услуг",
  cPost       : Comp       "Поставщик",
  // Для объединения BaseFin'ов по платежам
  DopType     : Word       "Тип документа",            // 1 - PlPor, 2 - Veksl, 0 - не задан
  cDopDoc     : Comp       "Дополнительный документ",  // PlPor или Veksl
  sNamePL1    : string     "Наимен.товара,работ один",
  sNamePL2    : string     "Наимен.товара,работ два",
  sNamePL3    : string     "Наимен.товара,работ три",
  sNamePL4    : string     "Приложение"
)
with index
(
  tmpDocSort01 = cDogovor + TypeDoc + dDoc,
  tmpDocSort02 = cDogovor + cAppDogovor + TypeDoc + cDoc,
  tmpDocSort03 = cDogovor + cAppDogovor + TypeDoc + DopType + cDopDoc,
  tmpDocSort04 = cDogovor + cAppDogovor + dDoc
);

const
  MyCode   = 7779;
  MyMess   = 'Не добавлены документы: ';
  BuchSopr = 60000;
  NoBuhSchet = 'не учитывать';
  MinDouble  = 0.001;
  cnstDel    = 101; // Признак того, что запись нужно удалить
end;

function GroupDocS(C : Word) : Boolean;
{
  GroupDocS := False;

  case C of
    101..111, 151, 201..211, 251, 700, 114 : GroupDocS := True;
  end;
}

function GroupDocF(C : Word) : Boolean;
{
  GroupDocF := False;
/*
  1004 - Стороннее заявление на аккредитив
  1005 - Стороннее заявление об отказе от акцепта
  1011 - Стороннее платежное требование-поручение
  1030 - Сторонний реестр счетов
  1032 - Стороннее платежное требование
  1044 - Стороннее валютное заявление на аккредитив
*/

  case C of
    1..11, 17, 18, 21, 22, 27,
    30..36, 70, 90..92,
    1004, 1005, 1011, 1030, 1032, 1044 : GroupDocF := True;
  end;
}

function GroupDocR(C : Word) : Boolean;
{
  GroupDocR := False;

  if (C = 911)
    GroupDocR := True;
}

function GroupDocV(C : Word) : Boolean;
{
  case C of
    81..89 : GroupDocV := True;
  else
    GroupDocV := False;
  end;
}

function GroupDocD(C : Word) : Boolean;
{
  GroupDocD := (C = 51);
}

Function GroupDocRem ( C: word ): boolean;
{
  case C of
    553: GroupDocRem := TRUE;
  else
    GroupDocRem := FALSE;
  end;
}

Var pxlrepsetup : xlrepsetup;

Create view vRep_plV

var
  // Переменные для настройки отчета
  BegDate, EndDate, BegDate_BuhSchet, EndDate_BuhSchet : Date;
  wDirect, SoprInRep, wPlPorSopr, wBuhSchetFilter      : Word;
  MrkStatusSopr, MarkerDoc, IndexNoDoc, MarkerTree,
  BuhSchCount,    // Кол-во выбранных счетов и субсчетов для фильтрации проводок
  IndexNoTree  : LongInt;
  CurGroup, cRec_Org, cRecNotes, myPlansNo, pDogovor_BaseFin,
  pDogovor_BaseDoc, pDogovor_KatSopr, cBankOrg : Comp;
  Flag                                         : Boolean;
  RepName, NameTG, Soob, sBuhSchet, ID, sBoss, sDoljBoss : String;

  // Фильтрация по договорам
  wFilter, wDopParam        : Word;
  cFilterDogovor                     : Comp;
  MrkDogovorFilter, NumFilterDogovor : LongInt;
  bIsFilterDogovor                   : Boolean;
  pKatorg                            : KatOrg; // Объект для работы с каталогом организаций

as select
  if (TempDescr.cRecKat = 0, TempDescr.Name, KatDoc.Name)
        (FieldName = KatDocN),

  if (TempDescr.cRecKat = 0, '' , Trim(String(KatDoc.TiDKGal)))
        (FieldName = KatDocT),

  if (SearchMarker(MarkerTree, Comp(TempDescr.SortName), IndexNoTree) and
      TempDescr.cRecKat <> 0, 'V', ' ')
        (FieldName = MarkerTree_V),

  if (SearchMarker(MarkerDoc, KatDocTmp.NRec, IndexNoDoc), 'V', ' ')
        (FieldName = MarkerDoc_V),

  if ((cRecNotes <> 0), KatNotes.Name,
    if (GetMarkerCount(MrkStatusSopr) > 1, 'множественный выбор (' +
                                           String(GetMarkerCount(MrkStatusSopr)) + ')', 'все'))
        (FieldName = StatusSopr),

  if (NumFilterDogovor = 1, if (IsValid(tnDogovorFilter), '№ ' + DogovorFilter.NoDoc + DateToStr(DogovorFilter.dDoc, ' от DD/MM/YYYY'), ''),
    if (NumFilterDogovor > 1, 'множественный выбор (' + String(NumFilterDogovor) + ')', ''))
        (FieldName = fDogovor),

  *
from
  KatOrg,
  KatSopr,
  SpSopr (SpSopr02),
  KatMC,
  GroupMC,
  KatUsl,
  GroupUsl,
  BaseFin,
  Dogovor,
  IerDog,
  RzDoc,
  RzSpDoc (RzSPDOC03),
  KatDoc  (KatDoc01),
  TempDescr (TempDescr02),
  tmpDocSort (tmpDocSort01),
  tmpValSort,
  tmpDogovor,
  KatNotes,
  HozOper,
  BuhSchet,
  KlVal,
  PlPor,
  Dogovor Dog_KS,
  KatDoc KatDocTmp (KatDoc02),
  PlPor PlP_Sopr,
  KatOrg KatOrgSelf,
  KatOrg KatOrgGr,
  SoprHoz SoprHozBF,
  SoprHoz SoprHoz70,
  Oborot OborotBF,
  Oborot OborotBF70,
  Oborot OborotPlP,
  Oborot OborotRz,
  SoprHoz SoprHozKS,
  Oborot OborotKS,
  Dogovor DogovorFilter,
  Dogovor Dogovor_Dop,
  KatBank,
  BaseDoc,
  Dogovor Dog_BaseDoc,
  StepDoc,
  SpStep,
  KatMC KatMCBD,
  GroupMC GroupMCBD,
  KatUsl KatUslBD,
  GroupUsl GroupUslBD,
  KatPodr KatPodrFrom,
  SpDocNal NDS_SpDocNal,
  RzKutPrih,
  Persons,
  Catalogs,
  Appointments

where
((
  coGetTune('MyOrg')   == KatOrgSelf.NRec     and
  cRec_Org             == KatOrg.NRec         and

  pDogovor_BaseFin     == Dogovor.NRec        and  // Договор или соглашение
  BaseFin.cSoprHoz     == SoprHozBF.NRec      and
  SoprHozBF.NRec       == OborotBF.cSoprHoz   and
  SoprHoz70.cSoprDoc   == BaseFin.nRec        and
  SoprHoz70.NRec       == OborotBF70.cSoprHoz and
  myPlansNo            == OborotBF.cPlansSch  and
  PlP_Sopr.nRec        == OborotPlP.cSoprDoc  and
  PlP_Sopr.TiDk        == OborotPlP.TiDk      and
  myPlansNo            == OborotPlP.cPlansSch and

  pDogovor_KatSopr     == Dog_KS.NRec         and
  KatSopr.cNazna       == KatNazna.NRec       and
  KatSopr.cHozOper     == HozOper.NRec        and
  KatSopr.VidSopr      == SoprHozKS.TipDoc    and
  KatSopr.NRec         == SoprHozKS.cSoprDoc  and
  SoprHozKS.NRec       == OborotKS.cSoprHoz   and
  myPlansNo            == OborotKS.cPlansSch  and
  KatSopr.NRec         == SpSopr.cSopr        and
  SpSopr.cMCUsl        == KatMC.NRec          and
  KatMC.cGroupMC       == GroupMC.NRec        and
  SpSopr.cMCUsl        == KatUsl.NRec         and
  KatUsl.cGroupUsl     == GroupUsl.NRec       and

  tmpValSort.cValut    == tmpDogovor.cVal     and
  RzDoc.NRec           == RzSpDoc.cSopr       and

  word(900)            == NDS_SpDocNal.TipDoc and
  RzSpDoc.cKutPrih     == NDS_SpDocNal.cSpDoc and
  RzSpDoc.cKutPrih     == RzKutPrih.nRec      and
  RzDoc.cPodrFrom      == KatPodrFrom.NRec    and

  RzDoc.TypeMove       == OborotRz.TiDk       and
  RzDoc.NRec           == OborotRz.cSoprDoc   and
  myPlansNo            == OborotRz.cPlansSch  and

  Word(MyCode)         == TempDescr.Code      and // Номер отчета
  CurGroup             == TempDescr.cGroup    and // Для прохода по дереву
  TempDescr.cRecKat    == KatDoc.NRec         and

  cRecNotes            == KatNotes.NRec       and
  cFilterDogovor       == DogovorFilter.NRec  and

  pDogovor_BaseDoc     == Dog_BaseDoc.NRec    and

  BaseDoc.Nrec         == StepDoc.cBaseDoc    and
  StepDoc.Nrec         == SpStep.cStepDoc     and
  SpStep.cMCUsl        == KatMCBD.NRec        and
  KatMCBD.cGroupMC     == GroupMCBD.NRec      and
  SpStep.cMCUsl        == KatUslBD.NRec       and
  KatUslBD.cGroupUsl   == GroupUslBD.NRec
))
// Документы на дату периода отчета
bounds byBaseFinDat =
       cRec_Org         == BaseFin.cOrg and
       BegDate         <<= BaseFin.dDoc and
       EndDate         >>= BaseFin.dDoc

bounds byKatSoprDatAll =
       cRec_Org         == KatSopr.cOrg  and
       BegDate         <<= KatSopr.dSopr and
       EndDate         >>= KatSopr.dSopr

bounds byKatSoprDatOpr =
       cRec_Org         == KatSopr.cOrg and
       BegDate         <<= KatSopr.dOpr and
       EndDate         >>= KatSopr.dOpr

bounds byRzDocDatAll =
       Word(911)        == RzDoc.TypeMove      and
       BegDate         <<= RzDoc.dDoc          and
       EndDate         >>= RzDoc.dDoc          and
       cRec_Org         == RzDoc.cOrg (NoIndex)

bounds byRzDocDatOpr =
       Word(911)        == RzDoc.TypeMove       and
       cRec_Org         == RzDoc.cOrg (NoIndex) and
       BegDate         <<= RzDoc.dOpr (NoIndex) and
       EndDate         >>= RzDoc.dOpr (NoIndex)


bounds byBaseDocDat =
       Word(201)        == BaseDoc.VidDoc and
       cRec_Org         == BaseDoc.cOrg   and
       BegDate         <<= BaseDoc.dDoc   and
       EndDate         >>= BaseDoc.dDoc

// Для сопроводительных PLPOR
bounds byPlPorDat1 =
       wPlPorSopr       == PlP_Sopr.TiDkGal and
       BegDate         <<= PlP_Sopr.DatVip  and
       EndDate         >>= PlP_Sopr.DatVip  and
       cRec_Org         == PlP_Sopr.cPlat (NoIndex)

bounds byPlPorDatOb1 =
       wPlPorSopr       == PlP_Sopr.TiDkGal and
       BegDate         <<= PlP_Sopr.DatOb   and
       EndDate         >>= PlP_Sopr.DatOb   and
       cRec_Org         == PlP_Sopr.cPlat (NoIndex)

bounds byPlPorDat2 =
       wPlPorSopr       == PlP_Sopr.TiDkGal and
       BegDate         <<= PlP_Sopr.DatVip  and
       EndDate         >>= PlP_Sopr.DatVip  and
       cRec_Org         == PlP_Sopr.cPlatNew(NoIndex)

bounds byPlPorDatOb2 =
       wPlPorSopr       == PlP_Sopr.TiDkGal and
       BegDate         <<= PlP_Sopr.DatOb   and
       EndDate         >>= PlP_Sopr.DatOb   and
       cRec_Org         == PlP_Sopr.cPlatNew (NoIndex)

// Для расчета баланса на дату начала периода
bounds byBaseFinDatBeforeBeg =
       cRec_Org         == BaseFin.cOrg and
       ZeroDate         << BaseFin.dDoc and
       BegDate          >> BaseFin.dDoc

bounds byKatSoprDatBeforeBegAll =
       cRec_Org         == KatSopr.cOrg  and
       ZeroDate         << KatSopr.dSopr and
       BegDate          >> KatSopr.dSopr

bounds byKatSoprDatBeforeBegOpr =
       cRec_Org         == KatSopr.cOrg and
       ZeroDate         << KatSopr.dOpr and
       BegDate          >> KatSopr.dOpr

bounds byRzDocDatBeforeBegAll =
       Word(911)        == RzDoc.TypeMove      and
       ZeroDate         << RzDoc.dDoc          and
       BegDate          >> RzDoc.dDoc          and
       cRec_Org         == RzDoc.cOrg (NoIndex)

bounds byRzDocDatBeforeBegOpr =
       Word(911)        == RzDoc.TypeMove       and
       cRec_Org         == RzDoc.cOrg (NoIndex) and
       ZeroDate         << RzDoc.dOpr (NoIndex) and
       BegDate          >> RzDoc.dOpr (NoIndex)

bounds byPlPorDatBeforeBeg1 =
       wPlPorSopr       == PlP_Sopr.TiDkGal and
       ZeroDate         << PlP_Sopr.DatVip  and
       BegDate          >> PlP_Sopr.DatVip  and
       cRec_Org         == PlP_Sopr.cPlat (NoIndex)

bounds byPlPorDatObBeforeBeg1 =
       wPlPorSopr       == PlP_Sopr.TiDkGal and
       ZeroDate         << PlP_Sopr.DatOb   and
       BegDate          >> PlP_Sopr.DatOb   and
       cRec_Org         == PlP_Sopr.cPlat (NoIndex)

bounds byPlPorDatBeforeBeg2 =
       wPlPorSopr       == PlP_Sopr.TiDkGal and
       ZeroDate         << PlP_Sopr.DatVip  and
       BegDate          >> PlP_Sopr.DatVip  and
       cRec_Org         == PlP_Sopr.cPlatNew (NoIndex)

bounds byPlPorDatObBeforeBeg2 =
       wPlPorSopr       == PlP_Sopr.TiDkGal  and
       ZeroDate         << PlP_Sopr.DatOb    and
       BegDate          >> PlP_Sopr.DatOb    and
       cRec_Org         == PlP_Sopr.cPlatNew (NoIndex)

bounds byBaseDocDatBeforeBeg =
       Word(201)        == BaseDoc.VidDoc and
       cRec_Org         == BaseDoc.cOrg   and
       ZeroDate         << BaseDoc.dDoc   and
       BegDate          >> BaseDoc.dDoc

condition byKatDocS  =
          (GroupDocS(KatDocTmp.TiDKGal))
condition byKatDocF  =
          (GroupDocF(KatDocTmp.TiDKGal))
condition byKatDocR  =
          (GroupDocR(KatDocTmp.TiDKGal))
condition byKatDocV  =
          (GroupDocV(KatDocTmp.TiDKGal))
condition byKatDocD  =
          (GroupDocD(KatDocTmp.TiDKGal))
Condition byKatDocRem =
          (GroupDocRem(KatDocTmp.TiDKGal))

condition byPlP_Sopr =
          ((PlP_Sopr.ModeDoc and 4) <> 0 and         // тип - "сопроводительный"
           (PlP_Sopr.ModeDoc and 2) = 0)             // во взаиморасчетах участвует
;

!form frmAktSvDO('AktSvDO.out', 'AktSvDO') with NoVisual;

var
  iCOper : CalcOper;       // Для расчета баланса
  pXL    : XLSRepBuilder;  // Объект формирования Excel-отчетов
  iMarkFuncs : pMarkFun;   // Объект для работы с маркерами и Pick'ами

#include PickBuh.var       // Переменная "интерфейс работы с таблицей PickBuh"
#include raskontr_dgv.vpp  // Функции расчета и печати отчета

Panel pnScreen;

Screen scRep_Pl_Dgv;
  show at (,,61,);
  table TempDescr;
Fields
  BegDate   ('Начальная дата интервала',, sci13Esc) : [, 'DD/MM/YYYY'], NoProtect;
  EndDate   ('Конечная дата интервала',, sci13Esc)  : [, 'DD/MM/YYYY'], NoProtect;
  KatOrg.Name ('Выбор контрагента',, sci13Esc) : Protect, PickButton,
      {Font = {BackColor = if (cRec_Org = 0, ColorNeed, 0)}};
  wFilter   ('Установите фильтры',,) : NoProtect;
  fDogovor  ('Установите фильтр по договорам',,sci13Esc) : PickButton, Protect;
  wDirect   ('Контролировать при расчете все документы или только по продаже/закупке',,) : NoProtect;
  wDopParam ('Дополнительные параметры',,) : NoProtect;
  SoprInRep ('Накладные в расчетах с контрагентом',, sci13Esc) :
    [LIST 'все', 'только проведенные'], Protect;
  StatusSopr('Статус накладных/актов',, sci13Esc) : PickButton, Protect;
  sBuhSchet ('Фильтр по наличию оборотов по счету',, sci13Esc) : PickButton, Protect;
  wBuhSchetFilter  ('Фильтр по оборотам',,) : NoProtect;
  BegDate_BuhSchet ('Начальная дата оборотов',, sci13Esc) : [, 'DD/MM/YYYY'], NoProtect;
  EndDate_BuhSchet ('Конечная дата оборотов',, sci13Esc)  : [, 'DD/MM/YYYY'], NoProtect;
  sBoss     ('Руководитель',, sci13Esc)          : PickButton;
  sDoljBoss ('Должность руководителя',, sci1Esc) : NoProtect;
Buttons
  cmValue1, Default,, 'Сформировать отчет',,;
  cmValue14, , ,'Настройка Excel', , sci1Esc;
  cmCancel,,, 'Отмена',,;
<<
  Период формирования  `c`.@@@@@@@@@@ `по`.@@@@@@@@@@

 `Контрагент` .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

 `Фильтр по`
   [.] договорам` .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

 `Направление` [.] продажа`
               [.] закупка`

 `Дополнительные параметры`
   [.] отображать договоры с нулевым сальдо     `
   [.] договоры без движения не включать в отчет`
   [.] отображать в разрезе соглашений          `

 `Учитывать накладные`      .@@@@@@@@@@@@@@@@@@@@@@@@
 `Статус накладных/актов`   .@@@@@@@@@@@@@@@@@@@@@@@@
 `Наличие оборотов по счетам / субсчетам`
   .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
   [.] период оборотов` `c`.@@@@@@@@@@`по`.@@@@@@@@@@

 `Руководитель`          .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 `Должность руководителя`.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

 <. Сформировать .> <.Настройка шаблона.> <.    Отмена    .>
>>
end;
end; // Panel pnScreen

Panel pnTree;

Tree 1 trTemp 'Документы' (,,sci178InsExPMTree);
  show at (62,,,)
  NoMove, NoReSize
  table TempDescr;
Fields
  {Font = {Color = if (SearchMarker(MarkerTree, Comp(TempDescr.SortName), IndexNoTree),
                       ColorMark, 0)}};
  MarkerTree_V #3'√' ('Отметить',,) : [1], Skip, NoAutoSize;
  KatDocN      #3'Наименование документа' ('Наименование платежного средства',,) : [37], Protect;
  KatDocT      #3'Код' ('Код документа',,) : [3], Protect, NoAutoSize;
end;
end;  // Panel pnTree

Function GetDolj(pPerson : comp) : string;
{
  Result := '';

  if ( GetFirst FastFirstRow Persons where (( pPerson == Persons.nRec )) = tsOk )
    if ( GetLast Appointments where ((  Persons.nRec == Appointments.Person
                                    AND integer(0)   == Appointments.lPrizn )) ordered by Appointments.AppointDate = tsOk )
      if ( GetFirst FastFirstRow Catalogs where (( Appointments.Post == Catalogs.nRec )) = tsOk )
        Result := Catalogs.Name;
}

// Считает кол-во отмеченных листьев в дереве
function GetMarkerTree(ITemp : LongInt): LongInt;
var
  uz : LongInt;
{
  uz := 0;
  TreePushPos(ITemp);
  if (TreeGetFirstEx(ITemp))
  {
    do
    {
      if ((TempDescr.IsLeaf = 0) and (SearchMarker(MarkerTree, Comp(TempDescr.SortName), IndexNoTree)))
        uz := uz + 1;
    }
    while (TreeGetNextEx(ITemp));
  }

  TreePopPos(ITemp);
  GetMarkerTree := GetMarkerCount(MarkerTree) - uz;
}

function GetNaznCount(ITemp : LongInt) : LongInt;
var
  uz : LongInt;
{
  uz := 0;
  TreePushPos(ITemp);
  if (TreeGetFirstEx(ITemp))
  {
    if (TempDescr.cRec = 1)
      uz := uz + 1;

    while TreeGetNextEx(ITemp) do
    {
      if (TempDescr.cRec = 1)
        uz := uz + 1;
    }
  }

  TreePopPos(ITemp);
  GetNaznCount := uz;
}

// Считает кол-во включенных назначений в дереве
function GetNaznTree(ITemp : LongInt) : LongInt;
var
  uz : LongInt;
{
  uz := 0;
  TreePushPos(ITemp);
  if (TreeGetFirstEx(ITemp))
  {
    do
    {
      if ((TempDescr.cRec = 1) and (TempDescr.IsLeaf = 0))
        uz := uz + 1;
    }
    while (TreeGetNextEx(ITemp));
  }

  TreePopPos(ITemp);
  GetNaznTree := GetNaznCount(trTemp) - uz;
}

// Считает кол-во отмеченных листьев в ветке
function GetMarkerLeaf(ITemp : LongInt) : LongInt;
var
  uz : LongInt;
{
  uz := 0;
  TreePushPos(ITemp);
  TreeGetNext(ITemp);

  do
  {
    if (SearchMarker(MarkerTree, Comp(TempDescr.SortName), IndexNoTree))
      uz := uz + 1;
  }
  while (TreeGetNextEx(trTemp) and TempDescr.IsLeaf = 1);

  TreePopPos(ITemp);
  GetMarkerLeaf := uz;
}

// Считает кол-во листьев в ветке
function GetLeafTree(ITemp : LongInt) : LongInt;
var
  uz : LongInt;
{
  uz := 0;
  TreePushPos(ITemp);

  while (TreeGetNextEx(ITemp)) do
  {
    if (TempDescr.IsLeaf = 1)
      uz := uz + 1;
    else
      Break;
  }

  TreePopPos(ITemp);
  GetLeafTree := uz;
}

// Считает кол-во листьев в дереве
function GetLeafTreeAll(ITemp : LongInt) : LongInt;
var
  uz : LongInt;
{
  uz := 0;
  TreePushPos(ITemp);

  if (TreeGetFirstEx(ITemp))
  {
    do
    {
      if (TempDescr.IsLeaf = 1)
        uz := uz + 1;
    }
    while (TreeGetNextEx(ITemp));
  }

  TreePopPos(ITemp);
  GetLeafTreeAll := uz;
}

// Считает кол-во включенных назначений в ветке
function GetNaznLeaf(ITemp : LongInt) : LongInt;
var
  uz : LongInt;
{
  uz := 0;
  TreePushPos(ITemp);
  TreeGetNext(ITemp);

  do
  {
    if (TempDescr.cRec = 1)
      uz := uz + 1;
  }
  while (TreeGetNextEx(ITemp) and TempDescr.IsLeaf = 1);

  TreePopPos(ITemp);
  GetNaznLeaf := uz ;
}

procedure SetPusto(ITemp : LongInt);
{
  TreePushPos(ITemp);
  TreeGetFirstEx(ITemp);

  do
  {
    if ((TempDescr.IsLeaf = 0 and TempDescr.cGroup <> 0))
      if (GetLeafTree(trTemp) = 0)
      {
        DeleteMarker(MarkerTree, Comp(TempDescr.SortName));
        UpDate current TempDescr
          Set TempDescr.cRec := 0;
        NextVisual;
      }
  }
  while (TreeGetNextEx(ITemp));

  TreePopPos(ITemp);
}

procedure SetMyTitle(ITemp : LongInt);
{
  SetColumnTitle(ITemp, #KatDocN, 'Наименование документов' +
                 ' (выбрано ' + Trim(String(GetMarkerTree(trTemp))) + ')');
}

procedure PopCondDoc;
{
  SetBounds(#KatDocTmp);

  case NameTG of
    'Сопроводительные документы' : PopCondition(tcbyKatDocS);
    'Финансовые документы'       : PopCondition(tcbyKatDocF);
    'Розничная торговля'         : PopCondition(tcbyKatDocR);
    'Векселя'                    : PopCondition(tcbyKatDocV);
    'ДО'                         : PopCondition(tcbyKatDocD);
    'Управление ремонтами'       : PopCondition(tcbyKatDocRem);
  end;
}

#doc
Окно выбора документа
#end

Window wndVyborDoc 'Выбор документа'
  ('Выбор документа', hcPs_PlARepAktSverkiParam, sci1EnIns) EscClose, DoAccept, Gray;
  show at (,,42,20)

Browse brVDoc;
  table KatDocTmp
Fields
  {Font = {Bold  = if (SearchMarker(MarkerDoc, KatDocTmp.NRec, IndexNoDoc), True, False);
           Color = if (SearchMarker(MarkerDoc, KatDocTmp.NRec, IndexNoDoc), ColorMark, 0)}};
  MarkerDoc_V       #3'√' ('Отметить',,) : [1], Skip, NoAutoSize;
  KatDocTmp.Name    '   Тип документа' ('Тип документа',,) : [37], Protect;
  KatDocTmp.TiDkGal #3'Код' ('Код типа документа',,) : [5], Protect, NoAutoSize;
end;

HandleEvent

cmInit :
{
  ReSetBounds(#KatDocTmp);

  case NameTG of
    'Сопроводительные документы' : PushCondition(tcbyKatDocS);
    'Финансовые документы'       : PushCondition(tcbyKatDocF);
    'Розничная торговля'         : PushCondition(tcbyKatDocR);
    'Векселя'                    : PushCondition(tcbyKatDocV);
    'ДО'                         : PushCondition(tcbyKatDocD);
    'Управление ремонтами'       : PushCondition(tcbyKatDocRem);
  end;

  if (GetFirst FastFirstRow KatDocTmp = tsOk) {}
}

cmDefault :
{
  Flag := True;
  if (GetMarkerCount(MarkerDoc) = 0)
    InvertMarker(MarkerDoc, KatDocTmp.NRec);
}

cmCancel :
{
  PopCondDoc;
  ClearMarker(MarkerDoc);
}

cmClose :
{
  PopCondDoc;
  ClearMarker(MarkerDoc);
}

cmMarkUnMark :
{
  InvertMarker(MarkerDoc, KatDocTmp.NRec);
  if (GetNext KatDocTmp <> tsOk) {}

  RescanPanel(#KatDocTmp);
}

cmSelectAll :
{
  StartNewVisual(vtRotateVisual, vfTimer, 'Помечаю все', 1);
  PushPos(#KatDocTmp);

  _loop KatDocTmp
  {
    InsertMarker(MarkerDoc, KatDocTmp.NRec);
    NextVisual;
  }

  PopPos(#KatDocTmp);
  RescanPanel(#KatDocTmp);
  StopVisual('', 0);
}

cmUnSelectAll :
{
  ClearMarker(MarkerDoc);
  RescanPanel(#KatDocTmp);
}

end;
end; // Window wndVyborDoc

function GetUge : Boolean;
var
  L : Integer;
{
  TreePushPos(trTemp);
  if (TempDescr.IsLeaf = 1)
    TreeJumpToRecord(trTemp, TempDescr.cGroup);

  L := TreeLevel(trTemp);
  GetUge := True;

  while (TreeGetNextEx(trTemp)) do
  {
    NextVisual;
    if (TreeLevel(trTemp) <= L)
      Break;

    if (TempDescr.cRecKat = KatDocTmp.NRec)
    {
      Soob := Soob + if (Soob <> MyMess,
        ', ' + Trim(String(KatDocTmp.TiDKGal)),
         Chr(13) + Trim(String(KatDocTmp.TiDKGal)));
      GetUge := False;
      Break;
    }
  }

  TreePopPos(trTemp);
}

function SetNewGroup(Gr : Comp; SName, SN : String) : Comp;
{
  ClearBuffer(#TempDescr);
  TempDescr.Code     := Word(MyCode);
  TempDescr.CGroup   := Gr;
  TempDescr.Name     := SName;
  TempDescr.SortName := SN;
  Insert current TempDescr;
  SetNewGroup := TempDescr.NRec;
}

procedure SetLeafTreeDoc(Gr : Comp; ITable : Word);
{
  ClearBuffer(#TempDescr);

  TempDescr.Code     := Word(MyCode);
  TempDescr.CGroup   := Gr;
  TempDescr.CRecKat  := KatDoc.NRec;
  TempDescr.Name     := KatDoc.Name;
  TempDescr.isLeaf   := 1;
  TempDescr.Level    := ITable;
  TempDescr.SortName := String(KatDoc.TiDKGal, 5);

  Insert current TempDescr;
}

procedure AddLeafTreeDoc;
var
  L       : Comp;
  tmpName : String;
{
  if (GetFirst FastFirstRow TempDescr where(('   70' == TempDescr.SortName (NoIndex))) = tsOk)
  {
    L := TempDescr.cRec;
    tmpName := TempDescr.Name;
    ClearBuffer(#TempDescr);
    TempDescr.Code     := Word(MyCode);
    TempDescr.isLeaf   := 1;
    TempDescr.cRec     := L;
    TempDescr.Name     := tmpName;
    TempDescr.Level    := coBaseFin;
    TempDescr.SortName := String(Word(71), 5);
    Insert current TempDescr;
  }

  if (GetFirst FastFirstRow TempDescr where(('   90' == TempDescr.SortName (NoIndex))) = tsOk)
  {
    L := TempDescr.cRec;
    tmpName := TempDescr.Name;
    ClearBuffer(#TempDescr);
    TempDescr.Code     := Word(MyCode);
    TempDescr.isLeaf   := 1;
    TempDescr.cRec     := L;
    TempDescr.Name     := tmpName;
    TempDescr.Level    := coBaseFin;
    TempDescr.SortName := String(Word(94), 5);
    Insert current TempDescr;
  }

  if (GetFirst FastFirstRow TempDescr where(('   91' == TempDescr.SortName (NoIndex))) = tsOk)
  {
    L := TempDescr.cRec;
    tmpName := TempDescr.Name;
    ClearBuffer(#TempDescr);
    TempDescr.Code     := Word(MyCode);
    TempDescr.isLeaf   := 1;
    TempDescr.cRec     := L;
    TempDescr.Name     := tmpName;
    TempDescr.Level    := coBaseFin;
    TempDescr.SortName := String(Word(93), 5);
    Insert current TempDescr;
  }

  if (GetFirst FastFirstRow TempDescr where(('   92' == TempDescr.SortName (NoIndex))) = tsOk)
  {
    L := TempDescr.cRec;
    tmpName := TempDescr.Name;
    ClearBuffer(#TempDescr);
    TempDescr.Code     := Word(MyCode);
    TempDescr.isLeaf   := 1;
    TempDescr.cRec     := L;
    TempDescr.Name     := tmpName;
    TempDescr.Level    := coBaseFin;
    TempDescr.SortName := String(Word(95), 5);
    Insert current TempDescr;
  }
}

procedure DelAddLeafTreeDoc;
{
  Delete TempDescr where(('   71'      == TempDescr.SortName (NoIndex) and
                          Word(MyCode) == TempDescr.Code));

  Delete TempDescr where(('   93'      == TempDescr.SortName (NoIndex) and
                          Word(MyCode) == TempDescr.Code));

  Delete TempDescr where(('   94'      == TempDescr.SortName (NoIndex) and
                          Word(MyCode) == TempDescr.Code));

  Delete TempDescr where(('   95'      == TempDescr.SortName (NoIndex) and
                          Word(MyCode) == TempDescr.Code));
}

procedure SetDefaultTreeDoc;
var
  GroupT, GroupT1, GroupT2, GroupT3, GroupT4, GroupT5, GroupT6: Comp;
{
  StartNewVisual(vtRotateVisual, vfTimer, 'Документы по умолчанию', 1);
  Delete TempDescr where((Word(MyCode) == TempDescr.Code));
  ClearMarker(MarkerTree);
  GroupT  := 0;
  GroupT  := SetNewGroup(GroupT, 'Документы', '11111');
  GroupT1 := SetNewGroup(GroupT, 'Сопроводительные документы', '22222');
  GroupT2 := SetNewGroup(GroupT, 'Финансовые документы', '33333');
  GroupT3 := SetNewGroup(GroupT, 'Векселя', '44444');
  GroupT4 := SetNewGroup(GroupT, 'Розничная торговля', '55555');
  GroupT5 := SetNewGroup(GroupT, 'ДО', '66666');
  GroupT6 := SetNewGroup(GroupT, 'Управление ремонтами', '77777');

  ReSetBounds(#KatDoc);

/*
    44 - Собственное валютное заявление на аккредитив
  1004 - Стороннее заявление на аккредитив
  1005 - Стороннее заявление об отказе от акцепта
  1011 - Стороннее платежное требование-поручение
  1030 - Сторонний реестр счетов
  1032 - Стороннее платежное требование
  1044 - Стороннее валютное заявление на аккредитив
*/
  _loop KatDoc
  {
    case KatDoc.TiDKGal of
      101..111, 201, 203..211, 251,700 : SetLeafTreeDoc(GroupT1, coKatSopr);
      //-------------------------------
      1..11, 17, 18, 21, 22, 27,
      30..36, 44, 70, 90..92,
      1004, 1005, 1011, 1030, 1032, 1044 : SetLeafTreeDoc(GroupT2, coBaseFin);
      //-------------------------------
      911 : SetLeafTreeDoc(GroupT4, coRzDoc);
      //-------------------------------
      81..89 : SetLeafTreeDoc (GroupT3, coAppVeks);
      //-------------------------------
      51 :  SetLeafTreeDoc (GroupT5, coBaseDoc);
      //-------------------------------
      553:  SetLeafTreeDoc (GroupT6, coObjRem);
    end;

    NextVisual;
  }

  SetBounds(#KatDoc);
  CurGroup := 0;
  TreeCloseAllOpenedNode(trTemp);
  if (GetFirst TempDescr = tsOk) {}

  SetMyTitle(trTemp);
  ReReadRecord(tnTempDescr);
  RescanPanel(tnTempDescr);
  StopVisual('', 0);
}

procedure SetHeadTree(ITemp : LongInt);
{
  if (GetMarkerTree(ITemp) = 0)
  {
    TreePushPos(ITemp);
    TreeGetFirst(ITemp);
    DeleteMarker(MarkerTree, Comp(TempDescr.SortName));
    TreePopPos(ITemp);
  }
  else
  {
    TreePushPos(ITemp);
    TreeGetFirst(ITemp);
    InsertMarker(MarkerTree, Comp(TempDescr.SortName));
    TreePopPos(ITemp);
  }
}

// Установка полей фильтра
procedure SetFilterFields;
{
  if (wFilter = 1)
    SetFieldState(#fDogovor, sfVisible);
  else
    ClearFieldState(#fDogovor, sfVisible);
}

// Удаление фильтра по договору
procedure DelDogovorFilter;
{
  MrkDogovorFilter := InitMarker('Dogovor_AktSv_Dog', 8, 100, 10);
  ClearMarker(MrkDogovorFilter);
  DoneMarker(MrkDogovorFilter, 'Dogovor_AktSv_Dog');

  Set NumFilterDogovor := 0;
  Set cFilterDogovor   := Comp(0);
}

Panel pnTreeHandle
  table TempDescr;

HandleEvent

cmInsert :
{
var l   : Word;
var CTG : Comp;

  Soob := MyMess;
  if (TempDescr.cGroup = 0)
  {
    Message('Нельзя добавить в корень!', OKButton);
    Stop;
  }
  else
  {
    if (TempDescr.IsLeaf = 1)
    {
      CTG := TempDescr.cGroup;
      l   := TempDescr.Level;
      TreePushPos(trTemp);
      TreeJumpToRecord(trTemp, TempDescr.cGroup);
      NameTG := TempDescr.Name;
      TreePopPos(trTemp);
    }
    else
    {
      CTG    := TempDescr.NRec;
      NameTG := TempDescr.Name;
      if (not TreeNodeIsOpen (trTemp))
      {
        TreeOpenNode(trTemp);
        RescanPanel(#TempDescr);
        TreePushPos(trTemp);
        TreeGetNextEx(trTemp);
        l := TempDescr.Level;
        TreePopPos(trTemp);
      }
      else
      {
        TreePushPos(trTemp);
        TreeGetNextEx(trTemp);
        l := TempDescr.Level;
        TreePopPos(trTemp);
      }
    }

    Flag := False;
    RunWindowModal(wndVyborDoc);

    StartNewVisual(vtRotateVisual, vfTimer, 'Добавляю', 1);
    if (not Flag)
      StopVisual('', 0);
    else
    {
      _loop KatDocTmp
      {
        if (not SearchMarker(MarkerDoc, KatDocTmp.NRec, IndexNoDoc))
          Continue;

        if (GetUge)
        {
          ClearBuffer(#TempDescr);

          TempDescr.CRecKat  := KatDocTmp.NRec;
          TempDescr.Name     := KatDocTmp.Name;
          TempDescr.isLeaf   := 1;
          TempDescr.cGroup   := CTG;
          TempDescr.Level    := l;
          TempDescr.SortName := String(KatDocTmp.TiDKGal, 5);

          Insert current TempDescr;
          TreeJumpToRecord(trTemp, TempDescr.NRec);
          RescanPanel(#TempDescr);
          NextVisual;
        }
      }

      StopVisual('', 0);
    }

    PopCondDoc;
    ClearMarker(MarkerDoc);
    if (Soob <> MyMess)
      Message(Soob + ',' + Chr(13) + 'т.к. уже были в группе!', OkButton);

    Stop;
  }
}

cmDeleteRecord :
{
var L  : Integer;
var Gr : Comp;

  if (TempDescr.IsLeaf = 0)
  {
    if (TempDescr.cGroup = 0)
    {
      if (Message('Удалить все документы?', YesNo + Confirmation) = cmYes)
      {
        if (GetLeafTreeAll(trTemp) = 0)
          Message('Нет документов!', OkButton);
        else
        {
          TreePushPos(trTemp);
          StartNewVisual(vtRotateVisual, vfTimer, 'Удаляю', 1);
          ClearMarker(MarkerTree);
          Delete TempDescr where((Word(MyCode) == TempDescr.Code and
                                  Word(1)      == TempDescr.IsLeaf));

          UpDate TempDescr where((Word(MyCode) == TempDescr.Code))
            Set TempDescr.cRec := 0;

          NextVisual;
          TreePopPos(trTemp);
          SetMyTitle(trTemp);
          RescanPanel(#TempDescr);
          StopVisual('', 0);
        }
      }
    }
    else
      if (Message('Удалить все документы из группы?', YesNo + Confirmation) = cmYes)
      {
        if (GetLeafTree(trTemp) = 0)
          Message('Нет документов в группе!', OkButton);
        else
        {
          TreePushPos(trTemp);
          StartNewVisual(vtRotateVisual, vfTimer, 'Удаляю', 1);
          L  := TreeLevel(trTemp);
          Gr := TempDescr.NRec;

          while TreeGetNextEx(trTemp) do
          {
            if (TreeLevel(trTemp) <= L)
              Break;

            if (SearchMarker(MarkerTree, Comp(TempDescr.SortName), IndexNoTree))
            {
              DeleteMarker(MarkerTree, Comp(TempDescr.SortName));
              NextVisual;
            }
          }

          if (GetMarkerTree(trTemp) = 0)
          {
            TreeGetFirst(trTemp);
            DeleteMarker(MarkerTree, Comp(TempDescr.SortName));
            NextVisual;
          }

          Delete TempDescr where((Word(MyCode) == TempDescr.Code and
                                  Gr           == TempDescr.cGroup));

          TreePopPos(trTemp);

          DeleteMarker(MarkerTree, Comp(TempDescr.SortName));
          UpDate current TempDescr Set TempDescr.cRec := 0;

          if (GetNaznTree(trTemp) = 0)
          {
            TreePushPos(trTemp);
            TreeGetFirst(trTemp);
            UpDate current TempDescr
              Set TempDescr.cRec := 0;
            NextVisual;
            TreePopPos(trTemp);
          }

          NextVisual;
          SetMyTitle(trTemp);
          RescanPanel(#TempDescr);
          StopVisual('', 0);
        }
      }
  } // if (TempDescr.IsLeaf = 0)
  else
    if (Message('Вы уверены?', YesNo + Confirmation) = cmYes)
    {
      if ((SearchMarker(MarkerTree, Comp(TempDescr.SortName), IndexNoTree)) or (TempDescr.cRec = 1))
      {
        TreePushPos(trTemp);
        TreeJumpToRecord(trTemp, TempDescr.cGroup);
        if (GetMarkerLeaf(trTemp) = 1)
          DeleteMarker(MarkerTree, Comp(TempDescr.SortName));

        if (GetNaznLeaf(trTemp) = 1)
          UpDate current TempDescr
            Set TempDescr.cRec := 0;

        TreePopPos(trTemp);

        DeleteMarker(MarkerTree, Comp(TempDescr.SortName));
        UpDate current TempDescr
          Set TempDescr.cRec := 0;

        if (GetMarkerTree(trTemp) = 0)
        {
          TreePushPos(trTemp);
          TreeGetFirst(trTemp);
          DeleteMarker(MarkerTree, Comp(TempDescr.SortName));
          TreePopPos(trTemp);
        }

        if (GetNaznTree(trTemp) = 0)
        {
          TreePushPos(trTemp);
          TreeGetFirst(trTemp);
          UpDate current TempDescr
            Set TempDescr.cRec := 0;

          TreePopPos(trTemp);
        }
      }

      Delete current TempDescr;
      TreeGetPrev(trTemp);
      SetMyTitle(trTemp);
      RescanPanel(tnTempDescr);
    } // if Message
}

cmCheckField :
{
  var wOld : Word;
  var M    : Boolean;
  var L    : Integer;

  case CurField of

    #wFilter : SetFilterFields;

    #TempDescr.cRec :
    {
      StartNewVisual(vtRotateVisual, vfTimer, 'Помечаю', 1);
      UpDate current TempDescr;
      M := (TempDescr.cRec = 1);
      if (TempDescr.IsLeaf = 1)
      {
        TreePushPos(trTemp);
        TreeJumpToRecord(trTemp, TempDescr.cGroup);
        if (GetNaznLeaf(trTemp) = 0)
          UpDate current TempDescr Set TempDescr.cRec := 0;
        else
          UpDate current TempDescr Set TempDescr.cRec := 1;

        TreePopPos(trTemp);
        NextVisual;
      }
      else
      {
        if (GetLeafTree(trTemp) = 0)
          UpDate current TempDescr Set TempDescr.cRec := 0;

        L := TreeLevel(trTemp);
        TreePushPos(trTemp);

        while TreeGetNextEx(trTemp) do
        {
          if (TreeLevel(trTemp) <= L)
            Break;

          if (M)
          {
            if (TempDescr.cRec = 0)
              UpDate current TempDescr Set TempDescr.cRec := 1;
          }
          else
            if (TempDescr.cRec = 1)
              UpDate current TempDescr Set TempDescr.cRec := 0;

          NextVisual;
        }

        TreePopPos(trTemp);
        SetPusto(trTemp);
      }

      if (GetNaznTree(trTemp) = 0)
      {
        TreePushPos(trTemp);
        TreeGetFirst(trTemp);
        UpDate current TempDescr Set TempDescr.cRec := 0;
        TreePopPos(trTemp);
      }
      else
      {
        TreePushPos(trTemp);
        TreeGetFirst(trTemp);
        UpDate current TempDescr Set TempDescr.cRec := 1;
        TreePopPos(trTemp);
      }

      NextVisual;
      RescanPanel(tnTempDescr);
      StopVisual('', 0);
    }

    #wDopParam :
    {
      wOld := Word(OldFieldValue); // Старое значение доп.параметров
      if (((wOld and 4) <> 0) and ((wDopParam and 4) = 0))
      {
        // Удаление фильтра по договору при смене режима соглашений на договора
        DelDogovorFilter;
      }
    }
  end;
}

cmUpdateRecord :
{
  Update current TempDescr;
}

cmTreeTop :
  CurGroup := 0;

cmTreeUp :
  CurGroup := TempDescr.cGroup;

cmTreeDown :
  CurGroup := TempDescr.NRec;

cmTreeNodeType :
{
  if (TempDescr.isLeaf = 1)
    TreeSetNodeType (trTemp, 2);
}

cmTreeNeedOwner :
  TreeJumpToRecord(trTemp, TempDescr.cGroup);

cmMarkUnMark :
{
var M : Boolean;
var L : Integer;

  StartNewVisual(vtRotateVisual, vfTimer, 'Помечаю', 1);
  InvertMarker(MarkerTree, Comp(TempDescr.SortName));

  if ((TempDescr.IsLeaf = 0) and (GetLeafTree(trTemp) = 0) and (TempDescr.cGroup <> 0))
    DeleteMarker(MarkerTree, Comp(TempDescr.SortName));

  M := SearchMarker(MarkerTree, Comp(TempDescr.SortName), IndexNoTree);
  if (TempDescr.IsLeaf = 1)
  {
    TreePushPos(trTemp);
    TreeJumpToRecord(trTemp, TempDescr.cGroup);
    if (GetMarkerLeaf(trTemp) = 0)
      DeleteMarker(MarkerTree, Comp(TempDescr.SortName));
    else
      InsertMarker(MarkerTree, Comp(TempDescr.SortName));

    NextVisual;
    TreePopPos(trTemp);
  }
  else
  {
    L := TreeLevel(trTemp);
    TreePushPos(trTemp);

    while TreeGetNextEx(trTemp) do
    {
      if (TreeLevel(trTemp) <= L)
        Break;

      if (M)
      {
        if (not SearchMarker(MarkerTree, Comp(TempDescr.SortName), IndexNoTree))
          InsertMarker(MarkerTree, Comp(TempDescr.SortName));
      }
      else
        if (SearchMarker(MarkerTree, Comp(TempDescr.SortName), IndexNoTree))
          DeleteMarker(MarkerTree, Comp(TempDescr.SortName));

      NextVisual;
    }

    TreePopPos(trTemp);
    SetPusto(trTemp);
  }

  SetHeadTree(trTemp);
  TreeGetNext(trTemp);
  SetMyTitle(trTemp);
  NextVisual;
  RescanPanel(tnTempDescr);
  StopVisual('', 0);
}

cmSelectAll :
{
  StartNewVisual(vtRotateVisual, vfTimer, 'Помечаю все', 1);
  TreePushPos(trTemp);

  if (TreeGetFirst(trTemp))
    do
    {
      if ( ( KatDocT <> '51' ) AND ( KatDocN <> 'ДО' ) )
        InsertMarker(MarkerTree, Comp(TempDescr.SortName));

      NextVisual;
    }
    while (TreeGetNextEx(trTemp));

  TreePopPos(trTemp);
  SetHeadTree(trTemp);
  SetMyTitle(trTemp);
  NextVisual;
  SetPusto(trTemp);
  RescanPanel(tnTempDescr);
  StopVisual('', 0);
}

cmUnSelectAll :
{
  ClearMarker(MarkerTree);
  SetMyTitle(trTemp);
  RescanPanel(#TempDescr);
}

cmHotKeys :
{
  PutHotCommand(RunMenu('StartTree_Rep'));
}

cmDocBas :
{
  SetDefaultTreeDoc;
}

end;
end;  // Panel pnTreeHandle


procedure SaveParamOtch;
{
  SaveMyDsk(BegDate,   'Rep_Pl_Dgv_d0');
  SaveMyDsk(EndDate,   'Rep_Pl_Dgv_d1');
  SaveMyDsk(cRec_Org,  'Rep_Pl_Dgv_cOrg');
  SaveMyDsk(wDirect,   'Rep_Pl_Dgv_wDirect');
  SaveMyDsk(wFilter,   'Rep_Pl_Dgv_wFilter');
  SaveMyDsk(wDopParam, 'Rep_Pl_Dgv_wDopParam');
  SaveMyDsk(BegDate_BuhSchet, 'Rep_Pl_Dgv_BegDate_BuhSchet');
  SaveMyDsk(EndDate_BuhSchet, 'Rep_Pl_Dgv_EndDate_BuhSchet');
  SaveMyDsk(sBoss,     'Rep_Pl_Dgv_sBoss');
  SaveMyDsk(sDoljBoss, 'Rep_Pl_Dgv_sDoljBoss');
}

procedure SetFilter_BuhSchet;
{
  if (BuhSchCount = 0)
    wBuhSchetFilter := 0;

  ClusterDisabledField(#wBuhSchetFilter, if (BuhSchCount = 0, 1, 0));

  if (wBuhSchetFilter = 0)
  {
    HideLabel4Field(#BegDate_BuhSchet);
    HideLabel4Field(#EndDate_BuhSchet);
  }
  else
  {
    ShowLabel4Field(#BegDate_BuhSchet);
    ShowLabel4Field(#EndDate_BuhSchet);
  }

  SetFieldVisible(#BegDate_BuhSchet, (wBuhSchetFilter = 1));
  SetFieldVisible(#EndDate_BuhSchet, (wBuhSchetFilter = 1));
}

procedure ReadParamOtch;
var
  DateChanged : Boolean;
{
  if (not ReadMyDsk(BegDate, 'Rep_Pl_Dgv_d0', DateChanged))
    BegDate := Sub_Months(Cur_Date, 1);

  if (not ReadMyDsk(EndDate, 'Rep_Pl_Dgv_d1', DateChanged))
    EndDate := Cur_Date;

  if (not ReadMyDsk(cRec_Org, 'Rep_Pl_Dgv_cOrg', DateChanged))
    cRec_Org := 0;

  if (not ReadMyDsk(wDirect, 'Rep_Pl_Dgv_wDirect', DateChanged))
    wDirect := 1 + 2;

  if (not ReadMyDsk(wFilter, 'Rep_Pl_Dgv_wFilter', DateChanged))
    wFilter := 0;

  if (not ReadMyDsk(wDopParam, 'Rep_Pl_Dgv_wDopParam', DateChanged))
    wDopParam := 0;

  if (not ReadMyDsk(sBoss, 'Rep_Pl_Dgv_sBoss', DateChanged))
    sBoss := sGetTune('Boss');

  if (not ReadMyDsk(sDoljBoss, 'Rep_Pl_Dgv_sDoljBoss', DateChanged))
    sDoljBoss := GetDolj(coGetTune('Boss'));

  SoprInRep := wGetTune('Rep.SoprKontr');

  if (boGetTune('Oper.AutoCalcBalance'))
    SoprInRep := wGetTune('Oper.SoprInBalans');

  ID := 'L_KontrBal\AktSvDO';

  if (not ReadMyDsk(RepName, ID, DateChanged))
    RepName := TranslatePath('%ClientStartPath%XLS\' + ID + '.xlt');

  if (Trim(RepName) = '')
    RepName := TranslatePath('%ClientStartPath%XLS\' + ID + '.xlt');

  // Определение плана счетов (сначала пользователя, а потом - общесистемный)
  myPlansNo := coGetTune('Fin.User.cPlansSch');
  if (myPlansNo = 0)
    myPlansNo := coGetTune('Konsolid.cPlansSch');

  BuhSchCount := 0;
  if (myPlansNo = 0)
  {
    sBuhSchet := NoBuhSchet + ', нет текущего плана счетов';
    ClearFieldOption(#sBuhSchet, ofSelectable);
  }
  else
  {
    sBuhSchet := NoBuhSchet;
    SetFieldOption(#sBuhSchet, ofSelectable);
  }

  if (not ReadMyDsk(BegDate_BuhSchet, 'Rep_Pl_Dgv_BegDate_BuhSchet', DateChanged))
    BegDate_BuhSchet:= Sub_Months(Cur_Date, 1);

  if (not ReadMyDsk(EndDate_BuhSchet, 'Rep_Pl_Dgv_EndDate_BuhSchet', DateChanged))
    EndDate_BuhSchet := Cur_Date;

  SetFilter_BuhSchet;

  SaveParamOtch;
}

function CheckParamOtch : Boolean;
var
  IsNastrOk, IsDateBuhSchetOk : Boolean;
{
  CheckParamOtch := False;

  IsNastrOk := True;
  if (boGetTune('Oper.AutoCalcBalance'))
    if (SoprInRep <> wGetTune('Oper.SoprInBalans'))
      IsNastrOk := False;

  IsDateBuhSchetOk := True;
  if ((BuhSchCount <> 0) and (wBuhSchetFilter = 1))
    IsDateBuhSchetOk := ((LongInt(BegDate_BuhSchet) <> 0) and (LongInt(EndDate_BuhSchet) <> 0) and
                         (BegDate_BuhSchet <= EndDate_BuhSchet));


  if ((BegDate > ZeroDate)      and
      (EndDate > ZeroDate)      and
      (BegDate <= EndDate)         and
      (GetMarkerTree(trTemp) <> 0) and
      (cRec_Org <> Comp(0))        and
      (wDirect > 0)                and
      (IsNastrOk)                  and
      (IsDateBuhSchetOk))
  {
    CheckParamOtch := True;
    Exit;
  }

  if ((GetMarkerTree(trTemp)) = 0)
  {
    Message('Выберите хотя бы один документ.', CancelButton + Warning);
    Exit;
  }

  if (BegDate = ZeroDate)
  {
    Message('Начальная дата периода формирования не может быть нулевой.', CancelButton + Warning);
    Exit;
  }

  if (EndDate = ZeroDate)
  {
    Message('Конечная дата периода формирования не может быть нулевой.', CancelButton + Warning);
    Exit;
  }

  if (BegDate > EndDate)
  {
    Message('Конечная дата периода формирования должна быть не меньше начальной.', CancelButton + Warning);
    Exit;
  }

  if (cRec_Org = 0)
  {
    Message('Выберите контрагента.', CancelButton + Warning);
    Exit;
  }

  if (wDirect = 0)
  {
    Message('Выберите направление.', CancelButton + Warning);
    Exit;
  }

  if (not IsNastrOk)
  {
    Message('Использование входящего сальдо невозможно, ' + ''#13 +
            'поскольку в настройке системы и в параметрах отчета ' + ''#13 +
            'установлены разные методы расчета баланса взаиморасчетов' + ''#13 +
            'и учета накладных в расчетах с контрагентами.', CancelButton + Warning);
    Exit;
  }

  if (not IsDateBuhSchetOk)
  {
    if (LongInt(BegDate_BuhSchet) = 0)
    {
      Message('Начальная дата периода оборотов не может быть нулевой.', CancelButton + Warning);
      Exit;
    }

    if (LongInt(EndDate_BuhSchet) = 0)
    {
      Message('Конечная дата периода оборотов не может быть нулевой.', CancelButton + Warning);
      Exit;
    }

    if (BegDate_BuhSchet > EndDate_BuhSchet)
    {
      Message('Конечная дата периода оборотов должна быть не меньше начальной.', CancelButton + Warning);
      Exit;
    }
  }
}

// Формирование строки с информацией о множественном выборе
function GetMultiString(NumElementsSch, NumElementsSub : Word) : String;
{
  GetMultiString := 'множественный выбор ( ' +
                    String(NumElementsSch) + ' / ' + String(NumElementsSub) + ' )';
}

// Возвращает наименование счета/субсчета
function GetNameSch(Sch : tSchet3; Sub : tSubSch) : String;
{
  // Всегда буду перечитывать субсчет,
  // так как возможна куча ситуаций когда GetBuhSchet вернет в поле sSubSchet непонятно что
  if (Sub <> cgDefSub)
    iPickBuh.FoundFirstSub(Sch, Sub);

  if (GetFirst FastFirstRow BuhSchet where ((Sch == BuhSchet.Schet and
                                             Sub == BuhSchet.SubSch)) = tsOk)
    GetNameSch := BuhSchet.Code + ' ' + BuhSchet.Name;
}


HandleEvent

cmInit :
{
  #if(#__TOOLVERSION__ >= 5004.007)
     {
       if (IsHtmlClient)
       {
         message('Excel-функционал не поддерживается для HTML клиента!');
         abort;
         exit;
       }
     }
  #end

  ReadParamOtch;

  oValFunc.InitVal;

  MrkStatusSopr := InitMarker('Rep_Pl_Dgv_StatusSopr', 8,10,10, False);
  if (GetMarkerCount(MrkStatusSopr) = 1)
    if (GetMarker(MrkStatusSopr, 0, cRecNotes)) {}

  Set cRecNotes := cRecNotes;
  SetTitle('Параметры отчета акт сверки в разрезе договоров');
  MarkerTree := InitMarker('TreeKatDoc_Dgv', 8, 100, 10);
  MarkerDoc  := InitMarker('VybKatDoc_Dgv', 8, 100, 10);

  if ( (GetFirst FastFirstRow TempDescr <> tsOK)
       OR                                                             // Для удаления 10,21,22 из сопроводит. документов
       (GetFirst FastFirstRow TempDescr where ((   word(MyCode)                 == TempDescr.Code
                                               AND  '60022'                     == TempDescr.SortName (NoIndex) )) = tsOK) )
    SetDefaultTreeDoc;

  // Фильтр по договорам
  MrkDogovorFilter := InitMarker('Dogovor_AktSv_Dog', 8, 100, 10);
  NumFilterDogovor := GetMarkerCount(MrkDogovorFilter);

  if (NumFilterDogovor = 1)
    GetMarker(MrkDogovorFilter, 0, cFilterDogovor);

  DoneMarker(MrkDogovorFilter, 'Dogovor_AktSv_Dog');

  SetFilterFields;
  SetMyTitle(trTemp);
  ReScanPanel(tnTempDescr);
  SetFormat(scRep_Pl_Dgv);
  SetFormat(trTemp);
  RereadRecord;
}

cmDone :
{
  DoneMarker(MarkerTree,    'TreeKatDoc_Dgv');
  DoneMarker(MarkerDoc,     'VybKatDoc_Dgv');
  DoneMarker(MrkStatusSopr, 'Rep_Pl_Dgv_StatusSopr');
  SaveParamOtch;
  oValFunc.DoneVal;
}

 // Настройка Excel-шаблонов
cmValue14 :
{
  RunInterface('xlRepSetup', 1, ID, RepName);
  ReadMyDsk(RepName, ID, True);
}

cmValue1 :
{
  if (CheckParamOtch)
  {
    if not pxlrepsetup.checkParam(0, ID, RepName)
      if (not pXLRepSetup.RunSetUpDialog(2, ID, RepName) )
        Exit;

    SaveParamOtch;
    AddLeafTreeDoc;
    if (SearchMarker(MarkerTree, Comp(90), IndexNoTree))
      InsertMarker(MarkerTree, Comp(94));

    if (SearchMarker(MarkerTree, Comp(91), IndexNoTree))
      InsertMarker(MarkerTree, Comp(93));

    if (SearchMarker(MarkerTree, Comp(92), IndexNoTree))
      InsertMarker(MarkerTree, Comp(95));

    if (SearchMarker(MarkerTree, Comp(70), IndexNoTree))
      InsertMarker(MarkerTree, Comp(71));

    MrkDogovorFilter := InitMarker('Dogovor_AktSv_Dog', 8, 100, 10); // Маркер с фильтром по договорам

    if (CalcTempTable)  // Расчеты и заполнение временных таблиц, по которым строится отчет
      CreateRasKontr_Excel(False);

    DoneMarker(MrkDogovorFilter, 'Dogovor_AktSv_Dog');

    if (SearchMarker(MarkerTree, Comp(90), IndexNoTree))
      DeleteMarker(MarkerTree, Comp(94));

    if (SearchMarker(MarkerTree, Comp(91), IndexNoTree))
      DeleteMarker(MarkerTree, Comp(93));

    if (SearchMarker(MarkerTree, Comp(92), IndexNoTree))
      DeleteMarker(MarkerTree, Comp(95));

    if (SearchMarker(MarkerTree, Comp(70), IndexNoTree))
      DeleteMarker(MarkerTree, Comp(71));

    DelAddLeafTreeDoc;

    CloseInterface(cmDone);
  }
}

cmPick :
{
var MultiSch, MultiSub, aPickDogApp : Word;
var sSchet      : tSchet3;
var sSubSchet   : tSubSch;
var sTmp        : String;
var cOldRec_Org : Comp;

  case CurField of

    #StatusSopr :
    {
      DoneMarker(MrkStatusSopr, 'MKatNotes');
      if (RunInterface('GetSomKatNotes', Word(100), Word(0), Word(0), True, cRecNotes) <> cmCancel)
      {
        MrkStatusSopr := InitMarker('MKatNotes',8,10,10, False);
        if (GetMarkerCount(MrkStatusSopr) = 1)
        {
          if (not (GetMarker(MrkStatusSopr, 0, cRecNotes)))
            cRecNotes := Comp(0)
        }
        else
          cRecNotes := Comp(0);

        DoneMarker(MrkStatusSopr, 'Rep_Pl_Dgv_StatusSopr');
      }

      MrkStatusSopr := InitMarker('Rep_Pl_Dgv_StatusSopr', 8,10,10, False);
      Set cRecNotes := cRecNotes;
    }

    #KatOrg.Name :
    {
      cOldRec_Org := cRec_Org;

      if (RunInterface('GetKatOr', cRec_Org, 0, False, 0, cBankOrg) <> cmCancel)
      {
        Set cRec_Org := cRec_Org;
        Set cBankOrg := cBankOrg;

        if (cOldRec_Org <> cRec_Org)
          DelDogovorFilter;  // Удаление фильтра по договору при изменении контрагента
      }
    }
    #fDogovor :
    {
      var aOwn : Comp;

      iMarkFuncs.MarkerToMarker('Dogovor_AktSv_Dog', 'MDogovor', True, True);
      // Фильтр по контрагенту
      SaveMyDsk(True,     'GetSDog_NeedFilterOnKontr2');
      SaveMyDsk(32,       'GetSDog_optView');
      SaveMyDsk(cRec_Org, 'GetSDog_pKontr2');
      SaveMyDsk(True,     'GetSDog_SaveSelect');

      // 0 - выбирать только договора, 1 - и соглашения тоже
      aPickDogApp := if ((wDopParam and 4) <> 0, Word(1), Word(0));

      SaveMyDsk(TRUE, 'GetSDog_NotNeedDisableDogs');

      if (RunInterface('GetSomeDogovor',
                        Word(0),            // pVidDog,    вид документа - если задан будет установлен фильтр
                        Word(0FFFFh),       // pStatus,    0-все документы, иначе маска РАЗРЕШЕННЫХ статусов
                        Word(0),            // pDirect,    0-все документы, 1-продажа, 2-закупка
                        aPickDogApp,        // pAttach,    0-выбирать соглашения нельзя, 1-можно, 2-только соглашения
                        True,               // OkOne,      TRUE - груповой выбор FALSE - только один
                        cFilterDogovor,     // prmDogovor, возвращаемый указатель на договор
                        False,              // OneLevel,   показывать записи одного уровня (True), False - нет
                        aOwn                // pOwn        ссылка на владельца уровня (действует если OneLevel = True) - ВОЗВРАЩАЕМЫЙ!
                      ) <> cmCancel)
      {
        Set NumFilterDogovor := iMarkFuncs.MarkerToMarker('MDogovor', 'Dogovor_AktSv_Dog', True, True);
        Set cFilterDogovor := cFilterDogovor;
      }
    }

    #sBuhSchet :
    {
      if (RunInterface('GetBuhSchet', cgiPickMult, myPlansNo, sSchet, sSubSchet) = cmDefault)
      {
        MultiSch := iPickBuh.GetCountItem(cgPick_Schet);
        MultiSub := iPickBuh.GetCountItem(cgPick_SubSch);
        BuhSchCount := MultiSch + MultiSub;

        if ((MultiSch = 1) and (MultiSub <= 1)) // Единичный выбор счета или субсчета
          Set sBuhSchet := GetNameSch(sSchet, sSubSchet);
        else
          if ((BuhSchCount) > 1)  // Множественный выбор
            Set sBuhSchet := GetMultiString(MultiSch, MultiSub);
          else
          {
            Set sBuhSchet := NoBuhSchet;  // Нет выбора
            BuhSchCount   := 0;
          }

        SetFilter_BuhSchet;
      }
    }
    #sBoss:
    {
      var cPers : comp;
      cPers := 0;

      if ( iGetKau.GetCodeKau(cgiPick, cgKau_Persons, cPers) > 0 )
        if (GetFirst Persons where (( cPers == Persons.nRec )) = tsOK)
          {
            set sBoss     := Persons.FIO;
            set sDoljBoss := GetDolj(cPers);
          }
    }
  end;

  ReReadRecord(#TempDescr);
}

cmDelOnProtect :
{
  case CurField of

    #StatusSopr :
    {
      Set cRecNotes := Comp(0);
      ClearMarker(MrkStatusSopr);
    }

    #KatOrg.Name : Abort;

    #sBuhSchet :
    {
      BuhSchCount   := 0;
      Set sBuhSchet := NoBuhSchet;
      SetFilter_BuhSchet;
    }

    #fDogovor : DelDogovorFilter;

  end

  ReReadRecord(#TempDescr);
}

cmCheckField :
{
  case CurField of
    #wBuhSchetFilter : SetFilter_BuhSchet;

    #BegDate :
    {
      if (BegDate > EndDate)
        Set EndDate := Date(Last_Day(BegDate), Month(BegDate), Year(BegDate));
    }

    #EndDate :
    {
      if (BegDate > EndDate)
        Set BegDate := Date(1, Month(EndDate), Year(EndDate));
    }

    #BegDate_BuhSchet :
    {
      if (BegDate_BuhSchet > EndDate_BuhSchet)
        Set EndDate_BuhSchet := Date(Last_Day(BegDate_BuhSchet), Month(BegDate_BuhSchet), Year(BegDate_BuhSchet));
    }

    #EndDate_BuhSchet :
    {
      if (BegDate_BuhSchet > EndDate_BuhSchet)
        Set BegDate_BuhSchet := Date(1, Month(EndDate_BuhSchet), Year(EndDate_BuhSchet));
    }
  end;
}

end;
end.