Zum Inhalt springen
Smart Templates Handbuch Website Handbuch für die KI

Vorlagenformat

Kurz gesagt

Jede Vorlage ist eine JSON-Datei. Der Designer schreibt sie, der Druck liest sie. Mit »Exportieren« laden Sie die Datei herunter, mit »Importieren« laden Sie eine Datei wieder in den Designer. Diese Seite beschreibt jeden Schlüssel: was er bewirkt, welche Werte erlaubt sind und was gilt, wenn er fehlt.

Aufbau auf einen Blick

Eine Vorlage ist ein JSON-Objekt. Die wichtigsten Schlüssel an der Wurzel:

  • name, culture und die Zahlen- und Datumseinstellungen,
  • page: Blattgröße und Ränder,
  • brand: Standardschrift und Zeilenabstand,
  • sources: die Datenquellen mit Beziehungen und Regeln,
  • variables: eigene Variablen,
  • body: alles, was auf dem Blatt steht (Texte, Bilder, Codes, Gruppen, Tabellen, Formen, Seitenumbrüche),
  • eRechnung: wenn eingeschaltet, die E-Rechnung zum Beleg (Zuordnung zu einem Standard).
JSONKleinste vollständige Vorlage
{
  "name": "Sample",
  "culture": "en-US",
  "page": { "widthMm": 210, "heightMm": 297 },
  "body": []
}

Grundregeln

  • Schreibweise: Schlüssel in camelCase, genau wie in den Tabellen. Der Druck liest viele Schlüssel auch in anderer Groß- und Kleinschreibung, der Designer nicht. Werte von type (zum Beispiel "Group") unterscheiden Groß und Klein immer.
  • Einheiten: Lagen und Größen in Millimetern (Schlüssel enden auf Mm), Strichstärken und Schriftgrößen in Punkt (Pt), Drehung in Grad (rotDeg).
  • Zahlen als Zahlen: "xMm": 10, nicht "xMm": "10". Nur unter page wandelt der Designer Zahlentext um.
  • Farben: #RGB, #RRGGBB oder #RRGGBBAA (das # darf fehlen) oder eine Farbvariable {{@Name}}. Farbnamen wie red gelten als »keine Farbe« und werden gemeldet.
  • Fehlt ein Schlüssel, gilt seine Vorgabe. null überschreibt keine Vorgabe.
  • Unbekannte Schlüssel sind kein Fehler, sie wirken aber nicht. Der Druck meldet sie als Warnung (an der Wurzel, unter page und page.margins, an jedem Objekt, in style, columns[], variables[] und sources[]). Unter brand, page.border, rows, cells, bild, anchor, sorts, borders, variants, in Wenn-Dann-Zweigen sowie in relations[], fields[] und rules[] (samt select, group, vars) werden sie still übergangen.
  • Schlüssel mit _ am Anfang sind Vermerke des Designers. Sie wirken nicht und werden nicht gemeldet (außer unter page und page.margins). Schreiben Sie keine eigenen.
  • Strenges JSON: keine Kommentare, kein Komma am Ende, ohne BOM. Höchstens 128 JSON-Ebenen; jede Gruppe zählt zwei, das reicht für rund 60 ineinanderliegende Gruppen.

Gut zu wissen

Der Designer baut beim Öffnen manche Altformen um (zum Beispiel "Band" zu "Group" oder eine Tabelle direkt auf einer Beziehung zu einer Tabelle auf einer Regel). Gedruckt wird die umgebaute Form erst, nachdem die Vorlage im Designer gespeichert wurde.

Die Wurzel

SchlüsselTypVorgabeBedeutung
nameText–Name der Vorlage. In Dynamics gilt der Name des Datensatzes.
cultureTextde-DESprache der Vorlage: Datum, Monatsnamen, Ja/Nein-Wörter, Zahlenstil; solange optionLabelLanguage leer ist, auch die Sprache der Optionslabels. Ein unbekannter Code druckt deutsch, mit Warnung. Die Oberfläche bietet de-DE, de-AT, de-CH, en-US, en-GB.
dateFormatTextKurzformat der Sprache (d)Format für Datumswerte ohne eigenes Muster. .NET-Muster wie dd.MM.yyyy oder %%benutzer (Format des druckenden Benutzers).
dateTimeFormatTextgDasselbe für Datum mit Uhrzeit, zum Beispiel dd.MM.yyyy HH:mm.
currencySymbolWert mit Wenn-Dann€Währungssymbol für {{Currency:…}}; steht mit geschütztem Leerzeichen hinter dem Betrag. Leer heißt €, nicht »ohne Symbol«. Darf ein Platzhalter sein, gelesen am Hauptdatensatz.
currencyDecimalsWert mit Wenn-Dann2Nachkommastellen für Währung, 0 bis 10. Gilt nicht für {{Number:…}}. Darf wie currencySymbol ein Platzhalter sein, gelesen am Hauptdatensatz.
numberStyleWert mit Wenn-Dannaus cultureLänderstil: de 1.234,56 · en 1,234.56 · fr 1 234,56 · ch 1'234.56 · plain 1234.56.
thousandSeparatorWert mit Wenn-Dannleeran, aus oder leer. Leer: automatische Stellen ohne Trenner, feste Stellen mit Trenner.
optionLabelLanguageWert mit Wenn-DannleerSprache der Optionslabels: in welcher Sprache Auswahl-, Mehrfachauswahl-, Ja/Nein-, Status- und Statusgrund-Felder aus Dynamics ihre Beschriftung drucken. Die Kennung der Sprache in Dynamics als Text ("1031" Deutsch, "1033" Englisch; der Designer bietet die installierten Sprachen an) oder ein Kürzel wie en-US. Leer: die Sprache aus culture (de-AT und de-CH gelten als Deutsch, en-GB als Englisch). Fehlt eine Beschriftung in dieser Sprache oder ist die Sprache in Dynamics nicht installiert, druckt die Grundsprache der Umgebung. Kein Platzhalter; ein Wert, der keine Sprache ist, gilt als leer und wird als Warnung gemeldet. Bedingungen vergleichen weiter mit der Beschriftung in der Sprache des Benutzers, der den Beleg erzeugt.
orphanLinesZahl2Mindestzeilen eines geteilten Textes je Seite.
minPagesZahl0Mindestseitenzahl; fehlende Seiten kommen leer dazu (höchstens 200).
repeatTableHeaderJa/NeintrueVorgabe für alle Tabellen: Kopfzeile auf Folgeseiten wiederholen.
pdfNameWert mit Wenn-DannleerPDF-Name: der Name der Datei ohne .pdf, ein Text mit Platzhaltern wie im Dokument, etwa "Rechnung {{invoicenumber}}". Ausgewertet einmal je Dokument am Hauptdatensatz. Zeichen, die in Dateinamen nicht gehen (etwa /, : oder ?), Steuerzeichen und jeder Leerraum werden _; .pdf kommt dazu. Der Name gilt für den Anhang der E-Mail-Aktionen, den Ausgang FileName, den Download im Designer und den Titel des PDF; eine E-Rechnung »nur XML« heißt genauso mit .xml (die Datei in einem ZUGFeRD-PDF heißt immer factur-x.xml). Leer: der bisherige Name. Ergibt er für einen Datensatz nichts: der Name der Vorlage wie im E-Mail-Anhang. Der Designer setzt bei einer neuen Vorlage {{<Namensfeld der Hauptquelle>}} ein.
pdfNameMaxZahl200Höchstens so viele Zeichen für pdfName; danach wird abgeschnitten, .pdf zählt nicht mit. 1 bis 200, mehr gilt als 200.
pageObjektA4, Ränder 18/15/18/20Blatt, siehe unten.
brandObjektArimo, Zeilenabstand 1Schrift und Zeilenabstand, siehe unten.
sourcesListe–Datenquellen, siehe unten. Ohne Hauptquelle fragt der Designer beim Öffnen danach.
variablesListe–Eigene Variablen, siehe unten.
bodyListe[]Die Objekte auf dem Blatt, siehe unten.
eRechnungObjekt–Die E-Rechnung zum Beleg: welcher Standard, welche Ausgabe und welcher Wert in welche Angabe, siehe »E-Rechnung (eRechnung)«.
wahlenObjekt–Wenn-Dann-Wahl der E-Mail-Vorlage für Buttons in Dynamics: { "mailvorlage": { "faelle": [ { "wenn": Bedingung, "dann": Kennung der E-Mail-Vorlage } ], "sonst": Kennung } }. Der erste zutreffende Fall gewinnt, sonst gilt sonst; ein Fall ohne dann wird übergangen. Ausgewertet am Hauptdatensatz, wenn der Beleg entsteht; genutzt wird das Ergebnis nur, wenn ein Button oder die Aktion st_CreateEmail bzw. st_SendEmail keine EmailTemplateId mitgibt (eine mitgegebene E-Mail-Vorlage hat Vorrang). Wirkt nicht auf den Beleg.
varLabelsObjekt–Anzeigenamen von Variablen im Designer, { "Pfad": "Anzeigename" }. Wirkt nicht auf den Druck.
guidesOffJa/NeinfalseHilfslinien im Designer aus. Wirkt nicht auf den Druck.

Diese Schlüssel kommen vor, sollen aber nicht geschrieben werden: templateId, version, rendererVersion und dataSource (ohne Wirkung), warmhalten und istAktiv (Spiegel von Spalten des Datensatzes), pageHeader und pageFooter (Altform, wird beim Lesen zu Wiederhol-Gruppen umgebaut).

Blatt und Ränder (page)

SchlüsselTypVorgabeBedeutung
widthMmZahl210Blattbreite. Das Blatt entsteht nur aus widthMm und heightMm; Querformat heißt vertauschte Maße.
heightMmZahl297Blatthöhe.
sizeTextA4Nur eine Beschriftung (A4, A3, A5, Letter, Legal, custom). Setzt kein Maß.
sizeNameText–Merker der Auswahl im Designer, gleiche Werte wie size.
marginsObjekt18/15/18/20Seitenränder: topMm, rightMm, bottomMm, leftMm. Kurzformen wie top werden nicht gelesen.
ignoreMarginsJa/NeinfalseAlle Ränder zählen 0 (die Werte bleiben gespeichert).
borderObjekt–Rahmen um jede Seite, siehe nächste Tabelle.
Schlüssel in page.borderTypVorgabeBedeutung
enabledJa/NeinfalseHauptschalter.
colorFarbe#333333Strichfarbe.
widthPtZahl1Strichstärke; 0 druckt keinen Rahmen.
insetMmZahl0Abstand vom Blattrand.
firstSpecial, lastSpecialJa/NeinfalseErste beziehungsweise letzte Seite bekommt einen eigenen Rahmen.
first, lastObjekt–Dieser eigene Rahmen: enabled (Vorgabe true), color, widthPt, insetMm. Er erbt nichts vom Hauptrahmen.

Schrift und Zeilenabstand (brand)

SchlüsselTypVorgabeBedeutung
bodyFontTextArimoStandardschrift für Text ohne eigene Schrift und für style.font = "body". Eine Schrift muss in Dynamics hochgeladen sein; fehlt sie, druckt Arimo mit Warnung.
headingFontTextArimoSchrift für style.font = "heading". Der Designer setzt beide gleich.
lineSpacingZahl1Standard-Zeilenabstand, höchstens 5.
listIndentMmZahl5Einzug je Aufzählungsstufe, höchstens 20.

