ARLingNotes

NbOfTxs a CtrlSum nesedia:najčastejší dôvod, prečo dávka neprejde

Exportuješ hromadný príkaz z účtovného softvéru, ručne v ňom pred odoslaním ešte niečo upravíš, napríklad zmažeš jeden riadok, alebo zlúčiš dva menšie súbory do jedného. Import v internet bankingu súbor odmietne. Formulár banky pritom neukáže meno, sumu ani konkrétny riadok, len všeobecnú hlášku o neplatnom súbore. Vo veľkej časti takýchto prípadov nie je problém v žiadnej platbe, ale v dvoch číslach v hlavičke súboru: GrpHdr/NbOfTxs a GrpHdr/CtrlSum. Po ručnej úprave sa práve tieto dve hodnoty najľahšie rozídu od skutočného obsahu súboru.

1. Čo tieto dve polia musia obsahovať

GrpHdr/NbOfTxs je počet platobných transakcií v celom súbore, teda počet blokov <CdtTrfTxInf>, spočítaný naprieč všetkými blokmi <PmtInf> dokopy, nie len v tom prvom. GrpHdr/CtrlSum je súčet všetkých súm <InstdAmt> v súbore, na presne dve desatinné miesta. Obe polia patria do hlavičky správy pain.001.001.03, ktorú definuje schéma ISO 20022, a majú zhŕňať to, čo skutočne nasleduje v tele súboru, nie to, čo tam malo pôvodne byť pred úpravou.

SEPA pain.001 Doctor, nástroj ARLing, ktorý oba súčty pri kontrole prepočítava a porovnáva s hlavičkou, označuje ich nezhodu ako závažnú, blokujúcu chybu, nie len upozornenie. Podľa skúsenosti zapísanej priamo v jeho kóde je nezhoda počtu transakcií jeden z najčastejších dôvodov, prečo banka import hromadného príkazu odmietne.

2. Prečo to najčastejšie nesedí

Dva typické scenáre sa opakujú najviac:

  • Ručná úprava exportu bez prepočtu hlavičky. Účtovný softvér vygeneruje súbor so správnym NbOfTxs aj CtrlSum. Niekto potom v texte XML alebo v tabuľke, z ktorej sa súbor generoval, zmaže alebo pridá jeden riadok, napríklad preto, že jedna faktúra sa medzičasom uhradila inak. Telo súboru sa zmení, hlavička ostane rovnaká ako pred úpravou.
  • Zlúčenie dvoch exportov do jedného súboru. Dva menšie súbory z rôznych dní alebo stredísk sa skopírujú za seba, aby sa do banky poslal len jeden. Bloky <PmtInf> aj transakcie sa spoja správne, no v súbore ostane len jedna hlavička GrpHdr, s pôvodným počtom a súčtom len z jedného z dvoch zdrojových súborov.

V oboch prípadoch je XML naďalej formálne dobre formované, dá sa otvoriť aj prezrieť, a práve preto sa chyba pri letmom pohľade na súbor ľahko prehliadne.

3. Overenie počtu transakcií bez programovania

Najspoľahlivejší spôsob bez inštalácie čohokoľvek: pretiahni XML súbor do okna prehliadača (Chrome, Edge, Firefox), stlač Ctrl+F a vyhľadaj text <CdtTrfTxInf>. Vyhľadávacie pole prehliadača ukáže presný počet nájdených výskytov, napríklad „1 z 24“. To je skutočný počet transakcií v súbore. Porovnaj ho s hodnotou v <NbOfTxs> v hlavičke, tú nájdeš rovnakým vyhľadaním.

V klasickom Poznámkovom bloku Windows funguje podobný trik cez dialóg Nahradiť (Ctrl+H): keď zadáš rovnaký text do poľa „Nájsť“ aj „Nahradiť čím“ a spustíš „Nahradiť všetko“, program po dokončení nahlási počet vykonaných nahradení, obsah súboru sa tým nezmení. Toto správanie sa môže medzi verziami Poznámkového bloku vo Windows 11 líšiť, over si preto najprv na krátkom testovacom texte, že sa naozaj nič neprepísalo.

4. Overenie súčtu vzorcom v Exceli

Na počet transakcií funguje v Exceli rovnaký princíp ako v prehliadači, len cez vzorec. Vlož celý text XML súboru do jednej bunky, napríklad A1 (dá sa aj cez Dáta → Z textu/CSV, kde sa súbor načíta ako jeden dlhý riadok), a napíš:

=(DĹŽKA(A1)-DĹŽKA(DOSADIŤ(A1;"<CdtTrfTxInf>";"")))/DĹŽKA("<CdtTrfTxInf>")

V anglickej verzii Excelu je rovnaký vzorec =(LEN(A1)-LEN(SUBSTITUTE(A1,"<CdtTrfTxInf>","")))/LEN("<CdtTrfTxInf>"). Vzorec spočíta, koľkokrát sa v texte opakuje značka <CdtTrfTxInf>, čiže presný počet transakcií. Výsledok porovnaj s hodnotou NbOfTxs v hlavičke.

