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:
| Feld | Wert | Bedeutung |
|---|---|---|
| 1 | EXTF | Kennzeichnet eine EXTF-Exportdatei. |
| 2 | 700 | Header-Version. |
| 3 | 21 | Formatkategorie für Buchungsstapel. |
| 4 | Buchungsstapel | Formatname. |
| 5 | 13 / 12 | Datenformatversion: 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"
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.
| Konstante | DATEV-Wert |
|---|---|
FINANCIAL_ACCOUNTING | 1 |
ANNUAL_FINANCIAL_STATEMENTS | 2 |
| Konstante | DATEV-Wert |
|---|---|
INDEPENDENT | 0 |
TAX_LAW | 30 |
CALCULATION | 40 |
COMMERCIAL_LAW | 50 |
IFRS | 64 |
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
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.