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

Закрытие периода и поздние проводки

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

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

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

Закрытие должно фиксировать, какие данные и правила использованы для результата периода. Поздняя доставка не должна незаметно менять утверждённый отчёт. При этом EDWH должен принимать и сохранять новые данные, чтобы объяснять расхождения и поддерживать разрешённый пересчёт.

Здесь рассматривается инженерный контракт закрытия для главной книги. Это материал knowledge, а не описание опыта автора или реализации лаборатории. Общая историзация разобрана в статье об истории и времени; здесь основной вопрос - готовность периода и управление версиями результата. Закрытие месяца в ERP, завершение загрузки EDWH и разрешение выпуска финансовой отчётности являются разными событиями.

Зерно, ключи и даты#

Входное зерно - версия строки проводки. Ключ включает систему-источник, юридическое лицо, книгу учёта, документ и номер строки; идентификатор версии сохраняют отдельно. Сумма хранится с валютой и масштабом. В синтетическом примере суммы выражены в целых копейках RUB, дебет положителен, кредит отрицателен. Валюты не суммируют между собой.

Поле Значение в предлагаемом контракте
operation_date Дата экономической операции по данным источника
posting_date Учётная дата, определяющая период проводки в данной книге
source_posted_at Момент регистрации проводки источником, если доступен
observed_at Момент первого получения версии EDWH
available_at Момент успешной публикации версии для расчётов после проверок
loaded_at Техническое время записи в слой хранения

Названия полей не являются стандартом. В этой модели business_date соответствует posting_date; переносить это соответствие на любой источник нельзя. Дата документа тоже может отличаться от даты операции. Пропущенное время источника остаётся неизвестным, его не заменяют временем загрузки.

Период определяется календарём книги, а не номером месяца из даты операции. Ключ периода включает книгу и календарь; для состояния закрытия добавляют юридическое лицо. Специальные корректировочные периоды требуют явного идентификатора источника, если одной даты недостаточно. Timestamp нормализуют в UTC, а деловые даты интерпретируют в согласованном календаре и часовом поясе.

Три вида позднего поступления#

Синтетический пример: расход по операции 28 января составляет 10000 копеек RUB. Документ содержит дебет расхода +10000 и кредит расчётов -10000. Январский результат зафиксирован 2 февраля с отсечкой доступности 2026-02-02T12:00:00Z.

Ситуация Учётная дата Доступность EDWH Следствие
Проводка существовала в источнике к отсечке, но доставка задержалась 31 января 3 февраля Январский выпуск не содержал документ; нужна оценка полноты и новая версия при разрешённом пересчёте
Новая проводка внесена в январь после разрешённого открытия периода 31 января 4 февраля Это изменение учётных данных после закрытия; нужны основание и версия состояния периода
Январская операция отражена в феврале по принятому учётному решению 3 февраля 4 февраля По учётной дате это февральский оборот; дата операции не переносит его в январь

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

Контракт закрытия и выпуска#

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

Рабочая последовательность ниже является псевдокодом, не исполняемым SQL или Python:

Определить юридическое лицо, книгу, период и критерии готовности.
Зафиксировать состояние источников и согласованные границы выгрузки.
Дождаться завершения необходимых партий и обработки исключений.
Закрепить набор версий, доступных до отсечки, и версии правил.
Проверить полноту, баланс документов и согласование остатков.
Рассчитать результат и сохранить трассировку к входным строкам.
При успехе проверок и утверждении создать неизменяемый выпуск.
Поздние данные сохранить и зарегистрировать их влияние отдельно.
Разрешённый пересчёт оформить новым выпуском со ссылкой на прежний.

Отсечка сама по себе не доказывает полноту. Нужны подтверждения источников по согласованному объёму данных: например, завершённые выгрузки и сверка ожидаемых документов. Партия, полученная до отсечки, но опубликованная после неё, не входит в этот выпуск по выбранному определению available_at. Это правило должно совпадать с фактически сохранённым набором входов.

