Formatreferenz · EXTF · 0.2.0

Die Zeile vor den Überschriften.

Eine Buchungsstapel-Datei beginnt mit einem Verwaltungssatz, dessen Aufbau nichts mit den darunter liegenden Buchungszeilen zu tun hat. Fehler hier sind der häufigste Grund, warum ein sonst korrekter Export abgelehnt wird.

Drei Sätze, zwei Formen

Eine vollständige Datei besteht aus drei Schichten: dem EXTF-Verwaltungssatz, der exakten versionierten Spaltenüberschrift und den Buchungszeilen. Nur die letzten beiden teilen ihre Form. Der Verwaltungssatz hat immer 31 Felder, unabhängig von der Formatversion.

Die ersten fünf Felder sind feste Kennungen. An ihnen erkennt ein Leser die Datei überhaupt erst:

Feste Kennfelder des Verwaltungssatzes
FeldWertBedeutung
1EXTFKennzeichnet eine EXTF-Exportdatei.
2700Header-Version.
321Formatkategorie für Buchungsstapel.
4BuchungsstapelFormatname.
513 / 12Datenformatversion: 13 oder 12.

Ein echter Verwaltungssatz

Diese Zeilen erzeugt die Bibliothek selbst, aus Metadaten mit festem Zeitstempel, damit die Ausgabe reproduzierbar ist.

Formatversion 13

"EXTF";700;21;"Buchungsstapel";13;20260812093000000;;"RE";"my_application";"";1001;1;20260101;4;20260801;20260831;"August 2026";"";1;0;1;"EUR";;"";;;"";;;"";"my-application"

Formatversion 12 — identisch bis auf Feld 5

"EXTF";700;21;"Buchungsstapel";12;20260812093000000;;"RE";"my_application";"";1001;1;20260101;4;20260801;20260831;"August 2026";"";1;0;1;"EUR";;"";;;"";;;"";"my-application"
Leer ist nicht dasselbe wie fehlend

Reservierte Felder werden als leere Zellen geschrieben, und Textfelder bleiben auch leer gequotet. Ein Feld wegzulassen statt es zu leeren verschiebt jedes folgende Feld um eine Position.

Formate, über die man stolpert

  • Der Erstellungszeitstempel nutzt yyyyMMddHHmmssSSS — 17 Ziffern inklusive Millisekunden, ungequotet.
  • Wirtschaftsjahresbeginn und Buchungszeitraum nutzen yyyyMMdd, ungequotet.
  • Textfelder werden gequotet, auch die vorgesehenen leeren. Ein Anführungszeichen in der Anwendungsinformation wird durch Verdopplung maskiert.
  • Numerische Felder bleiben ungequotet, einschließlich Berater- und Mandantennummer.

Die kodierten Felder

Vier Felder nehmen Werte aus einer geschlossenen Menge statt freier Eingabe.

Buchungstyp
KonstanteDATEV-Wert
FINANCIAL_ACCOUNTING1
ANNUAL_FINANCIAL_STATEMENTS2
Rechnungslegungszweck
KonstanteDATEV-Wert
INDEPENDENT0
TAX_LAW30
CALCULATION40
COMMERCIAL_LAW50
IFRS64

Aufbau aus Java

Die Metadaten werden einmal je Datei gebaut und bei der Konstruktion validiert, sodass eine unmögliche Kombination scheitert, bevor eine Zeile geschrieben wird. Der Builder wählt die Formatversion, und der Exporter lehnt einen Verwaltungssatz ab, dessen Version nicht zur Überschrift passt.

import io.github.mrtyldr.datev.core.DatevMetadata;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Currency;

DatevMetadata metadata = DatevMetadata.bookingBatchV13()
        .createdAt(LocalDateTime.now())
        .origin("RE")
        .exportedBy("my_application")
        .advisorNumber(1001)
        .clientNumber(1)
        .fiscalYearStart(LocalDate.of(2026, 1, 1))
        .accountLength(4)
        .period(LocalDate.of(2026, 8, 1), LocalDate.of(2026, 8, 31))
        .description("August 2026")
        .currency(Currency.getInstance("EUR"))
        .applicationInformation("my-application")
        .build();

String record = metadata.toCsvLine();   // the 31-field management record
Eine Version je Datei

Ein v12-Verwaltungssatz lässt sich nicht mit der 125-spaltigen v13-Überschrift kombinieren. Der Builder weist die Abweichung zurück, statt eine Datei zu schreiben, die kein Importeur deuten kann.