Выгрузка для налоговой по "Банковские счета" формата 3,0

Автор:Лександр
Дата:20.10.2004
Просмотров:3720
Скачиваний:2139
Оценка:, Оценок - 1
Сохранить в файле

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

Описание

!!!Обновлен!!!
Макрос выгрузки файлов по открытию/закрытию счетов для налоговой. Формат выгрузки 3.0, Файл-Тестер пропускает.
создается файл num.dat в котором Вы в самом начале просто напишите номер крайнего сообщения.
Буду рад выслушать предложения по доработке. ;)

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

 /* макрос выгрузки данных по открытию, закрытию счетов */

file acc ("account.dbt") key 0;  /*   */
file cl  ("client.dbt") key 0;   /*   */

file out () txt write;
file num1() txt;
file num2() txt write;

/******************************************************************************/
/* Заполните фамилию должностного лица и путь к шаблону бланка сообщения      */
/* Обратите внимание, что номер сообщения (НомСооб) выведен отдельной         */
/*так как я до сих пор по этому номеру не получил указания, а СвидГР, СвидНУ и*/ 
/*ОГРН берутся из пользовательских полей,так как у нас версия RSBank 5.00.73.3*/
/******************************************************************************/

var
    /* Адрес банка */
    _КодРегиона = "19",
    _Район      = "Хакасия",
    _Город      = "Абакан",
    _НасПункт   = "",
    _Улица      = "Советская",
    _Дом        = "69",
    _Корпус     = "",
    _Квартира   = "",
    /* Данные отпровителя */
    ФамилияДолжностногоЛица="Коченева,В,А",
    ДолжностьОтправителя   ="Начальник учетно операционного отдела",
    ИдПол       ="1901",
    ФИООтпр	="ФИО",
    ТелОтпр     ="4-95-05",
    /* Реквизиты банка */    
    ИННКО	="1901017690",
    КППКО	="190101001",
    БИК		="049514720",
    ОГРНКО	="1234567890123",
    НаимКО	="Комерческий банк Центрально Азиатский",
    АдрКО	="643,655017,19,,Абакан,,Советская,69,,",
    ФДЛБанка    ="Шулбаева",
    ТелБанка    ="4-95-05",
    НФайла      ="",
    НомерФайла  =1000000,
    ИмяФайла    ="",
    ТекстДата   ="дата",
    ФорматДаты  ="",
    ИДФ,
    ВремяВыхода ="",
    ПутьКВыходу ="\\\\green\\Work\\",
    СлужебПуть  ="\\\\green\\Work\\",
    НомСооб     ="", /* Вот с номером нужно разобраться*/
    НомС, НомЧ,
    ДатаОтчета  = Date(); /* На самом деле дата будет запрашиваться */

macro Замена(где,что,начто); /* замена однй подстроки другой в указаной строке */
/* Для того, чтобы в двтах менять проьел на 0 и - на .*/
var ФД1,ФД2,вых;
    вых=String(где);
       while(index(вых,что)>0)
         ФД1=SubStr(вых,1,index(вых,что)-1);
         ФД2=SubStr(вых,index(вых,что)+1);
         вых=ФД1+начто+ФД2;
       end;
   Return вых;
end;

macro Нулик(что,длинна) /*Добовляем впереди 0 до необходимой длинны */
var пер;
  пер=string(что);
  while(StrLen(String(пер))<длинна)
    пер="0"+пер;
  end;
  return пер;
end;

macro Шапка /* Вывод в файл шапки, которая для всех одинакова */
  ВремяВыхода=String(Time);
  ИДФ=Замена("ИдФайл:"+ИННКО+"**"+КППКО+SubStr(ТекстДата,7)+SubStr(ТекстДата,4,2)+SubStr(ТекстДата,1,2)+SubStr(ВремяВыхода,1,2)+SubStr(ВремяВыхода,4,2)+SubStr(ВремяВыхода,7,2)+SubStr(НФайла,2)," ","0");
  insert(out, ИДФ);
  insert(out, "ТипИнф:СООБЩЕНИЕБАНКА");
  insert(out, "ИдПол:"+ИдПол);
  insert(out, "ТелОтпр:"+ТелОтпр);
  insert(out, "ДолжнОтпр:"+ДолжностьОтправителя);
  insert(out, "ФИООтпр:"+ФамилияДолжностногоЛица); 
  insert(out, "КолДок:1");
  insert(out, "ВерсФорм:3.00");
  insert(out, "###");
  insert(out, "ИННКО:"+ИННКО);
  insert(out, "КППКО:"+КППКО);
  insert(out, "БИК:"+БИК);
  insert(out, "ОГРНКО:"+ОГРНКО);
  insert(out, "НаимКО:"+НаимКО);
  insert(out, "АдрКО:"+АдрКО);
  insert(out, "ФДЛБанка:"+ФДЛБанка);
  insert(out, "ТелБанка:"+ТелБанка);
  insert(out, "ДатаПодп:"+Замена(Замена(ДатаОтчета,"-",".")," ","0"));
  insert(out, "###");
  insert(out, "@@@");