logoAssetId, accentColor, accentColor2 und headingColor kommen in älteren Vorlagen vor und wirken auf den Druck nicht.

Werte mit Wenn-Dann

currencySymbol, currencyDecimals, numberStyle, thousandSeparator, optionLabelLanguage und pdfName stehen als Objekt mit festem Wert und Zweigen. Ein blanker Wert ("currencySymbol": "$") wird ebenfalls gelesen und gilt als fester Wert ohne Zweige.

JSONWert mit Wenn-Dann
"currencySymbol": { "value": "€", "rules": [ { "when": "country == 'US'", "value": "$" } ] }
SchlüsselTypBedeutung
valueTextGilt, wenn kein Zweig zutrifft.
rulesListeZweige { "when": Bedingung, "value": Wert }. Der erste Zweig mit leerer oder wahrer Bedingung gewinnt.
  • Ausgewertet wird einmal je Dokument am Hauptdatensatz.
  • In der Bedingung gelten auch eigene Variablen (@Name), im Wert ebenso ({{@Name}}). Hängt eine solche Variable selbst von dieser Einstellung ab (Kreis), gilt die Wahl mit den festen Werten der Vorlage, und das Dokument meldet eine Warnung (»template setting '…' is circular«).
  • Ein zutreffender Zweig mit leerem Wert liefert die eingebaute Vorgabe (€, 2 Stellen, Stil der Sprache, bei optionLabelLanguage die Sprache aus culture, bei pdfName den Namen der Vorlage wie im E-Mail-Anhang), nicht den festen value.
  • optionLabelLanguage mit { "value": "", "rules": [ { "when": "country == 'US'", "value": "1033" } ] } druckt die Optionslabels für Kunden in den USA englisch, sonst in der Sprache aus culture.
  • pdfName mit { "value": "Rechnung {{invoicenumber}}", "rules": [ { "when": "country == 'US'", "value": "Invoice {{invoicenumber}}" } ] } nennt die Datei für Kunden in den USA Invoice_R-1.pdf, sonst Rechnung_R-1.pdf.
  • Der Haken »Währung aus dem Datensatz übernehmen« hat keinen eigenen Schlüssel. Er besteht aus einer Beziehung der Hauptquelle mit "kind": "lookup" auf transactioncurrency (vom deutschen Designer Waehrung genannt) und dem festen Wert {{Waehrung.currencysymbol}} in currencySymbol sowie {{Waehrung.currencyprecision}} in currencyDecimals; trägt die Beziehung einen anderen Namen, steht dieser im Platzhalter. Der Designer erkennt den Haken an dieser Beziehung und am Platzhalter in currencySymbol. Lassen Sie beides stehen.

Eigene Variablen (variables)

Eine eigene Variable hat überall im Dokument einen einzigen Wert. Im Text heißt sie {{@Name}}, in Bedingungen @Name.

SchlüsselTypVorgabeBedeutung
nameTextPflichtEindeutig; Groß und Klein zählen; Leerzeichen sind erlaubt, { } | : nicht. Bei doppelten Namen gilt der erste, mit Meldung.
typeTexttexttext, number, currency, boolean, date oder color. Immer angeben. Nur number und currency rechnen.
defaultText–Wert, wenn kein Zweig zutrifft. Text oder Formel mit {{…}}; bei number und currency auch ein blankes sum(quote_details.amount) (über eine Beziehung, nicht über ein Regel-Ergebnis), bei date ein blankes dateadd(…).
rulesListe–Zweige { "when": Bedingung, "value": Wert }; der erste zutreffende gewinnt. Ein Treffer mit leerem Wert ergibt LEER.
symbolTextVorlageNur currency: eigenes Währungssymbol (darf ein Platzhalter sein).
decimalsTextVorlageNachkommastellen 0 bis 10. Leer: bei currency die Stellen der Vorlage, bei number automatisch bis 4.
numberStyleTextVorlagede, en, fr, ch oder plain.
thousandSeparatorTextVorlagean, aus oder leer.
  • Alle eigenen Variablen werden einmal je Dokument am Hauptdatensatz gerechnet, nachdem die Daten geladen sind und bevor die erste Regel läuft. Sie sehen deshalb keine Regel-Ergebnisse.
  • Ein Kreis (A liest B, B liest A) macht alle Beteiligten leer und wird gemeldet.
  • Anzeige je Typ: number im Zahlenstil, currency mit Symbol, date im dateFormat, boolean als Ja/Nein der Vorlagensprache, text und color wörtlich.
JSONEigene Variablen
"variables": [
  { "name": "PaymentTerms", "type": "text", "default": "14 days",
    "rules": [ { "when": "totalamount > 1000", "value": "30 days" } ] },
  { "name": "Gross", "type": "currency", "default": "{{sum(quote_details.baseamount)}} * 1.19" },
  { "name": "Due", "type": "date", "default": "{{dateadd(createdon, 30, day)}}" }
]

Datenquellen (sources)

sources ist eine Liste von Quellen. Die Hauptquelle ist der Datensatz, für den gedruckt wird (zum Beispiel ein Angebot). Weitere Quellen sind Listen, die unabhängig davon geladen werden (zum Beispiel alle Währungen). Unter jeder Quelle hängen Beziehungen, unter Quellen und Beziehungen hängen Regeln.

Quelle

SchlüsselTypVorgabeBedeutung
idText–Kennung, zum Beispiel src1.
nameText–Anzeigename.
primaryJa/NeinfalseHauptquelle. Setzen Sie es bei genau einer Quelle auf true. Beim Drucken gilt ohne true zwar die erste Quelle, der Designer fragt beim Öffnen aber nach einer Hauptquelle und legt dafür eine neue Quelle an.
entityTextPflichtLogischer Tabellenname, zum Beispiel quote.
basePathTextHauptquelle ""Hauptquelle: muss leer sein. Weitere Quelle: Pflicht, nicht leer; unter diesem Namen liegt ihre Liste an der Wurzel. Der Designer nimmt den Tabellennamen.
idAttrText–Primärschlüssel, zum Beispiel quoteid. Spart eine Abfrage.
fieldsListe–Benutzte Felder, siehe »Feld«. Fehlt die Liste oder ist sie leer, werden alle Spalten geholt.
relationsListe–Beziehungen.
rulesListe–Regeln an der Quelle.
sampleIdText–Beispiel-Datensatz des Entwurfs (GUID).

set, nameAttr, locked, sampleName und sampleMissing pflegt der Designer selbst.

Feld

SchlüsselTypBedeutung
nameTextPflicht: exakter logischer Spaltenname. Ein Verweis heißt _<spalte>_value (zum Beispiel _customerid_value). Für {{x_code}} und {{_x_value_id}} steht nur x beziehungsweise _x_value in der Liste.
labelTextAnzeigename; pflegt der Designer. Bei neuen Feldern weglassen.
typeTextstring, number, money, date, boolean, optionset, lookup, image oder file. Immer angeben, bei Verweisen lookup (sonst zeigt die Entwurfsfläche die GUID statt des Namens).

Achtung

Ist fields nicht leer, wird nur abgefragt, was darin steht (dazu Schlüsselspalten und Beziehungsfelder). Ein benutztes, aber nicht gelistetes Feld bleibt leer. Gewarnt wird nur bei Feldern hinter Beziehungen und in Tabellenzellen, nicht bei Feldern des Hauptdatensatzes. Listen Sie jedes benutzte Feld, auch Sortier- und Filterfelder von Regeln. Den Primärschlüssel nicht als Feld aufnehmen, er steht in idAttr.

Beziehung

SchlüsselTypBedeutung
nameTextPflicht. Der Name ist das Pfadstück im Platzhalter ({{Customer.name}}). Der Designer nimmt beim Anlegen den Navigationsnamen aus Dynamics; ältere Vorlagen tragen auch frei gewählte Namen wie Customer oder Items. Beides geht, denn geholt wird über entity und refAttr. Nur Buchstaben, Ziffern und _, eindeutig neben den Feldern und Regeln derselben Ebene.
kindTextPflicht: lookup (N:1, ein Datensatz) oder collection (1:N, eine Liste). Alles außer genau collection gilt als N:1.
entityTextPflicht: Zieltabelle (bei collection die Kindtabelle).
refAttrTextPflicht. lookup: die Verweisspalte auf der Elternzeile (zum Beispiel customerid). collection: der Fremdschlüssel auf der Kindtabelle (zum Beispiel quoteid).
idAttrTextPrimärschlüssel der Zieltabelle (spart eine Abfrage).
fields, relations, rulesListenwie bei der Quelle.

Fehlt name oder entity, wird die Beziehung still übersprungen; fehlt refAttr, mit Hinweis. Fehlt kind oder steht dort etwas anderes als collection, gilt sie als N:1. Geben Sie deshalb immer alle vier an. Geholt wird eine Beziehung nur, wenn etwas darin gebunden ist. Beziehungen werden höchstens sechs Ebenen tief geladen.

Regel

Eine Regel nimmt die Zeilen einer Liste (Beziehung collection oder weitere Quelle) und filtert, fasst zusammen, sortiert und wählt aus. Ihr Ergebnis liegt als Geschwister der Beziehung am Elternknoten unter dem Regelnamen.

SchlüsselTypVorgabeBedeutung
idText–Kennung, eindeutig in der Vorlage.
nameTextPflichtEindeutig in der ganzen Vorlage und anders als jedes Feld und jede Beziehung am Elternknoten (das Ergebnis überschreibt sie sonst). Daraus entsteht das Pfadstück: Leerraum wird _, Satzzeichen fallen weg (»Size (m²)« wird Size_m).
filterExprTextkein FilterBedingung je Zeile, ohne {{ }} (siehe »Bedingungen«).
groupObjekt–Zusammenfassen: by (Liste von Feldern der Zeile selbst, ohne Punkt-Pfad; leer = alles zu einer Zeile) und aggs (Berechnungen).
selectObjekt–Sortieren und Auswählen.
varsListe–Regel-Variablen, siehe unten.
Schlüssel in group.aggs[]Bedeutung
nameName des neuen Feldes.
fnsum, count, avg, min oder max.
fieldFeld der Zeile (auch über einen Verweis, Product.price); bei count ohne Bedeutung.
nachkommaNur sum und avg: jeder Wert wird erst auf diese Stellen gerundet, dann summiert. Eine ganze Zahl von 0 bis 6; mehr gilt als 6, eine negative Zahl wie keine Angabe, ebenso ein Wert, der keine Zahl ist (etwa "abc"); die Prüfung meldet ihn als Hinweis. Fehlt er, gelten die Stellen der Vorlage.
Schlüssel in selectBedeutung
modeleer = alle Zeilen (nur sortieren) · topN = die ersten n · first, last, nth = ein einzelner Datensatz (kein Tabellen-Inhalt). Die Auswahl kürzt nur das Ergebnis, nicht das Laden; weniger geladen wird nur über einen Filter.
nAnzahl bei topN, Position bei nth (ab 1). Eine ganze Zahl; was sich nicht als ganze Zahl lesen lässt (etwa "abc"), gilt wie keine Angabe, also 1, und die Prüfung nennt es als Hinweis.
sortsSortierstufen { "by": Feld, "dir": "asc" oder "desc" }. Leere Werte stehen immer am Ende.

