ЭДО

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

ЭДО

Сообщение Admin »

У кого ни будь есть разбор (может быть и формирования) файлов ЭДО в виде класса или более менее кода?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

ЭДО

Сообщение finsoftrz »

Есть и то, и другое. Только у меня свои классы, могу код выложить в качестве примера.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

ЭДО

Сообщение Admin »

Да пожалуйста. Адаптируем.
Основание стандартные XML классах наверное.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

ЭДО

Сообщение finsoftrz »

Ловите те.
Формирование файла для отправки в ЭДО, в том числе маркированных товаров.

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

form_r routine   
   DATA
lor:idPol     string(80)
lor:err       byte
lor:flagMark  byte

lor:kol       real
lor:num       long
lor:ProcNDS   real
lor:cenaNoNDS real
lor:sumNoNDS  real
lor:sumNDS    real

lor:sumIt       real
lor:sumNoNDSIt  real
lor:sumNDSIt    real

lor:koeff       real
   CODE

   Loc:DateToday=today()
   
   FsPrimary:Firma(DTovH:IDFirma)
   if Fir:Director='' and len(clip(Fir:inn))=12
      FsMessagePr('Для фирмы не задан руководитель!')
      exit
   .   
   FsPrimary:Klients(DTovH:IDOrg)
   if Kli:Manager='' and len(clip(Kli:inn))=12
      FsMessagePr('Для контрагента не задан руководитель!')
      exit
   .  
   
   lor:idPol=GetDopParamKlient(Kli:ID,'ЭДОид')
   if lor:idPol=''
      FsMessagePr('Не задан ид в ЭДО для покупателя!')
      exit
   .   
   
   if DTovH:IDOrgDop>0
      clear(KliA:Record)
      KliA:id=DTovH:IDOrgDop
      get(klientsa,KLIA:keyID)
   else
      clear(KliA:record)
   .   
   
   GetDogLastFirma(kli:id,Fir:id,DTovH:Date)
   if Dog:Date=0
      FsMessagePr('Не найден договор!')
      exit
   .   
   
   lor:sumIt=0
   lor:sumNoNDSIt=0   
   lor:sumNDSIt=0
   lor:err=0
   clear(DTovT:record,-1)
   DTovT:IDDoc=DTovH:ID
   set(DTovT:keyNum,DTovT:keyNum)
   loop
      next(DocTovT)
      if error() or DTovT:IDDoc<>DTovH:ID
         break
      .      
      FsPrimary:Tovar(DTovT:IDTovar)
      if len(clip(tov:Shtrih))<>13
         lor:err=1
         break
      .   
      FsPrimary:Nalogs(Tov:IDNalog)
      lor:ProcNDS=GetNDSProc(DTovH:Date,Nal:NDSStavka)
      lor:sumNDS=GetNDSStavka(DTovT:Sum,Nal:NDSStavka,DTovH:Date)      
      lor:sumNDSIt+=lor:sumNDS
      lor:sumIt+=DTovT:Sum
      lor:sumNoNDSIt+=DTovT:Sum-lor:sumNDS
   .   
   if lor:err=1
      if Tov:Shtrih=''
         FsMessagePr('Не задан штрих-код у товара ' & Tov:name)
      else   
         FsMessagePr('Неверно задан штрих-код у товара ' & Tov:name)
      .   
      exit
   .   
   
   Loc:FileNameXML='ON_NSCHFDOPPRMARK' & '_' & clip(lor:idPol) & '_' & clip(GetDopParamFirma(Fir:ID,'ЭДООПид')) & '_' & format(Loc:DateToday,@d12) & '_0204ae98-49f0-4ebd-a741-4aee779a052f.XML'
   FinSoftASCIIFileName=clip(FsFilePathNoSlash(FsAccess:ActiveUserDir)) & '\' & Loc:FileNameXML

   if exists(FinSoftASCIIFileName)
      remove(FinSoftASCIIFileName)
   .
   FsASCIIFile{PROP:NAME}=FinSoftASCIIFileName
   create(FsASCIIFile)
   if error()
      FsMessagePr('Не могу создать выходной файл!')
      exit
   .
   open(FsASCIIFile)
   if error()
      FsMessagePr('Не могу открыть выходной файл!')
      exit
   .
   
   FsAF:rec='<?xml version="1.0" encoding="windows-1251"?>'
   add(FsASCIIFile)
   FsAF:rec='<Файл ИдФайл="' & clip(FsStrReplace(Loc:FileNameXML,'.XML','')) & '" ВерсФорм="5.01" ВерсПрог="ФинСофт КупецЪ">'
   add(FsASCIIFile)
   FsAF:rec='<СвУчДокОбор ИдОтпр="' & clip(GetDopParamFirma(Fir:ID,'ЭДОид')) & '" ИдПол="' & clip(lor:idPol) & '">'
   add(FsASCIIFile)
   FsAF:rec='  <СвОЭДОтпр ИННЮЛ="' & clip(GetDopParamFirma(Fir:ID,'ЭДООПинн')) & '" ИдЭДО="' & clip(GetDopParamFirma(Fir:ID,'ЭДООПид')) & '" НаимОрг="' & clip(GetDopParamFirma(Fir:ID,'ЭДООПнаим')) & '" />'
   add(FsASCIIFile)
   FsAF:rec='</СвУчДокОбор>'
   add(FsASCIIFile)
   FsAF:rec='<Документ КНД="1115131" ВремИнфПр="' & format(clock(),@t04.) & '" ДатаИнфПр="' & format(Loc:DateToday,@d06.) & '" НаимЭконСубСост="' & clip(FsStrReplace(Fir:NameLong,'"','&quot;')) & '" Функция="СЧФДОП" ПоФактХЖ="Документ об отгрузке товаров (выполнении работ), передаче имущественных прав (документ об оказании услуг)" НаимДокОпр="Счет-фактура и документ об отгрузке товаров (выполнении работ), передаче имущественных прав (документ об оказании услуг)">'
   add(FsASCIIFile)
   FsAF:rec=' <СвСчФакт НомерСчФ="' & DTovH:Num & '" ДатаСчФ="' & format(DTovH:Date,@d06.) & '" КодОКВ="643">'
   add(FsASCIIFile)
   FsAF:rec='   <СвПрод>'
   add(FsASCIIFile)
   FsAF:rec='     <ИдСв>'
   add(FsASCIIFile)
   if len(clip(Fir:INN))=10
      FsAF:rec='       <СвЮЛУч НаимОрг="' & clip(FsStrReplace(Fir:NameLong,'"','&quot;')) & '" ИННЮЛ="' & clip(Fir:inn) & '" КПП="' & clip(Fir:kpp) & '" />'
      add(FsASCIIFile)
   else   
      FsAF:rec='       <СвИП ИННФЛ="' & clip(Fir:inn) & '">'
      add(FsASCIIFile)
      FsAF:rec='          <ФИО Фамилия="' & clip(FsGetFIOPart(Fir:Director,1)) & '" Имя="' & clip(FsGetFIOPart(Fir:Director,2)) & '" Отчество="' & clip(FsGetFIOPart(Fir:Director,3)) & '"/>'
      add(FsASCIIFile)
      FsAF:rec='       </СвИП>'
      add(FsASCIIFile)
   .   
   FsAF:rec='     </ИдСв>'
   add(FsASCIIFile)
   FsAF:rec='     <Адрес>'
   add(FsASCIIFile)
   FsAF:rec='       <АдрИнф КодСтр="643" АдрТекст="' & clip(FsStrReplace(Fir:AdresUr,'"','&quot;')) & '"/>'
   add(FsASCIIFile)
   FsAF:rec='     </Адрес>'
   add(FsASCIIFile)
   FsAF:rec='   </СвПрод>'
   add(FsASCIIFile)
   if Kli:Adress<>KliA:AdressDost and KliA:AdressDost<>''
      FsAF:rec='   <ГрузПолуч>'
      add(FsASCIIFile)      
      FsAF:rec='     <ИдСв>'
      add(FsASCIIFile)
      if len(clip(Kli:INN))=10
         FsAF:rec='       <СвЮЛУч НаимОрг="' & clip(FsStrReplace(Kli:NameFull,'"','&quot;')) & '" ИННЮЛ="' & clip(Kli:inn) & '" КПП="' & clip(Kli:kpp) & '" />'
         add(FsASCIIFile)
      else   
         FsAF:rec='       <СвИП ИННФЛ="' & clip(Kli:inn) & '">'
         add(FsASCIIFile)
         FsAF:rec='          <ФИО Фамилия="' & clip(FsGetFIOPart(Kli:Manager,1)) & '" Имя="' & clip(FsGetFIOPart(Kli:Manager,2)) & '" Отчество="' & clip(FsGetFIOPart(Kli:Manager,3)) & '"/>'
         add(FsASCIIFile)
         FsAF:rec='       </СвИП>'
         add(FsASCIIFile)
      .      
       FsAF:rec='     </ИдСв>'
       add(FsASCIIFile)
       FsAF:rec='     <Адрес>'
       add(FsASCIIFile)
       FsAF:rec='       <АдрИнф КодСтр="643" АдрТекст="' & clip(FsStrReplace(KliA:AdressDost,'"','&quot;')) & '"/>'
       add(FsASCIIFile)
      FsAF:rec='     </Адрес>'
      add(FsASCIIFile)         
      FsAF:rec='   </ГрузПолуч>'
      add(FsASCIIFile)            
   .   
   FsAF:rec='   <СвПокуп>'
   add(FsASCIIFile)
   FsAF:rec='     <ИдСв>'
   add(FsASCIIFile)
   if len(clip(Kli:INN))=10
      FsAF:rec='       <СвЮЛУч НаимОрг="' & clip(FsStrReplace(Kli:NameFull,'"','&quot;')) & '" ИННЮЛ="' & clip(Kli:inn) & '" КПП="' & clip(Kli:kpp) & '" />'
      add(FsASCIIFile)
   else   
      FsAF:rec='       <СвИП ИННФЛ="' & clip(Kli:inn) & '">'
      add(FsASCIIFile)
      FsAF:rec='          <ФИО Фамилия="' & clip(FsGetFIOPart(Kli:Manager,1)) & '" Имя="' & clip(FsGetFIOPart(Kli:Manager,2)) & '" Отчество="' & clip(FsGetFIOPart(Kli:Manager,3)) & '"/>'
      add(FsASCIIFile)
      FsAF:rec='       </СвИП>'
      add(FsASCIIFile)
   .      
   FsAF:rec='     </ИдСв>'
   add(FsASCIIFile)
   FsAF:rec='     <Адрес>'
   add(FsASCIIFile)
   FsAF:rec='       <АдрИнф КодСтр="643" АдрТекст="' & clip(FsStrReplace(Kli:Adress,'"','&quot;')) & '"/>'
   add(FsASCIIFile)
   FsAF:rec='     </Адрес>'
   add(FsASCIIFile)   
   FsAF:rec='   </СвПокуп>'
   add(FsASCIIFile)
   FsAF:rec=' </СвСчФакт>'
   add(FsASCIIFile)
   FsAF:rec=' <ТаблСчФакт>'   
   add(FsASCIIFile)

   lor:num=0
   clear(DTovT:record,-1)
   DTovT:IDDoc=DTovH:ID
   set(DTovT:keyNum,DTovT:keyNum)
   loop
      next(DocTovT)
      if error() or DTovT:IDDoc<>DTovH:ID
         break
      .   
      FsPrimary:Tovar(DTovT:IDTovar)
      FsPrimary:Ed(DTovT:IDEd)
      lor:koeff=Ed:Koeff
      FsPrimary:Ed(GetTovEdOne(DTovT:IDTovar))
      FsPrimary:StdCodes(Ed:IDOKEI)
      FsPrimary:Nalogs(Tov:IDNalog)
      
      lor:flagMark=1
      if Tov:isMark=0
         FsPrimary:TovarGr(Tov:idGr)
         FsPrimary:Directs(TovGr:IDDirects)
         if Dirs:TovarRegl<>4  !4 - маркированные товары
            lor:flagMark=0
         .   
      .   
      
      lor:ProcNDS=GetNDSProc(DTovH:Date,Nal:NDSStavka)
      lor:sumNDS=GetNDSStavka(DTovT:Sum,Nal:NDSStavka,DTovH:Date)
      lor:sumNoNDS=DTovT:Sum-lor:sumNDS
      lor:cenaNoNDS=DTovT:Cena-GetNDSStavka(DTovT:Cena,Nal:NDSStavka,DTovH:Date)
      lor:kol=round(DTovT:Kol*lor:koeff,0.001)
      lor:num+=1
      
      FsAF:rec='<СведТов НомСтр="' & lor:num & '" НаимТов="' & clip(FsStrReplace(Tov:name,'"','&quot;')) & '" ОКЕИ_Тов="' & StdCod:Kod & '" КолТов="' & clip(left(format(lor:kol,@n-_12.3))) & '" ЦенаТов="' & clip(left(format(lor:cenaNoNDS,@n-_12.2))) & '" СтТовБезНДС="' & clip(left(format(lor:sumNoNDS,@n-_12.2))) & '" НалСт="' & lor:ProcNDS & '%" СтТовУчНал="' & clip(left(format(DTovT:Sum,@n-_12.2))) & '">'
      add(FsASCIIFile)
      FsAF:rec='  <Акциз>'
      add(FsASCIIFile)
      FsAF:rec='    <БезАкциз>без акциза</БезАкциз>'
      add(FsASCIIFile)
      FsAF:rec='  </Акциз>'
      add(FsASCIIFile)
      FsAF:rec='  <СумНал>'
      add(FsASCIIFile)
      FsAF:rec='    <СумНал>' & clip(left(format(lor:sumNDS,@n-_12.2))) & '</СумНал>'
      add(FsASCIIFile)
      FsAF:rec='  </СумНал>'
      add(FsASCIIFile)
      FsAF:rec='  <ДопСведТов НаимЕдИзм="' & clip(ed:name) & '">'
      add(FsASCIIFile)
      if lor:flagMark=1
         FsAF:rec='    <НомСредИдентТов>'
         add(FsASCIIFile)
        if Tov:isVes=0  
         FsAF:rec='      <НомУпак>020' & clip(Tov:Shtrih) & '37' & lor:kol & '</НомУпак>'
        else    
         FsAF:rec='      <НомУпак>020' & clip(Tov:Shtrih) & '37' & choose(DTovT:Prim='' or left(DTovT:Prim)='0' or abs(int(DTovT:Prim))<>(0+DTovT:Prim),'1',int(DTovT:Prim)) & '</НомУпак>'
        .    
         add(FsASCIIFile)
         FsAF:rec='    </НомСредИдентТов>'
         add(FsASCIIFile)
      .   
      FsAF:rec='  </ДопСведТов>'
      add(FsASCIIFile)
      FsAF:rec='  <ИнфПолФХЖ2 Идентиф="штрихкод" Значен="' & clip(Tov:Shtrih) & '" />'
      add(FsASCIIFile)
      FsAF:rec='</СведТов>'
      add(FsASCIIFile)
   .
   FsAF:rec='      <ВсегоОпл  СтТовБезНДСВсего="' & clip(left(format(lor:sumNoNDSIt,@n-_12.2))) & '" СтТовУчНалВсего="' & clip(left(format(lor:sumIt,@n-_12.2))) & '">'
   add(FsASCIIFile)
   FsAF:rec='        <СумНалВсего>'
   add(FsASCIIFile)
   FsAF:rec='          <СумНал>' & clip(left(format(lor:sumNDSIt,@n-_12.2))) & '</СумНал>'
   add(FsASCIIFile)
   FsAF:rec='        </СумНалВсего>'
   add(FsASCIIFile)
   FsAF:rec='      </ВсегоОпл>'
   add(FsASCIIFile)      
      
    FsAF:rec='</ТаблСчФакт>'
    add(FsASCIIFile)

    FsAF:rec='<СвПродПер>'
    add(FsASCIIFile)
    FsAF:rec='  <СвПер СодОпер="Товары переданы">'
    add(FsASCIIFile)
    FsAF:rec='    <ОснПер НаимОсн="Договор поставки" НомОсн="' & Dog:Num & '" ДатаОсн="' & format(Dog:Date,@d06.) & '" />'
    add(FsASCIIFile)
    FsAF:rec='  </СвПер>'
    add(FsASCIIFile)
    FsAF:rec='</СвПродПер>'
    add(FsASCIIFile)
    FsAF:rec='<Подписант ОснПолн="Должностные обязанности" ОблПолн="5" Статус="1">'
    add(FsASCIIFile)
   
    if len(clip(Fir:INN))=10
       FsAF:rec='  <ЮЛ ИННЮЛ="' & clip(Fir:inn) & '" Должн="' & clip(GetDopParamFirma(Fir:ID,'ЭДОдолжн')) & '" НаимОрг="' & clip(FsStrReplace(Fir:NameLong,'"','&quot;')) & '">'
    else     
       FsAF:rec='  <ИП ИННФЛ="' & clip(Fir:inn) & '">'
    .     
    add(FsASCIIFile)
         
    FsAF:rec='    <ФИО Фамилия="' & clip(GetDopParamFirma(Fir:ID,'ЭДОфам')) & '" Имя="' & clip(GetDopParamFirma(Fir:ID,'ЭДОимя')) & '" Отчество="' & clip(GetDopParamFirma(Fir:ID,'ЭДОотч')) & '" />'
    add(FsASCIIFile)
    if len(clip(Fir:INN))=10
       FsAF:rec='  </ЮЛ>'
    else     
       FsAF:rec='  </ИП>'
    .     
    add(FsASCIIFile)
    FsAF:rec='</Подписант>'
    add(FsASCIIFile)
    FsAF:rec='</Документ>'
    add(FsASCIIFile)
    FsAF:rec='</Файл>'
    add(FsASCIIFile)
   
    close(FsASCIIFile)
   
   
   if Loc:Path<>''
      copy(FinSoftASCIIFileName,clip(FsFilePathNoSlash(Loc:Path)) & '\' & Loc:FileNameXML)
      if exists(clip(FsFilePathNoSlash(Loc:Path)) & '\' & Loc:FileNameXML)  
         FsMessagePr('Сформирован файл ' & clip(FsFilePathNoSlash(Loc:Path)) & '\' & Loc:FileNameXML)   
      else      
         fsMessagePr('Сформирован файл ' & clip(FinSoftASCIIFileName))     
      .
   else
      fsMessagePr('Сформирован файл ' & clip(FinSoftASCIIFileName))    
   .    
            
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

ЭДО

Сообщение finsoftrz »

Загрузка файла из ЭДО, в том числе маркировка.
Загружает в кьюшку следующей структуры, а дальше работается с ней.

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

Loc:Queue            QUEUE,PRE()
Loc:Kol              REAL
Loc:Cena             REAL
Loc:Sum              REAL
Loc:CenaMRC          REAL
Loc:ProcNds          REAL
Loc:FlagNdsDif       BYTE
Loc:IDTovar          LONG
Loc:TovShtrih        STRING(20)
Loc:TovName          STRING(150)
                     END

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

loadXML1_r  routine   !загрузить из формата эдо маркировка
   DATA

lor:queue  queue, pre()
lor:tovkol        string(20), name('tovkol')
lor:tovsum        string(20), name('tovsum')
lor:tovshtrih     string(40), name('tovshtrih')
lor:tovshtrih2    string(40), name('tovshtrih2')
lor:procnds       string(10), name('procnds')
lor:koef          long,       name('koef')
lor:tovname       string(150), name('tovname')
  .

lor:i        long
lor:j        long
lor:mrc      string(10)
lor:nums     string(10)

   CODE

     do testRows_r
     if Loc:OkRows=1
        exit
     .

     lor:nums='0123456789'

     Loc:NameTmp=GetNameTmp(FsAccess:ActiveUserDir,'xml',0)
     Loc:NameVbsTmp=GetNameTmp(FsAccess:ActiveUserDir,'vbs',0)
     Loc:NameOutTmp=GetNameTmp(FsAccess:ActiveUserDir,'txt',0)

     fsXmlPar.init(Loc:FileName,Loc:NameVbsTmp,Loc:NameOutTmp)

     fsXmlPar.LoadQueueHand('lor:queue',lor:queue)
     fsXmlPar.AddScriptInt('Set NodeList = Root.getElementsByTagName("СведТов")')
     fsXmlPar.AddScriptInt('For Each Elem In NodeList')
     fsXmlPar.AddScriptInt('   tovname = Elem.getAttribute("НаимТов")')
     fsXmlPar.AddScriptInt('   tovkol = Elem.getAttribute("КолТов")')
     fsXmlPar.AddScriptInt('   tovsum = Elem.getAttribute("СтТовУчНал")')
     fsXmlPar.AddScriptInt('   procnds = Elem.getAttribute("НалСт")')

     fsXmlPar.AddScriptInt('   SET per = Elem.getElementsByTagName("ДопСведТов/НомСредИдентТов/НомУпак")(0)')
     fsXmlPar.AddScriptInt('   if not per is Nothing then')
     fsXmlPar.AddScriptInt('      tovshtrih = per.text')
     fsXmlPar.AddScriptInt('   else')
     fsXmlPar.AddScriptInt('      tovshtrih = ""')
     fsXmlPar.AddScriptInt('   end if')

     fsXmlPar.AddScriptInt('   tovshtrih2 = ""')
     fsXmlPar.AddScriptInt('   koef = ""')
     fsXmlPar.AddScriptInt('   Set NodeList2 = Elem.getElementsByTagName("ИнфПолФХЖ2")')
     fsXmlPar.AddScriptInt('   For Each Elem2 In NodeList2')
     fsXmlPar.AddScriptInt('     ident = Elem2.getAttribute("Идентиф")')
     fsXmlPar.AddScriptInt('     val   = Elem2.getAttribute("Значен")')
     fsXmlPar.AddScriptInt('     if ident = "штрихкод" then')
     fsXmlPar.AddScriptInt('        tovshtrih2 = val')
     fsXmlPar.AddScriptInt('     elseif ident = "вложенность" then')
     fsXmlPar.AddScriptInt('        koef = val')
     fsXmlPar.AddScriptInt('     end if')
     fsXmlPar.AddScriptInt('   Next')

     fsXmlPar.AddScriptInt('   outFile.WriteLine "tovname=" & tovname')
     fsXmlPar.AddScriptInt('   outFile.WriteLine "tovshtrih=" & tovshtrih')
     fsXmlPar.AddScriptInt('   outFile.WriteLine "tovshtrih2=" & tovshtrih2')
     fsXmlPar.AddScriptInt('   outFile.WriteLine "tovkol=" & tovkol')
     fsXmlPar.AddScriptInt('   outFile.WriteLine "tovsum=" & tovsum')
     fsXmlPar.AddScriptInt('   outFile.WriteLine "procnds=" & procnds')
     fsXmlPar.AddScriptInt('   outFile.WriteLine "koef=" & koef')
     fsXmlPar.AddScriptInt('   outFile.WriteLine "@add"')

     fsXmlPar.AddScriptInt('Next')
     fsXmlPar.AddScriptInt('Set NodeList = Nothing')
     fsXmlPar.AddScriptInt('Set NodeList2 = Nothing')
     fsXmlPar.AddScriptInt('')

     fsXmlPar.MakeScript(1)
     if fsXmlPar.ErrorCode<>0
        FsMessagePr('Ошибка! ' & clip(fsXmlPar.ErrorMessage))
        loc:Error=1
     .
     fsXmlPar.kill
     if loc:Error=1
        exit
     .

     loop lor:i=1 to records(lor:queue)
        get(lor:queue,lor:i)
        clear(Loc:Queue)
        Loc:Kol=lor:tovkol
        Loc:Sum=lor:tovsum
        if lor:koef>0
           Loc:Kol=round(Loc:Kol*lor:koef,1)
        .
        Loc:TovName=lor:tovname
        if lor:tovshtrih=''
           lor:tovshtrih=lor:tovshtrih2
        .
        if lor:tovshtrih<>''
           if sub(lor:tovshtrih,1,2)='01' or sub(lor:tovshtrih,1,2)='02'
              Loc:TovShtrih=sub(lor:tovshtrih,4,13)
           else
              Loc:TovShtrih=sub(lor:tovshtrih,1,13)
           .
           Loc:IDTovar=TovarShtrihSearch(Loc:TovShtrih)
        .
            
        if Loc:IDTovar>0 and Fir:FlagNDS=1    !сверка ставок ндс
           Loc:ProcNds=left(lor:procnds) 
           FsPrimary:Tovar(Loc:IDTovar)   
           FsPrimary:Nalogs(Tov:IDNalog) 
           Loc:ProcNdsTov=GetNDSProc(DTovH:Date,Nal:NDSStavka)
           if Loc:ProcNdsTov<>Loc:ProcNds
              Loc:IDTovar=0
              Loc:FlagNdsDif=1    
           .                   
        .    

        if Loc:IDTovar>0
           FsPrimary:Tovar(Loc:IDTovar)
           if Tov:FlagMRC=1
              lor:mrc=''
              if len(clip(Loc:TovName))>20
                 loop lor:j=len(clip(Loc:TovName)) to len(clip(Loc:TovName))-19 by -1
                    if instring(Loc:TovName[lor:j],lor:nums,1,1)=0
                       if len(clip(lor:mrc))>0 and Loc:TovName[lor:j]<>'.' and Loc:TovName[lor:j]<>','
                          break
                       .
                       cycle
                    .
                    lor:mrc=Loc:TovName[lor:j] & lor:mrc
                 .
              .
              Loc:CenaMRC=0+lor:mrc
              if Loc:CenaMRC>1000
                 Loc:CenaMRC=round(Loc:CenaMRC/100,0.01)
              .
           .
        .

        add(Loc:Queue)
        if Loc:IDTovar=0
           Loc:FlagTovNo=1
        .
     .

     free(lor:queue)

     loc:ok=1

C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

ЭДО

Сообщение Игорь Столяров »

В XML нужно ВСЕ строковые значения тегов экранировать, и только замена двойных кавычек - недостаточно ... :(
Что-то вроде вот такого (не помню где спионерил):

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

EscapeXml   PROCEDURE  (xSource_) ! ,String
SIndex               LONG,AUTO
DIndex               LONG,AUTO
ReplacedBy           CSTRING(7),AUTO
LenReplace           BYTE,AUTO
Loc:xResult          String((Size(xSource_) * 6) + 20)
  Code
!  Loc:xResult = Clip(xSource_)             ! Старый вариант (меееееееееееееедленно)
!  ReplaceText(Loc:xResult,'&',  '&amp;')
!  ReplaceText(Loc:xResult,'>',  '&gt;')
!  ReplaceText(Loc:xResult,'<','  &lt;')
!  ReplaceText(Loc:xResult,'''', '&apos;')
!  ReplaceText(Loc:xResult,'"',  '&quot;')

  If (Clip(Left(xSource_)) = '') Or Numeric(Clip(Left(xSource_)))
     Return Clip(Left(xSource_))
  else
     Loc:xResult = ''
     DIndex = 1
     Loop SIndex = 1 to Len(Clip(xSource_)) by 1

       Case Val(xSource_[SIndex])
       Of Val('&')
          ReplacedBy = '&amp;'
          LenReplace = 5
       Of Val('>')
          ReplacedBy = '&gt;'
          LenReplace = 4
       Of Val('<')
          ReplacedBy = '&lt;'
          LenReplace = 4
       Of Val('''')
          ReplacedBy = '&apos;'
          LenReplace = 6
       Of Val('"')
          ReplacedBy = '&quot;'
          LenReplace = 6
       Of 1 To 9 OrOf 11 To 12 OrOf 14 To 31  ! Убрать спецсимволы, кроме 10,13
          ReplacedBy = ' '
          LenReplace = 1
       else
          ReplacedBy = xSource_[SIndex]
          LenReplace = 1
       end

       Loc:xResult[(DIndex):(DIndex + LenReplace - 1)] = ReplacedBy
       DIndex += LenReplace

       If (DIndex + 10) > Size(Loc:xResult) then Break.  ! Если нет запаса следующий шаг замены символа
     end

     Return Clip(Loc:xResult)
  end
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

ЭДО

Сообщение finsoftrz »

В описании формата xml для Честного знака видел недавно табличку с этими символами. Когда сыр пытались резать. Выгрузка в эдо делалась раньше, вопрос всплыл про кавычки, другое из этого списка редко используется, не попадалось. По хорошему, конечно, надо экранировать все.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

ЭДО

Сообщение Admin »

finsoftrz писал(а): 08 Февраль 2023, 17:11Загрузка файла из ЭДО, в том числе маркировка.
Парсер на JS конечно не то что хотелось бы. Ну и генерация простыми строками.
Похоже с парсером придется самому разбираться.
А создаем файлик сейчас вот так:

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

IDstr               CSTRING(255)
FileName            CSTRING(255)

loc:Number          STRING(255)
loc:Date            LONG

XML                 CLASS(XMLGenerator)
                    END

 CODE

 LOOP k# = 1 TO RECORDS(DATA_Q)
    GET(DATA_Q,k#)

    IF LEN(CLIP(DATA_Q.PrnNumber))
       loc:Number = DATA_Q.PrnNumber
    ELSE
       loc:Number = DATA_Q.Number
    END
    IF DATA_Q.PrnDate_GR.PrnDate_DATE
       loc:Date = DATA_Q.PrnDate_GR.PrnDate_DATE
    ELSE
       loc:Date = DATA_Q.AccountDate_GR.AccountDate_DATE
    END

    IDstr = 'ON_NSCHFDOPPR_'& CLIP(DATA_Q.R_EDO_ID) & '_' & CLIP(DATA_Q.P_EDO_ID) & '_' & FORMAT(loc:Date,@D12) & '_' & CLIP(DATA_Q._UID)
    FileName = xNOrmDir(CLIP(loc:XmlPath)) & IDstr & '.xml'

    XML.Init(FileName)
    XML.OpenDocument()
    XML.SetEncoding('windows-1251')
!    XML.SetUseCRLF(TRUE)
    XML.SetUseCRLF(false)

    IF EXISTS(FileName)
       ! шапка
       XML.SetRootTag('Файл')
       XML.AddRootTagAttributes('ИдФайл',IDstr)
       XML.AddRootTagAttributes('ВерсПрог','Бытовая техника ЭНКА')
       XML.AddRootTagAttributes('ВерсФорм','5.01')

       ! сведения об участниках ЭДО
       XML.AddTag('СвУчДокОбор','')
       XML.AddAttribute('ИдОтпр',CLIP(DATA_Q.P_EDO_ID),'СвУчДокОбор')
       XML.AddAttribute('ИдПол',CLIP(DATA_Q.R_EDO_ID),'СвУчДокОбор')

       ! сведения об операторе
       XML.AddTag('СвОЭДОтпр','',FALSE,'СвУчДокОбор')
       XML.AddAttribute('ИдЭДО','2BM','СвОЭДОтпр')
       XML.AddAttribute('ИННЮЛ','6663003127','СвОЭДОтпр')
       XML.AddAttribute('НаимОрг','АО "ПФ СКБ Контур"','СвОЭДОтпр')

       ! шапка
       XML.AddTag('Документ','')
       XML.AddAttribute('КНД','1115131','Документ') ! код
       XML.AddAttribute('Функция','СЧФДОП ','Документ') ! типа УПД
       XML.AddAttribute('ДатаИнфПр',FORMAT(TODAY(),@d06.b),'Документ') ! дата формирования документа
       XML.AddAttribute('ВремИнфПр',FORMAT(CLOCK(),@T04.b),'Документ') ! время формирования документа
       XML.AddAttribute('НаимЭконСубСост',CLIP(DATA_Q.P_Name),'Документ') ! кто отправил ???
       XML.AddAttribute('ПоФактХЖ','Документ об отгрузке товаров (выполнении работ), передаче имущественных прав (документ об оказании услуг)','Документ')
       XML.AddAttribute('НаимДокОпр','Счет-фактура и документ об отгрузке товаров (выполнении работ), передаче имущественных прав (документ об оказании услуг)','Документ')

       XML.AddTag('СвСчФакт','',FALSE,'Документ')
       XML.AddAttribute('НомерСчФ',CLIP(loc:Number),'СвСчФакт')
       XML.AddAttribute('ДатаСчФ',FORMAT(loc:Date,@D06.b),'СвСчФакт')
       XML.AddAttribute('КодОКВ','643','СвСчФакт') ! код валюты - 643 рубли

       ! сведения о продавце
       XML.AddTag('СвПрод','',FALSE,'СвСчФакт')
       XML.AddTag('ИдСв','',FALSE,'СвПрод')
       IF NOT DATA_Q.P_FlagPE  ! продавец организация
          XML.AddTag('СвЮЛУч','',FALSE,'ИдСв')
          XML.AddAttribute('НаимОрг',CLIP(DATA_Q.P_Name),'СвЮЛУч')
          XML.AddAttribute('ИННЮЛ',CLIP(DATA_Q.P_INN),'СвЮЛУч')
          IF LEN(CLIP(DATA_Q.P_KPP))
             XML.AddAttribute('КПП',CLIP(DATA_Q.P_KPP),'СвЮЛУч')
          END
       ELSE ! продавец ИП
          XML.AddTag('СвИП','',FALSE,'ИдСв')
          XML.AddAttribute('ИННФЛ',CLIP(DATA_Q.P_INN),'СвИП')
          IF LEN(CLIP(DATA_Q.P_PEInfo))
             XML.AddAttribute('СвГосРегИП',CLIP(DATA_Q.P_PEInfo),'СвИП')
          END
          XML.AddTag('ФИО','',FALSE,'СвИП')
          XML.AddAttribute('Фамилия',CLIP(DATA_Q.P_EDO_SecondName),'ФИО')
          XML.AddAttribute('Имя',CLIP(DATA_Q.P_EDO_FirstName),'ФИО')
          IF LEN(CLIP(DATA_Q.P_EDO_ThirdName))
             XML.AddAttribute('Отчество',CLIP(DATA_Q.P_EDO_ThirdName),'ФИО')
          END
       END

       ! адрес продавца
       XML.AddTag('Адрес','',FALSE,'СвПрод')
       XML.AddTag('АдрРФ','',FALSE,'Адрес')
       IF LEN(CLIP(DATA_Q.P_EDO_RegionCode))
          XML.AddAttribute('КодРегион',CLIP(DATA_Q.P_EDO_RegionCode),'АдрРФ')
       END
       IF LEN(CLIP(DATA_Q.P_EDO_Index))
          XML.AddAttribute('Индекс',CLIP(DATA_Q.P_EDO_Index),'АдрРФ')
       END
       IF LEN(CLIP(DATA_Q.P_EDO_Region))
          XML.AddAttribute('Район',CLIP(DATA_Q.P_EDO_Region),'АдрРФ')
       END
       IF LEN(CLIP(DATA_Q.P_EDO_City))
          XML.AddAttribute('Город',CLIP(DATA_Q.P_EDO_City),'АдрРФ')
       END
       IF LEN(CLIP(DATA_Q.P_EDO_Locality))
          XML.AddAttribute('НаселПункт',CLIP(DATA_Q.P_EDO_Locality),'АдрРФ')
       END
       IF LEN(CLIP(DATA_Q.P_EDO_Street))
          XML.AddAttribute('Улица',CLIP(DATA_Q.P_EDO_Street),'АдрРФ')
       END
       IF LEN(CLIP(DATA_Q.P_EDO_HouseNo))
          XML.AddAttribute('Дом',CLIP(DATA_Q.P_EDO_HouseNo),'АдрРФ')
       END
       IF LEN(CLIP(DATA_Q.P_EDO_HousePart))
          XML.AddAttribute('Корпус',CLIP(DATA_Q.P_EDO_HousePart),'АдрРФ')
       END
       IF LEN(CLIP(DATA_Q.P_EDO_FlatNo))
          XML.AddAttribute('Кварт',CLIP(DATA_Q.P_EDO_FlatNo),'АдрРФ')
       END

       ! сведения о грузоотправителе
       IF DATA_Q.CP_ID
          XML.AddTag('ГрузОт','',FALSE,'СвСчФакт')
          IF DATA_Q.CP_ID = DATA_Q.P_ID
             XML.AddTag('ОнЖе','он же',FALSE,'ГрузОт')
          ELSE
             XML.AddTag('ГрузОтпр','',FALSE,'ГрузОт')
             XML.AddTag('ИдСв','',FALSE,'ГрузОтпр')
             IF DATA_Q.CP_FlagPE  ! грузоотправитель ИП
                XML.AddTag('СвИП','',FALSE,'ИдСв')
                XML.AddAttribute('ИННФЛ',CLIP(DATA_Q.CP_INN),'СвИП')
                IF LEN(CLIP(DATA_Q.CP_PEInfo))
                   XML.AddAttribute('СвГосРегИП',CLIP(DATA_Q.CP_PEInfo),'СвИП')
                END
                XML.AddTag('ФИО','',FALSE,'СвИП')
                XML.AddAttribute('Фамилия',CLIP(DATA_Q.CP_EDO_SecondName),'ФИО')
                XML.AddAttribute('Имя',CLIP(DATA_Q.CP_EDO_FirstName),'ФИО')
                IF LEN(CLIP(DATA_Q.CP_EDO_ThirdName))
                   XML.AddAttribute('Отчество',CLIP(DATA_Q.CP_EDO_ThirdName),'ФИО')
                END
             ELSE
                XML.AddTag('СвЮЛУч','',FALSE,'ИдСв')
                XML.AddTag('НаимОрг',CLIP(DATA_Q.CP_Name),FALSE,'СвЮЛУч')
             END

             ! адрес грузоотправителя
             XML.AddTag('Адрес','',FALSE,'ГрузОтпр')
             XML.AddTag('АдрРФ','',FALSE,'Адрес')
             IF LEN(CLIP(DATA_Q.CP_EDO_RegionCode))
                XML.AddAttribute('КодРегион',CLIP(DATA_Q.CP_EDO_RegionCode),'АдрРФ')
             END
             IF LEN(CLIP(DATA_Q.CP_EDO_Index))
                XML.AddAttribute('Индекс',CLIP(DATA_Q.CP_EDO_Index),'АдрРФ')
             END
             IF LEN(CLIP(DATA_Q.CP_EDO_Region))
                XML.AddAttribute('Район',CLIP(DATA_Q.CP_EDO_Region),'АдрРФ')
             END
             IF LEN(CLIP(DATA_Q.CP_EDO_City))
                XML.AddAttribute('Город',CLIP(DATA_Q.CP_EDO_City),'АдрРФ')
             END
             IF LEN(CLIP(DATA_Q.CP_EDO_Locality))
                XML.AddAttribute('НаселПункт',CLIP(DATA_Q.CP_EDO_Locality),'АдрРФ')
             END
             IF LEN(CLIP(DATA_Q.CP_EDO_Street))
                XML.AddAttribute('Улица',CLIP(DATA_Q.CP_EDO_Street),'АдрРФ')
             END
             IF LEN(CLIP(DATA_Q.CP_EDO_HouseNo))
                XML.AddAttribute('Дом',CLIP(DATA_Q.CP_EDO_HouseNo),'АдрРФ')
             END
             IF LEN(CLIP(DATA_Q.CP_EDO_HousePart))
                XML.AddAttribute('Корпус',CLIP(DATA_Q.CP_EDO_HousePart),'АдрРФ')
             END
             IF LEN(CLIP(DATA_Q.CP_EDO_FlatNo))
                XML.AddAttribute('Кварт',CLIP(DATA_Q.CP_EDO_FlatNo),'АдрРФ')
             END
          END
       ELSE
          XML.AddTag('ГрузОт','',FALSE,'СвСчФакт')
          XML.AddTag('ОнЖе','он же',FALSE,'ГрузОт')
       END

       ! сведения о грузополучателе
       IF DATA_Q.CR_ID
          XML.AddTag('ГрузПолуч','',FALSE,'СвСчФакт')
          XML.AddTag('ИдСв','',FALSE,'ГрузПолуч')
          IF DATA_Q.CR_FlagPE  ! грузоотправитель ИП
             XML.AddTag('СвИП','',FALSE,'ИдСв')
             XML.AddAttribute('ИННФЛ',CLIP(DATA_Q.CR_INN),'СвИП')
             IF LEN(CLIP(DATA_Q.CR_PEInfo))
                XML.AddAttribute('СвГосРегИП',CLIP(DATA_Q.CR_PEInfo),'СвИП')
             END
             XML.AddTag('ФИО','',FALSE,'СвИП')
             XML.AddAttribute('Фамилия',CLIP(DATA_Q.CR_EDO_SecondName),'ФИО')
             XML.AddAttribute('Имя',CLIP(DATA_Q.CR_EDO_FirstName),'ФИО')
             IF LEN(CLIP(DATA_Q.CR_EDO_ThirdName))
                XML.AddAttribute('Отчество',CLIP(DATA_Q.CR_EDO_ThirdName),'ФИО')
             END
          ELSE
             XML.AddTag('СвЮЛУч','',FALSE,'ИдСв')
             XML.AddTag('НаимОрг',CLIP(DATA_Q.CR_Name),FALSE,'СвЮЛУч')
          END
          ! адрес грузополучателя
          XML.AddTag('Адрес','',FALSE,'ГрузПолуч')
          XML.AddTag('АдрРФ','',FALSE,'Адрес')
          IF LEN(CLIP(DATA_Q.CR_EDO_RegionCode))
             XML.AddAttribute('КодРегион',CLIP(DATA_Q.CR_EDO_RegionCode),'АдрРФ')
          END
          IF LEN(CLIP(DATA_Q.CR_EDO_Index))
             XML.AddAttribute('Индекс',CLIP(DATA_Q.CR_EDO_Index),'АдрРФ')
          END
          IF LEN(CLIP(DATA_Q.CR_EDO_Region))
             XML.AddAttribute('Район',CLIP(DATA_Q.CR_EDO_Region),'АдрРФ')
          END
          IF LEN(CLIP(DATA_Q.CR_EDO_City))
             XML.AddAttribute('Город',CLIP(DATA_Q.CR_EDO_City),'АдрРФ')
          END
          IF LEN(CLIP(DATA_Q.CR_EDO_Locality))
             XML.AddAttribute('НаселПункт',CLIP(DATA_Q.CR_EDO_Locality),'АдрРФ')
          END
          IF LEN(CLIP(DATA_Q.CR_EDO_Street))
             XML.AddAttribute('Улица',CLIP(DATA_Q.CR_EDO_Street),'АдрРФ')
          END
          IF LEN(CLIP(DATA_Q.CR_EDO_HouseNo))
             XML.AddAttribute('Дом',CLIP(DATA_Q.CR_EDO_HouseNo),'АдрРФ')
          END
          IF LEN(CLIP(DATA_Q.CR_EDO_HousePart))
             XML.AddAttribute('Корпус',CLIP(DATA_Q.CR_EDO_HousePart),'АдрРФ')
          END
          IF LEN(CLIP(DATA_Q.CR_EDO_FlatNo))
             XML.AddAttribute('Кварт',CLIP(DATA_Q.CR_EDO_FlatNo),'АдрРФ')
          END
       END

       ! сведения о покупателе
       XML.AddTag('СвПокуп','',FALSE,'СвСчФакт')
       XML.AddTag('ИдСв','',FALSE,'СвПокуп')
       IF NOT DATA_Q.R_FlagPE  ! покупатель организация
          XML.AddTag('СвЮЛУч','',FALSE,'ИдСв')
          XML.AddAttribute('НаимОрг',CLIP(DATA_Q.R_Name),'СвЮЛУч')
          XML.AddAttribute('ИННЮЛ',CLIP(DATA_Q.R_INN),'СвЮЛУч')
          IF LEN(CLIP(DATA_Q.R_KPP))
             XML.AddAttribute('КПП',CLIP(DATA_Q.R_KPP),'СвЮЛУч')
          END
       ELSE ! покупатель ИП
          XML.AddTag('СвИП','',FALSE,'ИдСв')
          XML.AddAttribute('ИННФЛ',CLIP(DATA_Q.R_INN),'СвИП')
          IF LEN(CLIP(DATA_Q.R_PEInfo))
             XML.AddAttribute('СвГосРегИП',CLIP(DATA_Q.R_PEInfo),'СвИП')
          END
          XML.AddTag('ФИО','',FALSE,'СвИП')
          XML.AddAttribute('Фамилия',CLIP(DATA_Q.R_EDO_SecondName),'ФИО')
          XML.AddAttribute('Имя',CLIP(DATA_Q.R_EDO_FirstName),'ФИО')
          IF LEN(CLIP(DATA_Q.R_EDO_ThirdName))
             XML.AddAttribute('Отчество',CLIP(DATA_Q.R_EDO_ThirdName),'ФИО')
          END
       END

       ! адрес покупателя
       XML.AddTag('Адрес','',FALSE,'СвПокуп')
       XML.AddTag('АдрРФ','',FALSE,'Адрес')
       IF LEN(CLIP(DATA_Q.R_EDO_RegionCode))
          XML.AddAttribute('КодРегион',CLIP(DATA_Q.R_EDO_RegionCode),'АдрРФ')
       END
       IF LEN(CLIP(DATA_Q.R_EDO_Index))
          XML.AddAttribute('Индекс',CLIP(DATA_Q.R_EDO_Index),'АдрРФ')
       END
       IF LEN(CLIP(DATA_Q.R_EDO_Region))
          XML.AddAttribute('Район',CLIP(DATA_Q.R_EDO_Region),'АдрРФ')
       END
       IF LEN(CLIP(DATA_Q.R_EDO_City))
          XML.AddAttribute('Город',CLIP(DATA_Q.R_EDO_City),'АдрРФ')
       END
       IF LEN(CLIP(DATA_Q.R_EDO_Locality))
          XML.AddAttribute('НаселПункт',CLIP(DATA_Q.R_EDO_Locality),'АдрРФ')
       END
       IF LEN(CLIP(DATA_Q.R_EDO_Street))
          XML.AddAttribute('Улица',CLIP(DATA_Q.R_EDO_Street),'АдрРФ')
       END
       IF LEN(CLIP(DATA_Q.R_EDO_HouseNo))
          XML.AddAttribute('Дом',CLIP(DATA_Q.R_EDO_HouseNo),'АдрРФ')
       END
       IF LEN(CLIP(DATA_Q.R_EDO_HousePart))
          XML.AddAttribute('Корпус',CLIP(DATA_Q.R_EDO_HousePart),'АдрРФ')
       END
       IF LEN(CLIP(DATA_Q.R_EDO_FlatNo))
          XML.AddAttribute('Кварт',CLIP(DATA_Q.R_EDO_FlatNo),'АдрРФ')
       END

       XML.AddTag('ДопСвФХЖ1','',FALSE,'СвСчФакт')
       XML.AddAttribute('НаимОКВ','Российский рубль','ДопСвФХЖ1')

       ! детали счет-фактуры
       XML.AddTag('ТаблСчФакт','',FALSE,'Документ')

       cnt_g# = 0
       LOOP l# = 1 TO RECORDS(mSFContent)
          GET(mSFContent,l#)
          IF mSFContent.AccountID <> DATA_Q.AccountID THEN CYCLE END
          cnt_g# += 1
          XML.AddTag('СведТов','',FALSE,'ТаблСчФакт')
          XML.AddAttribute('НомСтр',CLIP(mSFContent.NumPP),'СведТов')
          XML.AddAttribute('НаимТов',CLIP(mSFContent.NameGoods),'СведТов')
          XML.AddAttribute('ОКЕИ_Тов',mSFContent.MU_code,'СведТов')
          XML.AddAttribute('КолТов',mSFContent.Quantity,'СведТов')
          XML.AddAttribute('ЦенаТов',mSFContent.Price,'СведТов')
          XML.AddAttribute('СтТовБезНДС',mSFContent.SumWithoutNDS,'СведТов')
          XML.AddAttribute('СтТовУчНал',mSFContent.SumWithNDS,'СведТов')
          CASE mSFContent.NDSRate
          OF 0
             XML.AddAttribute('НалСт','без НДС','СведТов')
          ELSE
             XML.AddAttribute('НалСт',CLIP(mSFContent.NDSRate) & '%','СведТов')
          END

          XML.AddTag('Акциз','',FALSE,'СведТов')
          XML.AddTag('БезАкциз','без акциза',FALSE,'Акциз')

          XML.AddTag('СумНал','',FALSE,'СведТов')
          IF mSFContent.SumNDS
             XML.AddTag('СумНал',CLIP(mSFContent.SumNDS),FALSE,'СумНал')
          ELSE
             XML.AddTag('БезНДС','без НДС',FALSE,'СумНал')
          END

          XML.AddTag('СвТД','',FALSE,'СведТов')
          IF NOT (NOT LEN(CLIP(mSFContent.GTDNum)) OR mSFContent.GTDNum = '--' OR mSFContent.GTDNum = '-')
             XML.AddAttribute('НомерТД',SUB(mSFContent.GTDNum,1,23),'СвТД')
          END
          IF mSFContent.Country_code <> 0
             XML.AddAttribute('КодПроисх',FORMAT(mSFContent.Country_code,@N03),'СвТД')
          END

          XML.AddTag('ДопСведТов','',FALSE,'СведТов')
          XML.AddAttribute('НаимЕдИзм',CLIP(mSFContent.MU),'ДопСведТов')
          IF mSFContent.Country_code <> 0
             XML.AddAttribute('КрНаимСтрПр',CLIP(mSFContent.Country),'ДопСведТов')
          END
          IF mSFContent.FlagTrack ! подлежит прослеживаемости
             LOOP p# = 1 TO RECORDS(mRNPT)
                GET(mRNPT,p#)
                IF mRNPT.DetailID <> mSFContent.DetailID THEN CYCLE END
                XML.AddTag('СведПрослеж','',FALSE,'ДопСведТов')
                XML.AddAttribute('НомТовПрослеж',CLIP(mRNPT.RNPT),'СведПрослеж')
                XML.AddAttribute('ЕдИзмПрослеж',CLIP(mSFContent.MU_code),'СведПрослеж')
                XML.AddAttribute('НаимЕдИзмПрослеж',CLIP(mSFContent.MU),'СведПрослеж')
                XML.AddAttribute('КолВЕдПрослеж',CLIP(mRNPT.Quantity),'СведПрослеж')
             END
          END
       END

       XML.AddTag('ВсегоОпл','',FALSE,'ТаблСчФакт')
       XML.AddAttribute('СтТовБезНДСВсего',DATA_Q.SumWithoutNDS,'ВсегоОпл')
       XML.AddAttribute('СтТовУчНалВсего',DATA_Q.SumWithNDS,'ВсегоОпл')
       XML.AddTag('СумНалВсего','',FALSE,'ВсегоОпл')
       IF DATA_Q.SumNDS
          XML.AddTag('СумНал',DATA_Q.SumNDS,FALSE,'СумНалВсего')
       ELSE
          XML.AddTag('БезНДС','без НДС',FALSE,'СумНалВсего')
       END

       XML.AddTag('СвПродПер','',FALSE,'Документ')
       XML.AddTag('СвПер','',FALSE,'СвПродПер')
       XML.AddAttribute('СодОпер','-','СвПер')
       XML.AddTag('ОснПер','',FALSE,'СвПер')
       IF LEN(CLIP(DATA_Q.R_EDO_OsnPer))
          XML.AddAttribute('НаимОсн',CLIP(DATA_Q.R_EDO_OsnPer),'ОснПер')
          IF LEN(CLIP(DATA_Q.R_EDO_NomOsn))
             XML.AddAttribute('НомОсн',CLIP(DATA_Q.R_EDO_NomOsn),'ОснПер')
          END
          IF LEN(CLIP(DATA_Q.R_EDO_DateOsn))
             XML.AddAttribute('ДатаОсн',CLIP(DATA_Q.R_EDO_DateOsn),'ОснПер')
          END
       ELSE
          XML.AddAttribute('НаимОсн','Без документа-основания','ОснПер')
       END

       XML.AddTag('Подписант','',FALSE,'Документ')
       XML.AddAttribute('ОснПолн','Должностные обязанности','Подписант')
       XML.AddAttribute('ОблПолн',1,'Подписант')
       XML.AddAttribute('Статус',1,'Подписант')
       IF NOT DATA_Q.P_FlagPE  ! продавец организация
          XML.AddTag('ЮЛ','',FALSE,'Подписант')
          XML.AddAttribute('ИННЮЛ',CLIP(DATA_Q.P_INN),'ЮЛ')
          IF CLIP(DATA_Q.P_EDO_Post)
             XML.AddAttribute('Должн',CLIP(DATA_Q.P_EDO_Post),'ЮЛ')
          END
          XML.AddTag('ФИО','',FALSE,'ЮЛ')
          XML.AddAttribute('Фамилия',CLIP(DATA_Q.P_EDO_SecondName),'ФИО')
          XML.AddAttribute('Имя',CLIP(DATA_Q.P_EDO_FirstName),'ФИО')
          IF LEN(CLIP(DATA_Q.P_EDO_ThirdName))
             XML.AddAttribute('Отчество',CLIP(DATA_Q.P_EDO_ThirdName),'ФИО')
          END
       ELSE ! продавец ИП
          XML.AddTag('ИП','',FALSE,'Подписант')
          XML.AddAttribute('ИННФЛ',CLIP(DATA_Q.P_INN),'ИП')
          XML.AddAttribute('СвГосРегИП',CLIP(DATA_Q.P_PEInfo),'ИП')
          XML.AddTag('ФИО','',FALSE,'ИП')
          XML.AddAttribute('Фамилия',CLIP(DATA_Q.P_EDO_SecondName),'ФИО')
          XML.AddAttribute('Имя',CLIP(DATA_Q.P_EDO_FirstName),'ФИО')
          IF LEN(CLIP(DATA_Q.P_EDO_ThirdName))
             XML.AddAttribute('Отчество',CLIP(DATA_Q.P_EDO_ThirdName),'ФИО')
          END
       END
       XML.SetSupportNameSpaces(True)
       XML.CloseDocument()
    END
 END
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

ЭДО

Сообщение Игорь Столяров »

Надо попробовать - будет ли читать штатный парсер русские теги (после конвертации документа в UTF-8 есстесно).
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

ЭДО

Сообщение Admin »

Игорь Столяров писал(а): 09 Февраль 2023, 7:52 Надо попробовать - будет ли читать штатный парсер русские теги (после конвертации документа в UTF-8 есстесно).
Нет. Не хочет.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

ЭДО

Сообщение Admin »

Сейчас разбираю при приеме (только товар) через iQXML но код получается вырвиглазный.
Нужно переделывать как то и парсить полностью файл.
Вот думаю.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

ЭДО

Сообщение Игорь Столяров »

Admin писал(а): 09 Февраль 2023, 8:02 через iQXML но код получается вырвиглазный
Как-то начинать новый проект на заведомо мёртвой библиотеке совсем не бест ... :(
Есть ведь CapeSoft xFiles4, EasyXML ...
Admin писал(а): 09 Февраль 2023, 7:57Нет. Не хочет.
Вот и я что-то такое помню ...
Были варианты поиска и подмены имён тегов перед парсом, но до реального проекта не доросло. Тогда. :(
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

ЭДО

Сообщение Admin »

Игорь Столяров писал(а): 09 Февраль 2023, 8:16 начинать новый проект
Проект старый но нужно сделать немного обмена через ЭДО для плавного переезда на 1с.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

ЭДО

Сообщение finsoftrz »

Я как-то не заморачиваюсь с генерацией xml, делаю либо напрямую в файл, либо через специальный класс, когда надо в utf8. Не вижу смысла навешивать дополнительную обертку. От ошибок это не защитит, а кода получится заметно больше. Кроме того, проще копипастить строки из примеров.

Парсер именно через генерацию js. Обычно все гораздо проще, загрузка в очередь одним оператором, явно на js кода нет. Если логика загрузки более сложная, то можно прямо указать строки на js, как в этом примере. Такой подход несёт определённые накладные расходы, зато никаких сюрпризов и ограничений. Никаких ломаний головы, примеры кода на js легко гуглятся. Например, я не знаю, как на штатной кларионовское обертке работать с переменными именами тегов (xpath), а это необходимо в егаис.

Приведённые примеры из работающего проекта, логика, думаю, понятная. Если возникнут вопросы по нюансам, поясню.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

ЭДО

Сообщение Игорь Столяров »

finsoftrz писал(а): 09 Февраль 2023, 11:15 с генерацией xml, делаю либо напрямую в файл
Аналогично. Но по другой причине - штатный класс очень сильно тормозит по скорости. :(
Если записать пару документов - то и нет проблем, но на массивах по несколько тысяч записей всё виснет.
За теми кто отстал - не возвращаться. (С) Кодекс
Ответить