E-Rechnung

XRechnung als CII oder UBL sowie ZUGFeRD bzw. FacturX

Ab dem 1. Januar 2025 gilt die grundsätzliche Verpflichtung zwischen inländischen Unternehmern zur Ausstellung (Versand) einer elektronischen Rechnung.

Viele VBA Entwickler fragen sich nun, was zu tun ist. Ja, entweder das Rad neu erfinden oder diesen Artikel lesen 🙂

Der öffentliche Dienst verlangt von seinen Lieferanten ja schon ziemlich lange E-Rechnungen. Am Anfang ZUGFeRD danach XRechnung.

Ab 2025 soll der Standard E-Rechnung auch für den B2B-Bereich verpflichtend werden. Die genaue Umsetzung ist derzeit aber noch Unklarheit. Ziemlich sicher lässt sich allerdings sagen, dass die E-Rechnung  das Rechnungsformat der Zukunft werden wird.

Keiner von uns wird im B2B-Bereich um diese neuen Rechnungen herum kommen. Das bedeutet aber auch, dass wir keine Rechnung ablehnen können nur weil wir sie nicht lesen können.

Grund für all das ist das Wachstumschancengesetz. Also genauer gesagt das „Gesetz zur Stärkung von Wachstumschancen, Investitionen
und Innovation sowie Steuervereinfachung und Steuerfairness“ aus dem Bundesgesetzblatt vom 27.03.2024.

Hier wird im Artikel 23 „Weitere Änderung des Umsatzsteuergesetzes“ die E-Rechnung definiert und auch die Ausnahmen geregelt.

Ausnahmen? 

Ja, es gibt Ausnahmen! z.B. Wenn Käufer oder Verkäufer kein Unternehmer ist oder einer von beiden nicht im Inland sitzt. Auch wenn der Bruttorechnungsbetrag 250,00€ nicht übersteigt oder es sich beim Artikel um einen Fahrschein handelt gibt es keine E-Rechnungspflicht. Auch nach §4 Nr. 8-29 UStG steuerbefreite Unternehmer haben keine E-Rechnungspflicht. 

Es gibt allerdings keine Papierrechnungspflicht! Wenn z.B. der Schornsteinfeger an meine Firmenadresse eine E-Rechnung schreibt muss ich, als Unternehmer, diese annehmen.

Übergangsregelungen 

Ja, kein Gesetz ohne Übergangsregelungen 🙂 Bis einschließlich 31.12.2026 dürfen Papierrechnungen verschickt werden. Auch PDF oder sonstige nicht E-Rechnungsformate dürfen mit Einwilligung des Empfängers versendet werden. Ab 01.01.2027 dürfen nur noch Unternehmen mit weniger als 800.000€ Vorjahresumsatz Papier- oder PDF-Rechnungen versenden. Ab 01.01.2028 gibt es keine Übergangsregelungen mehr. Da wir hier aber in Deutschland sind schreibe ich sicherheitshalber dazu, dass das eine Aussage  mit Stand 01.11.2024 ist. Aus der Vergangenheit haben wir ja gelernt, dass sich da ganz schnell etwas ändern kann.

Was sind nun also E-Rechnungen?

Es gibt ZUGFeRD (neuerdings auch Factur-X genannt) als hybrides Format und die XRechnung in den Ausprägungen UBL (Universal Business Language) und CII (Cross Industry Invoice) als reine elektronische Rechnung. Reine PDF-Dateien sind zwar elektronische Dokumente und vielleicht auch Rechnungen, aber eben keine E-Rechnung im Sinne des Wachstumschancengesetzes.

ZUGFeRD

