Импорт платежных поручений из файла формата 1С

ПНР и сопровождение

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Sheinina
Местный житель
Сообщения: 366
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Импорт платежных поручений из файла формата 1С

Сообщение Sheinina »

Собственно сабж :)
Захотело наше руководство настроить импорт платежек из системы "Банк-клиент" (ага, 26 штук в день максимум). Банков - несколько, у каждого свой формат. Но все поддерживают формат 1С: текстовые файлы строгой структуры, в которых первая строчка

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

1CClientBankExchange
потому решили настроить один универсальный импорт.
Но как это сделать - всю голову сломали :cry:
Помогите, кто чем может!!!
кусочек файла:

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

1CClientBankExchange
ВерсияФормата=1,01
Кодировка=Windows
Получатель=1Cv77
ДатаСоздания=29.10.2012
ВремяСоздания=15:53:47
ДатаНачала=19.10.2012
ДатаКонца=29.10.2012
РасчСчет=XXXXXXXXXXXXXXXXXXXX
СекцияРасчСчет
ДатаНачала=19.10.2012
ДатаКонца=26.10.2012
РасчСчет=XXXXXXXXXXXXXXXXXXXX
НачальныйОстаток=NNNNNN.NN
ВсегоПоступило=NNNNN
ВсегоСписано=0
КонечныйОстаток=NNNNNN.NN
КонецРасчСчет
СекцияДокумент=Платежное поручение
Дата=19.10.2012
Номер=355138
Сумма=nnn
ПлательщикСчет=xxxxxxxxxxxxxxxxxxxx
ПолучательСчет=xxxxxxxxxxxxxxxxxxxx
ПлательщикИНН=yyyyyyyyyy
Плательщик1=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
ПлательщикБИК=bbbbbbbbb
ПлательщикБанк1=zzzzzzzzzzzzzzzzzzzzzzzzzzzz
ПолучательИНН=yyyyyyyyyy
Получатель1=nnnnnnnnnnnnnnnnnnnnn
ПолучательБИК=bbbbbbbbb
ПолучательБанк1=zzzzzzzzzzzzzzzzzzzzzzzzzzzzz
НазначениеПлатежа=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
СтатусСоставителя=
ПлательщикКПП=
ПолучательКПП=
ПоказательКБК=
ОКАТО=
ПоказательОснования=
ПоказательПериода=
ПоказательНомера=
ПоказательДаты=
ПоказательТипа=
ВидОплаты=1
ДатаПоступило=19.10.2012
КонецДокумента
КонецФайла
Если мы правильно поняли, то надо использовать текстовый формат с формой...
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Импорт платежных поручений из файла формата 1С

Сообщение edward_K »

Я не парился и сделал предобработку. Сложность тут в чем - кол-во строк на документ может быть разное - а галка на это не заточена.
Чуь спасает наличие разрыва мжеду документами. Поэтому вырезал шапку и нормировал кол-во строк. Остальное решаемо - в опыте кое что выложил - посмотрите.
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: Импорт платежных поручений из файла формата 1С

Сообщение Алексей »

Я бы, всё же придерживался ДБФ формата... с банк-клиентами давно не работал, но лет 9 назад... настраивал довольно много и почте все клиенты могли выгружать в ДБФ.
Сделаете несколько настроек в клиент-банке модуль Галактики под каждый банк и будут юзеры жамкать нужную кнопу "импорт" для каждого банка свою настройку выбирать.
maikl
Местный житель
Сообщения: 1503
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Тверь

Re: Импорт платежных поручений из файла формата 1С

Сообщение maikl »

Я тоже обрабатываю выписку 1С на Fox, получаю dbf и загружаю его в Галактику.
Обидно и непонятно почему нет у Галактики простого функционала для обработки выписок из 1С.
pk
Постоянный обитатель
Сообщения: 135
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва Связьтранснефть

Re: Импорт платежных поручений из файла формата 1С

Сообщение pk »

>потому решили настроить один универсальный импорт.
>Но как это сделать - всю голову сломали
>Помогите, кто чем может!!!
Сделал один наш умница-программист. Смените типы документов для собственной БД (td:=word(10199) и т.п.).
В принципе, и импорт ПП (модуль "Обмен бизнес-документами") из 1С формата был настроен, хотя и с какими-то тонкостями (не пользуемся этим форматом, потому не вспомню, какие).

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