Reihenfolge in einer Regel: Filter → Zusammenfassen und Berechnungen → Sortieren → Auswählen → Regel-Variablen. Nach group gibt es nur noch die by-Felder und die Berechnungen.

Schlüssel in vars[]Bedeutung
nameName des neuen Feldes in jeder Ergebniszeile.
typeImmer angeben: number oder currency rechnen, text setzt zusammen, boolean, date, color setzen Werte ein.
defaultFormel; jeder Bezug in {{ }}, zum Beispiel {{baseamount}} * 1.19.
rulesZweige { "when": Bedingung, "value": Formel }, Bedingung gegen die Zeile.

Wo das Ergebnis einer Regel liegt

Regel steht an …Ergebnis liegt unter …Beispiel
einer Beziehung direkt unter der Hauptquelledem Regelnamen an der WurzelRegel »Open« an quote_details → Open
einer Beziehung unter einem VerweisVerweisname + RegelnameRegel »Active« an den Kontakten des Kunden → Customer.Active
einer Beziehung unter einer Listedem Regelnamen in jeder Zeile der äußeren ListeRegel »Expensive« an den Chargen jeder Position → in einer Tabelle auf den Positionen itemsPath: "Expensive" (relativ)
einer weiteren Quelledem Regelnamen an der WurzelAllCurrencies
der Hauptquelle selbstdem Regelnamen an der WurzelKeyFigure (mit mode: first)

Was eine Regel sehen darf

  • Erlaubt: die eigene Zeile, Felder über Verweise, Felder der Elternzeilen bis zur Wurzel, Zusammenfassungen über eigene Unterlisten, Ergebnisse von Regeln darunter und auf derselben Beziehung, eigene Variablen, System.*.
  • Verboten: Ergebnisse von Regeln weiter oben, auch die Ergebnisse von Regeln an einer Quelle (sie liegen an der Wurzel und gelten als »über allem«), die Regel selbst, Kreise. Ein Bezug nach oben wird gelöscht und gemeldet. Ein Kreis schaltet alle Regeln ab.
  • Eine weitere Quelle wird immer ganz geladen; die Regel kürzt erst danach.
  • Eine Regel rechnet nur, wenn ihr Ergebnis irgendwo gebunden ist (Tabelle, Platzhalter, andere Regel).
  • Leer bleibt leer: Steht ein Feld auf der Zeile, ist aber leer, gilt das für diese Zeile, auch für seinen Rohwert <feld>_code; ein gleichnamiges Feld weiter oben springt nicht ein. Weiter oben gesucht wird nur, was die Zeile gar nicht hat.
JSONQuelle mit Beziehung und Regel
"sources": [ {
  "id": "src1", "name": "Quote", "entity": "quote", "primary": true, "basePath": "", "idAttr": "quoteid",
  "fields": [ { "name": "name" }, { "name": "totalamount" } ],
  "relations": [ {
    "name": "quote_details", "kind": "collection", "entity": "quotedetail", "refAttr": "quoteid",
    "fields": [ { "name": "productdescription" }, { "name": "quantity" }, { "name": "baseamount" }, { "name": "sequencenumber" } ],
    "rules": [ { "id": "r1", "name": "Items", "filterExpr": "",
                 "select": { "mode": "", "sorts": [ { "by": "sequencenumber", "dir": "asc" } ] }, "vars": [] } ]
  } ],
  "rules": []
} ]

Eine Tabelle auf dieser Regel hat "itemsPath": "Items".

Platzhalter

Ein Platzhalter steht in doppelten geschweiften Klammern im Text: {{…}}. Pfade unterscheiden Groß und Klein und bestehen aus Buchstaben, Ziffern und _, getrennt durch Punkte.

FormBeispielBedeutung
Feld{{name}}Feld der aktuellen Ebene: der Wurzel, in einer Tabellenzelle der Zeile.
über einen Verweis{{Customer.name}}Customer ist der name der Beziehung.
Anzeigename eines Verweises{{_customerid_value}}Name des verknüpften Datensatzes ohne Beziehung; {{_customerid_value_id}} ist seine GUID.
Beschriftung einer Auswahl{{statuscode}}Auswahl, Mehrfachauswahl, Ja/Nein, Status und Statusgrund aus Dynamics: die Beschriftung in der Sprache der Optionslabels (optionLabelLanguage); Mehrfachauswahl mit »; « getrennt. Auch in einer Tabellenzelle, in first(…) und in einer Gruppenzeile.
Rohwert einer Auswahl{{statuscode_code}}Zahl beziehungsweise true/false statt der Beschriftung.
Regel-Ergebnis (Einzelwert){{MostExpensive.price}}Regel mit mode: first, last oder nth.
erster Wert einer Liste{{first(Items.name)}} oder {{Items[0].name}}Eine Liste allein ({{Items}}) druckt nichts.
Zusammenfassung{{Currency:sum(Items.baseamount)}}first, sum, avg, min, max über ein Feld einer Liste, also einer Beziehung collection oder eines Regel-Ergebnisses; count auch über die Liste selbst (count(Items)).
eigene Variable{{@Gross}}Immer der Wert am Hauptdatensatz.
Datumsrechnung{{Date:dateadd(createdon, 30, day)}}siehe »Datumsrechnung«.
System{{System.Date}}, {{System.DateTime}}, {{System.Time}}, {{Date:System.Now}}, {{System.User}}Heutiges Datum und druckender Benutzer.
Seite{{Page.Current}}, {{Page.Total}}Nur im Text (auch Kopf, Fuß, Zelle), nie in Bedingungen oder Formeln.

Formatierer

Ohne Formatierer druckt ein Datum als ISO-Text und eine Zahl mit Punkt. Auswahl- und Ja/Nein-Felder aus Dynamics erscheinen mit ihrer Beschriftung (»Ja«/»Nein«, »Bezahlt«) in der Sprache der Optionslabels; echte Wahrheitswerte (_code, Regel-Variablen ohne Typ) erscheinen als True/False, eine Regel-Variable vom Typ boolean mit einem Wahrheitswert als »Ja«/»Nein« der Vorlagensprache (ihr Rohwert steht unter <Name>_code). Formatieren Sie deshalb immer. Die Namen unterscheiden Groß und Klein.

PlatzhalterWirkung
{{Currency:totalamount}}Stellen, Stil und Symbol der Vorlage (oder der Variablen). {{Currency:totalamount|USD}} setzt ein anderes Symbol.
{{Number:quantity}}Ohne Angabe so viele Stellen wie nötig, höchstens 4, ohne Tausendertrenner. {{Number:quantity|2}}: genau 2 Stellen, mit Trenner.
{{Date:createdon}}Im dateFormat der Vorlage. {{Date:createdon|de-DE|dd.MM.yyyy}} mit Sprache und eigenem Muster; {{Date:createdon||yyyy-MM-dd}} nur mit Muster.
{{DateTime:createdon}}Wie Date, mit Uhrzeit (dateTimeFormat).
{{Bool:field}}Ein Ja/Nein-Feld aus Dynamics: seine Beschriftung in der Sprache der Optionslabels, auch eine eigene wie »Unbezahlt«. Ohne Beschriftung aus Dynamics (eigene Variable, Regel-Variable, Daten ohne Dynamics): Ja/Nein in der Vorlagensprache.
{{Rich:field}}Den Feldinhalt als Auszeichnung darstellen. Sonst erscheinen Datenwerte immer wörtlich.

Wo ein Platzhalter sucht

  • Im Dokumenttext: an der Wurzel (Hauptdatensatz).
  • In einer Tabellenzelle: in der Zeile. Was die Zeile nicht hat, bleibt leer; nur eigene Variablen, System.*, Page.* und Zusammenfassungen über Pfade außerhalb der Zeile gehen an die Wurzel.
  • In einer Tabelle in einer Tabellenzelle: itemsPath und alle Pfade relativ zur äußeren Zeile.
  • Im einfachen Spaltenkopf header werden keine Platzhalter aufgelöst; dafür headerCell verwenden.

Bedingungen

Bedingungen stehen in filterExpr, in when von Wenn-Dann-Zweigen und Textversionen (variants), in visibleIf, in wenn von Bildregeln und von Fällen unter wahlen sowie in w der Zweige eines dynamischen Textes. Sie nennen Felder ohne {{ }}.

ElementBedeutung
== !=gleich, ungleich
> < >= <=größer, kleiner
contains notContains startsWith endsWithTextteil, ohne Groß und Klein; mit Leerzeichen davor und danach
&& || ! ( )und, oder, nicht, Klammern
'Text' oder "Text"Text; ein verdoppeltes Zeichen steht für sich ('O''Neill')
1.5Zahl, immer mit Punkt
true false nullWahrheitswerte, leer
@Nameeigene Variable (als ganze Seite eines Vergleichs)
sum(…) avg(…) count(…) min(…) max(…) first(…)Zusammenfassung über ein Feld einer Liste (als ganze Seite)
dateadd(…)Datumsrechnung (als ganze Seite)
  • Keine Arithmetik in Bedingungen: sum(a) * 1.19 > 5 geht nicht. Bilden Sie dafür eine Variable.
  • Nicht =, <>, &, |, AND, OR, UND, ODER oder not schreiben. Das wird gemeldet, und der Ausdruck wirkt falsch.
  • Unvollständig: Fehlt ein Teil (a == 1 &&, || b == 2, status != ohne Wert, ! ohne etwas dahinter, ()), wird das gemeldet, und der fehlende Teil gilt nie als erfüllt: a == 1 && trifft nie zu, a == 1 || nur, wenn a == 1 zutrifft. Eine ganz leere Bedingung bedeutet weiter »immer«.
  • Auswahl und Ja/Nein aus Dynamics kommen als Beschriftung an (»Aktiv«, »Ja«). Zahlen vergleichen Sie über den Rohwert mit _code: statecode_code == 0. Eine Mehrfachauswahl hat als Rohwert eine Liste von Zahlen: contoso_tags_code contains 100000001 prüft, ob diese Option gewählt ist, notContains das Gegenteil (die Zahl ohne Anführungszeichen; in Anführungszeichen vergleicht contains Text). So schreibt auch der Designer, wenn der Wert aus der Liste gewählt wird. contoso_print == true und contoso_print == false richten sich bei einem Ja/Nein-Feld aus Dynamics nach seinem Rohwert, auch bei eigenen Beschriftungen wie »Unbezahlt«; ebenso der blanke Name (contoso_print, !contoso_print) und eine Ja/Nein-Variable, die das Feld übernimmt: eine eigene druckt dann »Nein«, eine Regel-Variable druckt weiter die Beschriftung und trägt den Rohwert als <Name>_code daneben. Ohne Rohwert (eigene Daten) zählt die Beschriftung: alles außer den Nein-Wörtern ist wahr. Verglichen wird die Beschriftung in der Sprache des Benutzers, der den Beleg erzeugt, nicht die der Optionslabels, in der gedruckt wird.
  • Datum: == und != vergleichen zwei Datumswerte immer nur nach dem Kalendertag. <, > und Co. vergleichen tagesgenau, sobald eine Seite keine Uhrzeit trägt (createdon >= '2026-08-01').
  • Text: == vergleicht exakt, Groß und Klein zählen.
  • Leer prüfen: !field heißt »leer«, field heißt »ausgefüllt«. Als »leer« gelten dabei auch 0 und jede Null mit Punkt (0.00), false sowie »nein«, »no«, »off«, »n«, »non«, »nee« und »nie« (ohne Groß und Klein); »0,00« mit Komma gilt dagegen als ausgefüllt. Bei Zahlenfeldern prüft field == null sicherer auf »fehlt«. field == '' ist bei einem fehlenden Wert falsch.
  • Unbekannte Variable: Das Ergebnis ist immer Nein, auch mit ! und !=.
