ФИНАНСОВАЯ ОБЛАСТЬP0L3

Сторно и повторная проводка: аудит и пересчёт

Как связать исходную запись, сторно и замену, сохранить аудит и пересчитать движение без потери оборотов и промежуточных состояний.

Справочный материал. Контракты данных, архитектурные решения и ограничения применения. Источники приведены в материалах, где используются внешние основания.

Задача и границы#

Исправление проведённого документа должно объяснять, какая запись отменена и какая появилась вместо неё. 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 18 UNIQUE и внешние ключи помогают контролировать идентичность и существование ссылок. CHECK не предназначен для гарантирования условий по другим строкам или таблицам. Баланс документа, отсутствие циклов и завершённость группы требуют дополнительных контролей. Эти замечания относятся к PostgreSQL 18, не доказывают аналогичное поведение другой СУБД и не являются заявлением о выполненных PostgreSQL-тестах.

Связанные темы и вопросы#

Базовое зерно разобрано в финансовых событиях, временные срезы - в истории и времени, независимый контроль полноты - в сверке.

  1. Почему удаление исходного документа и сторно может сохранить чистую сумму, но испортить сверку оборотов?
  2. Как отличить завершённую отмену без замены от недоставленной повторной проводки?
  3. Какие периоды изменятся, если сторно и замена имеют разные учётные даты?

Источники и документация

  1. SAP Learning - SAP S/4HANA: Configuring Document Reversal ↗
  2. IFRS Foundation - IAS 8: обзор требований ↗
  3. PostgreSQL 18 - Constraints ↗

Источники нужны для самостоятельной проверки. Примеры и интерпретации на сайте могут быть учебными упрощениями.