VipInterface ImportSB Licensed (Free);
Interface ImportSB DoAccept;
var dd,nomer,summa,platsch1,platsch2,polsch1,polsch2,platinn,platname1,platbik,platbank,polinn,polname,polbik,polbank,nazn:string;
var statsost,platkpp,polkpp,kbk_,okato,pokosn,pokper,poknom,pokdat,poktip,vidopl,dd2,ochered:string;
var platrec,platbankrec,polrec,polbankrec:comp;
var s1,s2,s3,vid_:string;
var dat1,dat2,dat3:date;
var d1,d2,d3:double;
var i,j,k:integer;
var SourcePath,F_NAME:string;
var td:word;
var ifnext,ifend:boolean;
var str: array [1..37] of string;
Create view
as select * from plpor;
Create View Org
var inn: string
as select * from katorg
where ((inn==katorg.unn));
Create view bank
var bik,rs:string
as select * from katbank
where ((bik==katbank.mfo1 and rs==katbank.schet1));

Form Print_import( 'PrintImp.out' );

file hndFile;
Screen switch
        Buttons
          cmImport;



  <<
    <. Импорт   .>


  >>
end;

HandleEvent
          cmInit:
          {

          }
          cmImport:
          {
            nomer      :='';
            dd         :='';
            summa      :='';
            platsch1   :='';
            platinn    :='';
            platname1  :='';
            platbank   :='';
            platbik    :='';
            platsch2   :='';
            polsch1    :='';
            polinn     :='';
            polname    :='';
            polbank    :='';
            polbik     :='';
            polsch2    :='';
            vidopl     :='';
            ochered    :='';
            nazn       :='';
            statsost   :='';
            platkpp    :='';
            polkpp     :='';
            kbk_       :='';
            okato      :='';
            pokosn     :='';
            pokper     :='';
            poknom     :='';
            pokdat     :='';
            poktip     :='';
            td         :=0;
            ifnext     :=true;
            ifend      :=false;
            F_NAME := GetFileName('*.txt', 'Выберите файл');
            if hndFile.OpenFile(F_NAME, stOpenRead) then
            begin
                  message('Файл открыли');
                  while not hndFile.eof do
                  begin
                        while (s1<>OEM2ANSI('КонецРасчСчет'))and (ifnext=true) do hndFile.Readln(s1);
                        ifnext:=false;
                        j:=1;
                        while j<=37 do
                        begin
                             hndFile.Readln(s1);
                             if s1=oem2ansi('КонецФайла') then begin ifend:=true;break;end;
                             str[j]:=Ansi2oem(s1);
                             j:=j+1;
                        end;
                        j:=1;
                        while j<=37 do
                        begin
                              i:=pos('=',str[j]);
                              s2:=SubStr(str[j],1,i-1);
                              case s2 of
                                  'Номер'                 :nomer      :=Trim(Substr(str[j],i+1,255));
                                  'Дата'                  :dd         :=Trim(Substr(str[j],i+1,255));
                                  'Сумма'                 :summa      :=Trim(Substr(str[j],i+1,255));
                                  'ПлательщикСчет'        :platsch1   :=Trim(Substr(str[j],i+1,255));
                                  'ПлательщикИНН'         :platinn    :=Trim(Substr(str[j],i+1,255));
                                  'Плательщик1'           :platname1  :=Trim(Substr(str[j],i+1,255));
                                  'ПлательщикБанк1'       :platbank   :=Trim(Substr(str[j],i+1,255));
                                  'ПлательщикБИК'         :platbik    :=Trim(Substr(str[j],i+1,255));
                                  'ПлательщикКорсчет'     :platsch2   :=Trim(Substr(str[j],i+1,255));
                                  'ПолучательСчет'        :polsch1    :=Trim(Substr(str[j],i+1,255));
                                  'ПолучательИНН'         :polinn     :=Trim(Substr(str[j],i+1,255));
                                  'Получатель1'           :polname    :=Trim(Substr(str[j],i+1,255));
                                  'ПолучательБанк1'       :polbank    :=Trim(Substr(str[j],i+1,255));
                                  'ПолучательБИК'         :polbik     :=Trim(Substr(str[j],i+1,255));
                                  'ПолучательКорсчет'     :polsch2    :=Trim(Substr(str[j],i+1,255));
                                  'ВидПлатежа'            :vidopl     :=Trim(Substr(str[j],i+1,255));
                                  'Очередность'           :ochered    :=Trim(Substr(str[j],i+1,255));
                                  'НазначениеПлатежа'     :nazn       :=Trim(Substr(str[j],i+1,255));
                                  'СтатусСоставителя'     :statsost   :=Trim(Substr(str[j],i+1,255));
                                  'ПлательщикКПП'         :platkpp    :=Trim(Substr(str[j],i+1,255));
                                  'ПолучательКПП'         :polkpp     :=Trim(Substr(str[j],i+1,255));
                                  'ПоказательКБК'         :kbk_       :=Trim(Substr(str[j],i+1,255));
                                  'ОКАТО'                 :okato      :=Trim(Substr(str[j],i+1,255));
                                  'ПоказательОснования'   :pokosn     :=Trim(Substr(str[j],i+1,255));
                                  'ПоказательПериода'     :pokper     :=Trim(Substr(str[j],i+1,255));
                                  'ПоказательНомера'      :poknom     :=Trim(Substr(str[j],i+1,255));
                                  'ПоказательДаты'        :pokdat     :=Trim(Substr(str[j],i+1,255));
                                  'ПоказательТипа'        :poktip     :=Trim(Substr(str[j],i+1,255));
                                  'СекцияДокумент'        :vid_       :=Trim(Substr(str[j],i+1,255));
                              end;
                              j:=j+1;
                        end;
                        if vid_='Платежное требование' then td:=word(10199);    //ВТБ  П/Т
                        if (vid_='Платежное поручение')and (platinn<>'7723011906')  then td:=(10188);     //ВТБ П/П
                        if (vid_='Платежное поручение')and (platinn='7723011906')  then td:=(0);//Собственные не закачиваем
                        set org.inn:=platinn;
                        if org.getfirst=TsOk then platrec:=org.katorg.nrec else platrec:=0;
                        set org.inn:=polinn;
                        if org.getfirst=TsOk then polrec:=org.katorg.nrec else polrec:=0;
                        set bank.bik:=platbik;
                        set bank.rs:=platsch1;
                        if bank.getfirst=TsOk then platbankrec:=bank.katbank.nrec else platbankrec:=0;
                        set bank.bik:=polbik;
                        set bank.rs:=polsch1;
                        if bank.getfirst=TsOk then polbankrec:=bank.katbank.nrec else polbankrec:=0;
                        if (polrec<>0) and (polbankrec<>0) and (platrec<>0) and (platbankrec<>0) and (td<>0) and (ifend<>true) then
                        begin
                              insert plpor set
                              plpor.tidk=td,
                              plpor.TIDKGAL=word(1),
                              plpor.VIDDK=0,
                              plpor.PRI=0,
                              plpor.DIRECT=1,//собственное
                              plpor.NODOK=nomer,
                              plpor.YEARDOC=year(strtodate(dd,'dd.mm.yyyy')),
                              plpor.DATVIP=strtodate(dd,'dd.mm.yyyy'),
                              plpor.DATOTS=strtodate(dd,'dd.mm.yyyy'),
                              plpor.DATOB=strtodate(dd,'dd.mm.yyyy'),
                              plpor.CPLAT=platrec,
                              plpor.CBANKPLAT=platbankrec,
                              plpor.FILBANKPLAT=platbank,
                              plpor.CPOL=polrec,
                              plpor.CBANKPOL=polbankrec,
                              plpor.FILBANKPOL=polbank,
                              plpor.CBANKKORR=0,
                              plpor.CGRUZOTP=0,
                              plpor.CGRUZPOL=0,
                              plpor.CPLATNEW=0,
                              plpor.SUMPLAT=summa,
                              plpor.CVAL=0,
                              plpor.SUMPLATV=summa,
                              plpor.DATAPOL='',
                              plpor.MONTH='',
                              plpor.NAMEPL1=substr(nazn,1,100),
                              plpor.NAMEPL2=substr(nazn,101,100),
                              plpor.NAMEPL3=substr(nazn,202,100),
                              plpor.DESCR='BEZ',
                              plpor.DESGR='1';
                              if td=10199 then  Print_import.write('Платежное требование')
                              else
                              if td=10188 then  Print_import.write('Платежное поручение')
                              Print_import.write(nomer);
                              Print_import.write(strtodate(dd,'dd.mm.yyyy'));
                              Print_import.write(double(summa));
                              Print_import.write(nazn);
                        end;
                  end;
                  message('OK');
                  Print_import.ShowFile;
                  CloseInterface(cmDefault);
            end;
          }
