GeneralLedgerEntries - счетоводните записи
Счетоводните записи - от журнал до транзакция до ред, и как точно се стига до сумите в тях.
Три нива, не едно
GeneralLedgerEntries е самото счетоводство - но структурирано на три вложени нива: Journal (дневник) съдържа Transactions (счетоводни операции), а всяка операция съдържа TransactionLines (счетоводни редове - дебит/кредит записите). Повечето капани в тази секция идват от объркване на кое ниво трябва да живее коя информация.
CustomerID и SupplierID на две нива едновременно
Ако операция е свързана с конкретен клиент, идентификаторът му (CustomerID) се подава
и на ниво транзакция, и на ниво ред - не само на едното от двете. И двете полета са
задължителни на всяко от двете нива по схема - логично е да се предположи, че редовете
просто наследяват стойността от транзакцията и не е нужно да се повтаря, но схемата
изисква изричното присъствие на двете нива поотделно.
Когато операцията изобщо няма контрагент
Ако операцията е обвързана с точно един от двата типа контрагент (само клиент
или само доставчик), другото поле получава изрично "0". Но ако редът изобщо не е
свързан нито с клиент, нито с доставчик (например вътрешно осчетоводяване на
амортизация или преоценка), правилото е различно: и CustomerID, и SupplierID
получават идентификатора на самата подаваща фирма - не "0" за двете, и не празни
полета. Трите различни сценария (само клиент / само доставчик / никой от двата)
водят до три различни комбинации, не до едно универсално правило.
Дебит и кредит - взаимно изключващи се, не двойка
Всеки ред е или дебитен, или кредитен - никога и двете. Ако редът е дебитен, CreditAmount
отсъства напълно от реда - не се пише "0.00". Схемата ги моделира като истински
xs:choice - същият принцип, който видяхме за началните салда в MasterFiles (глава 4),
се повтаря тук на ниво отделен ред.
Сумите не са голи числа - AmountStructure
DebitAmount, CreditAmount, TaxAmount и останалите парични полета в GLE не са прости
десетични числа - всяко от тях е цял контейнер, AmountStructure.
За операции в отчетната валута, CurrencyAmount трябва да е точно равно на Amount
Ако операцията е в отчетната валута (EUR), CurrencyAmount не е "приблизително същото
число" - логически трябва да съвпада точно с Amount, защото формулата
CurrencyAmount × ExchangeRate = Amount изисква курс 1 при едно и също и себе си.
Разминаване тук обичайно идва от закръгляне на двете полета поотделно в изходните ви
данни, не от самата схема. Дали такова разминаване се хваща зависи от софтуера ви -
някои инструменти (Magi включително) сверяват двете стойности и отбелязват коя са
коригирали; ако вашият не го прави, разминаването остава във файла и рискът е върху
вас. По-сигурно е изчисленията ви да произвеждат еднакви стойности от самото начало,
вместо да разчитате на автоматична поправка, която може да не съществува.
AccountID срещу TaxpayerAccountID - кой код е чий
Ред от транзакцията може да носи и двете полета едновременно, и това е нормално - те описват различни неща:
AccountID- кодът по номенклатурата на НАП (сметкопланa, съпоставен при мапирането - виж глава 7).TaxpayerAccountID- вашият вътрешен номер на сметката, както е в собствената ви счетоводна програма, преди мапиране.
Не са дублиране на едно и също нещо - едното е кодът, който НАП разпознава, другото е кодът, който вие разпознавате. Схемата иска и двете, за да може да проследи връзката между вътрешния ви сметкоплан и стандартизираната номенклатура.
Идентификаторите тук следват същите префиксни правила
Полетата CustomerID/SupplierID в GLE следват абсолютно същата префиксна система,
разгледана подробно в глава 7 (10=ЕИК, 11=VIES ДДС номер, 13=ЕГН и т.н.), включително
изискването за валиден код на държавата при чуждестранни контрагенти. Ако използвате
софтуер, който проверява или коригира тези кодове автоматично (какъвто е случаят с
Magi), проверката важи еднакво тук и в MasterFiles - но ако не сте сигурни дали
инструментът ви прави това, проверете идентификаторите ръчно и тук, не само в
MasterFiles.
Корекция на грешка от миналия период - две различни дати
Ако откриете грешка от предходен период и я коригирате сега, записът носи две отделни дати, не една:
SystemEntryDate- днешната дата, когато реално въвеждате корекцията в системата.GLPostingDate- датата от периода, за който се отнася грешката (миналия месец, не днешния).
Пример от практиката
Файлът за м.12.2025 г. вече е подаден и приет. На 20.02.2026 г. пристига фактура за ток, издадена на 15.02.2026 г., за период 15.12.2025-14.01.2026 - разходът за декемврийската част се осчетоводява със счетоводна дата 31.12.2025 г. Записът за файла за м.02.2026 г. (в който реално въвеждате тази операция) носи стойностите по-долу.
<nsSAFT:Period>12</nsSAFT:Period>
<nsSAFT:PeriodYear>2025</nsSAFT:PeriodYear>
<nsSAFT:TransactionDate>2026-02-15</nsSAFT:TransactionDate>
<nsSAFT:SystemEntryDate>2026-02-20</nsSAFT:SystemEntryDate>
<nsSAFT:GLPostingDate>2025-12-31</nsSAFT:GLPostingDate>
Забележете, че Period/PeriodYear следват GLPostingDate (декември 2025), не датата,
на която реално въвеждате записа.
Обърквания на двете е лесно
Интуитивно "датата на операцията" звучи като едно поле - но схемата изисква да различите кога сте направили нещо от за кой период се брои то. Ако запишете и двете полета с днешната дата, губите точно информацията, заради която корекцията се различава от нов, обикновен запис.
TaxInformation - данъчният код на всеки ред
За разлика от повечето структури в тази глава, TaxInformation не е опционална добавка
- схемата я изисква на всеки ред от транзакцията, дори когато редът няма нищо общо с
данъци.
Няма изключение \"този ред не е свързан с данъци\"
Кодовете 600 ("Данък върху разходите") и 700 ("Данък при източника") се посочват,
когато редът действително касае тези конкретни данъци. За всички останали случаи
(обичайни разходи и приходи, ДДС - вече отразен другаде в подаването) не се пропуска
елементът - подава се с кодове за неприложимост: TaxType = "000" и
TaxCode = "000000". Празен ред без TaxInformation не е валиден вариант.
Как да проверите себе си преди подаване
- Всеки ред има
CustomerID/SupplierIDна транзакционно И редово ниво - и правилната комбинация от трите сценария (само клиент / само доставчик / никой от двата). - Всеки ред е или дебитен, или кредитен - никога и двете, никога "0.00" за отсъстващото.
- Всяка парична стойност е пълен
AmountStructure; за отчетната валутаCurrencyAmountсъвпада точно сAmount. - Всеки ред носи
TaxInformation- с реален код за 600/700 или с кодовете за неприложимост "000"/"000000" за всичко останало, никога липсващ елемент. - Корекция от минал период разграничава
SystemEntryDate(днес) отGLPostingDate(периода на грешката), аPeriod/PeriodYearследватGLPostingDate.
Какво да запомните от тази глава
- Journal → Transaction → TransactionLine - три нива, всяко със собствени изисквания.
- CustomerID/SupplierID се подават на ниво транзакция И на ниво ред, не само на едното.
- Три различни сценария за контрагент: само клиент, само доставчик, или никой - последният получава идентификатора на подаващата фирма и на двете полета, не "0" и не празно.
- DebitAmount и CreditAmount са взаимно изключващи се на ниво ред (
xs:choice) - отсъстващото поле не се пише с "0.00". - Паричните полета са пълни AmountStructure контейнери (Amount + CurrencyCode + CurrencyAmount + ExchangeRate), не голи числа; за отчетната валута CurrencyAmount трябва да съвпада точно с Amount.
- AccountID (номенклатура на НАП) и TaxpayerAccountID (вътрешен код) са различни полета с различно предназначение, не дублиране.
- TaxInformation присъства на всеки ред без изключение - реален код 600/700 или кодове за неприложимост "000"/"000000", никога липсващ елемент.
- Корекция на грешка от минал период носи SystemEntryDate (днес) отделно от GLPostingDate (периода на грешката) - а Period/PeriodYear следват GLPostingDate.
Следващата глава е SourceDocuments - фактурите, плащанията и движението на стоки зад счетоводните записи.
Magi изгражда журналите и транзакциите вместо вас
Вместо да сглобявате ръчно Journals → Transactions → Lines от различни справки, Magi корелира данните ви автоматично.