Вспомогательные отчёты в Excel для 230-ФЗ

Автор:НоскиПоэта
Дата:25.10.2021
Просмотров:89
Скачиваний:20
Оценка: - , Оценок - 0
Скачать (zip-файл; Размер - 17340)

Обсудить в форуме

Описание

В архиве 2 вспомогательных отчета по НКО, выводимых в Excel для удобной последующей работы с ними. В тексте примера один из них: отчёт с быстрым выводом в Excel через TFE_lite с выделением шрифтом и цветом. Отчёт по документам НКО за период. Используются два временных файла - описания их в def файле в архиве.

В архиве ещё отчёт со списком НКО по счетам и TFE_lite для быстрого вывода в Excel.

Текст примера

 // список документов проходящих по счетам НКО за заданный период
// Используется быстрый вывод в Excel = TFE_lite
// и 2 временных файла, описанных в приложенном 230FZ.def
// Номер документа и сумма сделаны увеличенным и жирным шрифтом 
// Если на клиенте-НКО стоит отметка ДА в 953 категории, а статус выгрузки в модуль ФинМон пустой - ячейка статус подкрашивается жёлтым цветом

import bankinter, rsexts, rcw, clnInter, globals;
import "TFE_lite.mac"; // здесь должен быть ваш путь к папке, где лежит TFE_lite.mac
var  AcMask="40703*,40603*,40503*";
var ac=TBFILE("account.dbt","R",0);
var cl=TBFILE("client.dbt","R",0);
var xx;
var dd=TBFILE("doc230fz.dbt","EAC+",0,GetWorkFileName("doc230fz"),"230FZ.def"); // пропишите ваш путь в def-файлу
var dac=TBFILE("ac230fz.dbt","EAC+",0,GetWorkFileName("ac230fz"),"230FZ.def");  // -//-
var opc=TBFILE("opcontr.dbt","R",2);
var dat1 = {curdate}-1;
var dat2 = {curdate};
var aaStat=TARRAY; aaStat[0]="";aaStat[1]="на контроль";aaStat[2]="проконтр.";aaStat[3]="завизир.";aaStat[4]="отложен";aaStat[5]="выгружен";aaStat[6]="отвергнут";
var WhatNKOOut=0;
macro GetClCtg(_ctgId, _clId) // получение категории для Client
  var aa=TARRAY();
  aa.Size = 0;
  If (GetCtgVal(3,_ctgID,GetClientID(_clID),aa))
    if (aa.Size > 0)
      return aa[aa.size-1];
    end;
  end;
  return "";
end;
macro GetAccCtg(_ctgId, _acc) // получение категории для account
  var aa=TARRAY(), _cur = 0;
  aa.Size = 0;
  _cur =  Int(Substr(_acc,6,3));
  if (_cur == 810) _cur = 0; end;
  If (GetCtgVal(5,_ctgID,GetAccountID(1, _cur, _acc),aa))
    if (aa.Size > 0)
      return aa[aa.size-1];
    end;
  end;
  return "";
end;
macro Filldac(_dat, _acc, _opbik, _opacc, _opinn, _opnam, _debkre, d0) //заполнение одной записи временного файла
  dac.clear;
  dac.keynum = 1;
  dac.rec.account = _acc;
  if ((StrLen(_opInn) - index(_opInn,"/")) < 3)
    _opInn = trim(Substr(_opInn,1,Index(_opInn,"/")-1));
  end;
  if (not dac.Geteq)
    ac.clear;
    ac.rec.account = _acc;
    ac.GetEq;
    dac.keynum = 0;
    dac.clear;
    dac.rec.client = ac.rec.client;
    if (not dac.GetEq)
      dac.clear;
      dac.rec.client = ac.rec.client;
      dac.rec.code = GetClientCodeById(dac.rec.client);
      dac.rec.account = ac.rec.account;
      dac.rec.c953=GetClCtg(953,ac.rec.client);
      dac.insert;
    else
      dac.rec.account = ac.rec.account;
      dac.insert;
    end;
  end;
  if (((dac.rec.c953 == "ДА") and (mod(WhatNKOout,2) == 0)) or ((dac.rec.c953 != "ДА") and (WhatNKOout > 0)))
    opc.rewind;
    opc.clear;
    dd.clear;
    dd.rec.date_carry = _dat;
    dd.rec.client = dac.rec.client;
    dd.rec.code = dac.rec.code;
    dd.rec.account = _acc;
    dd.rec.opbik = _opbik;
    _opAcc = trim(StrSubst(_opAcc ,"()",""));
    dd.rec.opacc = _opacc;
    dd.rec.opinn = _opinn;
    dd.rec.opnam = _opnam;
    dd.rec.debkre = _debkre;
    dd.rec.sum = d0.rec.sum;
    dd.rec.ground = d0.rec.ground;
    dd.rec.oper = d0.rec.oper;
    dd.rec.numb_document = d0.rec.numb_document;
    opc.rec.iApplicationKind = dd.rec.iApplicationKind = d0.rec.iApplicationKind;
    opc.rec.ApplicationKey = dd.rec.ApplicationKey = d0.rec.ApplicationKey;
    dd.rec.Number_Pack = d0.rec.Number_Pack;
    if (opc.GetEq)
      dd.rec.status = opc.rec.status;
    end;
    dd.insert;
  end;