Переоткрытие учётного периода разрешает ответственный учётный процесс. EDWH не меняет учётную дату самостоятельно. При поздней доставке ранее проведённого документа переоткрытие ERP может не требоваться, хотя выпуск EDWH потребует пересмотра. Альтернативы - замороженный выпуск и отдельный актуальный пересчёт либо замена активного выпуска новой версией после утверждения. Первый вариант требует явного выбора представления; второй требует сохранить прежний выпуск и объяснение изменений.

Жизненный цикл выпуска витрины#

Закрытие задаёт готовность периода, а выпуск закрепляет конкретный результат. Ниже предложен проектный контракт состояний для корпоративной витрины. Он не является требованием IAS 10 и не реализован на этом статическом сайте или в лаборатории. Выпуск EDWH не равнозначен разрешению выпуска финансовой отчётности.

Зерно манифеста - один неизменяемый release_id для определённой формы и её версии, периметра юридических лиц, книги, периода и валютного basis. Манифест закрепляет входной снимок, версии правил, единицы сумм и контрольный протокол. Ключ ячейки включает release_id и её деловые измерения. Состояние выпуска и история решений хранятся отдельно от неизменяемых ячеек: изменение статуса не переписывает суммы. Для рублёвого примера сохраняются целые копейки и ранее заданное соглашение о знаках; смена валюты или масштаба требует отдельного basis.

Состояние Допустимое действие и условие
preparing Подготовить полный набор ячеек и происхождение; после фиксации манифеста новые входы требуют нового ID
checked Зафиксировать успешный контроль именно этого манифеста; отсутствие обязательных данных блокирует переход
approved Уполномоченный процесс утвердил проверенный выпуск; сохранены решение, основание и время
rejected Контроль или утверждение отклонили кандидата; повторная подготовка создаёт новый ID
withdrawn Выпуск отозван с причиной; его нельзя выбирать как действующий
superseded Ранее действовавший выпуск заменён утверждённым новым; старые ячейки сохранены

Утверждение и активация различаются: утверждённый кандидат может ожидать переключения. В этом контракте отклонённый, отозванный или заменённый ID не активируют повторно. Возврат к прежним значениям оформляют новым кандидатом с повторным контролем и утверждением. Это выбранная политика управления, а не универсальное правило учёта.

Действующий выпуск и согласованное чтение#

Ссылка active_release имеет зерно согласованного отчётного периметра: форма, версия, книга, период и basis. Для него допустим не более одного действующего ID. Если форма включает несколько юридических лиц, переключают весь согласованный комплект; независимая замена каждого лица может создать смешанный отчёт. Отсутствие активного выпуска показывают явно.

Следующая последовательность - псевдокод контракта, не SQL или Python:

Зафиксировать новый выпуск B и проверить все его ячейки и связи.
Сохранить утверждение B и основание замены A.
В одной согласованной операции:
  проверить ожидаемые active_release = A и версию ссылки;
  проверить, что B утверждён, не отозван и имеет тот же периметр;
  перевести ссылку на B, отметить A как заменённый, записать переход.
Если ожидание не совпало, ничего не переключать и разобрать конфликт.

Версия ссылки нужна даже при повторном появлении того же значения: сравнение одного ID может не обнаружить промежуточное изменение. Первичная активация ожидает пустую ссылку. Повтор запроса с тем же идентификатором операции возвращает сохранённое решение; использование этого идентификатора для другого кандидата является конфликтом. При сбое до фиксации остаётся A; после фиксации повтор не создаёт второй переход. Для нескольких хранилищ требуется отдельный протокол согласованности, здесь он не реализуется.

Отзыв действующего B одновременно убирает активную ссылку и записывает причину либо переключает её на отдельно утверждённую замену. Автоматический возврат к A недопустим по выбранной политике. Сохранённые суммы и журнал переходов остаются доступны для разрешённого исторического просмотра с явным статусом.

Читатель разрешает активную ссылку один раз и закрепляет ID на весь отчёт, пагинацию, drill-back и выгрузку. Ключ кеша содержит ID; отсутствие ячейки даёт ошибку полноты, а не подстановку из другого выпуска. Старый читатель может завершить просмотр заменённого A с его статусом. Если политика запрещает чтение отозванного результата, запрос прекращают; незаметно продолжать его данными B нельзя. Права доступа проверяют по текущей политике.