end;
end.

.Set name 'Print_import'
.fields
tipdoc:string
numdoc:string
datdoc:date
sumdoc:double
nazdoc:string
.endfields
.{
  ^ ^ ^ &'&&&&&&&&&&&&.&& ^
.}
.endform
.linkform 'importsb_mptus1' prototype is 'Print_import'
.fields
tipdoc
numdoc
datdoc
sumdoc
nazdoc
.endfields
.{
  ^ ^ ^ &&&&&&&&&&&&&&.&& ^
.}
.endform
С ув..
Sheinina
Местный житель
Сообщения: 366
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Импорт платежных поручений из файла формата 1С

Сообщение Sheinina »

pk писал(а):>потому решили настроить один универсальный импорт.
>Но как это сделать - всю голову сломали
>Помогите, кто чем может!!!
Сделал один наш умница-программист. Смените типы документов для собственной БД (td:=word(10199) и т.п.).
В принципе, и импорт ПП (модуль "Обмен бизнес-документами") из 1С формата был настроен, хотя и с какими-то тонкостями (не пользуемся этим форматом, потому не вспомню, какие).
Спасибо большое! Пошла изучать код и прилаживать его к нашим условиям :)
oiko
Местный житель
Сообщения: 419
Зарегистрирован: 29 мар 2005, 17:49