JSONBedingungen
"filterExpr": "statecode_code == 0 && (totalamount > 1000 || prioritycode_code == 1)"
"when": "count(quote_details) > 0 && name contains 'Ltd'"
"visibleIf": "discountamount == null"

Formeln

Formeln stehen in default und value von Variablen. Jeder Bezug steht in {{ }}. Bleiben nach dem Einsetzen nur Zahlen, + - * /, Klammern und Leerraum übrig, wird gerechnet; sonst wird der Text zusammengesetzt.

  • Dezimalzahlen mit Punkt: {{net}} * 1.19. Ein Komma (1,19) macht die Formel zu Text.
  • Ein fehlendes Feld zählt 0. Ein echter Wahrheitswert (zum Beispiel {{contoso_print_code}}) zählt 1 oder 0; das Ja/Nein-Feld selbst ist Text (»Ja«) und macht die Formel zu Text, ebenso eine Regel-Variable vom Typ boolean.
  • Ein Formatierer im Bezug gilt in einer Formel nicht: {{Currency:net}} * 2 rechnet mit net, {{Bool:contoso_print}} setzt den Wert des Felds ein (seine Beschriftung).
  • Teilen durch 0 ergibt leer, mit Meldung.
  • Es gibt keine weiteren Funktionen (round, %, ^).
  • Erst runden, dann summieren: sum und avg runden jeden Einzelwert auf die Anzeigestellen, bevor sie summieren. So stimmt die Summe mit den gedruckten Zeilen überein.

Datumsrechnung

dateadd(Basis, Anzahl, Einheit) rechnet mit ganzen Tagen, Monaten oder Jahren.

  • Basis: ein Feld, @Variable, ein ISO-Datum (2026-01-31), System.Now oder ein weiteres dateadd.
  • Anzahl: Zahl, Feld, -Feld oder @Variable; Nachkommastellen werden abgeschnitten.
  • Einheit: day (Vorgabe), month oder year (auch tag, monat, jahr).
  • Ein Monat mehr auf den 31.01. ergibt den 28.02.
  • Ergebnis ist ein ISO-Text; zum Anzeigen {{Date:dateadd(createdon, 30, day)}}.
  • dateadd steht immer allein, nichts davor oder dahinter.

Objekte im Dokument (body)

body ist eine Liste von Objekten. Jedes Objekt hat einen type. Objekte stehen auch in children einer Gruppe und in Tabellenzellen (columns[].cell, columns[].headerCell, rows[].cells[].content, subRows[].cells[].content).

typeObjekt
TextTextfeld mit Platzhaltern und Auszeichnung
ImageBild
BarcodeStrichcode, QR-Code oder GiroCode (Art in barcode.art)
GroupBehälter für andere Objekte; mit repeatEveryPage ein Kopf oder Fuß
TableDatentabelle (mit itemsPath) oder Freie Tabelle (ohne itemsPath, mit rows)
GridRaster aus Zellen, ältere Form: Im Designer lässt sich kein Raster mehr neu anlegen. Für neue Vorlagen nehmen Sie eine Freie Tabelle (Table ohne itemsPath, mit rows).
Line, Rect, Ellipse, Triangle, Star, Arrow, PolygonFormen
PageBreakSeitenumbruch, nur direkt in body

Lage und Größe

ObjektxMm zählt abyMm zählt ab
direkt in bodylinkem SeitenrandOberkante der Nutzfläche des Blattes pageIndex (oberer Rand oder Unterkante eines oben angedockten Kopfes)
Kopf oder Fuß (repeatEveryPage)linkem Seitenrandoberem Seitenrand
in einer Gruppelinker oberer Ecke der GruppeOberkante der Gruppe
in einer TabellenzelleZelle plus InnenabstandZelle plus Innenabstand
  • pageIndex: Entwurfsblatt, ab 0. Jedes Objekt direkt in body außer Kopf und Fuß braucht es. Trägt kein Objekt ein pageIndex, gilt ein älteres Modell: yMm ist dann ein Versatz im Fluss, und einige Regeln (Mitwandern, Tabellen) wirken anders. Fehlt es, legt der Designer das Blatt beim Öffnen selbst fest, und das kann den Druck ändern; die Prüfung beim Einlesen nennt es als Hinweis, eine KI-Änderung, die ein Objekt ohne pageIndex hinterlässt, wird abgelehnt (Kurzregel 9).
  • wMm: Breite. Bei einem Text Pflicht (ohne steht ein Wort je Zeile). Gruppe und Raster ohne wMm: volle Breite. Tabellen: Summe der Spaltenbreiten.
  • hMm: Höhe. heightMm ist die ältere Schreibweise und gilt nur, wenn hMm fehlt; der Designer schreibt sie bei neuen Gruppen in body (25).
  • Die Breite zwischen den Rändern eines A4-Blatts mit Hausrändern ist 175 mm.

Gemeinsame Schlüssel

SchlüsselTypVorgabeBedeutung
idText–Kennung, Ziel eines Ankers, Name in Meldungen.
placeTextsiehe untenPositionsverhalten: static (Feste Position), auto (Fließend bei Berührung), flow (Fließend).
marginTopMmZahl0Mindestabstand nach oben. Direkt in body nur bei auto, in einer Gruppe bei auto und flow.
visibleIfTextsichtbarBedingung: Objekt nur drucken, wenn wahr. Direkt in body bleibt der Platz eines ausgeblendeten Objekts frei; nichts rückt nach oben. Eine ausgeblendete Gruppe fehlt samt Inhalt. Ein Kopf oder Fuß mit falscher Bedingung fehlt auf allen Seiten und hält keinen Platz frei. Ein Blatt, auf dem nur Ausgeblendetes steht, entfällt.
keepTogetherJa/NeintrueBeim Seitenumbruch als Ganzes auf das nächste Blatt. false: darf geteilt werden (langer Text). Wirkt nur direkt in body bei Text, Gruppe und ungedrehtem Rechteck, nicht bei static und nicht bei Kopf und Fuß. In einer Gruppe entscheidet der Wert der Gruppe: Mit false an einer Gruppe mit autoHeight: true läuft auch ein Text darin über die Blattkante weiter; ein Raster darin bleibt ganz und rückt samt allem daneben auf das nächste Blatt. An Bild, Code, Linie, Formen, gedrehtem Rechteck und Raster (Grid) überhört der Druck false: Sie wandern immer als Ganzes; nur ein Raster, das höher ist als ein Blatt, wird geteilt, und zwar nur zwischen zwei Zeilen (mit Meldung).
rideAlongJa/NeintrueNur direkt in body mit pageIndex: ein Objekt, das mit mindestens 20 % seiner eigenen Fläche auf einem größeren liegt, wandert mit ihm; nicht bei static, Tabellen, Rastern und Umbrüchen, und nicht, wenn das größere selbst mitwandert. false schaltet ab.
frontRankZahl0Vordergrund-Rang −50 bis 50; höher liegt vorn.
rotDegZahl0Drehung im Uhrzeigersinn; nur Formen, Bilder und Codes (Codes nur 0, 90, 180, 270).
cornerRadiusMmZahl0Eckenradius: Rechteck, Fläche und Rahmen von Gruppe und Text, Tabellenrahmen.
styleObjekt–Schrift, Farbe, Fläche, Rahmen; siehe »Stil«.
anchorObjekt–Lage relativ zu einem Geschwister in derselben Gruppe: to (dessen id), h (alignLeft, alignRight, alignCenterH, rightOf, leftOf), v (alignTop, alignBottom, alignMiddle, below, above), dx, dy.

Fehlt place: Direkt in body verhält sich jedes Objekt wie auto. In einer Gruppe oder Zelle stehen Text, Bild, Codes und Formen fest (static), Gruppen, Tabellen und Raster wie auto. Der Designer schreibt bei neuen Texten, Bildern, Codes und Formen in body "place": "auto"; neue Gruppen, Tabellen und Umbrüche bekommen kein place.

  • static bleibt genau an seiner Stelle und darf überlappen. Ausnahmen: Eine Tabelle beginnt an ihrer Entwurfsstelle, bricht aber normal über Seiten um; ein Raster direkt in body verhält sich wie auto.
  • auto bleibt an seiner Stelle und weicht nur nach unten aus, wenn ein Objekt darüber es sonst überlappen würde.
  • flow hält den gezeichneten Abstand zum Objekt darüber und rückt um genau so viel nach unten, wie dieses wächst. Es rutscht nie nach oben. Damit es nachrückt, braucht das Objekt darüber eine gezeichnete Unterkante (Tabelle mit Daten, Gruppe mit Höhe oder Text mit autoHeight: false).

Kopf und Fuß

Eine Gruppe mit "repeatEveryPage": true erscheint auf jeder Seite. Ist ihr yMm höchstens 0.5 (sie beginnt also höchstens 0,5 mm unter dem oberen Rand), ist sie ein Kopf, und der übrige Inhalt beginnt darunter. Endet sie höchstens 0,5 mm über dem unteren Ende des bedruckten Bereichs oder tiefer, ist sie ein Fuß, und er endet darüber. Dazwischen ist sie ein frei stehender Bereich: Der übrige Inhalt setzt unter ihm fort, wenn er sonst hineinliefe, über die ganze Breite.

  • Lage des Fußes: yMm = Blatthöhe − unterer Rand − Höhe − oberer Rand. Bei A4 und Hausrändern mit 12 mm Höhe: 297 − 18 − 12 − 18 = 249.
  • pageRule: first, notFirst, last, notLast, even, odd; leer = alle Seiten.
  • excludePagesText: Seiten ausnehmen, zum Beispiel "1, 3-5".
  • reserveSpace kommt in älteren Vorlagen vor und wirkt nicht.

Text

SchlüsselTypVorgabeBedeutung
valueText–Inhalt mit Platzhaltern und Auszeichnung; \n bricht die Zeile.
wMmZahlPflichtBreite des Textfelds.
autoHeightJa/NeintrueHöhe folgt dem Text. false: hMm ist die gezeichnete Höhe (für »Fließend« und Mitwandern); gedruckt wird trotzdem der ganze Text, Rahmen und Fläche so hoch wie der Text, ein Überstand wird gemeldet.
minHeightMm, maxHeightMmZahl–Grenzen der Höhe, nur mit autoHeight: true; was über maxHeightMm geht, fällt weg und wird gemeldet.
padTopMm, padRightMm, padBottomMm, padLeftMmZahl0Innenabstand.
variantsListe–Textversionen { "when": Bedingung, "value": Text, "name": … }. Die erste zutreffende ersetzt value ganz; trifft keine zu, bleibt der Text leer. Die Version mit leerem when gehört ans Ende.

