Как связать исходную запись, сторно и замену, сохранить аудит и пересчитать движение без потери оборотов и промежуточных состояний.
8 мин чтения·База знаний
Справочный материал. Контракты данных, архитектурные решения и ограничения применения. Источники приведены в материалах, где используются внешние основания.
Исправление проведённого документа должно объяснять, какая запись отменена и какая появилась вместо неё. EDWH сохраняет исходные события и связи исправления, а не затирает сумму первоначального документа. Здесь рассматривается контракт полного сторно с отдельной повторной проводкой для главной книги. Частичный возврат, переоценка и изменение оценки требуют собственных правил; их нельзя автоматически считать полным сторно.
Простой временной пересчёт уже показан в сквозном лабораторном случае. Эта статья расширяет модель связями исправления, контролем неполных цепочек и разделением оборотов и чистого движения. Это инженерные рекомендации со статусом knowledge, без заявления о реализации или опыте автора.
Зерно денежного факта - строка проведённого документа. Её бизнес-ключ: система-источник, юридическое лицо, книга, финансовый год при необходимости, идентификатор документа и номер строки. Год нужен, если источник повторно использует номера документов. Версия сообщения и идентификатор доставки не заменяют идентичность бухгалтерской записи.
Зерно связи исправления - направленная связь между документами с типом reverses или replaces. Сохраняют ключи обоих документов, основание, идентификатор группы исправления и время получения связи. Связь reverses ведёт от сторно к отменяемому документу; replaces - от новой записи к исправляемому. Это предлагаемая схема, а не обязательные поля стандарта. Если источник не передаёт связь, фиксируют отсутствие или документированное правило сопоставления; одинаковые суммы не доказывают связь.
Каждая сумма имеет валюту и масштаб. В примере ниже используются целые копейки RUB, дебет положителен, кредит отрицателен. business_date - учётная дата строки, observed_at - момент первого получения события EDWH, available_at - доступность после проверок. Все три документа сохраняют собственные даты. Группа исправления не переносит сторно в период исходной записи.
В синтетическом примере исходный документ O содержит расход +12000 и расчёты -12000. Полное сторно R даёт расход -12000 и расчёты +12000. Замена N содержит расход +10500 и расчёты -10500. Все суммы в копейках RUB; каждый документ сбалансирован отдельно.
Представление расходного счёта
Дебетовый оборот
Кредитовый оборот
Чистое движение
Только O
12000
0
12000
O и обычная обратная проводка R
12000
12000
0
O, обычная R и N
22500
12000
10500
Чистое движение равно дебету минус кредиту в выбранном соглашении. Оно не является универсальным определением прибыли: для финансового результата нужны классификация счетов и правила отчёта. Удаление O и R даёт ту же чистую сумму, но теряет обороты и аудит. Аналитическое представление только действующих документов допустимо отдельно; его нельзя выдавать за журнал или использовать для сверки валовых оборотов.
В учебном материале SAP S/4HANA обычное сторно увеличивает обороты противоположной стороны, а negative posting уменьшает соответствующие обороты. Negative posting требует разрешения в настройках компании и причины сторно. Это поведение продукта, а не универсальное требование учёта; для конкретной версии и конфигурации проверяют контракт выгрузки. Одной суммы со знаком недостаточно, чтобы восстановить оба вида оборотов: сохраняют исходную сторону и признак способа сторнирования.
O доступен 31 января. R поступает 3 февраля, N - 4 февраля; учётная дата всех трёх в примере январская. На отсечке доступности 3 февраля чистое движение расходного счёта равно нулю. Это наблюдаемое промежуточное состояние, а не доказательство завершённого исправления. Если источник подтверждает необходимость замены, группа остаётся незавершённой до получения N. Отмена без замены может быть самостоятельным завершённым действием; статус нельзя выводить только из отсутствия N.
Если R приходит раньше O, сохраняют исходное сообщение и неразрешённую ссылку. По предлагаемой политике группа не допускается в окончательный аналитический выпуск до разрешения ссылки; промежуточный результат маркируется явно. Не создают фиктивную исходную проводку. Порядок доставки не доказывает порядок бухгалтерских действий, поэтому запрет замены до сторно в лаборатории не является универсальным правилом.
Повтор того же события с тем же содержимым не создаёт денежный факт. Другое содержимое под прежним ключом неизменяемого события является конфликтом. Если источник передаёт изменяемое состояние документа, применяют контракт версий, а не правило неизменяемого потока. Версии нельзя суммировать как отдельные проводки; новая версия ссылки на сторно тоже не создаёт повторного сторно.
Ниже псевдокод, не исполняемый SQL или Python. Он описывает политику публикации группы исправления, а не текущий лабораторный код.
Сохранить сообщение, источник, время получения и исходное содержимое.
Проверить ключ, валюту, масштаб и контракт неизменяемости или версий.
Разрешить ссылки reverses и replaces в пределах учётного контура.
Проверить баланс документов и соответствие полного сторно исходному.
Определить завершённость группы по подтверждённому контракту источника.
Неразрешённые группы оставить в исключениях с явным статусом.
Готовую группу опубликовать согласованно вместе со связями и строками.
Зафиксировать набор входов, отсечку доступности и версию правил.
Пересчитать затронутые обороты и зависимые остатки новым выпуском.
Сохранить прежний выпуск и объяснение изменения по документам.
При полном сторно проверяют противоположное движение по соответствующим счетам, аналитикам и валютным измерениям исходного документа. Если функциональная валюта изменилась из-за правил курса или появились отдельные курсовые строки, простое построчное равенство неприменимо: нужен отдельный контракт, а не допуск, скрывающий расхождение. Замена может менять сумму и счёт; равенство N и O не требуется.
Если R учтён в феврале, январский учётный оборот сохраняет O; февраль включает R и, при февральской дате, N. Аналитическая группировка по исходной операции имеет другую семантику. Пересчёт остатков распространяют от первого затронутого периода по зависимостям. Правила утверждения нового выпуска разобраны в закрытии периода.
Согласованная публикация группы удобна для окончательной витрины, но задерживает доступность при неполной доставке. Публикация отдельных событий быстрее, но требует показывать незавершённость и воспроизводить промежуточные срезы. В обоих вариантах сохраняют поступившие события и не добавляют будущую замену в прошлый срез.
Уникальность бизнес-ключа события и контроль содержимого
Дубль доставки или конфликт, а не новую проводку
Существование цели ссылки и совпадение учётного контура
Потерянный документ или неверное сопоставление
Баланс по документу и валютному измерению
Ошибку строк; общий ноль по партии недостаточен
Соответствие R исходному O по контракту полного сторно
Неполную или ошибочную отмену
Отсутствие циклов и повторного полного сторно одной цели
Ошибочную цепочку в этой модели
Отдельная сверка ожидаемых документов и связей
Пропуск целой сбалансированной группы
В данной модели повторное полное сторно O отвергают как исключение. Если система поддерживает отмену сторно, нужен отдельный тип действия и явная цепочка, а не второй независимый R. Несколько исправленных документов вместо одного требуют связи один-ко-многим и критериев завершения группы. Соединение строк с такими связями может размножить суммы: денежные агрегаты считают на зерне строки, а связи используют для трассировки отдельно.
Граничные сценарии для приёмки: сторно без оригинала, повтор R, конфликт суммы, другая валюта, замена на другой счёт, отмена без замены, раздельная доставка, цикл ссылок и исправление через границу года. Для каждого заранее определяют ожидаемый результат или исключение. Числа таблицы являются арифметической иллюстрацией, не результатом выполнения SQL.
IAS 8 требует ретроспективного исправления существенных ошибок прошлых периодов, кроме случаев практической неосуществимости определения их эффекта. Изменения оценок на основе новой информации не являются исправлениями ошибок. Стандарт не предписывает схему reverses или технический способ сторно в ERP. Применимую редакцию и учётное решение определяет ответственный процесс; EDWH сохраняет основание и реализует согласованные правила.
В PostgreSQL 18UNIQUE и внешние ключи помогают контролировать идентичность и существование ссылок. CHECK не предназначен для гарантирования условий по другим строкам или таблицам. Баланс документа, отсутствие циклов и завершённость группы требуют дополнительных контролей. Эти замечания относятся к PostgreSQL 18, не доказывают аналогичное поведение другой СУБД и не являются заявлением о выполненных PostgreSQL-тестах.
Correcting a posted document must explain which entry was cancelled and which entry replaced it. The EDWH retains source events and correction links instead of overwriting the original document's amount. This article proposes a contract for a full reversal followed by a separate reposting in the general ledger. Partial refunds, revaluation, and changes in estimates need their own rules; they must not automatically be treated as full reversals.
A simple time-based recalculation is already shown in the end-to-end lab case. This article extends the model with correction links, incomplete-chain controls, and a distinction between turnover and net movement. These are engineering recommendations with knowledge status, without claims about implementation or the author's experience.
The monetary fact grain is one line of a posted document. Its business key comprises source system, legal entity, ledger, financial year where necessary, document identifier, and line number. The year is needed if the source reuses document numbers. Message versions and delivery identifiers do not replace the identity of an accounting entry.
The correction-link grain is one directed link between documents, typed as reverses or replaces. Retain both document keys, the reason, a correction-group identifier, and the time the link was received. A reverses link points from the reversal to the cancelled document; a replaces link points from the new entry to the corrected document. This is a proposed schema, not mandatory standard-defined fields. If the source supplies no link, record its absence or a documented matching rule; equal amounts do not prove a relationship.
Each amount has a currency and scale. The example below uses integer RUB kopecks, with debit positive and credit negative. business_date is the line's accounting date, observed_at is when the EDWH first received the event, and available_at is availability after validation. All three documents retain their own dates. A correction group does not move a reversal into the original entry's period.
In the synthetic example, original document O contains an expense of +12000 and a payable of -12000. Full reversal R contributes expense of -12000 and payable of +12000. Replacement N contains expense of +10500 and payable of -10500. All amounts are RUB kopecks; each document balances separately.
Expense-account view
Debit turnover
Credit turnover
Net movement
O only
12000
0
12000
O and ordinary opposite-side reversal R
12000
12000
0
O, ordinary R, and N
22500
12000
10500
Net movement equals debit minus credit under the chosen convention. It is not a universal definition of profit: financial results require account classification and report rules. Removing O and R gives the same net amount but loses turnover and the audit trail. A separate analytical view of effective documents is possible; it must not be presented as the journal or used to reconcile gross turnover.
In the SAP S/4HANA learning material, an ordinary reversal increases opposite-side turnover, whereas a negative posting reduces the corresponding turnover. Negative postings require permission in company-code and reversal-reason settings. This is product behavior, not a universal accounting requirement; verify the extraction contract for the particular version and configuration. A signed amount alone cannot reconstruct both turnover treatments: retain the source side and reversal-method indicator.
O is available on January 31. R arrives on February 3 and N on February 4; all three accounting dates are in January in this example. At the February 3 availability cutoff, net expense-account movement is zero. This is an observed intermediate state, not proof of a completed correction. If the source confirms that a replacement is required, the group remains incomplete until N arrives. Cancellation without replacement can be a completed action in its own right; its status cannot be inferred solely from the absence of N.
If R arrives before O, retain the source message and unresolved reference. Under the proposed policy, the group cannot enter a final analytical release until the reference is resolved; an intermediate result is explicitly marked. Do not invent an original entry. Delivery order does not establish accounting-action order, so the lab's prohibition on replacement preceding reversal is not a universal rule.
Repeating the same event with identical content does not create another monetary fact. Different content under the same immutable-event key is a conflict. If the source supplies mutable document state, apply a version contract rather than immutable-stream rules. Versions must not be summed as separate journal entries; a new version of a reversal link does not create another reversal either.
The following is pseudocode, not executable SQL or Python. It describes a correction-group publication policy, not the current lab code.
Retain the message, source, receipt time, and original content.
Validate the key, currency, scale, and immutability or version contract.
Resolve reverses and replaces links within the accounting scope.
Check document balance and full-reversal correspondence to the original.
Determine group completion using the confirmed source contract.
Keep unresolved groups as exceptions with an explicit status.
Publish a ready group consistently with its links and lines.
Pin the input set, availability cutoff, and rule version.
Recalculate affected turnover and dependent balances in a new release.
Retain the previous release and a document-level explanation of changes.
For a full reversal, check opposite movement against the original document's corresponding accounts, analytical dimensions, and currency dimensions. If functional-currency amounts change because of exchange-rate rules or separate FX lines appear, simple line-by-line equality is inapplicable: use a separate contract rather than a tolerance that hides discrepancies. The replacement may change amount and account; N need not equal O.
If R is posted in February, January accounting turnover retains O; February includes R and, if dated in February, N. Analytical grouping by original operation has different semantics. Propagate balance recalculation from the earliest affected period through dependencies. Rules for approving a new release are covered in period close.
Consistent publication of a group suits a final mart but delays availability when delivery is incomplete. Publishing individual events is faster but requires exposing incompleteness and reproducing intermediate snapshots. Both approaches retain received events and exclude future replacements from past snapshots.
Event business-key uniqueness and content comparison
Duplicate delivery or conflict, rather than a new entry
Link-target existence and matching accounting scope
Missing document or incorrect matching
Balance by document and currency dimension
Line errors; a zero batch total is insufficient
Correspondence of R to O under the full-reversal contract
Incomplete or incorrect cancellation
No cycles or repeated full reversal of one target
An invalid chain in this model
Separate reconciliation of expected documents and links
A missing, fully balanced group
This model treats a repeated full reversal of O as an exception. If a system supports cancelling a reversal, it needs a distinct action type and an explicit chain rather than a second independent R. Multiple corrected documents replacing one original require one-to-many links and group-completion criteria. Joining lines to such links can multiply amounts: calculate monetary aggregates at line grain and use links separately for lineage.
Acceptance boundary cases include a reversal without its original, repeated R, conflicting amounts, another currency, replacement with another account, cancellation without replacement, separate deliveries, a reference cycle, and a correction across a year boundary. Define an expected result or exception for each beforehand. The table's numbers are an arithmetic illustration, not SQL execution results.
IAS 8 requires retrospective correction of material prior-period errors, except where determining their effects is impracticable. Changes in estimates based on new information are not corrections of errors. The standard does not prescribe a reverses schema or an ERP's technical reversal method. The responsible process determines the applicable edition and accounting decision; the EDWH retains the rationale and implements agreed rules.
In PostgreSQL 18, UNIQUE and foreign keys help control identity and reference existence. CHECK is not intended to guarantee conditions involving other rows or tables. Document balance, cycle detection, and group completion need additional controls. These observations apply to PostgreSQL 18, do not establish equivalent behavior in other databases, and are not a claim of executed PostgreSQL tests.