Auf dieser Seite
Die kurze Antwort
PEPPOL-EN16931-R046 schlägt fehl, wenn das cac:AllowanceCharge innerhalb von cac:Price in cbc:BaseAmount einen Bruttopreis angibt und cbc:PriceAmount nicht genau dieser Bruttopreis minus dem Rabatt in cbc:Amount ist. Korrigieren Sie diejenige der drei Zahlen, die falsch ist, sodass Nettopreis = Bruttopreis - Rabatt gilt.
Der Vergleich ist exakt. Schon eine Abweichung in der vierten Nachkommastelle schlägt fehl.
Was die Regel prüft
Die Regel läuft für das cac:AllowanceCharge innerhalb von cac:Price, nicht für Nachlässe auf Positions- oder Dokumentenebene.
Hat dieses Element kein cbc:BaseAmount, ist kein Bruttopreis angegeben, und die Regel besteht, ohne etwas zu vergleichen. Mit dem Validator bestätigt.
Andernfalls muss das benachbarte cbc:PriceAmount gleich cbc:BaseAmount minus cbc:Amount sein. Die Werte werden als Dezimalzahlen verglichen, ohne Rundung und ohne Toleranz. Bei einem Rabatt von 2.5 und einem Nettopreis von 12.5 lehnt der Validator einen Bruttopreis von 15.01, 14.99 und 15.0001 ab.
Da numerisch verglichen wird, spielen Nullen am Ende keine Rolle: 12.50 und 15.00 verhalten sich wie 12.5 und 15.
| Begriff | Bedeutung | UBL-Element |
|---|---|---|
| BT-146 | Nettopreis des Artikels | cac:InvoiceLine/cac:Price/cbc:PriceAmount |
| BT-147 | Rabatt auf den Artikelpreis | cac:InvoiceLine/cac:Price/cac:AllowanceCharge/cbc:Amount |
| BT-148 | Bruttopreis des Artikels | cac:InvoiceLine/cac:Price/cac:AllowanceCharge/cbc:BaseAmount |
Wie es in einer Integration dazu kommt
Mögliche Ursachen, abgeleitet aus der Form der Regel und nicht aus gemessener Nutzung:
- Der Nettopreis wird auf zwei Nachkommastellen gerundet, während Bruttopreis und Rabatt mehr behalten, oder umgekehrt, sodass die Subtraktion nicht mehr genau aufgeht.
- Der Rabatt wird als Prozentsatz des Bruttopreises berechnet und gerundet, der Nettopreis dagegen getrennt aus ungerundeten Zahlen ermittelt.
- Der Bruttopreis stammt aus der aktuellen Preisliste, Nettopreis und Rabatt aus dem Auftrag, und der Listenpreis hat sich inzwischen geändert.
- Ein Rabatt für die gesamte Position wird in den Nachlass auf Preisebene geschrieben, der ein Rabatt je Basismenge des Preises ist.
- Eine Subtraktion in binärer Gleitkommaarithmetik ergibt einen Wert wie 12.499999, der unverändert serialisiert wird.
So korrigieren Sie das Dokument
- Lesen Sie für die Position aus dem Befund
cbc:PriceAmountsowiecbc:BaseAmountundcbc:Amountdes Nachlasses innerhalb voncac:Price. - Behandeln Sie den Nettopreis als Bezugspunkt: Aus ihm wird der Nettobetrag der Position berechnet. Stimmen die Beträge der Position, ist der Bruttopreis oder der Rabatt der zu korrigierende Wert.
- Leiten Sie eine Zahl mit Dezimalarithmetik aus den beiden anderen ab, statt alle drei unabhängig voneinander zu beziehen, zum Beispiel Rabatt = Bruttopreis - Nettopreis, und serialisieren Sie mit so vielen Nachkommastellen, dass nichts verloren geht. Diese Regel beschränkt Preise nicht auf zwei Nachkommastellen.
- Kann das Quellsystem keinen verlässlichen Bruttopreis liefern, lassen Sie das
cac:AllowanceChargeauf Preisebene weg und übermitteln Sie nur den Nettopreis. Die Position ist auch ohne es gültig.
Das aufgezeichnete Beispiel hat einen Nettopreis von 12.5 und einen Rabatt auf den Preis von 2.5.
Fehlerhaft: Bruttopreis 16 - Rabatt 2.5 = 13.5, übermittelter Nettopreis 12.5 Korrigiert: Bruttopreis 15 - Rabatt 2.5 = 12.5, übermittelter Nettopreis 12.5
Vorher und nachher
Dies sind Ausschnitte, keine vollständigen Dokumente. Die vollständigen synthetischen Dokumente, aus denen sie stammen, sind unten verlinkt.
Ausschnitt der fehlerhaften Rechnungsposition: 16 minus 2.5 ergibt 13.5, nicht den Nettopreis von 12.5
<cac:Price>
<cbc:PriceAmount currencyID="GBP">12.5</cbc:PriceAmount>
<cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:Amount currencyID="GBP">2.5</cbc:Amount>
<cbc:BaseAmount currencyID="GBP">16</cbc:BaseAmount>
</cac:AllowanceCharge>
</cac:Price>Ausschnitt der korrigierten Rechnungsposition: 15 minus 2.5 ergibt 12.5
<cac:Price>
<cbc:PriceAmount currencyID="GBP">12.5</cbc:PriceAmount>
<cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:Amount currencyID="GBP">2.5</cbc:Amount>
<cbc:BaseAmount currencyID="GBP">15</cbc:BaseAmount>
</cac:AllowanceCharge>
</cac:Price>Nur der Bruttopreis in cbc:BaseAmount unterscheidet sich: 16 im fehlerhaften Dokument, 15 im korrigierten. Das fehlerhafte Dokument meldet nur PEPPOL-EN16931-R046. Der Nettobetrag der Position von 25.00 wird aus dem Nettopreis von 12.5 und einer Menge von 2 berechnet; der falsche Bruttopreis beeinflusst daher keine andere Summe.
Was der Validator gemeldet hat
- Die fehlerhafte Rechnung meldet PEPPOL-EN16931-R046. Das korrigierte Dokument besteht jeden Prüfschritt ohne Befunde.Fehlerhaftes XML herunterladenKorrigiertes XML herunterladen
Aufgezeichnet mit phive 12.1.0 / phive-rules-peppol 4.5.6 / Saxon-HE 12.10, der Engine hinter dem kostenlosen Validator, mit synthetischen Daten. Ein aufgezeichnetes Ergebnis ist ein Regressionsnachweis für diese Dokumente, keine Zertifizierung.
Wo die Regel gilt
- Gilt für den Preis einer
cac:InvoiceLinein einerInvoiceund einercac:CreditNoteLinein einerCreditNote. Mit dem Validator für eine Gutschrift bestätigt. - Bruttopreis und Rabatt auf den Preis sind informativ.
PEPPOL-EN16931-R120berechnet den Nettobetrag der Position nur aus dem Nettopreis und zieht den Rabatt auf Preisebene nicht noch einmal ab. - Innerhalb von
cac:Pricewird nur ein Nachlass akzeptiert. Wird dortcbc:ChargeIndicatorauftruegesetzt, meldet dasPEPPOL-EN16931-R044. - Die vollständige Prüfkette weist ein
cac:AllowanceChargeauf Preisebene ohnecbc:Amountbereits im XSD-Prüfschritt ab, bevor diese Regel läuft.
Verwandte Regeln
- PEPPOL-EN16931-R120 berechnet den Nettobetrag der Position aus dem Nettopreis
- PEPPOL-EN16931-R121 verlangt eine Basismenge zum Artikelpreis größer als null
- BR-27 lehnt einen negativen Nettopreis ab
- PEPPOL-EN16931-R040 ist die Betragsprüfung für Nachlässe auf Positions- und Dokumentenebene, die 0.02 Toleranz zulässt
- Alle Regeln der Referenz ansehen
- Hintergrund (auf Englisch): How Peppol invoice validation actually works
Umfang und Quelle
Geschrieben für Peppol BIS Billing 3.0.21 (May 2026), EN 16931 1.3.16, angewendet auf Invoice- und CreditNote-Dokumente in UBL 2.1. Andere Profile, Syntaxen und Releases können diese Kennung anders definieren. Version des Hinweiskatalogs 2026-09-24.1: Quelle geprüft am 2026-09-24, Erklärung zuletzt aktualisiert am 2026-09-20.
Die offizielle Definition von PEPPOL-EN16931-R046 (auf Englisch) enthält den normativen Wortlaut und den Test. Diese Seite ist unsere Erklärung dazu, keine Kopie.
Die Erklärung ändert das Urteil der Engine nicht. Dass Sie diesen Befund beheben, heißt nicht, dass das Dokument jeden Prüfschritt besteht. Die Validierung bescheinigt keine rechtliche oder steuerliche Konformität und überträgt kein Dokument über Peppol.