Auszeichnung in value: <b>, <i>, <u>, <sup>, <sub>, <br>, <span style="color:#C00000; font-size:12pt">, Absätze und Listen <p a="l" e="0" m="•"> (a: l, c, r, j; e: Einzugsstufe 0 bis 5; m: Marke) (Marken •, –, ▪, 1., a), i.), Links <a href="https://…"> (nur http, https, mailto, tel), Bild im Text <img k="logo_full" w="25" h="15">. Dynamischer Text: <cif d="…">Beschriftung</cif>; d ist Base64 (UTF-8) einer Liste [{ "w": Bedingung, "h": Inhalt }]. Gedruckt wird h des ersten Zweigs mit leerer oder wahrer Bedingung; trifft keiner zu, nichts. Die Beschriftung zwischen den Tags zeigt nur der Designer. Formel: <formel w="…" h="…" u="…" q="…" d="…">; q ist die LaTeX-Quelle, die Maße und d berechnet der Designer daraus. Übernehmen Sie beide unverändert; neue legt der Designer an. Andere Tags (zum Beispiel <ul>) bleiben samt Klammern als Text stehen; eine nicht erlaubte Listenmarke m="…" ergibt einen Absatz ohne Marke. rich: true schreibt der Designer selbst; der Druck braucht es nicht.

Bild

SchlüsselTypBedeutung
wMm, hMmZahlPflicht; der Rahmen des Bildes.
bildObjektDie Bildquelle, siehe unten.
Schlüssel in bildVorgabeBedeutung
artassetasset (hochgeladenes Bild), feld (Bildspalte), datei (Dateispalte), base64.
pfad–Bei asset der Schlüssel des Bildes (logo_full), sonst der Datenpfad (darf {{…}} sein).
entitaet, idFeld–Nur feld und datei: Tabelle und Schlüsselfeld der Quelle.
einpassungeinpasseneinpassen (ganz sichtbar), fuellen (Rahmen voll, Überstand fällt weg), original.
lagemittigSitz beim Einpassen: obenLinks, oben, obenRechts, links, mittig, rechts, untenLinks, unten, untenRechts.
maske–Zuschnitt: kreis, ellipse, eckenRund, dreieck, stern, vieleck.
wennKeinBildstillstill (nichts, belegt keine Höhe), notiz, platzhalter (grauer Kasten).
qualitaetoriginalNur feld: original oder niedrig.
vorschautrueNur Designer: das Bild auf der Entwurfsfläche zeigen oder einen Platzhalter.
regeln–»Außer wenn«: { "wenn": Bedingung, "dann": { "art", "pfad", … } }; die erste zutreffende wählt die Quelle.
daten–Nur beim Importieren, beim Hochladen von KI-Änderungen und bei Änderungen über den KI-Assistenten: ein neues Bild als data:-Adresse, PNG, JPEG oder SVG (data:image/png;base64,…, eine SVG-Grafik auch data:image/svg+xml;utf8,<svg …>). Der Designer nimmt ein gleiches vorhandenes Bild oder legt es in der Bilder-Ablage an (SVG als PNG), setzt dessen Kurznamen in pfad und entfernt daten. pfad ist dabei der Wunsch für den Kurznamen. Geht auch in einem Zweig von regeln.
name–Nur zusammen mit daten: der Name des neuen Bildes in der Bilder-Ablage.

Ältere Bilder tragen binding ("@logo") und fit; mit bild werden sie nicht gelesen.

Barcode, QR-Code und GiroCode

"type": "Barcode" ist ein Strichcode, ein QR-Code oder ein GiroCode (EPC-QR-Code nach EPC069-12, für SEPA-Überweisungen in Euro); welcher, sagt barcode.art. Lage, Größe, visibleIf und place wie beim Bild. Ein Code wird nie geteilt und an der Unterkante einer Gruppe mit fester Höhe nie gekürzt: passt er dort nicht ganz hinein, wird er weggelassen, und das Dokument warnt (ein GiroCode verhindert dann den Beleg).

SchlüsselTypBedeutung
wMm, hMmZahlPflicht; der Kasten. Der Code wird druckscharf eingepasst: ein Strich bzw. ein Punkt ist ein ganzes Vielfaches von 1/600 Zoll, der Code ist deshalb oft etwas kleiner als der Kasten.
rotDegZahl0, 90, 180 oder 270; gedreht wird der ganze Kasten samt Klartext.
barcodeObjektArt, Inhalt und Darstellung, siehe unten.
Schlüssel in barcodeVorgabeBedeutung
artcode128code128, ean13, ean8, code39, itf (Strichcodes), qr (QR-Code), epc (GiroCode).
wert–Nicht bei epc: der Inhalt, Text mit Platzhaltern ("{{invoicenumber}}") oder ein Wert mit Wenn-Dann wie unter »Werte mit Wenn-Dann« ({ "value": …, "rules": [ { "when": …, "value": … } ] }), ausgewertet am Objekt, in einer Tabellenzeile an der Zeile. Er kommt wörtlich in den Code, ohne Auszeichnung; ein Zahlenfeld ohne Formatierer ergibt die Zahl mit Punkt.
zahlung–Nur epc: die Felder der Überweisung, jedes wie wert: empfaenger und iban (Pflicht), bic, betrag (Zahl in Euro mit Punkt, ohne Formatierer; leer: der Zahler trägt ihn ein), verwendungszweck oder referenz (nie beide), zweckCode, hinweis, waehrung (nur Prüfung: ergibt es etwas anderes als EUR, ist der Code ungültig).
fehlerkorrekturMNur qr: L, M, Q, H. Der GiroCode hat immer M.
klartexttrueNur Strichcodes: der Inhalt lesbar unter den Strichen (Schrift: die Standardschrift der Vorlage, brand.bodyFont).
klartextPt8Schriftgröße des Klartexts, 5 bis 14.
ruhezonetrueDer weiße Rand, den Lesegeräte brauchen, liegt innerhalb des Kastens.
farbe#000000Farbe der Striche bzw. Punkte.
hintergrund#FFFFFFFläche hinter dem Code samt Ruhezone (beim Strichcode die volle Höhe des Kastens); "" = durchsichtig.
lagemittigSitz des Codes im Kasten, Werte wie bild.lage. Ein Strichcode füllt die Höhe ganz.
wennLeerstillNicht bei epc: ergibt wert nichts, still (nichts, belegt keine Höhe), notiz, platzhalter (grauer Kasten).
  • Ein ungültiger Strich- oder QR-Code (falsche EAN-Prüfziffer, ein Zeichen, das die Art nicht kann, zu langer Inhalt, Kasten zu klein) wird nicht gedruckt; die Stelle behält ihren Platz, und das Dokument warnt.
  • Ein sichtbarer, ungültiger GiroCode (zum Beispiel falsche IBAN-Prüfziffer, Betrag 0 oder negativ, eine andere Währung) verhindert den Beleg. Für Gutschriften blenden Sie ihn mit visibleIf aus.
  • {{Page.Total}} (die Gesamtseitenzahl) geht im Inhalt eines Codes nur in einer Gruppe, die auf jedem Blatt steht (Kopf- oder Fußzeile); im Körper wird der Code sonst nicht gedruckt (Strich- oder QR-Code: Warnung, GiroCode: der Beleg entsteht nicht).
  • Code 128: Buchstaben ohne Umlaute, Ziffern, Leerzeichen und Satzzeichen (ASCII ohne Steuerzeichen); EAN-13 und EAN-8: 12 bzw. 7 Ziffern (die Prüfziffer wird ergänzt) oder 13 bzw. 8 mit Prüfziffer; Code 39: 0–9, A–Z, Leerzeichen und - . $ / + %; ITF: Ziffern in gerader Anzahl.
  • QR Code is a registered trademark of DENSO WAVE INCORPORATED.
JSONGiroCode
{ "type": "Barcode", "xMm": 140, "yMm": 230, "wMm": 30, "hMm": 30, "pageIndex": 0, "place": "auto",
  "barcode": { "art": "epc",
    "zahlung": { "empfaenger": "{{@Payment recipient}}", "iban": "{{@Payment IBAN}}", "betrag": "{{totalamount}}",
                 "verwendungszweck": "Invoice {{invoicenumber}}" } } }

Formen

typeBesonderheit
LineWaagerechte Strecke in der Mitte des Rahmens xMm, yMm, wMm, hMm; schräg über rotDeg. Ältere Linien tragen x1Mm, y1Mm, x2Mm, y2Mm.
RectFläche und Rahmen, cornerRadiusMm.
EllipseKreis, wenn wMm gleich hMm.
Triangle, StarSpitze oben, Stern fünfzackig.
ArrowPfeil in der Mitte des Rahmens; arrowBoth: true für zwei Spitzen.
Polygonpoints: mindestens drei Punkte [x, y] in 0 bis 100 des Rahmens.

Farben und Strich stehen in style: strokeColor, strokeWidthPt (0 = kein Strich), fillColor, dash (solid, dashed, dotted; wirkt nicht beim Rechteck).

Gruppe

SchlüsselTypVorgabeBedeutung
childrenListe–Die Objekte in der Gruppe.
wMmZahlvolle BreiteBreite.
hMm oder heightMmZahl–Höhe.
autoHeightJa/Neinfalsefalse mit hMm/heightMm: feste Höhe, Inhalt darunter wird abgeschnitten (auch mitten durch eine Zeile). Ohne Höhe ist die Gruppe so hoch wie ihr Inhalt. true: mindestens die eingetragene Höhe, sonst wächst sie mit dem Inhalt; nur so rückt ein »Fließend«-Objekt darunter mit.
gapMmZahl0Zusatzabstand zwischen Objekten, die einander ausweichen.
repeatEveryPageJa/NeinfalseKopf oder Fuß, siehe oben.

Fläche und Rahmen kommen aus style: fillColor, strokeColor, strokeWidthPt, borderSides (Komma-Liste aus top, right, bottom, left; leer = keine Linie; fehlt = ganzer Rahmen). Ohne Fläche und Rahmen ist die Gruppe im PDF unsichtbar.

Tabelle