ist ein branchenübergreifendes Datenformat für den elektronischen Rechnungsdatenaustausch, das vom Forum elektronische Rechnung Deutschland (FeRD) – mit Unterstützung des Bundesministeriums für Wirtschaft und Energie – erarbeitet wurde. Das ZUGFeRD-Datenformat basiert auf der Richtlinie 2014/55/EU vom 16. April 2014 über die elektronische Rechnungsstellung bei öffentlichen Aufträgen und auf der am 28. Juni 2017 veröffentlichten Norm EN16931. Zudem werden die Cross-Industry-Invoice (CII) von UN/CEFACT und die ISO-Norm 19005-3:2012 (PDF/A-3) ab ZUGFeRD 2.0 berücksichtigt. (Quelle: https://www.ferd-net.de/standards/was-ist-zugferd/was-ist-zugferd.html)

Es handelt sich hier um ein PDF-A3 Dokument, welches eine eingebettete XRechnung im Format CII enthält. Na Super! Das kann also jeder Mensch lesen, kommt elektronisch und man kann es sofort ohne Scanner abspeichern. Dazu kommt noch, dass es ein anerkanntes E-Rechnungsformat ist.

Ja, damit könnte unsere Entscheidung schon fest stehen 🙂 Leider gibt es da einen kleinen Hacken. Wie bekomme ich das XML in das PDF? Dazu später mehr im Beitrag.

XRechnung

hierbei handelt es sich um eine strukturierte XML Datei. Sie hat allerdings keinen Platz für ein Firmenlogo, Design, individuelle Schriften oder gar fett gedruckte rote Hinweise auf die neue Kontoverbindung. Dafür können wir das XML allerdings recht einfach in fast jeder Programmiersprache erstellen.

Die XRechnung können wir im CII (Cross Industry Invoice) oder UBL (Universal Business Language) Schema erstellen. Es gibt hier keine Vorschrift welches Schema man verwenden muss. Wenn wir unser XML Dokument allerdings in ein ZUGFeRD-Dokument verpacken wollen sollte es CII sein. 

Wo ist nun der Unterschied?

Es ist die Struktur. Da im Namen von CII schon das Wort Invoice (Rechnung) auftaucht kann man wohl davon ausgehen, dass man damit nur Rechnungen schreiben kann. OK es gehen natürlich auch Gutschriften und Stornorechnungen. UBL hingegen ist für alle geschäftlichen Prozesse erstellt worden. Hier kann man also auch Lieferscheine, Arbeitszeitnachweise und Ähnliches erstellen. 

Auch im Aufbau erscheint mir UBL sehr viel logischer als CII. UBL ist z.B. in vielen Blöcken organisiert aber dafür nicht so tief verschachtelt wie CII.

UBL Hauptstruktur
CII Hauptstruktur

Hier muss sich also jeder selbst die Karten legen und sich letztendlich für beide Formate entscheiden 🙂

Für Beide – warum das denn? Ganz einfach: Du kannst Deinem Lieferanten nicht vorschreiben welches der beiden Formate er Dir schickt.

Schon vergessen? Wir müssen die Dinger auch noch lesen können und zwar alle 3. Zum erstellen meiner Rechnungen habe ich mich vor langer Zeit für ZUGFeRd und dann für XRechnung UBL entschieden. Warum? Nun ja ich arbeite für Staatsunternehmen, kleinere Unternehmen und Privatpersonen. 2017 wollte die DB alle Rechnungen sofort im ZUGFeRD Format. Damals noch ZUGFeRD 1.0 mit CID Schema. Ungefähr im Jahr 2020 wurde es dann XRechnung. Da es damals nur Vorlagen im UBL-Format gab war auch hier die Entscheidung leicht. Heute müsste man die Entscheidung eigentlich bereuen, weil ZUGFeRD ja nun auch auf CII umgestellt hat. Die ZUGFeRD Rechnungen sende ich übrigens an alle Kunden die mich nicht gebeten haben XRechnungen zu stellen. Ach ja ich mache das Alles in VBA!

E-Rechnung in VBA

VBA ist ein tolles Werkzeug auch wenn es etwas Microsoft lastig ist. XML Dateien kann VBA allerdings von Hause aus nicht verarbeiten. Das Schöne ist, eine XML Datei ist ja nur eine einfache Textdatei. Die können wir mit VBA lesen und schreiben.

z.B. mit so einer Funktion:

Function ReadFile(strFilePath As String) As String
On Error GoTo ErrHandler
Dim myFSO As Object
Dim myFSOTs As Object
Dim DataLine As String, tmpCtr As Integer
Dim Data As String, xml As Boolean

    Set myFSO = CreateObject(„scripting.FileSystemObject“)
    Set myFSOTs = myFSO.OpenTextFile(strFilePath, 1)

    Do Until myFSOTs.AtEndOfStream
        DataLine = myFSOTs.readline
        If InStr(1, DataLine, „<?xml“) > 0 Then xml = True
        If xml Then Data = Data & DataLine
    Loop

    ReadFile = Data

errExit:
    Exit Function
ErrHandler:
    MsgBox Err.Number & vbCrLf & Err.Description
    Resume errExit
End Function

Ich habe hier schon den oberen Teil des Files abgeschnitten, der nicht zum XML gehört, weil ich die Funktion nutze um das XML aus einer ZUGFeRD Rechnung zu extrahieren.

Das geht dann etwa so:

  Dim strStream As String
  strStream = Mid(strStream,   InStr(1, strStream, "<?xml"))
  If InStr(1, strStream, "</rsm:CrossIndustryDocument>") > 0 Then
      strStream = Mid(strStream, 1, InStr(1, strStream, "</rsm:CrossIndustryDocument>") + 27)
  Else
      strStream = Mid(strStream, 1, InStr(1, strStream, "</rsm:CrossIndustryInvoice>") + 26)
  End If

Die zwei unterschiedlichen Endtags verraten mir auch ob es ein CII oder CID Dokument ist. CID wird übrigens nur noch von veralteten Rechnungssystemen benutzt und ist gemäß Wachstumschancengesetzt kein gültiges E-Rechnungsformat mehr.

Nachdem wir nun die Dateien gelesen haben können wir die einzelnen Knotenpunkte suchen, in denen sich unsere Rechnungsinformationen befinden bzw. unsere Informationen in diese Knoten schreiben. Aber wo sind diese Knoten? Wie in den beiden Bildern oben zu sehen ist leider nicht an den selben Stellen. Wir müssen also unterscheiden welchen Typ von E-Rechnung wir vor uns haben oder welchen wir erstellen wollen. Schauen wir uns das mal am Beispiel von UBL an:

Das ist schon richtig heftig 🙂 Dieses Bild stammt aus der Spezifikation XRechnung die ihr unter https://xeinkauf.de/app/uploads/2024/07/302-XRechnung-2024-06-20.pdf findet. Dort könnt ihr auch genau sehen was wohin gehört und welches Format es haben sollte.

Auch für CII gibt es so ein Modell. Ich habe aber kein solches Komplettbild finden können.

Jetzt können wir uns eien Klasse schreiben, mit der wirXML Knoten lesen und schreiben können, oder einfach die Strings mit:

strXML = "<invoice>12345</invoice>"

zusammen bauen. Wir können natürlich auch die von Microsoft bereitgestellte MSXML2 Library nutzten. Dazu legen wir einen Verweis auf die Microsoft XML, v6.0 an. In einer neuen Klasse würde das dann etwa so aussehen:

Option Explicit

Private xmlDoc As Object ‚MSXML2.DOMDocument60
Private root As Object ‚Der Wurzelknoten der XRechnung

Private Sub Class_Initialize()
  Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")
  Set root = xmlDoc.createElement("ubl:Invoice")

  'Namespace-Definitionen hinzufügen
  root.setAttribute "xmlns:ubl", "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"  
  root.setAttribute "xmlns:cac", "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
  root.setAttribute "xmlns:cbc", "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
  root.setAttribute "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"
  root.setAttribute "xsi:schemaLocation", "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 http://docs.oasis-open.org/ubl/os-UBL-2.1/xsd/maindoc/UBL-Invoice-2.1.xsd"

  xmlDoc.appendChild root

  Dim invoiceElement As Object
  Set invoiceElement = xmlDoc.createElement("cbc:CustomizationID")
  invoiceElement.Text = "urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0"
  root.appendChild invoiceElement

  Set invoiceElement = xmlDoc.createElement("cbc:ProfileID")
  invoiceElement.Text = "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0"
  root.appendChild invoiceElement

End Sub

Mit diesem Wurzelknoten haben wir das komplette Gerüst der UBL XRechnung erstellt. Jetzt müssen noch alle anderen Informationen an den root-Knoten gebunden werden. Dazu gehören Rechnungsnummer

Set invoiceElement = xmlDoc.createElement("cbc:ID")
invoiceElement.Text = InvoiceInfo.Number
root.appendChild invoiceElement

, das Rechnungsdatum

Set invoiceElement = xmlDoc.createElement("cbc:IssueDate")
invoiceElement.Text = InvoiceInfo.Date
root.appendChild invoiceElement

und vieles mehr (s. Bild oben hier die ersten zwei Elemente links unter Invoice).  

Genau so wie das erstellen der XML-Datei funktioniert auch das Lesen der Datei. Wenn ihr eine XML Datei habet könnt ihr die Datei direkt mit 

Set xmlDoc = CreateObject("MSXML2.DOMDocument")
xmlDoc.Load xmlFile

einlesen oder wenn ihr ein PDF habt eben mit der oben beschriebenen Funktion das XML extrahieren und mit diesem Befehl dem xmlDoc zur Verfügung stellen:

Set xmlDoc = CreateObject("MSXML2.DOMDocument")
xmlDoc.loadXML strStream

Danach z.B. mit

Set xmlNode = xmlDoc.selectSingleNode("//cbc:ID")
If Not xmlNode Is Nothing Then strRANR = xmlNode.Text

die Rechnungsnummer auslesen und ggf. in einer Tabelle speichern.

Wer bis hier hin gelesen hat kann sich nun sicherlich den Aufwand vorstellen eine komplette Klasse für mindestens ein E-Rechnungsformat zu schreiben und dazu noch zwei Routinen um CII und UBL lesen zu können. Vermutlich habt ihr es euch schon  gedacht – ich habe mir diese Arbeit bereits gemacht. Es wäre also unfair euch nicht ein komplettes Werkzeug zum schreiben, lesen und verarbeiten an die Hand zu geben. Wer eine Access (32Bit) Demo mit der Ihr Rechnungen erstellen und einlesen könnt haben möchte füllt bitte das Formular aus:

Bitte aktiviere JavaScript in deinem Browser, um dieses Formular fertigzustellen.
Name

Eine 64-Bit Version stelle ich auf Anfrage gerne zur Verfügung. 

Für den offenen Quellcode würde ich um einen Betrag von 250€ zzgl, MwSt. (297,50€ brutto) bitten, für den ihr natürlich eine Factur-X Rechnung bekommt 🙂

Übrigens die MFB Klassen und Module sind auch Excel geeignet. Getestet in einem XLSM unter Excel 2016.

Factur-X oder ZUGFeRD

Stimmt ja, da war noch was. Wie bekomme ich den nun eigentlich das XML in das PDF. Meinen schicken Rechnungsbericht habe ich ja schon erstellt und als PDF speichern geht ja z.B. über 

DoCmd.OutputTo acOutputReport, "rep_Rechnung", acFormatPDF, "RA.pdf"

Wir wissen aber, dass das keine E-Rechnung ist und somit nur an Privatpersonen mit deren Einverständnis gesendet werden darf.

Für eine Factur-X Rechnung brauchen wir also nicht nur ein PDF sondern ein PDF mit Anhang. Das heißt dann PDF/A. Das A steht für Advanced also erweitert. Nun hat auch hier das Access Team vergessen uns wie in allen anderen Office-Programmen diesen Schalter zur Verfügung zu stellen und wir müssen unserem PDF-Export das über die Registry sagen. Das funktioniert z.B. so:

Sub PDFA_Setzen()
On Error Resume Next
Dim ws As Object
Set ws = CreateObject("WScript.Shell")
ws.RegWrite "HKCU\Software\MicroSoft\Office\" & Application.Version & "\Common\FixedFormat\LastISO19005-1", 1, "REG_DWORD"
If Err.Number <> 0 Then MsgBox "Fehler beim Setzen des Registry-Eintrags für die PDF/A-Kompatibilität!", vbInformation
Set ws = Nothing
End Sub

Danach produziert unser Befehl

DoCmd.OutputTo acOutputReport, "rep_Rechnung", acFormatPDF, "RA.pdf"

automatisch ein PDF/A1 Dokument.

Für das zusammenfügen unseres XML Elements mit dem PDF müssen wir das XML noch als speichern. z.B. mit dem Befehl 

xmlDoc.Save "RA.xml"

Da wir in Access leider auch keine Möglichkeit haben die beiden Dateien nun zusammen zu fügen brauchen wir ein weiteres Werkzeug. Ich habe jahrelang das bis 100 pro Tag freie Kommandozeilentool von intarsys benutzt und wollte das eigentlich hier verlinken. Darf ich aber nicht, weil in den Lizenzbedingungen steht ihr müsst es von deren Seite runterladen. Da ist es aber nicht mehr aufzufinden. Es gibt aber ein  Projekt namens Mustang. Die haben in Java eine Bibliothek geschrieben, die man per Kommandozeile aufrufen kann. Diese Bibliothek habe ich mit Launch4J in eine EXE Datei gekapselt. Damit könne wir ohne aufwendige Installation einfach per Shell Befehl die EXE aufrufen. Einfach das ZIP-File irgendwo hin extrahieren und z.B. so aufrufen:

Shell "mustang.exe --disable-file-logging --action combine -source ""RA.pdf"" -source-xml ""RA.xml"" -out ""RA_A3.pdf"""

Das Output-Element ist dann eine Factur-X oder ZUGFeRD Rechnung die ihr sowohl an Privatpersonen als auch an Firmen senden könnt. Download Mustang.zip (264 MB)

Wem das zu viel ist hier die „abgespeckte“ Variante in C#.Net 6.0 mit der ihr ZUGFeRD Rechnungen erstellen und das XML extrahieren könnt. Ebenfalls basierend auf dem Mustang-Projekt. Download MFB_ZUGFeRD (19MB)

Die Aufrufe hier:

MFBZUGFeRD.exe action:combine sourcePDF:“C:\Meine PDFs\Rechnung.pdf“ sourceXML:“C:\Meine XMLs\Rechnung.xml“ output:“C:\Meine Rechnungen\Rechnung.pdf“
MFBZUGFeRD.exe action:extract sourcePDF:“C:\Meine PDFs\Rechnung.pdf“ output:“C:\Meine XMLs\Rechnung.xml“

So nun viel Spaß mit eurem neuen Wissen. Bei Fragen oder Anregungen könnt ihr mir gerne mailen unter fried@eudatabase.de