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

Версии соответствий счетов статьям отчётности

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

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

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

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

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

Зерно, ключи и сумма#

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

Зерно правила - один интервал соответствия счёта одной конечной статье внутри неизменяемого набора правил. Контекст поиска включает источник, юридическое лицо, регистр, план счетов и его версию, счёт, форму отчёта и rule_set_id. Если классификация зависит от подразделения или типа операции, эти признаки становятся частью контекста; соединение только по номеру счёта недостаточно.

Поле Смысл в предлагаемой модели
rule_set_id, rule_id Идентификаторы набора правил и отдельного правила
report_item_id Конечная статья в закреплённой версии структуры отчёта
valid_from, valid_to Начало включительно и конец исключительно: [valid_from, valid_to)
business_date Дата строки, используемая для выбора интервала; здесь это дата проводки
observed_at Когда EDWH впервые получил версию строки
approved_at Когда набор правил был утверждён ответственным процессом

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

Покрытие до агрегации#

Для каждой входной строки определяют число подходящих правил внутри выбранного набора и контекста. Ноль означает отсутствующее соответствие, единица - допустимое, больше единицы - неоднозначное. Две одинаковые записи с одной статьёй тоже являются ошибкой: обычное соединение всё равно удвоит сумму.

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

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

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

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

Синтетический пример и инварианты#

Две январские строки одного счёта имеют суммы +10000 и -2000 копеек RUB. Набор R1 относит обе к статье A. Новый набор R2, утверждённый в феврале, относит этот счёт с 1 января к статье B. Это вымышленная переклассификация без изменения проводок.

Расчёт Статья A, копейки RUB Статья B, копейки RUB Общий итог
Старый выпуск, R1 8000 0 8000
Пересчёт того же входа, R2 0 8000 8000

Мост изменений показывает -8000 по A и +8000 по B. Равенство общего итога не означает неизменности отчёта. Если оба правила ошибочно попали в один выбранный набор с пересекающимися интервалами, каждая строка получит два соответствия и итог станет 16000. Нельзя соединять факты со всеми версиями правил одновременно.

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

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

Версия выпуска и альтернативы#

Выпуск закрепляет входные версии строк или воспроизводимый снимок, набор правил, версию структуры отчёта, календарь и правила знаков. Сохраняются результаты покрытия, связи с правилами и версия расчётного алгоритма. Одного observed_at недостаточно, если данные или правила впоследствии перезаписываются; время доступности входа определяется контрактом закрытия периода.

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

Альтернатива - хранить соответствия с деловым и системным временем вместо полных снимков наборов. Это уменьшает копирование, но требует корректного выбора обеих временных координат и сохранения всей истории. Полные неизменяемые наборы проще закреплять в выпуске, однако занимают больше места. Обе стратегии должны давать однозначный результат.

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

Ограничения СУБД и граничные случаи#

В PostgreSQL 18 типы диапазонов представляют интервалы, а exclusion constraints позволяют запрещать пересечения. Это средство контроля неоднозначности. Для составного контекста нужны подходящие операторы и индексная поддержка; готового DDL и утверждения о тестировании PostgreSQL здесь нет. Непересечение не гарантирует отсутствие пробелов в покрытии.

Согласно документации ограничений PostgreSQL 18, обычный CHECK не поддерживает проверку других строк таблицы. Поэтому строковые проверки границ и внешние ключи не заменяют контроль покрытия фактов выбранным набором правил. Эти свойства конкретной СУБД не следует автоматически переносить на SQLite или Greenplum. Модель соответствий не выводится из требований SQL или бухгалтерского стандарта.

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

Исправление справочника: основание и новый basis#

Ошибка реализации соответствия и новая политика классификации требуют разных оснований. Если утверждённое правило относило счёт к B, а справочник ошибочно содержал A, исправляют реализацию с документированным интервалом ошибки. Если принято новое правило, фиксируют решение, дату действия и область применения; дата загрузки справочника не определяет начало его действия. Ответственный за отчётность отдельно решает, какие сравнительные периоды представить заново. Изменение справочника само по себе не доказывает ошибку бухгалтерской отчётности.

Обзор IAS 8 IFRS Foundation различает изменения политики, оценки и ошибки. Он описывает ретроспективное применение изменений политики с исключениями и исправление существенных ошибок прошлых периодов с оговоркой о практической осуществимости. Поэтому новая политика не означает автоматически «только вперёд». Применимую редакцию, переходные положения и существенность определяет учётный процесс; полный текст может требовать доступа. Эти положения не задают алгоритм EDWH ниже.

Для изолированной оценки влияния закрепляют прежний входной снимок, cutoff, валюту, масштаб, календарь, курсы и алгоритм, меняя только версию исправленного справочника. Это новый basis и кандидат нового выпуска. Если одновременно включают поздние события или меняют курсы, перечисляют эти изменения отдельно: разница уже не объясняется одним справочником. Прежний выпуск и его манифест сохраняют без перезаписи.

Поиск затронутых строк, периодов и выпусков#

Зерно оценки влияния - версия исходной строки в конкретном входном снимке выпуска. Реестр кандидатов хранит release_id, полный ключ строки, старую и новую версии справочника, интервал изменения, прямую причину и зависимые результаты. observed_at исправления определяет момент доступности новой версии, а не период финансового влияния.

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

Затем ищут строки в сохранённых входных снимках потенциально затронутых выпусков по этим контекстам и датам [valid_from, valid_to). Для движения дата относится к периоду по закреплённому календарю регистра, включая корректировочные периоды. Регистрируют также выпуски с нулевым итогом и предварительные выпуски с отсутствующим соответствием. Текущая таблица фактов не заменяет исторические входы. Индекс lineage ускоряет отбор, но его полноту нужно подтвердить снимками и манифестами.

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

Выбор пересчёта и контроль полноты влияния#

Разделяют технически затронутые выпуски и выпуски, выбранные для нового представления. Для каждого кандидата сохраняют решение: пересчитать, сохранить только исторический результат или отложить с причиной и ответственным. Неизменный общий итог не исключает изменения статей. Старый ID не получает новые ячейки; управление заменой описано в закрытии периода, объяснение различий - в финансовой lineage.

Синтетический пример расширяет R1/R2 выше: изменение действует в январе [2026-01-01, 2026-02-01), а февральские движения классифицируются как прежде. Прямое влияние на январские A и B составляет соответственно -8000 и +8000 копеек RUB. Если февральский остаток по статье рассчитывается накоплением движений, в него переходят те же изменения; февральский оборот от этого не меняется. Если отчёт использует независимый снимок, такой перенос нельзя предполагать. Это разные контракты, а не два результата одного алгоритма.

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

Узкая оценка дешевле полного пересчёта, но требует полного графа и архивных входов. Консервативный широкий пересчёт уменьшает риск пропущенной зависимости, однако не заменяет учётное разрешение на новое представление. Здесь описаны критерии решения, нет планировщика или исполняемого SQL/Python; оценка и пересчёт не выполнялись. Представление интервалов в PostgreSQL 18 не доказывает полноту этого процесса.

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

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

Независимые проверки полноты рассматриваются в сверке данных. История входных событий и история правил являются разными зависимостями одного выпуска.

  1. Почему два правила одной статьи нельзя считать одним допустимым соответствием?
  2. Как объяснить изменение статей при неизменном общем итоге и входном наборе?
  3. Что потребуется сохранить, чтобы повторить январский выпуск после февральской переклассификации?

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

  1. IFRS Foundation - IAS 8 overview ↗
  2. PostgreSQL 18 - Constraints ↗
  3. PostgreSQL 18 - Range Types ↗

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