end;
macro Fill_DD // заполнение временного файла
  var _opAcc="",d0=TBFILE("arhdoc.dbt","R",0);
  InitProgress(dat2 - Dat1,"","Заполняю временный файл");
  if (Dat1 < {curdate})
    d0.rewind;
    d0.clear;
    d0.rec.date_carry = dat1;
    d0.getlt;
    while ((d0.next) and (d0.rec.date_carry <= Dat2)) 
      if (d0.rec.result_carry != 23) 
        UseProgress(d0.rec.date_carry - Dat1);
        if (compareStrWithMasks(AcMask, d0.rec.real_receiver) == 0)
          _opAcc = d0.rec.account_payer;
          if (d0.rec.real_payer != d0.rec.account_payer)
            _opAcc = String(_opAcc, " (",d0.rec.real_payer,")");
          end;
          FillDac(d0.rec.date_carry, d0.rec.real_receiver,d0.rec.MFO_payer,_opAcc,trim(d0.rec.OKPO_payer + " /" + d0.rec.KPP_PAYER),d0.rec.payer,1, d0);
        end;
        if (compareStrWithMasks(AcMask, d0.rec.real_payer) == 0)
          _opAcc = d0.rec.account_receiver;
          if (d0.rec.real_receiver != d0.rec.account_receiver)
            _opAcc = String(_opAcc, " (",d0.rec.real_receiver,")");
          end;
          FillDac(d0.rec.date_carry, d0.rec.real_payer,d0.rec.MFO_receiver,_opAcc,trim(d0.rec.OKPO_receiver + " /" + d0.rec.KPP_Receiver),d0.rec.receiver,2,d0);
        end;
      end;
    end;
  end;
  if (Dat2 >= {curdate})
    UseProgress({curdate} - Dat1);
    d0=TBFILE("document.dbt","R",0);
    d0.rewind;
    while (d0.next)
      if (d0.rec.result_carry != 23) 
        if (compareStrWithMasks(AcMask, d0.rec.real_receiver) == 0)
          _opAcc = d0.rec.account_payer;
          if (d0.rec.real_payer != d0.rec.account_payer)
            _opAcc = String(_opAcc, " (",d0.rec.real_payer,")");
          end;
          FillDac({curdate},d0.rec.real_receiver,d0.rec.MFO_payer,_opAcc,Trim(d0.rec.OKPO_payer + " /" + d0.rec.KPP_PAYER),d0.rec.payer,1,d0);
        end;
        if (compareStrWithMasks(AcMask, d0.rec.real_payer) == 0)
          _opAcc = d0.rec.account_receiver;
          if (d0.rec.real_receiver != d0.rec.account_receiver)
            _opAcc = String(_opAcc, " (",d0.rec.real_receiver,")");
          end;
          FillDac({curdate},d0.rec.real_payer,d0.rec.MFO_receiver,_opAcc,trim(d0.rec.OKPO_receiver + " /" + d0.rec.KPP_receiver),d0.rec.receiver,2,d0);
        end;
      end;
    end;
  end;
  RemProgress;