Na súčet súm je najjednoduchšie skopírovať hodnoty medzi značkami <InstdAmt Ccy="EUR"> a </InstdAmt> do samostatného stĺpca (napríklad cez Text do stĺpcov, kde sa ako oddeľovač použijú tieto značky) a spočítať ich vzorcom:

=ZAOKRÚHLIŤ(SUMA(B:B);2)

Zaokrúhlenie na presne dve desatinné miesta je dôležité: Excel pri súčte desatinných čísel občas zobrazí hodnotu ako 1234,999999 namiesto 1235,00 kvôli spôsobu, akým počítač ukladá desatinné čísla. Porovnávaj preto vždy zaokrúhlený výsledok, nie surové zobrazené číslo, s hodnotou CtrlSum v hlavičke.

5. Prečo banka odmieta hneď, bez zrozumiteľnej hlášky

GrpHdr/NbOfTxs a GrpHdr/CtrlSum sú súčasťou tej istej štruktúry XML, akú banka pri importe overuje strojovo, formálne, ešte pred tým, než sa začne pozerať na obsah jednotlivých platieb. Ak sa číslo v hlavičke nezhoduje s tým, čo súbor skutočne obsahuje, formálna kontrola zlyhá skôr, než by banka mohla vypísať, ktoré konkrétne meno alebo suma je v poriadku.

Presné znenie hlásenia, ktoré pri tejto konkrétnej nezhode zobrazí Tatra banka, VÚB, ČSOB alebo Slovenská sporiteľňa vo svojom internet bankingu, nemáme overené v žiadnom verejnom dokumente žiadnej z nich. Toto je preto všeobecné technické vysvetlenie, ako sa hlavička a telo XML súboru pri importe zvyčajne overujú, nie zdokumentované tvrdenie o konkrétnej banke: ber ho ako pravdepodobné vysvetlenie, nie potvrdenú skutočnosť.

Checklist

  1. Zisti skutočný počet transakcií (počet <CdtTrfTxInf>) cez Ctrl+F v prehliadači alebo vzorcom v Exceli, porovnaj s hodnotou GrpHdr/NbOfTxs.
  2. Spočítaj súčet všetkých <InstdAmt> na dve desatinné miesta, porovnaj s hodnotou GrpHdr/CtrlSum.
  3. Ak si súbor po exporte ručne upravoval (mazal alebo pridával riadok), oba súčty v hlavičke prepočítaj nanovo, softvér ich sám neaktualizuje.
  4. Ak spájaš dva exporty do jedného súboru, sprav to na úrovni pôvodných dát v účtovnom softvéri, nie kopírovaním XML textu za seba, alebo hlavičku po spojení prepočítaj ručne.
  5. Po každej oprave over súbor znova, banka ho validuje nanovo pri každom importe.

Časté otázky

Počíta sa NbOfTxs za celý súbor, alebo za každý blok PmtInf zvlášť?

Za celý súbor. Súčet ide naprieč všetkými blokmi PmtInf dokopy, nie len za prvý z nich. Rovnako sa cez všetky bloky spolu počíta aj CtrlSum.

Vadí, ak sa CtrlSum líši len o pár centov kvôli zaokrúhleniu?

Áno, aj malý rozdiel je nezhoda. CtrlSum má zodpovedať súčtu súm InstdAmt na cent presne, tolerovať sa dá len nepatrná zaokrúhľovacia odchýlka spôsobená výpočtom, nie rozdiel na úrovni celých centov.

Je prázdne pole NbOfTxs alebo CtrlSum vždy chyba?

Nie nutne. Podľa dokumentácie Tatra banky nie je NbOfTxs pri importe hromadného príkazu povinné pole, prázdna hodnota teda sama osebe nemusí byť dôvod na zamietnutie. Napriek tomu sa oplatí obe polia vyplniť presne, iné banky aj iné importy sa na ne môžu spoliehať.

Skontrolujte to za 30 sekúnd

Kto si to chce overiť na vlastnom súbore, môže ho vložiť do SEPA pain.001 Doctor, ktorý NbOfTxs aj CtrlSum prepočíta a porovná s hlavičkou automaticky.

Zdroje

  1. ISO 20022: pain.001.001.03, Customer Credit Transfer Initiation, základná schéma. iso20022.org. Definuje polia GroupHeader/NbOfTxs a GroupHeader/CtrlSum ako súhrn počtu transakcií a súčtu súm v správe; overené 6. 9. 2026 v zdrojovom kóde nástroja SEPA pain.001 Doctor, ktorý na tejto schéme kontrolu zakladá.
  2. Tatra banka: Prenosový formát pain.001.001.03 v štruktúre XML. tatrabanka.sk/.../prenosovy_formatpain001.pdf. Zdroj pre popis polí GrpHdr a PmtInf vrátane toho, že NbOfTxs nie je pri importe hromadného príkazu povinné pole; overené 6. 9. 2026 v zdrojovom kóde SEPA pain.001 Doctor.
  3. SEPA pain.001 Doctor (ARLing s. r. o.): zdrojový kód kontroly nb_of_txs_mismatch a ctrl_sum_mismatch, kde je nezhoda oboch polí označená ako závažná (blokujúca) chyba. Interný zdroj, overené priamym čítaním kódu 6. 9. 2026.