Контроли включают двух одновременных утверждающих, отзыв между утверждением и активацией, повтор после потери ответа, неполный комплект ячеек и переключение между страницами выгрузки. Инварианты: активный ID утверждён и не отозван, переход имеет основание, все ячейки одного ответа принадлежат одному ID, прежний выпуск не изменён. Транзакция СУБД сама по себе не доказывает эти деловые условия. Происхождение отдельной ячейки и мост между выпусками разобраны в финансовой lineage; здесь задаётся только управление состоянием и выбором результата.

Вопросы для подготовки: чем утверждение отличается от активации? Как обнаружить конкурирующее переключение? Что должен делать экспорт, если его закреплённый выпуск отозван?

Восстановимость выпуска: комплект и приёмка#

Неизменяемость release_id не доказывает, что выпуск переживёт утрату хранилища. Для корпоративного контура предлагается отдельный контракт восстановления одного закреплённого выпуска. Это инженерные критерии, не требования IAS 10. Настройка резервного копирования, сроки хранения, обещания RPO/RTO и восстановление всей платформы здесь не рассматриваются.

Различают два результата: восстановление сохранённых ячеек для исторического чтения и повторный расчёт из архивных входов. Первое не доказывает второе. Зерно ячейки, валюта, масштаб, знаки, период и basis остаются заданными манифестом; нельзя подменить RUB в копейках текущей валютой представления или использовать новые курсы. Время восстановления фиксируют отдельно от исходных business_date, cutoff и времени утверждения.

Минимальный комплект зависит от заявленной цели:

Часть архива Что сохранять и зачем
Манифест и опись Исходный ID, периметр, период, basis, ключи и ожидаемые объекты, их версии, формат, количество записей и контрольные суммы
Зафиксированный результат Полный набор ячеек с деловыми ключами, валютой, масштабом и знаками; нужен для восстановления чтения и как эталон пересчёта
Входные снимки Все реально использованные версии строк и зависимые справочники, включая курсы и отображения; нужны для повторного расчёта, ссылки на текущие таблицы недостаточны
Правила и среда Версии преобразований, параметры, календарь, политика округления, порядок операций и существенные версии СУБД/исполняющей среды; один номер версии без доступного содержимого не даёт воспроизводимости
Контроли и решения Исходные результаты проверок полноты и баланса, исключения, утверждение, отзыв и замена; помогают сравнить восстановление и не активировать отозванный результат

Для исторического drill-back дополнительно нужны сохранённые связи с версиями строк из контракта lineage. Если есть только ячейки, доступна сумма, но не доказано происхождение до события. Архив хранится в защищённом корпоративном контуре; на публичный сайт не выгружают его данные, секреты или полномочия пользователей.

Приёмка начинается в отдельном контуре без обращения к текущим источникам. Сначала проверяют наличие каждого обязательного объекта, читаемость форматов, контрольные суммы и согласованность ссылок с манифестом. Хеш обнаруживает изменение относительно доверенной описи, но сам по себе не доказывает полноту или подлинность комплекта; опись и её происхождение тоже должны быть защищены. Отсутствующее правило, повреждённый снимок или неизвестная версия среды дают явный отказ в повторном расчёте, даже если ячейки удалось прочитать.

Затем сравнивают полный набор деловых ключей, отсутствие дублей и значения каждой ячейки в исходном basis. Для целых копеек требуется точное равенство; общая сумма не заменяет построчное сравнение. Повторяют исходные предметные контроли по документу и валюте и сравнивают их результаты с архивным протоколом. Совпадение ячеек без полного набора входов позволяет принять только восстановление чтения, не воспроизводимость расчёта. Если расчёт использовал приближённую арифметику, критерий допустимого отклонения должен быть закреплён заранее вместе с причиной; новый допуск нельзя вводить после обнаружения расхождения.

