RAP: бизнес-объекты, транзакции и EML#
Эта статья частично раскрывает MOD-07, MOD-08 и MOD-09 на основе документации SAP ABAP Cross-Product и ABAP Platform 2025 FPS02. Она объясняет основные границы модели, но не является пошаговой инструкцией по созданию приложения в конкретной системе. Имена объектов, доступные функции, язык ABAP и правила расширения зависят от редакции и версии.
Из каких частей состоит бизнес-объект#
В RAP бизнес-объект (BO) объединяет модель данных, объявленное поведение и исполняющую это поведение инфраструктуру. Обычно данные описаны CDS-сущностями. Корневая сущность задаёт точку входа, дочерние сущности входят в композиционное дерево. Behavior definition описывает операции и свойства сущностей; behavior pool содержит пользовательскую реализацию тех частей, которые не предоставляет выбранный runtime. Потребитель обращается к объекту напрямую через EML либо к опубликованному business service.
Разделяйте внутреннюю модель BO и её проекцию для конкретного сервиса. Проекция ограничивает публикуемые элементы и операции, но не должна незаметно менять предметный смысл корневой сущности, ключа или композиции. Service definition и service binding образуют отдельную границу публикации. Сам факт наличия CDS-представления ещё не означает, что оно стало изменяемым бизнес-объектом или опубликованным API.
Для финансового примера можно спроектировать синтетический BO «запрос на перенос бюджета»: корень содержит компанию, период и статус, дочерние строки - источник, получателя и сумму с валютой. Команда отправки на согласование меняет статус запроса; она не проводит перенос бюджетной суммы в SAP. Такое моделирование помогает обсуждать ключи, инварианты и жизненный цикл, но не заменяет стандартную функцию бюджетирования, FI-FM или AVC.
Managed или unmanaged#
Выбор реализации определяет, какую часть транзакционной работы принимает на себя framework.
- В managed BO стандартные операции и управление транзакционным буфером предоставляет RAP runtime. Разработчик добавляет предметные правила: determinations, validations, actions и другие предусмотренные моделью расширения.
- В unmanaged BO разработчик реализует обязательные части контракта и сам отвечает за транзакционный буфер и согласование изменений с существующей логикой хранения. Этот вариант может подойти для обёртки ранее реализованного процесса, но увеличивает объём обязанностей по корректности.
Это не деление на «новый» и «старый интерфейс». Решение принимают по фактическому владению данными и существующим бизнес-процессом. До выбора зафиксируйте, кто проверяет ключи и авторизацию, кто меняет состояние, как отклоняется несогласованная запись, где проходит точка сохранения и какой компонент освобождает блокировки. Поверхностный unmanaged wrapper не становится безопасным только из-за того, что он повторно использует существующую таблицу или функцию.
Проверки, вычисления и явные действия#
У трёх расширений разный смысл.
- Validation проверяет условие и может запретить сохранение экземпляра. Ошибки и сообщения возвращаются через структуры RAP
FAILEDиREPORTED. Проверка не должна сама запускать изменение через EML. Не полагайтесь на заранее заданный порядок нескольких validations с одним триггером. - Determination автоматически вычисляет или устанавливает значения при заданном изменении. Повторный запуск при тех же входных данных должен давать тот же результат. Поэтому расчёт итоговой суммы запроса по его строкам естественнее выразить determination, если этот инвариант принадлежит самой модели.
- Action представляет явную предметную операцию, например «отправить запрос на согласование». Она вызывается потребителем или из другой реализации через EML и выполняет предусмотренную бизнес-логику. Не прячьте необратимый внешний эффект в determination, которую runtime может вызвать повторно.
Триггеры, фаза выполнения, поддержка draft и допустимые действия зависят от типа реализации. В частности, SAP документирует ограничения для некоторых unmanaged-сценариев: отдельные validations и determinations поддерживаются только для draft instances. Проверяйте конкретный контракт и версию; не переносите поведение одного варианта реализации на все RAP BO.
Ошибку делайте адресной: укажите ключи затронутых экземпляров, подходящий тип сообщения и поле, к которому оно относится. Это позволяет потребителю показать результат рядом с данными и исправить именно нарушенное условие. Конфликт конкурентного изменения, ошибка авторизации и несоблюдение бизнес-правила - разные причины и не должны маскироваться одним общим сообщением.
EML и транзакционная граница#
Entity Manipulation Language (EML) - типизированный ABAP-интерфейс к RAP BO. Через него можно читать сущности, изменять их стандартными операциями, выполнять actions и работать с ассоциациями. Операция доступна только если она объявлена для соответствующей сущности и реализована согласно контракту. EML позволяет применять поведение BO без OData-клиента; это не превращает обращение в произвольную запись в базовую таблицу.
Изменения EML сначала находятся в транзакционном буфере RAP. Внешний вызывающий код в подходящем сценарии завершает RAP LUW через COMMIT ENTITIES; ROLLBACK ENTITIES сбрасывает изменения текущего буфера. Внутри обработки поведения точку сохранения контролирует RAP runtime. Не вставляйте COMMIT WORK в локальную логику handler-метода: это может нарушить единый порядок сохранения BO и участников одной SAP LUW. Для автоматизированной проверки BO вне behavior pool SAP предоставляет EML-тестовый сценарий с явным завершением RAP LUW.
IN LOCAL MODE требует особой осторожности. Внутри реализации собственного BO оно позволяет EML обойти проверки authorization и feature control, которые иначе выполняются на внешней границе. Это может быть уместно для внутреннего шага уже авторизованного сценария, но только если вызывающий путь действительно гарантирует необходимые права. При потреблении чужого или released BO локальный режим не является способом отменить контракт доступа. Не используйте его как универсальное исправление отказа.
Согласование параллельных изменений#
Два механизма защищают разные моменты изменения.
- Optimistic concurrency сравнивает версию прочитанной записи с текущей версией, обычно через ETag при OData-взаимодействии. Оно обнаруживает, что пользователь отправил изменение поверх устаревшего состояния.
- Pessimistic concurrency блокирует изменение объекта на время заданной RAP транзакции. В managed BO runtime выполняет стандартную блокировку; unmanaged реализации должны обеспечить необходимые обязанности сами. Для draft жизненный цикл блокировки отдельный.
Для BO важны обе гарантии: актуальность клиентского снимка и отсутствие несовместимой одновременной записи. Ключи и уникальность при создании проверяйте отдельно: блокировка существующего экземпляра не доказывает, что другой клиент не создаёт тот же ключ. В модели с корнем и дочерними строками укажите lock master и зависимые сущности так, чтобы область блокировки соответствовала бизнес-инвариантам, не захватывая несвязанные документы.
Проектная проверка до реализации#
- Зафиксируйте release, ABAP language version, редакцию и доступные released APIs.
- Опишите корневой объект, композиции, ключи, обязательные поля, валюту, единицы и владельца состояния.
- Выберите managed или unmanaged по существующему storage и логике, а не по привычке.
- Для каждого правила определите: это validation, determination, action или отдельная координация процесса?
- Определите внешний service/API contract отдельно от внутреннего behavior.
- Опишите EML-потребителя, authorization boundary, commit/rollback и требуемый результат при ошибке.
- Проверьте ETag, enqueue lock, draft и уникальность на двух параллельных изменениях.
- Подготовьте тесты для повтора determination, отказа validation, неуспешного сохранения, устаревшего ETag, конфликта ключа и отката всего BO.
Источники#
Источники зарегистрированы как metadata_only: локальные снимки и хеши страниц не сохранены. Код примера намеренно не представлен как активируемый RAP-артефакт; проверок ABAP syntax, ATC, ABAP Unit или SAP runtime для этого материала не проводилось.
- ABAP RESTful Application Programming Model, ABAP Cross-Product
- Defining and Implementing Behavior of the Business Object
- Developing Unmanaged Transactional Apps, ABAP Platform 2025 FPS02
- Validations
- Determinations
- Actions
- Concurrency Control
- Entity Manipulation Language (EML)
- Pessimistic Concurrency Control (Locking)