ПРАКТИКУМ И ДОКАЗАТЕЛЬСТВАP1L3

Проверка негативных и повторных финансовых операций

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

Ревизия 1 Применимость к указанным контекстам Частичное покрытие Контекст: CTX-GENERALКонтекст: CTX-S4-ONPREM документальная опора: недостаточно данных
Справочный материал. Контракты данных, архитектурные решения и ограничения применения. Источники приведены в материалах, где используются внешние основания.

Проверка негативных и повторных финансовых операций#

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

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

Негативные сценарии#

Закрытый или недопустимый период#

Используйте дату, период или ledger, которые не допускает сценарий. Ошибка должна объясняться выбранным правилом периода. Дата не должна незаметно переноситься, а непредусмотренная запись не должна оставаться.

Неполная финансовая идентичность#

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

Дублирующий ключ#

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

Отсутствующий получатель распределения#

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

Недостаточная доступность бюджета#

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

Ошибка после частичной обработки#

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

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

Повтор после таймаута#

Таймаут не означает, что операция не завершилась. Сначала запросите статус по correlation ID, бизнес-ключу или документу результата. Затем разделите три случая:

  1. Операция не применена. Повтор допустим по контракту с ограниченным числом попыток.
  2. Операция применена, ответ потерян. Повтор должен вернуть исходный результат или позволить найти созданный объект, не создавая второй финансовый эффект.
  3. Состояние неизвестно. Приостановите автоматический повтор и выполните сверку; не трактуйте неопределённость как отказ.

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

Транспортный ответ, запись входящего сообщения и подтверждение бизнес-проведения являются разными наблюдаемыми состояниями. Сверяйте документ, суммы по валютам, компанию и период. См. также контракт RFC, BAPI и IDoc и проверки HTTP API.

Два параллельных изменения одного объекта#

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

Не смешивайте защиту от параллельных изменений и защиту от повторной команды. Блокировка управляет конфликтом одновременного доступа к объекту, но сама по себе не распознаёт повтор после потери ответа. Версия объекта или optimistic concurrency может выявить устаревшее обновление, но не подтверждает выполнение ранее принятого финансового действия.

Для ABAP учитывайте границы SAP LUW и database LUW, а также синхронное или асинхронное обновление. Регистрация обновления, возврат из вызывающего кода и фактически сохранённый бизнес-объект не всегда совпадают по времени. Проверяйте документ и итоговое состояние после точки фиксации и при ошибке обновления. Подробности lock object и Update Task разобраны в статье ABAP: блокировки, SAP LUW и Update Task.

Минимальный протокол проверки#

  1. Зафиксируйте версию SAP, интерфейс, бизнес-ключ, применимые настройки и начальный снимок.
  2. Выполните один положительный случай и по одному случаю для каждого применимого отказа из матрицы.
  3. Повторите запрос после обычного ответа и после искусственно потерянного ответа; сравните финансовый эффект.
  4. Запустите две конкурентные команды и проверьте конфликт, порядок, сохранность инварианта и повторное чтение.
  5. Сверьте созданные документы, суммы по валютам и периодам, а также объяснимость каждого отклонения.
  6. Сохраните входы, версии настроек, безопасные идентификаторы, ожидаемый результат, команду, фактический итог и ограничения.

Локальная модель на синтетических данных может проверить арифметику, инварианты и алгоритм повторной обработки, но не доказывает SAP enqueue, Update Task, AVC или фактическую проводку. Источники SAP в этой статье сохранены как metadata_only; конкурентные финансовые операции и ошибки в SAP runtime не запускались.

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

  1. SAP Lock Concept ↗
  2. LUWs in ABAP ↗
  3. CALL FUNCTION, IN UPDATE TASK ↗
  4. Synchronous and Asynchronous Updating ↗
  5. Availability Control Ledger ↗
  6. Defining Budget and Posting Addresses ↗

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