Синтетический пример: эталон содержит две ячейки +10000 и -10000 копеек RUB. Замена их на +9000 и -9000 сохраняет нулевой итог, но не проходит сравнение по ключам. Потерянная версия курса блокирует пересчёт зависимой ячейки, хотя сохранённое число остаётся читаемым. Новое время исполнения допустимо; новая учётная дата или версия курса меняет расчёт и требует другого выпуска.

В протоколе попытки сохраняют отдельный recovery_run_id, исходный release_id, состав комплекта, среду, различия и вывод по каждой цели. Успешное восстановление не утверждает выпуск заново и не переключает active_release; его статус сверяют с актуальным авторитетным журналом решений. Если журнал недоступен, активация блокируется. Права чтения применяют по текущей политике, а не восстанавливают автоматически из старого архива.

Документация PostgreSQL 18 описывает согласованный снимок одной базы при pg_dump; снимки разных баз при pg_dumpall не синхронизированы. Это свойство конкретного средства, а не доказательство согласованности EDWH-выпуска с файлами, внешними правилами и другими базами. Успешная загрузка дампа не заменяет предметную приёмку выше. Здесь нет исполняемого SQL/Python, восстановление и пересчёт не выполнялись.

Вопросы для подготовки: что можно принять, если остались ячейки, но потерян входной снимок? Почему контрольная сумма архива и нулевой итог не доказывают восстановимость? Как предотвратить активацию восстановленного, но ранее отозванного выпуска?

Учётный стандарт и поведение СУБД#

IAS 10 различает события между концом отчётного периода и разрешением выпуска отчётности: подтверждающие существовавшие на конец периода условия и свидетельствующие о новых условиях. Первые требуют корректировки признанных сумм; для существенных некорректирующих событий требуются раскрытия. Задержка доставки в DWH сама по себе не определяет эту классификацию. Стандарт не задаёт поля и состояния EDWH; учётное решение требует применимой редакции и оценки обстоятельств.

В PostgreSQL 18 при Read Committed последовательные запросы одной транзакции могут видеть разные зафиксированные данные. Repeatable Read даёт стабильный снимок относительно начала первого оператора, не управляющего транзакцией. Это поведение конкретной СУБД. Снимок не доказывает полноту источников и не сохраняет исторический выпуск после завершения транзакции. Для нескольких систем или расчётов вне одной транзакции нужен закреплённый набор входов. Здесь нет исполняемого примера и заявления о проверке PostgreSQL.

Контроли и пересчёт зависимостей#

Перед выпуском проверяют уникальность ключей версий и отсутствие размножения строк, полноту документов по источникам, баланс по документу и валюте, а также начальный остаток + оборот = конечный остаток по счёту, книге и валюте. Нулевая общая сумма не заменяет контроль полноты. Необработанный конфликт версии или отсутствующая обязательная партия блокируют выпуск либо дают явно обозначенный предварительный результат.

Если поздняя строка меняет январский оборот, она может менять январский конечный остаток и начальные остатки следующих периодов. Пересчёт распространяют по графу зависимостей до последнего затронутого результата; нельзя ограничиться январской витриной. При изменении учётной даты проверяют оба периода. Неизменившийся итог тоже требует объяснения, если изменился состав строк.

Для каждой пары выпусков сохраняют мост изменений: добавленные, исключённые и изменённые версии, их суммы по валютам, изменения правил и причины. Повтор с теми же входами и правилами должен воспроизводить результат. Техническое время повторного запуска может отличаться. Утверждённый старый выпуск остаётся доступным.

Граничные проверки включают строку ровно на отсечке (здесь включается), незавершённую партию, неизвестное время источника, повторное сообщение и переоткрытие без новых проводок. Для финансового календаря проверяют переход года и корректировочные периоды. Полный учёт ошибок прошлых лет, существенности и специальных регуляторных правил выходит за границы этой модели.

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

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

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

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

  1. IFRS Foundation - IAS 10 Events after the Reporting Period ↗
  2. PostgreSQL 18 - Transaction Isolation ↗
  3. PostgreSQL 18 - SQL Dump ↗

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