SchlüsselTypVorgabeBedeutung
itemsPathText–Datentabelle: Pfad zu einer Liste, in der Regel das Ergebnis einer Regel ("Items"). In einer Tabellenzelle relativ zur äußeren Zeile. Ein Einzeldatensatz (mode: first) druckt keine Zeilen.
columnsListePflichtSpalten, siehe unten.
rowsListe–Freie Tabelle (ohne itemsPath): eine Zeile je Eintrag { "cells": [ { "content": Objekt } ] }.
subRowsListe–Zusatzreihen je Datensatz (nur mit itemsPath), gleicher Aufbau wie rows.
headerStyleStilweiß, fett, 9 ptKopfzeile: fillColor, color, sizePt, bold. Die Vorgabe gilt nur, wenn headerStyle ganz fehlt; wer ihn angibt, setzt color, sizePt und bold vollständig (sonst schwarz, 10 pt, mager). Ohne headerStyle und ohne Füllung wäre die weiße Schrift unsichtbar.
rowStyleStil9 ptDatenzeilen: sizePt, color, fillColor, rowBorderColor (Linie unter jeder Zeile), paddingMm, lineSpacing. Ein rowStyle ohne sizePt ergibt 10 pt.
showHeaderJa/NeintrueKopfzeile zeigen.
repeatHeaderJa/NeinVorlageKopf auf Folgeseiten wiederholen.
headerHeightMmZahl8Mindesthöhe der Kopfzeile.
headerMaxHeightMmZahl–Höchsthöhe der Kopfzeile; leer oder 0 = wächst mit dem Inhalt.
rowMinHeightMm, rowMaxHeightMmZahl7, –Mindest- und Höchsthöhe einer Zeile.
cellPaddingMmZahlrowStyle.paddingMm, sonst 1.5Innenabstand der Zellen.
rowAltColor, colAltColorFarbe–Zebra je zweite Zeile beziehungsweise Spalte.
allowRowBreakJa/NeinfalseEine Zeile darf über eine Seitengrenze brechen.
sortsListe–Zusätzliche Sortierung { "by", "dir", "numeric" }; numeric: true sortiert Zahlen als Zahlen (sonst »10« vor »9«). Besser in der Regel sortieren.

Filtern gehört in die Regel; ein Schlüssel filter an der Tabelle wird nicht gelesen.

Schlüssel in columns[]Bedeutung
keyName der Spalte (c1, c2 …), keine Datenbindung.
headerKopftext, ohne Platzhalter.
headerCellKopf als Objekt (meist eine Gruppe); ersetzt header.
widthMmPflicht: Spaltenbreite.
alignleft, center, right, justify.
valueZellinhalt je Zeile, zum Beispiel {{Currency:baseamount}}.
cellZelle als Objekt (meist eine Gruppe mit autoHeight: true); ersetzt value.
vAligntop, middle, bottom.
headerFill, headerColorKopf-Hintergrund und Kopf-Schriftfarbe dieser Spalte.
cellBorder, headerBorderRahmen der Zellen: strokeColor, strokeWidthPt, borderSides.
colSpan, headerColSpan, rowSpanZellen verbinden (ab 2).

In rows[].cells[] und subRows[].cells[]: content (das Objekt), colSpan, rowSpan (nur in subRows). Steht ein Text direkt als content, hüllt der Designer ihn beim Öffnen in eine Gruppe.

Raster und Seitenumbruch

  • Grid (ältere Form, im Designer nicht mehr neu anzulegen; für neue Vorlagen eine Freie Tabelle): rows mit Zellen wie oben, je Zeile optional heightMm (Mindesthöhe dieser Zeile; sie wächst mit dem Inhalt), colWidthsMm (leer = gleich verteilt), rowMinHeightMm, borders (color, widthPt, outer, rowLines, colLines), Zellfarbe fill je Zelle.
  • PageBreak: steht direkt in body mit pageIndex und yMm (Stelle des Schnitts). Er bricht nur, wenn auf dem Blatt schon etwas steht. Was auf demselben Entwurfsblatt darunter liegt, rückt auf der Folgeseite um dieses yMm nach oben (ein Objekt bei 120 unter einem Umbruch bei 100 steht dort bei 20). Mit visibleIf falsch wirkt er nicht.

Stil

Schlüssel in styleVorgabeBedeutung
fontVorlagebody, heading oder der Name einer hochgeladenen Schrift.
sizePt10Schriftgröße.
alignleftleft, center, right, justify.
color#000000Schriftfarbe.
bold, italic, underlinefalseSchnitt.
fillColor–Fläche.
strokeColor–Rahmen- oder Linienfarbe; leer = kein Strich (Linie und Pfeil: schwarz).
strokeWidthPt1Strichstärke; 0 = kein Strich.
borderSidesganzer RahmenKomma-Liste aus top, right, bottom, left; leer = keine Linie.
dashsolidsolid, dashed, dotted (Formen außer Rechteck).
lineSpacingVorlageZeilenabstand, höchstens 5.

E-Rechnung (eRechnung)

eRechnung an der Wurzel macht den Beleg zusätzlich zu einer elektronischen Rechnung nach einem Standard. Mitgeliefert sind »XRechnung 3.0« (Kennung xrechnung-ubl, nur XML) und »ZUGFeRD 2.5.2 (EXTENDED)« (zugferd-extended, auch als PDF mit eingebetteter XML). Der Schlüssel ordnet jeder Angabe des Standards einen Wert zu: ein Feld, eine Variable oder einen festen Wert. Smart Templates rechnet nichts selbst. Es schreibt, was zugeordnet ist, rundet Beträge und prüft das Ergebnis mit den Regeln des Standards. Fehlt der Schlüssel oder ist aktiv nicht true, entsteht keine E-Rechnung, und der Beleg bleibt, wie er ist.

SchlüsselTypVorgabeBedeutung
aktivJa/NeinfalseNur true schaltet ein. Ausgeschaltet bleibt die Zuordnung erhalten.
standardText–Kennung des Standards: xrechnung-ubl, zugferd-extended oder die eines eigenen Standards.
fassungTextdie neueste gültigeFassung des Standards, zum Beispiel 3.0.2.
fassungFestJa/Neinfalsetrue: genau diese Fassung, auch wenn es eine neuere gibt.
ausgabeTextaus dem StandardpdfMitXml (PDF/A-3 mit eingebetteter XML, nur bei einem Standard, der das kann) oder nurXml.
lesekopieJa/NeinfalseBei nurXml: zusätzlich das PDF zum Lesen.
wennBedingungimmer»Nur wenn …«: Trifft die Bedingung nicht zu, entsteht der Beleg ohne E-Rechnung. Gelesen am Hauptdatensatz, geschrieben wie unter »Bedingungen«.
werteObjekt–Die Angaben im Kopf: { "BT-1": "{{invoicenumber}}" }. null heißt »nicht zugeordnet«.
listenObjekt–Die Listen (Positionen, Steuersätze, Nachlässe …), siehe unten.
umsetzungObjekt–Je Codeliste: Wert aus Dynamics → Code, zum Beispiel { "EINHEIT": { "hrs": "HUR" } }. Ergänzt das Erkennen üblicher Schreibweisen.
beispieleListe–Bis zu drei Beispieldatensätze für die Prüfung im Zuordnungsfenster: { "id": GUID, "name": Text }. Wirkt nicht auf den Beleg.
zuPruefenListe–Kennungen, die das Zuordnungsfenster gelb zeigt (»bitte prüfen«). Pflegt der Designer; wirkt nicht auf den Beleg. Eine KI darf Kennungen hinzufügen, wenn sie einen Vorschlag mit »pruefen« übernimmt, aber keine entfernen.

Angaben und Kennungen

Die Kennungen sind die des Standards: BT-… der Norm EN 16931 (Begleitangaben mit -1, etwa BT-34-1), BG-… für Listen und Gruppen, bei ZUGFeRD dazu eigene Kennungen ZX-… und ZXG-…. Welche Angaben ein Standard hat, welche Pflicht sind und welche Codes gelten, steht in seiner Übersicht: über die Aktion st_StandardLesen (Teile uebersicht, pflicht, abschnitt:<id>, codeliste:<id>), im KI-Paket im Abschnitt »E-Rechnung«. Eine unbekannte Kennung, eine Angabe auf der falschen Ebene oder eine Liste unter werte ist ein Fehler.

