Выгрузка для налоговой по "Банковские счета" формата 3,0
Сохранить в файлеОбсудить в форуме
Описание
!!!Обновлен!!!
Макрос выгрузки файлов по открытию/закрытию счетов для налоговой. Формат выгрузки 3.0, Файл-Тестер пропускает.
создается файл num.dat в котором Вы в самом начале просто напишите номер крайнего сообщения.
Буду рад выслушать предложения по доработке. ;)
Макрос выгрузки файлов по открытию/закрытию счетов для налоговой. Формат выгрузки 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;