end;
macro wrk() // раб.макрос
  var _ii=0,_clId=0, _clCode="", _clNam = "", _cAcc="",_acc, _deb="",_kre="", _c953="",aa=TARRAY(), _ret, _status="",_INN="";
  if (mod(int(dat1),7) == 0) dat1 = dat1 - 2; end;
  if (mod(int(dat1),7) == 6) dat1 = dat1 - 1; end;
  if (not GetDate(Dat1,"Дата начала периода"))
    exit(1);
  end;
  if (not GetDate(Dat2,"Дата конца периода"))
    exit(1);
  end;
  GetRegistryValue("MVODB\\ПРОЦЕДУРЫ\\БАЛАНСОВЫЕ СЧЕТА\\НЕКОММЕР_ОРГАНИЗ", V_STRING, AcMask, _ret);
  aa.Size = 0;
  aa[0]="Только с категорией \"ДА\"";
  aa[1]="Только с пустой категорией";
  aa[2]="Все НКО";
  WhatNKOout = menu(aa,"","Операции каких НКО выводим?");
  if (WhatNKOout < 0) exit(1); end;

  Fill_DD();
  xx = TFE("230FZ_"+StrSubst(String(Dat1:f,"--",Dat2:f),".","-"));
  xx.ColSizes("F,50,40,230,120,60,60,60,40,60,125,70,250,80,80,250");  //Установка размеров столбцов и автофильтра (F)

  xx.AddRow("H^Клиент","ML3^","H^п/п","ML^","H^Статус","H^Пачка","H^Получатель/плательщик","ML3^","H^Сумма","ML^","H^Назначение");    // 2 строки заголовков с объединениями ячеек
  xx.AddRow("H^Код","H^Категория 9003-9004","H^Наименование /ИНН","H^Счёт","H^Дата","H^№","MU^","MU^","H^БИК","H^Счёт","H^ИНН/КПП","H^Наименование","H^Дебет","H^Кредит","MU^");
  dd.rewind;
  dd.clear;
  _clID = 0; _cAcc = _acc = _c953= _clNam = _clCOde = ""; 
  dac.keynum = 0;
  InitProgress(dd.nrecords,"","Заполняю Excel из временного файла");
  _ii = 0;
  while (dd.next) 
    _ii = _ii + 1;
    UseProgress(_ii);
    if (dd.rec.client != _clId)
      _clId = dd.rec.client;
      _inn = GetCLientInn(_clId);
      _acc = dd.rec.account;
      _clCode = String("SCU#^" ,dd.rec.code);
      dac.rewind;
      dac.clear;
      _c953 = "SCU#^";
      dac.rec.client = dd.rec.client;
      if (dac.getEq)
        _c953 = String("SCU#^",dac.rec.c953);
      end;
      _cAcc = String("WCU#^" ,dd.rec.account, " дог.№",GetAccCtg(508,dd.rec.account)," от ", GetAccCtg(507,dd.rec.account):f);
      GetClientFullName(_clId, _clNam); 
      _clNam = String("WU#^",_clNam," /ИНН=",_inn);
    end;
    if (dd.rec.account != _acc)
      _cAcc = String("SCU#^",dd.rec.account);
      _acc = dd.rec.account;
    end;
    _deb = _kre = "N2#^";
    if (dd.rec.debkre == 2)
       if (dd.rec.sum < $1000000)
         _deb = String("BШ14N2#^",dd.rec.sum);
       else
         _deb = String("BN2#^",dd.rec.sum);
       end;
    elif (dd.rec.debkre == 1)
       if (dd.rec.sum < $1000000)
          _kre = String("Ш14BN2#^",dd.rec.sum);
       else
          _kre = String("BN2#^",dd.rec.sum);
       end;
    end;
    _status =String("SC#^",aaStat[dd.rec.status]);
    if ((_c953 == "ДА") and (dd.rec.status == 0))
      _status = "SCY#^";
    end;
    xx.AddRow(  _clCode, _c953, _clnam, _cAcc,
                String("DC#^",dd.rec.date_carry:f),
                String("Ш12BSC#^",dd.rec.Numb_document),
                _status,
                String("IC#^",dd.rec.Number_Pack),
                String("SC#^",dd.rec.opbik),
                String("WC#^",dd.rec.opacc),
                String("WC#^",dd.rec.opinn),
                String("W#^",dd.rec.opnam),
                _deb, _kre,
                String("W#^",dd.rec.Ground));
    _clNam = _c953 = _clCode = _cAcc = "MU^";
  end;
  RemProgress;
  xx.Go("230FZ_"+StrSubst(String(Dat1:f,"--",Dat2:f),".","-"));
end;
  wrk;
  exit(1);