Form des WertsBeispielBedeutung
Feld{{invoicenumber}}, {{customerid_account.name}}wie ein Platzhalter, aber ohne Formatierer
Variable{{@InvoiceType}}eine eigene Variable; in einer Liste aus einer Regel auch eine Regel-Variable der Zeile ({{Net}})
Zusammenfassung{{sum(Items.Net)}}über ein Feld einer Liste, wie im Platzhalter
fester Wert"380", "S", "19"Text; Zahlen mit Punkt, Datum als JJJJ-MM-TT
laufende Nummer{{#}}nur in Listen und nur bei Angaben, die der Standard dafür vorsieht
zusammengesetzt"Order {{ordernumber}}"nur bei Text-Angaben
  • Formatierer ({{Currency:…}}, {{Date:…}} …) sind nur bei Text-Angaben erlaubt; Beträge, Daten und Codes stehen ohne.
  • Beträge schreibt Smart Templates kaufmännisch auf 2 Nachkommastellen gerundet, auch aus einer Variablen. Einzelpreise, Mengen und Prozentsätze bleiben, wie sie sind. Die Rechenprobe prüft die gerundeten Werte.
  • Codes (Länder, Einheiten, Steuerarten …): ein Code der Codeliste, ein üblicher Name (»Deutschland« wird DE) oder eine Zeile in umsetzung. Was sich nicht erkennen lässt, ist ein Fehler.
  • Leer bleibt leer: Es gibt keinen Ersatzwert. Fehlt eine Pflichtangabe, entsteht der Beleg nicht und eine Meldung nennt sie; nur die Voll-Vorschau warnt und zeigt das PDF ohne XML.
  • Die Art der Rechnung (BT-3: Rechnung 380, Gutschrift 381 …) ist eine Angabe wie jede andere. Kommt sie aus einem Auswahlfeld, ordnen Sie eine Wenn-Dann-Variable nach dem Rohwert zu, mit Zweigen wie { "when": "<field>_code == 2", "value": "381" }. Leiten Sie die Art nie aus dem Vorzeichen, der Nummer oder der Beschriftung ab. Bei XRechnung entsteht für eine Gutschrift von selbst ein Gutschrift-Dokument.
  • Summen und Steuern ordnen Sie so zu, wie der Beleg sie druckt. Die Rechenprobe des Standards deckt jede Abweichung auf.

Listen

listen ordnet jeder Liste des Standards ihre Einträge zu, zum Beispiel BG-25 (Positionen), BG-23 (Steuer je Steuersatz), BG-20 (Nachlass auf die ganze Rechnung) oder BG-21 (Zuschlag auf die ganze Rechnung). Ob eine Liste eine Regel, feste Einträge oder beides nimmt, sagt die Übersicht (quelle).

SchlüsselBedeutung
itemsPathDie Regel, aus deren Zeilen die Einträge entstehen, wie bei einer Tabelle ("Items"). Für die Positionen nie eine Regel mit »die ersten N« oder genau einer Zeile: Eine E-Rechnung lässt keine Zeile weg.
wennBedingung für die Regel als Quelle, einmal im Bezug darüber ausgewertet.
werteDie Angaben je Zeile der Regel, Pfade relativ zur Zeile.
listenListen in der Liste, je Zeile, zum Beispiel BG-27 (Nachlass der Position) in BG-25.
eintraegeFeste Einträge nach den Zeilen der Regel: { "name": Text, "wenn": Bedingung, "werte": { … }, "listen": { … } }. name sieht nur der Designer. wenn wird im Bezug darüber ausgewertet (im Kopf am Hauptdatensatz, in einer Liste je Zeile); ohne wenn gilt der Eintrag immer.
JSONE-Rechnung
"eRechnung": {
  "aktiv": true, "standard": "xrechnung-ubl", "ausgabe": "nurXml",
  "werte": { "BT-1": "{{invoicenumber}}", "BT-2": "{{createdon}}", "BT-3": "{{@InvoiceType}}",
             "BT-5": "{{transactioncurrencyid.isocurrencycode}}", "BT-106": "{{sum(Items.Net)}}",
             "BT-109": "{{@NetTotal}}", "BT-110": "{{totaltax}}", "BT-112": "{{totalamount}}", "BT-115": "{{totalamount}}" },
  "listen": {
    "BG-25": { "itemsPath": "Items",
               "werte": { "BT-126": "{{#}}", "BT-129": "{{quantity}}", "BT-146": "{{priceperunit}}", "BT-131": "{{Net}}",
                          "BT-151": "S", "BT-152": "19" },
               "listen": { "BG-27": { "eintraege": [ { "name": "Discount", "wenn": "manualdiscountamount > 0",
                                                      "werte": { "BT-136": "{{manualdiscountamount}}", "BT-140": "95" } } ] } } },
    "BG-21": { "eintraege": [ { "name": "Freight", "wenn": "freightamount > 0",
                                "werte": { "BT-99": "{{freightamount}}", "BT-102": "S", "BT-103": "19", "BT-105": "FC" } } ] }
  },
  "umsetzung": { "EINHEIT": { "hrs": "HUR" } }
}

Dazu gehören die Regel Items auf den Positionen mit der Regel-Variablen Net ({{baseamount}} - {{manualdiscountamount}}; den Mengenrabatt enthält baseamount schon) und die eigenen Variablen InvoiceType (Wenn-Dann nach dem Rohwert des Typfelds) und NetTotal ({{totalamount}} - {{totaltax}}). Im Beispiel fehlen noch Angaben, die jede Rechnung braucht, etwa Ihr Unternehmen; welche, sagt der Teil pflicht der Übersicht.

Vorschläge für die Dynamics-Rechnung

Ist die Hauptquelle die Rechnung (invoice), kennt Smart Templates Vorschläge aus den Standardfeldern von Dynamics, nie aus eigenen Feldern eines Unternehmens. Im Designer übernimmt sie »Vorschläge übernehmen« im Zuordnungsfenster; die Tabelle liefert die Aktion st_StandardLesen mit dem Teil vorschlaege (mit Kennung zugeschnitten auf den Standard). Ein Vorschlag gilt nur, wenn es sein Feld in den Quellen der Vorlage gibt und die Angabe noch leer ist; mehrere pfade heißen: der erste, den es gibt. Die Einträge im Teil kopf tragen dazu eine art:

artWas zugeordnet wird
fehltdas erste vorhandene Feld aus pfade
belegartdie Art der Rechnung: ein Auswahlfeld, dessen Name zu feldMuster passt, als Wenn-Dann-Variable nach dem Rohwert; sonst der feste Wert sonstWert
summedie Zusammenfassung über die Regel-Variable der Positionen ({{sum(Items.Net)}}), sonst ein Feld aus ersatz
variableeine neue eigene Variable nach variable, sonst ein Feld aus ersatz

Im Teil positionen stehen die Regel-Variable (regelVariable, an der Regel der Positionstabelle) und die Angaben je Zeile mit den Arten laufendeNummer, fest (fester Wert für jede Position), vorgabe (die Vorgabe des Standards) und regelVariable; kopfListen und positionen.listen nennen feste Einträge mit Bedingung (eintrag) und den Steuereintrag (art steuer). Was pruefen trägt, ist ein Ersatz, eine Vorbelegung oder ein Wert für jeden Beleg: Der Anwender muss es ansehen und bestätigen. Ein Eintrag, der eine Variable anlegt, trägt zusätzlich pruefenVorhanden: Gab es die Variable schon (Regel-Variable: gleicher Name; variable: gleicher Name und gleiche Formel) und wird sie benutzt, gilt dieser Satz statt pruefen, dessen Anfang »Neu angelegt« dann nicht stimmte.

Eigene Standards

Einen eigenen Standard beschreibt eine Anmerkungsdatei, selbst ein XSD neben dem unveränderten offiziellen Schema. Ihren Aufbau beschreibt die Seite »Eigene Standards für die E-Rechnung« (Aktion st_StandardLesen mit dem Teil format); hochgeladen wird sie im Designer unter »Standards verwalten …« oder mit der Aktion st_StandardHochladen.

Ein vollständiges Beispiel

Ein Angebot mit Logo und Linie oben, Kunde und Titel, Positionstabelle auf einer Regel, Summe darunter und Seitenzahl unten.

JSONAngebot
{
  "name": "Quote",
  "culture": "en-US",
  "page": { "size": "A4", "widthMm": 210, "heightMm": 297,
            "margins": { "topMm": 18, "rightMm": 15, "bottomMm": 18, "leftMm": 20 } },
  "brand": { "bodyFont": "Arimo", "headingFont": "Arimo" },
  "sources": [ {
    "id": "src1", "name": "Quote", "entity": "quote", "primary": true, "basePath": "", "idAttr": "quoteid",
    "fields": [ { "name": "name" }, { "name": "_customerid_value" } ],
    "relations": [ {
      "name": "quote_details", "kind": "collection", "entity": "quotedetail", "refAttr": "quoteid",
      "fields": [ { "name": "productdescription" }, { "name": "quantity" }, { "name": "baseamount" }, { "name": "sequencenumber" } ],
      "rules": [ { "id": "r1", "name": "Items", "filterExpr": "",
                   "select": { "mode": "", "sorts": [ { "by": "sequencenumber", "dir": "asc" } ] }, "vars": [] } ]
    } ],
    "rules": []
  } ],
  "body": [
    { "type": "Group", "repeatEveryPage": true, "xMm": 0, "yMm": 0, "hMm": 20, "children": [
      { "type": "Image", "xMm": 0, "yMm": 0, "wMm": 45, "hMm": 14, "place": "static",
        "bild": { "art": "asset", "pfad": "logo_full", "einpassung": "einpassen" } },
      { "type": "Line", "xMm": 0, "yMm": 16, "wMm": 175, "hMm": 4, "place": "static",
        "style": { "strokeColor": "#2B4CC4", "strokeWidthPt": 1.5 } } ] },
    { "type": "Group", "pageIndex": 0, "yMm": 0, "heightMm": 30, "children": [
      { "type": "Text", "value": "{{_customerid_value}}", "xMm": 0, "yMm": 0, "wMm": 90, "place": "static" },
      { "type": "Text", "value": "Quote {{name}}", "xMm": 0, "yMm": 14, "wMm": 175, "place": "static",
        "style": { "font": "heading", "sizePt": 18, "bold": true, "color": "#16234B" } } ] },
    { "type": "Table", "pageIndex": 0, "yMm": 34, "place": "auto", "itemsPath": "Items",
      "headerStyle": { "fillColor": "#2B4CC4", "color": "#FFFFFF", "sizePt": 9, "bold": true },
      "rowStyle": { "sizePt": 9, "color": "#222222", "paddingMm": 1.5 },
      "columns": [
        { "key": "c1", "header": "Description", "widthMm": 105, "align": "left", "value": "{{productdescription}}" },
        { "key": "c2", "header": "Quantity", "widthMm": 30, "align": "right", "value": "{{Number:quantity|2}}" },
        { "key": "c3", "header": "Amount", "widthMm": 40, "align": "right", "value": "{{Currency:baseamount}}" } ] },
    { "type": "Text", "pageIndex": 0, "xMm": 95, "yMm": 50, "wMm": 80, "place": "flow",
      "value": "Total: {{Currency:sum(Items.baseamount)}}", "style": { "align": "right", "bold": true } },
    { "type": "Group", "repeatEveryPage": true, "xMm": 0, "yMm": 249, "hMm": 12, "children": [
      { "type": "Text", "value": "Page {{Page.Current}} of {{Page.Total}}", "xMm": 140, "yMm": 2, "wMm": 35, "place": "static",
        "style": { "sizePt": 7.5, "align": "right", "color": "#888888" } } ] }
  ]
}

Ältere und wirkungslose Schlüssel

Diese Schlüssel stehen in älteren Vorlagen. Der Druck liest die meisten noch, der Designer baut sie beim Öffnen um. Neue Vorlagen brauchen sie nicht.

SchlüsselWas damit ist
elementsAlte Kinderliste einer Gruppe; trägt eine Gruppe beide, gewinnt elements. Der Designer stellt auf children um.
type Band, ContainerAlte Namen für Group.
excludePagesAlte Ausschlussliste aus Seitenzahlen (negative zählen vom Ende); excludePagesText hat Vorrang.
rowCountAlte Freie Tabelle mit columns[].value; der Designer baut sie zu rows um.
sortBy, sortNumericAlte Sortierung an der Tabelle; der Designer verschiebt sie in die Regel. In select einer Regel sind sortBy und sortDir der Rückfall, wenn sorts fehlt.
numericIn den Sortierstufen einer Regel (select.sorts) ohne Wirkung; in sorts einer Tabelle schaltet true die Zahlensortierung ein.
formulaAlte Form von default bei Regel-Variablen; der Designer schreibt sie um.
borders an einer TabelleAlte Linien (style, color, widthPt, outer, rowLines, colLines, headerBottom, headerColor, headerWidthPt); der Designer wandelt sie in cellBorder und headerBorder der Spalten um. Am Raster sind borders aktuell.
binding, fitAlte Bildquelle; mit bild werden sie nicht gelesen.
x1Mm, y1Mm, x2Mm, y2MmAlte Linie über Endpunkte; der Designer stellt auf den Rahmen um.
layout, reserveSpace, richOhne Wirkung.
minWidthMm, maxWidthMmAn Objekten und Spalten nur Grenzen im Designer.
dataSource (type, rootEntity, itemsPath)Ohne Wirkung; die Daten stehen in sources.

Was der Designer selbst pflegt

Diese Schlüssel schreibt der Designer selbst. Lassen Sie sie stehen, wenn sie schon da sind, aber legen Sie keine neuen an:

  • in sources: set, nameAttr, locked, sampleName, sampleMissing, an Feldern label, stellen, stellenQuelle, schreibname, mehrzeilig, schreibbar, pflicht, anlegbar, weg, an Beziehungen linkLabel, weg;
  • alle Schlüssel mit _ am Anfang (zum Beispiel _loaded, _refLabel, _ot51b);
  • die Baukasten-Spiegel visGroup (zu visibleIf), filter (zu filterExpr), condGroup und cond (zu when) sowie gruppe (zu wenn, an Bildregeln und an den Fällen unter wahlen). Ändern Sie einen Ausdruck, entfernen Sie seinen Spiegel. Bleibt ein alter Spiegel stehen, kann der Designer den Ausdruck beim Öffnen des Editors aus dem Spiegel neu schreiben. Ohne Spiegel zeigt er einen Regelfilter als »nicht mit dem Baukasten gebaut« und lässt ihn stehen; Sichtbarkeit, Bildregeln und Variablen-Zweige liest er in die Bausteine zurück, soweit sie den Ausdruck darstellen können.

Kurzregeln für KI-Werkzeuge

  1. Aufbau: Quelle → Beziehung → Regel. Eine Datentabelle steht auf einer Regel, nicht direkt auf einer Beziehung: itemsPath = Pfad des Elternknotens plus Pfadstück des Regelnamens (»Open items« → Open_items).
  2. Benutzen Sie nur Tabellen, Felder und Beziehungen, die es gibt. Jedes benutzte Feld steht mit exaktem logischem Namen in fields seiner Ebene; ein Verweis heißt _<spalte>_value.
  3. Beziehungen brauchen name, kind (lookup oder collection), entity und refAttr. Höchstens sechs Ebenen tief.
  4. Regelnamen sind in der ganzen Vorlage eindeutig. Eine Regel liest keine Ergebnisse von Regeln weiter oben (auch keine Quellregeln); Felder darüber und eigene Variablen darf sie lesen. Ein Bezug nach oben wird gelöscht, ein Kreis schaltet alle Regeln ab.
  5. Bedingungen nennen Felder ohne {{ }}, Text in Anführungszeichen, Zahlen mit Punkt, && || !. Formeln setzen jeden Bezug in {{ }} und rechnen nur + - * /.
  6. Zusammenfassungen (sum, avg, count, min, max, first) gehen über ein Feld einer Liste (Beziehung collection oder Regel-Ergebnis): sum(Items.baseamount). last() gibt es nicht.
  7. Zahlen und Daten im Text immer formatieren: {{Currency:…}}, {{Number:…|2}}, {{Date:…}}, {{Bool:…}}.
  8. Ein Text braucht wMm. Eine Gruppe mit Höhe, aber ohne autoHeight: true schneidet ab, was über ihre Unterkante ragt.
  9. Jedes Objekt direkt in body außer Kopf und Fuß trägt pageIndex; fehlt es, wird die Änderung abgelehnt (in einer Vorlage ganz ohne pageIndex: nur Hinweis).
  10. Auswahl- und Ja/Nein-Felder vergleichen Sie über _code (statecode_code == 0); ohne _code steht dort die Beschriftung.
  11. select (topN, first) kürzt nur das Ergebnis; weniger geladen wird nur mit einem Filter.
  12. In Tabellenzellen sind Pfade relativ zur Zeile. Platzhalter im Spaltenkopf nur über headerCell.
  13. Seitenzahlen nur über {{Page.Current}} und {{Page.Total}} im Text, nie in Bedingungen oder Formeln.
  14. Eigene Variablen immer mit type; sie werden vor den Regeln gerechnet und sehen keine Regel-Ergebnisse.
  15. Behalten Sie alle Schlüssel, die Sie nicht ändern sollen, auch unbekannte. Ändern Sie einen Ausdruck, entfernen Sie seinen Baukasten-Spiegel (visGroup, filter, condGroup, cond, gruppe).
  16. Werte von type exakt schreiben (Group, nicht group). Zahlen als Zahlen, Farben als #RRGGBB.
  17. Etwas unter eine Tabelle setzen: direkt in body hinter die Tabelle, mit demselben pageIndex, einem yMm unterhalb dem der Tabelle und "place": "flow" (wie die Summe im Beispiel). Es hält dann den gezeichneten Abstand und rückt um genau so viel nach unten, wie die Tabelle wächst. Ohne place wirkt es wie auto: Es bleibt stehen, bis die Tabelle es erreicht, und sitzt dann ohne Abstand (nur marginTopMm) darunter. Steht unter der Tabelle schon eine Gruppe, etwa ein Summenblock, können Sie es auch dort hineinsetzen.
  18. Codes: "type": "Barcode" mit barcode.art. Der Inhalt steht in barcode.wert (beim GiroCode in barcode.zahlung mit empfaenger und iban); Nummern und Beträge dort ohne Formatierer. Drehung nur 0, 90, 180, 270.

Gut zu wissen

Wie Sie diese Einstellungen im Designer setzen, beschreiben die Kapitel für Anwender: Positionsverhalten und Mitwandern unter Positionsverhalten, Zusammenhalten unter An der Blattkante, Vordergrund-Rang unter Lage, Größe, Drehung und Anordnung, Bedingungen unter Bedingungen, Kopf, Fuß, Seitenumbruch und Seitenrahmen unter Seiten, Kopf- und Fußzeile, Tabellen unter Datentabellen und Freie Tabellen, dynamischen Text und Formeln unter Texte: Dynamischer Text und Das Fenster »Text bearbeiten«: Mathematische Formeln, Sprache, Zahlen und Wenn-Zweige unter Zahlen, Währung und Datum, die E-Rechnung unter E-Rechnung: ZUGFeRD und XRechnung und eigene Standards unter Eigene Standards für die E-Rechnung, die Wahl der E-Mail-Vorlage unter Die E-Mail-Vorlage aus der Vorlage wählen und im Assistenten unter Je nach Bedingung: die Fälle, Importieren und Exportieren unter Vorlagen verwalten: Importieren und Exportieren.

Das Beispiel im Designer

Das Beispiel aus Ein vollständiges Beispiel sieht auf der Entwurfsfläche des Designers so aus. Felder stehen dort als blaue Marken mit ihrem Namen; im PDF steht an dieser Stelle der Wert.

Ausschnitt der Entwurfsfläche mit dem Beispiel »Angebot« aus dem Vorlagenformat: ein weißes A4-Blatt im Hochformat, die Objekte durch gestrichelte Umrisse gerahmt; über dem Blatt steht »Seite 1 / 1«. Ganz oben liegt der Kopf, eine Gruppe über die Breite des bedruckten Bereichs: links das Logo »Dyn365 Smart Templates«, darunter eine blaue Linie. Darunter steht eine zweite Gruppe mit der blauen Feldmarke »_customerid_value« und, weiter unten, dem fetten, dunkelblauen Titel »Quote« gefolgt von der Feldmarke »name«. Darunter folgt die Positionstabelle: eine blaue Kopfzeile mit den weißen Überschriften »Description«, »Quantity« und »Amount« und genau eine Musterzeile mit den Feldmarken »productdescription«, »quantity« und »baseamount«. Rechtsbündig darunter steht die fette Zeile »Total:« mit der Feldmarke »baseamount«. Der Rest des Blatts ist leer, bis ganz unten der Fuß folgt: eine Gruppe mit der kleinen grauen Zeile »Page«, der Feldmarke »Seite #«, dem Wort »of« und der Feldmarke »Seiten ∑« am rechten Rand.
Das Beispiel »Angebot« auf der Entwurfsfläche, so wie der Designer es aus dem JSON aufbaut. Die Zahlen gehören zu den fünf Einträgen von body, in ihrer Reihenfolge.
  1. 1Der Kopf: eine Gruppe mit repeatEveryPage bei yMm 0, also am oberen Rand der Nutzfläche. Sie enthält das Logo (Image mit der Bildquelle logo_full) und die blaue Linie (Line).
  2. 2Kunde und Titel: eine Gruppe mit zwei Texten. Die Feldmarken stehen für {{_customerid_value}} und {{name}}; im PDF steht dort der Wert.
  3. 3Die Positionstabelle: Table mit itemsPath »Items«, einer Regel. Auf der Entwurfsfläche stehen nur die Kopfzeile und eine Musterzeile; alle Zeilen zeigt erst das PDF.
  4. 4Die Summe: ein Text mit place »flow«. Er hält den Abstand zur Tabelle und rückt nach unten, wenn die Tabelle im PDF wächst.
  5. 5Der Fuß: eine Gruppe mit repeatEveryPage bei yMm 249, unten am bedruckten Bereich. Sie trägt den Text Page {{Page.Current}} of {{Page.Total}}.

Was die Prüfung beim Import meldet

Bevor der Designer eine Vorlagendatei öffnet, prüft Dynamics sie gegen den Aufbau auf dieser Seite (siehe Vorlagen verwalten: Importieren). Fehler sperren das Öffnen, Hinweise fragen nur nach. Der Bericht nennt vor jedem Satz die Stelle im Aufbau der Vorlage, etwa body[0].type; die Sätze sind für die KI bestimmt, die die Datei erzeugt hat.

Fehler sperren das Öffnen. Die Prüfung meldet unter anderem:

  • Die Datei ist beschädigt. Der Bericht nennt die Stelle als Zeile und Spalte, den Inhalt der Zeile und den Grund, etwa einen Zeilenumbruch mitten in einem Text, ein fehlendes Zeichen, ein Komma zu viel, eine zu früh endende Datei oder eine zu tief verschachtelte Vorlage (es gibt eine Höchstzahl an Ebenen).
  • Der Aufbau stimmt nicht: Die Vorlage selbst, ihre Seite, ihre Marke, Listen und Einzelteile müssen die richtige Form haben.
  • Jedes Objekt braucht eine gültige Art: Text, Bild, Gruppe, Tabelle, Raster, Linie, Rechteck, Ellipse, Dreieck, Stern, Pfeil, Vieleck oder Seitenumbruch. Der Bericht nennt sie mit ihren englischen Namen; auf Groß- und Kleinschreibung kommt es an.
  • Maße und Winkel müssen Zahlen sein.
  • Eine Tabelle braucht mindestens eine Spalte, und jede Spalte eine Breite größer als 0.
  • Regeln und Variablen brauchen einen Namen, der nur einmal vorkommt. Für die Auswahl einer Regel sind nur diese Modi erlaubt: leer, die obersten n Zeilen, die erste, die letzte und die n-te Zeile.
  • Beziehungen brauchen Name, Art (N:1 oder 1:N), Tabelle und Verknüpfungsfeld; Quellen brauchen eine Tabelle, weitere Quellen auch den Namen ihrer Liste.
  • Im Text steht ein Feld einer eigenen Variablen, die es nicht gibt.

Hinweise fragen nur nach. Die Prüfung meldet unter anderem:

  • Die Datei enthält mehrere Textblöcke; gelesen wird der größte. Oder: Vor oder nach der Vorlage steht Text; gelesen wird nur der Teil mit der Vorlage.
  • Die Vorlage hat keinen Inhalt. Oder: Sie hat keine Datenquelle; der Designer fragt beim Öffnen nach der Hauptquelle.
  • Ein Text hat keine Breite und steht dann mit einem Wort je Zeile.
  • Ein Seitenumbruch steht nicht direkt im Dokument und wirkt deshalb nicht.
  • Ein Filter an der Tabelle wird nicht gelesen; er gehört in die Regel.
  • Eine Variable hat keinen Typ und gilt deshalb als Text, oder ihr Typ ist unbekannt.
  • Ein mitgeliefertes Bild ist kein PNG, JPEG oder SVG oder größer als 5 MB; die Stelle bleibt leer.
  • Eine Beziehung liegt tiefer als sechs Ebenen; gedruckt wird dort nichts.
  • Objekte direkt im Dokument haben kein pageIndex (das Blatt, gezählt ab 0). Beim Öffnen legt der Designer ihr Blatt selbst fest, und das kann den Druck ändern; prüfen Sie danach die »Voll-Vorschau«. Kopf und Fuß brauchen kein Blatt. Bei »KI-Änderungen hochladen« und beim KI-Assistenten ist dasselbe ein Fehler, sobald die Änderung ein solches Objekt hinterlässt (siehe Kurzregeln für KI-Werkzeuge, Regel 9).
  • Die Nachkommastellen einer Berechnung (nachkomma) liegen nicht zwischen 0 und 6. Bei mehr als 6 wird mit 6 gerechnet, bei einer negativen Zahl oder einem Wert, der keine Zahl ist, mit den Stellen der Vorlage.