end;

macro AccType(accs) /* Определение типа счета */
/* Выводятся только расчетные счета посему я просто задал перечень признаков расчетных счетов*/
var acc_s;
   acc_s=string(accs);
  if((SubStr(acc_s,1,3)=="401")or(SubStr(acc_s,1,3)=="402")or(SubStr(acc_s,1,3)=="403")or(SubStr(acc_s,1,3)=="404")or(SubStr(acc_s,1,3)=="405")or(SubStr(acc_s,1,3)=="406")or(SubStr(acc_s,1,3)=="407")or(SubStr(acc_s,1,3)=="408"))
    return -1
  else
    return 0
  end;
/* возвращает 0 если не расчетный и -1 если счет расчетный */
end;

 
/********** Пробуем выбрать чсета открытые сегодня **********/
/*
Для начала выборку сделаем простейшим методом перебора попорядку,
при нахождении необходимой даты просто выведем сей документ
*/
  rewind (acc);                                          /* переходим на начало таблици */
  while(next(acc))                                       /* и идем по всей базе счетов */
    if (((acc.Open_Date==ДатаОтчета)or(acc.Close_Date==ДатаОтчета))and(AccType(acc.account)==-1))/* проверяем на совподение дат */
       /* найден счет открытый в отчетный день */
       ТекстДата=Замена(String(Date),"-",".");
       НомерФайла=НомерФайла+1;
       НФайла=String(НомерФайла);
       ФорматДаты=SubStr(ТекстДата,7)+SubStr(ТекстДата,4,2)+SubStr(ТекстДата,1,2)+SubStr(НФайла,2);
       ИмяФайла=Замена("SBC"+ИННКО+"__"+КППКО+ФорматДаты," ","0");
       open(out,ПутьКВыходу+ИмяФайла);
       Шапка();
       /* Вставляем данные о клиенте */
       Cl.Client=acc.client;
       If(GetEQ(Cl))
         /* Нашли такова*/
         insert(out, "ИдДок:"+ИННКО+"**"+КППКО+SubStr(ТекстДата,7)+"00000001");
	 insert(out, "ИНННП:"+String(Cl.inn));
	 if((string(cl.kpp)!="")and(string(cl.kpp)!="0"))
	   insert(out, "КППНП:"+String(Cl.kpp));
         end;
         if((String(cl.UserField2)=="")or(String(cl.UserField2)=="0"))
           insert(out, "ОГРН:0000000000000");
         else
  	   insert(out, "ОГРН:"+cl.UserField2);
         end;
	 insert(out, "КодНОНП:"+SubStr(String(cl.inn),1,4));
	 insert(out, "СвидГР:"+cl.UserField3);
	 insert(out, "СвидНУ:"+cl.UserField4);
	 insert(out, "###");
         /* Формируем номер сообщения, читая из файла номер */
           open(num1,СлужебПуть+"num.dat");
           while (next(num1))
  	      НомС=num1.str;
           end;
         НомСооб=ИдПол+SubStr(String(ДатаОтчета),9);
         /* перезаписываем номер сообщения */
	  НомЧ=Int(НомС)+1;
          НомС=String(НомЧ);
          close(num1);
          open(num2,СлужебПуть+"num.dat");
  	  insert(num2,НомС);
          close(num2);
          НомСооб=НомСооб+","+Нулик(НомС,6);
	 insert(out, "НомСооб:"+НомСооб);
	 insert(out, "ДатаСооб:"+Замена(Замена(ДатаОтчета,"-",".")," ","0"));
	 insert(out, "НомСч:"+acc.account);
	 insert(out, "ДатаОткрСч:"+Замена(Замена(acc.Open_Date,"-",".")," ","0"));
	 if(Trim(acc.kind_account)=="А")
	   insert(out, "КодВСч:0"/*+acc.kind_account*/);
         elif(Trim(acc.kind_account)=="П")
	   insert(out, "КодВСч:1"/*+acc.kind_account*/);
         end;
         if(string(acc.Close_Date)!="")
	   insert(out, "ДатаЗакрСч:"+Замена(Замена(acc.Close_Date,"-",".")," ","0"));
	 end;
         insert(out, "КодСостСч:1");
	 insert(out, "НомерДог:"+acc.symbol);
	 insert(out, "ДатаДог:"+Замена(Замена(acc.Open_Date,"-",".")," ","0"));
	 insert(out, "###");
	 insert(out, "@@@");
	 insert(out, "===");
       close(out);
       else
         /* Ненашли такова*/
       end;
    end;
  end;