Re: Импорт платежных поручений из файла формата 1С

Сообщение oiko »

Вот к примеру настройка формы
1CClientBankExchange
ВерсияФормата=1.01
Кодировка=Windows
ДатаНачала=
ДатаКонца=
РасчСчет=
СекцияРасчСчет
ДатаНачала=
ДатаКонца=
РасчСчет=
НачальныйОстаток=
ВсегоПоступило=
ВсегоСписано=
КонечныйОстаток=
КонецРасчСчет
.{
СекцияДокумент=^
Номер=^
Дата=
Сумма=^
ПлательщикСчет=
ПлательщикИНН=^
Плательщик=
ПлательщикБИК=^
ПлательщикКорсчет=
ПлательщикБанк1=
ПлательщикРасчСчет=
ПлательщикКПП=
ПолучательСчет=
ДатаПоступило=^
Получатель=^
ПолучательИНН=^
ПолучательРасчСчет=^
ПолучательБанк1=
ПолучательБИК=^
ПолучательКорсчет=
ПолучательКПП=
ВидПлатежа=
ВидОплаты=
СрокПлатежа=^
Очередность=
НазначениеПлатежа=^
НазначениеПлатежа=^
КонецДокумента
.}
КонецФайла


В настройке укажите собственно в какие поля загружать
Шевцов Владимир
Постоянный обитатель
Сообщения: 175
Зарегистрирован: 09 окт 2009, 11:58
Откуда: г.Находка

Re: Импорт платежных поручений из файла формата 1С

Сообщение Шевцов Владимир »

pk писал(а):Сделал один наш умница-программист. Смените типы документов для собственной БД (td:=word(10199) и т.п.).
В принципе, и импорт ПП (модуль "Обмен бизнес-документами") из 1С формата был настроен, хотя и с какими-то тонкостями (не пользуемся этим форматом, потому не вспомню, какие).
Спасибо, тоже воспользуюсь Вашей заготовкой.
У нас есть нюанс что в выписке три вида документов:
1.собственные п/п, которые есть в галактике (их нужно по факту импорта сопоставить и дополнить сведениями из системы экспорта)
2.собственные п/п, которых нет в Галактике (их импортируем в собственные п/п по соответствующему р/с)
3.сторонние п/п (их импортируем в сторонние п/п)
Но, думаю, проблем не возникнет с допилкой :).
Ответить