---
schema_version: "1"
id: b285acc166fa1db6a98ddba8e3f2902060bde722b0d11c13f1a243745dc53410
title: 建筑表单
collection: architect
version: current
locale: zh-cn
portal_url: https://docs.salesforce.com/architect/current/zh-cn/decision-guides/guides/build-forms.md
canonical_url: https://architect.salesforce.com/docs/architect/zh-cn/decision-guides/guide/build-forms.html
source_site: architect.salesforce.com
content_type: documentation
content_hash: f45f43d0382616dd7d7bbc2a95a093ef0715c62de6237be8c22ff6ee913a69fd
products:
  - 决策指南
  - Architect Site Content Repo
updated_at: 2026-03-01T00:00:00Z
---
# 建筑表单

在 Agentforce 360 平台上构建表单有多种选项，它们跨越从低代码到专业代码方法的连续体。在连续体的一端，Lightning 应用程序生成器中的动态表单和 Flow Builder 中的屏幕流可用于低代码解决方案。另一方面，Lightning Web 组件 (LWC) 框架用于支持代码的解决方案。在连续体中，工具可以通过多种方式混合，使用 LWC 扩展的屏幕流和使用 Omnistudio 构建的面向客户的表单。

## 指南概览

本指南提供了 UI 解决方案构建表单的决策框架和指南。特别是，它使用十几个运行时和非功能决策点来为给定的用例正确选择最佳技术。

## 外卖

- **当您为 Lightning 页面构建创建/编辑/查看布局时，请使用动态表单。**今后,我们建议使用 _Lightning 应用程序生成器_中的_动态表单_来配置记录详细信息页面。

- **如果您需要为一个对象构建、创建或编辑表格，请使用 _Lightning 页面_和_动态表格_。**这是在 Agentforce 360 平台上构建表单的最简单方法。它还提供了额外的功能（例如，字段可见性控制）。

- **如果您正在构建多页面表单或向导，并且没有严格的 UX 或品牌化要求，请使用屏幕流。**屏幕流为编排多个表单提供了线性导航框架。您可以使用 LWC 来构建您自己的框架，以便在表单之间导航，但是我们建议让 Flow 来做这项工作，这样您就可以专注于表单本身，而不是专注于表单状态。

- **如果您需要其他逻辑或操作来支持表单，请使用屏幕流、Omnistudio 或 LWC。**其中每个工具都提供了不同的方法来增强您的解决方案，因为它允许它进行扩展，而不仅仅是创建或编辑单个记录。在这种情况下 , 术语_更多_可能是指高级逻辑(例如,分支或迭代 ) , 也可能是指与外部系统集成、发送电子邮件或将通知推送到用户移动应用程序等操作。

- **如果您有复杂的 UX 要求，或者如果您需要动态管理 UI 可见性以外的内容，请使用 LWC 或 Omniscript。**对于通过使用主题和基于列的布局来满足的要求，您可以直接在低代码生成器中构建表单。但是，对表单样式的精细控制需要 LWC 的灵活性。如果您是行业客户，并且您需要像素级完美品牌化，或者您拥有复杂的层次结构数据，请使用 Omnistudio，这允许您构建能够处理复杂业务逻辑和数据转换的消费者级表单。

- **如果您需要部署测试自动化，请使用 LWC。**您可以为任何 LWC 编写单元测试，而不论您将其嵌入何处。这提供了创建更强大的测试策略的能力，其中可能包括具有多个记录的批量测试以及消极测试。

- **您不受“要么/要么”决策的约束。**您可以组合多个选项来获得适用于用例的最佳解决方案（例如，如果您需要 Flow 的内置导航系统和 LWC 提供的完整样式灵活性，您可以一起使用它们）。

## 范围中的工具

以下工具通常用于实施和扩展表单体验。

### 工具描述

<table><tr><th colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;">动态表单</th>
<th colspan="1" rowspan="1"><a href="https://help.salesforce.com/s/articleView?id=platform.lightning_app_builder_overview.htm&type=5">Salesforce Lightning 应用程序生成器</a>中的<a href="https://help.salesforce.com/s/articleView?id=platform.dynamic_forms_migrate.htm&language=en_US&type=5">动态表单</a>将整体记录详细信息组件分解为单独的可配置字段和部分。此功能允许管理员通过在任何地方放置字段来创建灵活的高性能页面，并使用可见性规则根据用户简档、设备或数据显示或隐藏组件，这有助于减少页面混乱。</th></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流</strong></td>
<td colspan="1" rowspan="1">Salesforce <a href="https://help.salesforce.com/s/articleView?id=platform.create_forms_with_screen_flow_components.htm&type=5">屏幕流</a>是 <a href="https://help.salesforce.com/s/articleView?id=platform.flow.htm&type=5">Flow Builder</a> 中的一个交互式自动化工具，需要用户输入才能完成自定义的逐步业务流程。与自动后台流不同,屏幕流提供类似向导的用户界面,以通过 <a href="https://help.salesforce.com/s/articleView?id=platform.lightning_page_overview.htm&type=5">Lightning 页面</a>、按钮或自定义应用程序收集数据、显示信息或执行操作,而无需编写代码。</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>奧姆尼斯圖</strong></td>
<td colspan="1" rowspan="1">Salesforce <a href="https://help.salesforce.com/s/articleView?id=xcloud.os_omnistudio_standard.htm&type=5">Omnistudio</a> 是一款低代码工具套件，旨在快速构建特定于行业的引导式数字体验和复杂的业务流程。它使开发人员能够使用拖放组件(例如 <a href="https://help.salesforce.com/s/articleView?id=xcloud.os_flexcardsbasics_8118.htm&type=5">Flexcard</a> 和 <a href="https://help.salesforce.com/s/articleView?id=xcloud.os_omniscripts_8355.htm&type=5">Omniscript)</a>创建像素级完美用户界面(例如,引导式工作流和动态仪表板)。使用 Omnistudio，您可以声明性地创建 LWC。</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>Lightning Web组件</strong></td>
<td colspan="1" rowspan="1">Salesforce <a href="https://developer.salesforce.com/developer-centers/lightning-web-components">Lightning Web 组件</a>是轻量级的自定义 HTML 元素,使用 HTML、CSS 和现代 JavaScript 构建,设计用于在浏览器中本地运行,以获得卓越的 Salesforce UI 性能。它们允许开发人员创建与 <a href="https://developer.salesforce.com/docs/atlas.en-us.lightning.meta/lightning/intro_framework.htm">Aura</a> 组件共存的自定义用户界面，这通过行业标准和详细的组件生态系统增加了开发。</td></tr></table>

### 工具技能和许可证要求

此表概述了可用于通过 Salesforce 构建表单的工具，以及所需的技能和许可证注意事项。

**注意：**我们将在下一节深入探讨每个工具支持的特定功能，如何在基于点击的工具和基于代码的工具之间进行选择，以及何时组合它们。

<table><tr><th colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"></th>
<th colspan="1" rowspan="1">配置</th>
<th colspan="1" rowspan="1">其他许可证要求</th></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>动态表单</strong></td>
<td colspan="1" rowspan="1">低代码</td>
<td colspan="1" rowspan="1">无</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流</strong></td>
<td colspan="1" rowspan="1">低代码</td>
<td colspan="1" rowspan="1">无</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>奧姆尼斯圖</strong></td>
<td colspan="1" rowspan="1">低代码 + 专业代码</td>
<td colspan="1" rowspan="1">行业软件包</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流加上 Lightning Web 组件</strong></td>
<td colspan="1" rowspan="1">低代码 + 专业代码</td>
<td colspan="1" rowspan="1">无</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>Lightning Web组件</strong></td>
<td colspan="1" rowspan="1">Pro 代码</td>
<td colspan="1" rowspan="1">无</td></tr></table>

## 决策点

在选择产品和工具时，请记住一些决策点。此表概述了各种决策点，并提供高级别指导。

<table><tr><th colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;">决策点</th>
<th colspan="1" rowspan="1">指导</th></tr>
<tr><td colspan="2" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>运行时用例类别</strong></td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>表单范围和导航</strong></td>
<td colspan="1" rowspan="1">确定表单上的所有字段是否逻辑上适合一个屏幕，或者用户是否需要能够在多个屏幕之间导航。</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>位置</strong></td>
<td colspan="1" rowspan="1">确定您想要嵌入表单的位置，范围从 Salesforce 应用程序内部、移动应用程序到外部网站。</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>控制器</strong></td>
<td colspan="1" rowspan="1">确定用户与您的表单交互时必须在幕后执行的操作或逻辑，包括数据转换和与外部系统的集成。</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>验证</strong></td>
<td colspan="1" rowspan="1">确定您是否有超出 Salesforce 提供的标准系统级验证的任何其他输入验证要求。</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>交互设计</strong></td>
<td colspan="1" rowspan="1">确定应在表单中触发动态响应的交互或条件类型。</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>样式</strong></td>
<td colspan="1" rowspan="1">确定所需的样式和 CSS 要求的复杂程度。</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>布局</strong></td>
<td colspan="1" rowspan="1">确定表格的布局要求（例如，所需的列数、制表符和折叠符）以及显示重复数据块的能力。</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>翻译</strong></td>
<td colspan="1" rowspan="1">确定是否必须为其他语言本地化表单。</td></tr>
<tr><td colspan="2" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>非功能注意事项</strong></td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>安全性</strong></td>
<td colspan="1" rowspan="1">确定您的表单是否应该在执行某些操作之前检查用户的访问权限，您是否想要控制谁可以访问表单，以及您是否想要控制表单可以嵌入的位置。</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>对象影响</strong></td>
<td colspan="1" rowspan="1">确定您的表单是针对单个对象还是多个对象进行操作。</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>UI 测试自动化</strong></td>
<td colspan="1" rowspan="1">确定 DevOps 流程是否需要表单进行自动单元测试或自动端到端测试。</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>度量</strong></td>
<td colspan="1" rowspan="1">确定您想要如何跟踪表格的使用情况，包括页面视图、在表格上花费的时间、完成率和成功率。</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>打包和部署</strong></td>
<td colspan="1" rowspan="1">确定在构建表单后您想要如何分发或部署表单。</td></tr></table>

**注意：**在随后的决策对比表中，有一些值与任何工具-功能对相关联：

- **可用：**工具/功能适用于基本注意事项。

- **不可用：**未来 12 个月内，没有添加支持的计划。

- **不理想：**此工具/功能可能有效，但并非最佳工具。

- **不适用：**该工具不适用于特定用例。

## 用例

使用这些场景来比较基于范围、UX 和运营需求的工具选择。

### 表单范围和导航

如果您可以从单个屏幕表单获取所有用户输入，请从动态表单开始。请记住，记录页面中的动态表单可以使用路径功能来支持分阶段业务流程。

#### 要问的问题

- 您需要一个屏幕，还是用户需要在多个屏幕之间导航以完成任务？

- 您是否希望用户在填写表单时看到他们在流程中的进度的可视化描述？您的用户是否需要按特定顺序填写每个屏幕上的信息，或者他们是否应该可以根据需要在屏幕之间来回移动？

如果您需要比动态表单更多的功能，在 Flow、Omnistudio 和 LWC 之间进行选择取决于一些其他问题：

- 是否可以在表格底部显示导航栏？如果屏幕流和 Omniscript 导航体验提供了不良的 UX，请转向 LWC。

- 表格后面需要做什么？如果您需要管理员配置行为，请使用流。对于复杂的多对象关系，使用 _Omniscript_ 或 _LWC_。

<table><tr><th colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"></th>
<th colspan="1" rowspan="1">单屏幕</th>
<th colspan="1" rowspan="1">多屏幕表单</th>
<th colspan="1" rowspan="1">进度指示器</th>
<th colspan="1" rowspan="1">在步骤/屏幕之间跳转导航</th></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>动态表单</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>奧姆尼斯圖</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流 + LWC</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>LWC</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不理想</td>
<td colspan="1" rowspan="1">不理想</td>
<td colspan="1" rowspan="1">不理想</td></tr></table>

如果您选择 Flow 或 Omnistudio，您可能还需要构建 LWC 来实现正确的 UX。如果您已经在构建 LWC 来正确设计表单样式，请考虑是否需要将[该组件嵌入流](https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.use_flow)。

**向导样式导航**

另一方面，如果您的解决方案看起来像向导（用户可在多个屏幕之间导航），请考虑 Flow 或 Omnistudio。Flows 和 Omnistudio 具有内置导航模型，因此您无需构建和维护相互串联的 LWC。导航是线性的，具有向前移动操作、向后移动操作和保存表单以供以后使用的机制。如果符合您的目的，您也可以使用非线性导航构建表单。

Omnistudio 通过提供来自标准导航的进度指示器来显示表单中的步骤，从而提供了关键的导航优势。步骤视图自动显示用户在多步骤表单中的位置。与流不同，它允许用户通过单击表单中的各种步骤在屏幕之间跳转。

无论您是构建单屏幕还是多屏幕表单，重要的是确保您的表单被简化，以便您的用户可以轻松导航。

### 外形规格

如果您在标准 Lightning 记录页面中嵌入表格，我们正在比较的任何工具都可以正常工作；但是，动态表格目前只能在桌面上使用。如果您想提供允许用户从其他位置访问表单的体验，您可能需要考虑其他选项。

#### 要问的问题

- 用户是否需要通过桌面、移动设备或两者访问表单？

- 用户是否应该能够通过实用程序栏从应用程序的任何地方访问表单？

- 是否要启用快速操作，以便用户无需离开当前所在页面即可填写表单？

- 您的表单是否需要在外部网站上可用？

<table><tr><th colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"></th>
<th colspan="1" rowspan="1">Lightning 记录页面</th>
<th colspan="1" rowspan="1">Lightning 主页或应用程序页面</th>
<th colspan="1" rowspan="1">Aura Experience Cloud 站点</th>
<th colspan="1" rowspan="1">LWR Experience Cloud 站点</th>
<th colspan="1" rowspan="1">嵌入式 Snap-In</th>
<th colspan="1" rowspan="1">实用程序栏</th>
<th colspan="1" rowspan="1">特定于对象的操作</th>
<th colspan="1" rowspan="1">全局操作</th>
<th colspan="1" rowspan="1">Salesforce 移动应用程序*</th>
<th colspan="1" rowspan="1">Field Service Mobile</th>
<th colspan="1" rowspan="1">Mobile SDK</th>
<th colspan="1" rowspan="1">外部站点和应用程序</th>
<th colspan="1" rowspan="1">自定义 LWC</th></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>动态表单</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用**</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>奧姆尼斯圖</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流 + LWC</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不理想</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>LWC</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="14" rowspan="1" style="border-right: 1px solid #d8dde6;">*Salesforce 移动应用程序支持流和 LWC，但不支持嵌入流和 LWC 的所有方式（例如，移动设备支持特定于对象的操作，但实用程序栏项目不支持）。<br><br>**Salesforce Field Service 移动应用程序包含数据捕获 — 一个基于流引擎的离线优先表单解决方案，具有专用离线运行时，支持最新的流功能。该应用程序还包括传统的 Field Service 移动流，这些流在旧的自定义离线引擎上运行，并且不支持许多最新的流功能。</td></tr></table>

由于需要记录上下文，因此动态表单功能仅在 Lightning 记录页面中受支持。但是，Experience Cloud 页面不支持动态表单。

您可以构建需要记录上下文的流，或全局工作的流。换句话说，您可以在各种位置嵌入流。对于记录上下文流，位置可能包括：Lightning 记录页面、Experience Cloud 记录页面、特定于对象的操作或操作和推荐部署。对于全局流，位置可能包括：实用程序栏、其他 Lightning 或体验生成器页面、Snap单元或外部应用程序。目前，流不支持作为全局操作，但您可以将_流_封装在 _Aura_ 组件中作为解决方法。

Omnistudio 允许您构建可组合的 FlexCard 和 Omniscript，您可以将它们放在_几乎_任何可以放置流的地方，但它们虽然是可组合的，但不能打包。

LWC 提供了高度的可重用性，用于通过 Salesforce、社区和开源项目之间的元数据创建可与目标关联的组件。LWC组件也可以使用 [Lightning Out 2.0](https://developer.salesforce.com/docs/platform/lwc/guide/lightning-out-intro.html) 嵌入您自己的网站。
<image src="https://architect.salesforce.com/ns-assets/legacy/buildingformsguidediagrams-locationnoheader.png" alt="Lightning Out on External Sites" style="width:100%;border:1px solid #e5e5e5;margin-top:1rem;margin-bottom:1rem" />

LWC组件也可以通过 [Lightning-Flow](https://developer.salesforce.com/docs/component-library/bundle/lightning-flow/documentation) 组件启动 Flows。

Omnistudio 擅长通过 OmniOut 功能向外部站点公开内容。通过 Omnistudio 和 OmniOut，您可以将 Omniscript 表单和 FlexCard 组件编译为标准组件，然后在第三方站点或应用程序中将它们运行在平台外。

目前，Mobile SDK 模板不支持本指南涵盖的任何表单技术。如果 Mobile SDK 对用例至关重要，我们建议在移动应用程序中本地构建表单或构建 Visualforce 页面，同时请谨记外形规格。

### 逻辑

如果您需要使用表单中的值创建或更新记录，动态表单是完美的选择。您需要将 Flow、Omnistudio 或 LWC 用于该范围之外的功能，包括创建决策或迭代层，或使用表单中的输入生成 Slack 帖子或电子邮件。

#### 要问的问题

- 需要在后台执行哪些操作或逻辑？

- 是否需要使用相关记录中的值？

- 您的表单是否需要在单个事务中或跨多个事务完成操作？

- 是否需要与外部系统集成？

- 您对可重用性和模块化的要求是什么？

<table><tr><th colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"></th>
<th colspan="1" rowspan="1">日志和操作</th>
<th colspan="1" rowspan="1">层次结构数据管理</th>
<th colspan="1" rowspan="1">在一个事务中操作</th>
<th colspan="1" rowspan="1">跨多个事务操作</th>
<th colspan="1" rowspan="1">集成</th>
<th colspan="1" rowspan="1">模块化设计和重用</th>
<th colspan="1" rowspan="1">打包</th></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>动态表单</strong></td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>奧姆尼斯圖</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流 + LWC</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>LWC</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr></table>

Flow 提供了发布到 Slack、发送电子邮件和与 Quip 文档交互的标准操作，您无需为任何这些操作编写代码。LWC 通过与[用户界面 API](https://developer.salesforce.com/docs/atlas.en-us.uiapi.meta/uiapi/ui_api_get_started.htm) 交互的线路适配器，提供与单个记录和相关对象的丰富交互。LWC 也可以使用 [getListInfoByName](https://developer.salesforce.com/docs/component-library/documentation/en/lwc/reference_get_list_info_by_name.html) 的线与多个记录交互。
<image src="https://architect.salesforce.com/ns-assets/legacy/buildingformsguidediagrams-controllernoheader.png" alt="LWC Interaction via Wire Adapters" style="width:100%;border:1px solid #e5e5e5;margin-top:1rem;margin-bottom:1rem" />

Omnistudio 使用集成程序和数据映射器来获取和转换数据（Salesforce 的外部和内部）。由于具有大量无代码功能，它擅长用各种关系级别平展和扩展数据集。

Flow、Omnistudio 和 LWC 都与 Apex 集成在一起，因此您可以轻松弥合您选择的解决方案中的任何差距（例如，如果您需要从 LWC 中筛选记录，您可以使用 Apex 的线适配器来创建复杂的 SOQL 查询。如果您被基于点击的数据趋势图影响，请考虑使用 Flow 或 Omnistudio 作为 Apex 控制器的可行替代方案，以满足服务器端需求。

您还应考虑是立即提交操作，还是将其延迟到表单的特定部分。如果您使用多页表单，这尤其相关。流可轻松组合来自多个表单（流屏幕）的输入，并稍后在向导（流）中使用它们来执行某些操作，这正是我们建议设计流的方式。在结束时执行操作（以防用户在屏幕之间来回切换以更改答案）。

#### 控制操作

交易和[管理者限制](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_gov_limits.htm)是 Agentforce 360 平台的组成部分。如果您的用例相当简单，控制发生特定操作的事务可能不那么重要。但是,在少数用例中,您可能想要将多个操作合并为一个[事务](/docs/architect/zh-cn/fundamentals/guide/architecture-basics#交易),而不是在多个事务中执行它们。

以下是一些示例：

- **回滚：**假设您的表单在后台创建多个记录。如果创建第三个记录失败，是否应回滚前两个记录？如果每个操作相互独立，您可以将它们作为单独的事务来执行。但是，如果它们相互依赖，并且您希望其中一个的失败也回滚其他的错误，您应该将它们实施为一个事务。如果您的表单在流中，您可以使用错误路径中的回滚元素来回滚事务并确保数据完整性。

- **对调控器限制的下游影响：**在表单创建或更新记录时，重要的是考虑该操作的下游影响：

  - 根据建议的记录更改，保存订单中可以触发哪些流程、工作流规则、流触发器、Apex 触发器或其他项目？

  - 这些集体更改如何影响该事务中消耗的调控器限制？

  - 如果特定记录更改可能会导致许多影响限制的下游更改，最好考虑将该记录更改隔离在自己的事务中。

- **批处理：**您可能需要一起批处理多个更新（即使在 UI 上下文中）。假设您的多屏幕表单迭代一大组记录。与其在每个屏幕后提交记录更新（等到您收集了所有记录的更新），不如提交一个请求来更新所有记录。

当您使用动态表单创建或编辑记录时，您只执行一个操作，该操作始终是净新交易的开始。

当您构建屏幕流时，您可以显著控制给定事务中发生的内容。屏幕和本地操作充当事务之间的边界。以下是如何在屏幕流架构中管理事务的高级摘要。

1. 最终用户与屏幕交互，然后单击**下一步**。

2. 客户端向 API 发布输入请求。

3. API 接收请求，并打开事务和数据库连接。然后，API 调用流引擎来调用请求。

4. 流引擎接管并遵循流定义中的相应路径，直到到达屏幕或本地操作节点。然后，引擎向 API 返回有关该节点的信息。

5. API 创建包含要呈现的下一个屏幕的详细信息的响应对象，并将该对象返回到客户端。此时，提交数据库更改（根据[保存订单执行](/docs/architect/zh-cn/fundamentals/guide/architecture-basics#数据库操作)），并关闭数据库连接和事务。

6. 客户端使用 API 响应来呈现用户交互的下一个屏幕。

7. 从步骤 1 开始，重复该过程。

换句话说，屏幕会_破坏_交易。发生这种情况时，提交任何等待批准的操作或 DML，关闭之前的事务，并开始新的事务。
<image src="https://architect.salesforce.com/ns-assets/guide-forms-flow1.png" alt="multi-screen flow" style="width:100%;border:1px solid #e5e5e5;margin-top:1rem;margin-bottom:1rem" />
请记住，特定的设计元素（您分组到给定事务中的操作）取决于您。

以下是一些示例：
<image src="https://architect.salesforce.com/ns-assets/guide-forms-flow2.png" alt="screen flow with separate transactions" style="width:100%;border:1px solid #e5e5e5;margin-top:1rem;margin-bottom:1rem" />

- 开始时，您会看到一个流，该流在多个屏幕上收集输入，然后在一个事务中执行几个操作。
- 下一个流在单独的事务中执行每个操作。
- 如果单个操作在一系列数据库操作中失败，流也可以使用回滚记录来使您回滚整个事务。
  <image src="https://architect.salesforce.com/ns-assets/guide-forms-flow3.png" alt="Screen Flow with multiple create records" style="width:100%;border:1px solid #e5e5e5;margin-top:1rem;margin-bottom:1rem" />
  假设您有一个创建记录、更新记录，然后创建其他记录的流（如下一个流所示）。

在这种情况下，如果前两个元素成功，最后一个元素失败，前两个 DML 操作仍会创建和更新适当的记录，但第三个不会。
<image src="https://architect.salesforce.com/ns-assets/guide-forms-flow4.png" alt="Screen Flow with Rollback" style="width:100%;border:1px solid #e5e5e5;margin-top:1rem;margin-bottom:1rem" />
通过使用“回滚记录”元素，您可以确保如果所有三个操作必须一起发生，则整个事务将被回滚（如最终流所示）。

**注意：**有关更多详细信息，请查看[事务中的流](https://help.salesforce.com/articleView?id=flow_concepts_transaction.htm)和[事务中的流](https://help.salesforce.com/articleView?id=flow_concepts_bulkification.htm)批量化。

您从 LWC 控制事务的能力取决于 LWC 用来执行操作的底层服务。如果您正在使用 Lightning 记录表单基础组件，则在提交表单时，基础操作（创建或更新记录）将在独立事务中发生。

通常，这些规则适用：

- 每个 UI API 调用都在自己的事务中隔离。

- 如果您需要在单个事务中执行多个操作，请将输入发送到服务器端技术（例如 Apex 控制器或流）。请记住，该技术的常规事务规则仍然适用。

#### 外部集成

Flow、Omnistudio 和 LWC 都支持平台事件（适用于[事件驱动架构](/docs/architect/zh-cn/decision-guides/guide/event-driven)）和 API 集成。除了自定义 Apex 代码之外，Flow 和 Omnistudio 还有声明性支持机制，也可以与 API 集成。

如果您需要连接到 MuleSoft API 或 RPA 机器人，请使用 MuleSoft 服务，因为这会生成外部服务。
<image src="https://architect.salesforce.com/ns-assets/legacy/buildingformsguidediagrams-integrations-mulesoftnoheader.png" alt="External integrations via MuleSoft" style="width:100%;border:1px solid #e5e5e5;margin-top:1rem;margin-bottom:1rem" />

如果 API 具有 OpenAPI 模式，请创建外部服务。
<image src="https://architect.salesforce.com/ns-assets/legacy/buildingformsguidediagrams-integrations-openapi-noheader.png" alt="External Integrations via OpenAPI" style="width:100%;border:1px solid #e5e5e5;margin-top:1rem;margin-bottom:1rem" />

对于所有其他实例，在流中使用 **HTTP 标注**功能（由外部服务提供支持），或在 Omnistudio 中使用 **HTTP 操作**。
<image src="https://architect.salesforce.com/ns-assets/legacy/buildingformsguidediagrams-integrations-callouts-noheader.png" alt="External integrations via HTTP" style="width:100%;border:1px solid #e5e5e5;margin-top:1rem;margin-bottom:1rem" />

Omnistudio 具有丰富的集成功能，可以使用集成程序调用外部系统，以通过数据映射器转换数据。

无论您是使用自定义 Apex 代码还是外部服务来实施，**标注**仍然是标注。

以下是您需要了解的内容。

- 标注可能需要大量时间来处理。

- 当同步执行标注时，它会在数据库事务打开时执行。

- 如果您有任何待处理的数据库操作，Salesforce 不允许您保持数据库事务打开。

请谨记,主要限制是您在执行**创建**、**更新**或**删除**操作，然后在同一事务中执行**标注**时，可能会使数据处于不一致的状态。由于上述第三个注意事项，不允许此模式，这是因为前两个注意事项。

在流中，您可以通过打破事务绕过此限制。请记住，屏幕和本地操作会重新引入浏览器上下文。虽然您可以在使用外部标注时使用屏幕和本地操作，但我们建议在可调用高级设置中启用**事务控制**。事务控制允许您在进行标注之前自动结束事务。要启用事务控制，请在调用操作的**高级**部分中选择“**始终启动新事务**”。
<image src="https://architect.salesforce.com/ns-assets/guide-forms-flow5.png" alt="External Integrations via Callouts" style="width:100%;border:1px solid #e5e5e5;margin-top:1rem;margin-bottom:1rem" />
LWC 有助于简化标注对事务的影响。换句话说，使用 Lightning 数据服务 (LDS) 执行数据操作，然后使用 Apex 控制器进行外部标注。由于 LDS 调用在其自身事务中隔离（与 Apex 标注分开），因此可防止数据不一致。

#### 可重用性和模块化

动态表单不支持重用。每个记录都绑定到特定对象的特定 Lightning 记录页面；但是，您可以将该 Lightning 记录页面分配给多个应用程序、简档等。

与如何编写跨多个组件使用的库、实用程序和组件相似，您还可以在通过利用**子流**的功能创建流时应用类似的设计模式。为此，将流保存在更小的模块化存储桶中，然后使用**子流**元素从其他流调用它们。如果您的设计需要它，您可以构建一个对其自身和作为子流有用的流。

Omnistudio 本质上是为模块化而构建的。数据映射器、Omniscript、FlexCard 和集成程序都是独立构建的，但它们也可以互换工作。FlexCard 也可以构建为 LWC 组件，可嵌入其他 LWC、Omniscript、记录页面和 Experience Cloud 站点。

屏幕流、Omniscript 和 LWC 都可以构建用于重复使用，并嵌入到各种位置，包括外部站点和 Lightning Out 应用程序。当您将解决方案设计成可组合时，您还可以获得适应性和稳定性的好处。

### 验证

无论是经典验证规则还是内置于 Apex 触发器的自定义验证，用于创建或更新记录的所有技术都必须遵守系统级验证。无论您使用何种技术执行记录更改，每次更改都必须经过保存订单。这意味着，除了验证规则之外，记录更改也由许多保存前或保存后流、触发器前或触发器后、升级规则、分配规则等处理。

**注意：**如果您尚未这样做，请查看 Apex [执行顺序](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_triggers_order_of_execution.htm)并将其加入书签。

#### 要问的问题

- 除了系统级验证之外，您的表单是否有任何其他要求？

- 是否需要在表单中动态设置必填或只读字段？

<table><tr><th colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"></th>
<th colspan="1" rowspan="1">遵守系统级验证</th>
<th colspan="1" rowspan="1">特定于此表单的自定义字段级验证</th>
<th colspan="1" rowspan="1">自定义字段级验证</th></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>动态表单</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>奧姆尼斯圖</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流 + LWC</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>LWC</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr></table>

通常，流屏幕或 Omniscript 步骤上的输入是未绑定的，因此表单本身不会本地遵守与特定对象关联的系统级验证。但是，您用来创建或更新记录的值在保存顺序中处理，这意味着它们通过对象的系统级验证。

**注意：**并非所有屏幕流组件都支持输入验证。

与页面布局相似，动态表单允许您在页面级别设置**要求**和**只读**状态。请记住，您无法覆盖系统级设置。

流为自定义表单输入验证提供了灵活性。在客户端级别执行多个检查（例如，标记缺少的必填字段和数据类型检查，以及输入验证规则中的兼容公式）。作为额外的安全级别，输入验证也会在服务器上进行评估。当用户单击**下一步**时，流会将输入再次发送到服务器进行验证。如果返回任何无效输入，导航将被阻止，并显示适当的错误。

服务器通过检查来验证输入：

- 输入的**要求**设置，或输入的值是否与基础数据类型兼容。

- 输入的自定义验证。您需要提供一_个布尔_公式表达式和一个错误消息，以便在不满足公式表达式时显示。

- 基础组件的自定义验证。如果您正在为流构建自定义 LWC，您需要将自己的验证码添加到 validate() 方法中。

您也可以通过屏幕流中的**消息**组件提供可访问的用户提醒，但这并不妨碍用户导航到其他页面，或继续指导流中的下一步。**消息**组件中的_错误_状态最适合在禁用导航时通过错误路径触发的专用错误屏幕上使用。

Omnistudio 具有强大的错误和验证处理功能，可通过[设置错误](https://help.salesforce.com/s/articleView?id=sf.os_set_errors_in_an_omniscript.htm&type=5)操作与[条件视图](https://help.salesforce.com/s/articleView?id=sf.os_conditionally_display_elements_using_the_conditional_view_property.htm&type=5)和[消息](https://help.salesforce.com/s/articleView?id=sf.os_display_messages_in_omniscripts_19551.htm&type=5)传递组件相结合。

对于 LWC，大多数基本组件执行自己的客户端验证（例如，Lightning 记录表单遵守系统级要求，但不遵守页面级要求）。对于自定义组件，您可以 Build Your Own 验证机制。

请记住，需要用户输入数据的字段应出现在表格的开头。在提交表单之前（如果可能），验证客户端的用户输入。

### 交互设计

静态表单已过时。如今,重点已转移到在_特定_时间、_特定_地点为_特定_用户动态更新具有正确属性和值的表单。让我们仔细看看通过 Salesforce 表单构建工具的可行性。

#### 要问的问题

- 哪些类型的交互或条件应触发表单中的动态响应？

- 您是否需要在填写表单时执行屏幕外（后台）操作？

- 您需要将字段设置为**可见**、**必填**、**只读**或**禁用**，还是需要根据表单输入更改格式？

<table><tr><th colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"></th>
<th colspan="1" rowspan="1">执行屏幕外数据操作</th>
<th colspan="1" rowspan="1">条件值和计算</th>
<th colspan="1" rowspan="1">条件可见性</th>
<th colspan="1" rowspan="1">条件要求</th>
<th colspan="1" rowspan="1">条件格式化</th>
<th colspan="1" rowspan="1">条件只读状态</th>
<th colspan="1" rowspan="1">有条件禁用状态</th></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>动态表单</strong></td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用*</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>奧姆尼斯圖</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流 + LWC</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>LWC</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="8" rowspan="1" style="border-right: 1px solid #d8dde6;">*仅限于使用资源选择器而不是静态复选框的组件</td></tr></table>

**反应性屏幕**启用屏幕流交互性。反应性允许流屏幕上的单个组件相互通信，这使得屏幕流更加强大。

**执行屏幕外数据操作**

屏幕流提供了通过**屏幕操作**在同一屏幕上获取数据的声明性方法。屏幕操作允许您在屏幕内的任何更改上或在用户单击**操作按钮**组件时触发自动启动的流。您可以将自动启动的流结果映射到同一个屏幕，这样用户就无需导航到另一个屏幕。

LWC 提供全套的线路适配器,提供对 Salesforce 数据的访问权限,以在表单组件中动态填充数据,这允许开发人员通过 Apex 控制器**更新**、**删除**和**创建**记录。
<image src="https://architect.salesforce.com/ns-assets/legacy/buildingformsguidediagrams-offscreendataoperations-noheader.png" alt="Lightning Web Components Off-Screen Data Operations" style="width:100%;border:1px solid #e5e5e5;margin-top:1rem;margin-bottom:1rem" />

**可见性**

可见性可在所有表单构建工具中动态控制。动态表单、Flow Builder 和 Omnistudio 使用组件可见性功能解决此问题。您可以根据表单中的其他值或用户是否在移动设备上填写表单来声明性**显示**或**隐藏**字段。

- 动态表单根据记录字段值、查找字段和外形规格控制可见性。

- 通过流，您可以将可见性规则基于其他屏幕输入，以及流中较早填充的其他资源（例如，来自其他记录的公式或值）。

  - **基于设备的规则：**这可能从一开始不明显，但您可以使用公式在用户使用移动设备时**显示**或**隐藏**特定字段。编写检查 **$User.UIThemeDisplayed** 全局变量值的流公式。如果值为 **Theme4t**，则用户使用 Salesforce 移动应用程序完成表单。

  - **评估其他资源：**手动变量和公式引用仅在服务器上评估。这意味着资源在屏幕首次呈现时的值是它将拥有的值，直到您导航到另一个屏幕。在导航期间，流运行时向流引擎（服务器）提交请求，并返回最新的手动变量和公式值。如果您希望可见性规则在用户通过单个屏幕（例如，模糊）时更新，您需要确保仅引用屏幕上其他组件的值。

- 通过 Omnistudio，您可以通过设置**条件视图**属性来有条件地**显示**或**隐藏**组件。但是，您不能为输入添加多个条件视图属性。

**条件输入状态**

如果您需要动态控制任何其他属性（例如，字段是**必填**、**禁用**还是**只读**），有几个选项。LWC 提供对输入状态的完整反应性控制。通过反应性屏幕流组件，您可以动态控制支持它的标准组件的组件属性（例如，**只读**、**禁用**和**必需**），而 Omnistudio 支持特定于组件的全部属性。如果您的要求要求您需要流，并且组件不支持特定属性状态，您可以创建可嵌入的 LWC 来实现动态输入状态。

如果您需要动态控制任何其他属性（例如，字段是**必填项**还是**只读**项），请在短期内使用 LWC，因为您拥有完全控制权限。如果您有如何处理模糊或点击的定制要求，这尤其如此。

**屏幕流中的反应性 LWC**

如果您正在构建可以对屏幕流上的其他组件做出反应和更改的 LWC，请查看 [LWC 屏幕流最佳实践](https://developer.salesforce.com/blogs/2023/02/lwc-best-practices-for-screen-flows)指南，以确保您的组件与流运行时引擎集成并按预期运行。

<table><tr><th colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"></th>
<th colspan="1" rowspan="1">标准事件处理（模糊、聚焦）</th>
<th colspan="1" rowspan="1">自定义事件处理</th></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>动态表单</strong></td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流</strong></td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>奧姆尼斯圖</strong></td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用*</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流 + LWC</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>LWC</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="3" rowspan="1" style="border-right: 1px solid #d8dde6;">*Omnistudio 标准运行时不支持发布/订阅，但支持 Windows postMessage</td></tr></table>

对于自定义事件，如果您的一些输入（或整个表单）需要与页面上的另一个元素通信，LWC 是您的唯一选择。

- 要在同一 DOM 树中通信，请使用 [CustomEvent 界面](https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.events)。

- 要在DOM之间通信 请使用[Lightning Messaging Service](https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.use_message_channel)

- 如果目标容器[不支持](https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.use_message_channel_considerations) Lightning Messaging Service，请使用发布/订阅模块。

#### 交互设计的额外资源

- 有关更多详细信息,请查看 _Lightning Web 组件开发指南_ 中的[与事件通信](https://developer.salesforce.com/docs/component-library/documentation/en/lwc/events)和[跨DOM通信](https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.events_pubsub)。

- 对于 Omnistudio，从 Lightning Web 组件中查看与 Omniscript [通信。](https://help.salesforce.com/s/articleView?id=sf.os_communicate_with_omniscript_from_a_lightning_web_component_18222.htm&type=5)

### 样式

为了提供最佳用户体验，重要的是确保您的表单样式与嵌入表单的其余应用程序或站点保持一致。这可能意味着使用 Salesforce 提供的标准模板，或者创建自定义 CSS，使用设计中的每个像素提供更清晰的外观。

#### 屏幕流样式覆盖

管理员可以为屏幕容器或单个组件配置有限的屏幕和组件样式覆盖集（例如，颜色、边框和按钮外观）。这些覆盖在主题和品牌化之后应用，这允许生成器进行有针对性的视觉调整，而不会影响应用程序的其余部分。

样式覆盖用于本地化的视觉异常（例如，突出显示确认屏幕或强调特定的行动号召 (CTA);它们不是完整的样式系统。它们不提供 CSS 级别的控制，并且它们不是设计用于跨屏幕或流重用的。

从架构的角度来看，样式应遵循以下先例顺序：

1. **主题和品牌化：**Lightning 主题、体验生成器品牌集或 LWR 站点主题

2. **流样式覆盖：**目标屏幕或组件调整

3. **自定义组件 (LWC ) :** 当需要像素级完美控制或可重用设计模式时

使用主题和设计系统有助于确保样式保持一致性、可扩展性和易于长期维护。

#### 要问的问题

- 您想要的样式和 CSS 有多复杂？

- 您需要自定义的像素完美样式还是标准主题？

<table><tr><th colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"></th>
<th colspan="1" rowspan="1">直接样式</th>
<th colspan="1" rowspan="1">组织和体验生成器主题</th>
<th colspan="1" rowspan="1">像素完美样式</th></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>动态表单</strong></td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流</strong></td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用**</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>奧姆尼斯圖</strong></td>
<td colspan="1" rowspan="1">可用*</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流 + LWC</strong></td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>LWC</strong></td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="4" rowspan="1" style="border-right: 1px solid #d8dde6;">*仅限FlexCard<br><br>**可以为屏幕组件配置某些样式属性，但不能为 CSS 覆盖配置。</td></tr></table>

FlexCard 是本指南中唯一使您能够声明性地控制在工具中构建的 UI 的样式和布局的产品（例如，边距和填充、排印、颜色等）。

动态表单和流遵守声明性主题功能。如果您需要额外的控制(超出 [Salesforce 主题](https://help.salesforce.com/articleView?id=brand_your_org_in_lightning_experience.htm&mode=1)、[体验生成器品牌](https://help.salesforce.com/articleView?id=community_designer_brandsets.htm)化集或 [LWR Experience Cloud 站点](https://developer.salesforce.com/docs/atlas.en-us.exp_cloud_lwr.meta/exp_cloud_lwr/brand_overview.htm)支持的范围 ) , 请考虑编程解决方案。

对于喜欢使用 CSS 的团队，他们有几个选择：

- 流和 LWC 继承[标准设计令牌](https://developer.salesforce.com/docs/atlas.en-us.lightning.meta/lightning/tokens_standard.htm)。

- Omniscript 和 FlexCard 包括通过 [Newport](https://help.salesforce.com/s/articleView?id=sf.os_customize_omniscripts_and_flexcards_with_the_newport_design_system.htm&type=5) 的可自定义设计系统支持。

- 使用 LWC，您可以编写自己的组件并完全控制它们的 HTML 和 CSS。

如果可能，我们建议使用主题和设计系统，以确保所有内容的外观一致。

**注意：**您可在流中嵌入 Lightning 组件。如果您需要对表单的外观进行像素级完美控制，但又想使用流的其他优势（例如导航模型），您可以充分利用这两个优势！同样的原则适用于 Omniscript 和 FlexCard。

### 布局

选择良好的布局对于设计简化的表单至关重要，这些表单支持快速高效的数据输入并提高数据完整性。

#### 要问的问题

- 如何构建表单布局以优化用户体验？

- 您如何以让用户更容易将新数据输入到表单的方式向用户显示现有数据？

<table><tr><th colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"></th>
<th colspan="1" rowspan="1">2 列</th>
<th colspan="1" rowspan="1">4 列</th>
<th colspan="1" rowspan="1">超过 4 列</th>
<th colspan="1" rowspan="1">重复数据块</th>
<th colspan="1" rowspan="1">选项卡容器</th>
<th colspan="1" rowspan="1">折叠容器</th></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>动态表单</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>奧姆尼斯圖</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用*</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流 + LWC</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>LWC</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="7" rowspan="1" style="border-right: 1px solid #d8dde6;">*如果将数据嵌入 Omniscript 中的 FlexCard，可以使用选项卡</td></tr></table>

动态表单支持两列布局，可在字段中细分为单个部分。这些部分可以放在组件中（例如选项卡和折叠），以创建组织有序、易于使用的布局。

流也可以使用“**部分”**组件呈现。您可在流屏幕上添加最多四列和不限数量的部分。部分组件也会响应屏幕宽度，因此也可以在更小的屏幕上使用。它使您能够将条件可见性应用到整个部分，这使得将可见性批量应用到部分中的多个字段变得更加容易。**流部分**还支持列标题，并提供类似折叠的体验，用户可以单击标签折叠整个部分。

Omniscript 具有用于显示字段和数据的各种布局选项。您可以创建最多 12 列的数据部分，包括有条件折叠的手风琴。

使用 LWC，您可以使用 Lightning-form 和支持 Lightning-字段来控制布局。唯一的布局限制来自 HTML 和 CSS。**Lightning 记录表格**组件遵守相关页面布局中的部分配置(例如,如果部分在页面布局中是两列,则组件中也是两列)。

### 翻译

如果您的表单需要由不同地区的用户或讲不同语言的用户访问，您需要确保您用来构建表单的工具符合您的本地化要求。

**注意：**特别是对于表单，本地化要求通常涉及将文本元素翻译成其他语言。

#### 要问的问题

- 您的表单是否将在多个国家或地区使用？

- 表格中的文本是否需要本地化为其他语言？

<table><tr><th colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"></th>
<th colspan="1" rowspan="1">在生成器中输入的标签</th>
<th colspan="1" rowspan="1">代码中的标签</th></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>动态表单</strong></td>
<td colspan="1" rowspan="1">可用*</td>
<td colspan="1" rowspan="1">不可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>奧姆尼斯圖</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流 + LWC</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>LWC</strong></td>
<td colspan="1" rowspan="1">不适用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="3" rowspan="1" style="border-right: 1px solid #d8dde6;">*仅限字段部分标题</td></tr></table>

如果您本地化自定义字段，动态表单会遵守翻译的标签。动态表单还遵守在 Lightning 应用程序生成器中分配给组件标签和属性的任何[自定义标签](https://help.salesforce.com/s/articleView?id=platform.lightning_page_components_use_expressions_for_labels.htm&type=5)。

流支持通过翻译工作台翻译所有标准和自定义屏幕组件面向用户的标签。

您可以在这些屏幕组件上本地化标签、帮助文本和错误消息：

- 文本
- 长文本区域
- 数字
- 币种
- 复选框
- 单选按钮
- 选项列表
- 多选选项列表
- 复选框组密码
- 日期
- 日期/时间

没有现成的操作的内置翻译支持（例如发送电子邮件或发布到 Chatter），但有一个解决方法。如果使用[自定义标签](https://help.salesforce.com/articleView?id=cl_about.htm)定义翻译的标签，您可以在 Flow Builder 中配置时在操作或组件中引用该自定义标签。为此，您需要创建引用自定义标签的流公式，然后在流的适当位置引用该公式。

Omniscript 使用自定义标签进行翻译。有关更多信息，请查看[此帮助文档](https://help.salesforce.com/s/articleView?id=sf.os_create_multi_language_omniscripts.htm)，以确保 Omniscript 支持多种语言。

对于 LWC，如果在翻译工作台中配置，某些基本组件会自动继承关联对象字段、帮助文本和验证消息的翻译（例如 Lightning）。

如果您需要在代码中引入新颖的可翻译标签，自定义标签是最佳选择。声明您需要的自定义标签，然后将其从 `@salesforce/label` 范围模块导入组件。

## 非功能注意事项

使用此部分在实施前评估安全性、质量和操作约束。

### 安全性

安全性是一个复杂的主题，当涉及到构建表单时，有一些注意事项可能并不明显。在基础级别，您需要确保表单在正确的上下文中运行，并且用户拥有使用其基础数据所需的权限。除此之外，您可能还希望采取额外的措施，从富文本字段中删除潜在的恶意代码或 URL，阻止某些用户访问表单，或者对管理员未来可能嵌入表单的位置类型进行限制。

在选择工具之前，请确保彻底记录您的安全要求。有关此类文档的其他指导，请查看 Salesforce [结构良好的安全](/docs/architect/zh-cn/resources/guide/security-policy-template)策略模板。

#### 要问的问题

- 在执行某些操作之前，表单是否应该检查用户的访问权限？

- 您是否应对用户输入进行消毒？

- 是否要控制谁可以访问表单？

- 是否要控制表格的嵌入位置？

<table><tr><th colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"></th>
<th colspan="1" rowspan="1">提升用户权限</th>
<th colspan="1" rowspan="1">控制谁拥有访问权限</th>
<th colspan="1" rowspan="1">限制允许的位置</th></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>动态表单</strong></td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>奧姆尼斯圖</strong></td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用**</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流 + LWC</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">不可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>LWC</strong></td>
<td colspan="1" rowspan="1">可用*</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="4" rowspan="1" style="border-right: 1px solid #d8dde6;">*需要 Apex<br><br>**虽然 Omniscript 不能有一组指定的目标位置，但 FlexCard 可以。</td></tr></table>

#### 提升用户权限

当程序在**用户上下文**中运行时，Salesforce 会强制执行一系列访问权限检查，其中包括根据贵组织的共享规则验证字段级安全性、CRUD 权限和记录访问权限（例如，用户只有在能够更新个案、适当的字段级安全性和访问相关记录时，才能运行个案更新表单）。

如果您希望用户在使用表单时能够执行特定操作，而不是通过任何其他表单或交互，将会怎样？这就是**系统上下文**的作用所在！

**系统上下文**允许您在会话期间提升用户的权限(例如，用户无需更新对个案对象的访问权限，即可成功完成个案更新表单)。这对于未经身份验证的社区尤其有用。不要授予来宾用户潜在的危险功能，而是将您的表单设置为在系统上下文中运行。

系统上下文应仅在绝对必要时使用。当表格在系统上下文中运行时，每个 CRUD 操作都会绕过对象和字段级安全性和共享组件。此外，系统上下文对 Salesforce 认为的_操作者_（您在**上次修改人**字段中看到的名称）没有影响。对于表单执行的每个操作（例如个案更新），_操作者_是当前用户（即使表单在不同的上下文中运行）。

**注意：**动态表单、Omniscript 和 LWC 始终在用户上下文中运行，并且无法覆盖此行为。

屏幕流默认在用户上下文中运行，但您可以将其设置为在系统上下文中运行。您可以决定流是否应授予对所有数据的访问权限，或是否应强制执行记录级访问权限。

- 如果您在系统上下文中运行的流中嵌入 Lightning 组件，流不会覆盖组件的上下文。如果您需要绕过用户访问检查，请使用流执行这些操作，并将适当的数据传入或传出 Lightning 组件。一些现成的组件（例如查找）无法在系统上下文中运行。

- 如果您的流调用 Apex 操作，则涉及其他细微差别。

  - 如果 Apex 类设置为_继承共享_，则它将在具有共享的系统上下文中运行，无论流如何设置。

  - 如果类没有明确的共享声明，则无论流如何设置，它都将在系统上下文中运行而不共享。

  - 如果类设置为_共享或不共享_，它将覆盖流的上下文。

**使用 Experience Cloud 站点查询系统上下文中的记录**

如果您在 Experience Cloud 站点的系统上下文中运行流(特别是未经身份验证的流 ) , 请仅在**获取记录**元素中存储特定字段。当您使用流并将**获取记录**元素的结果传递到子流、可调用操作或 Lightning 组件时，浏览器的开发人员工具可能会检查该对象中的所有字段。尽管有此意图，但这可能会使字段对 Experience Cloud 用户可用。要确保在启用系统上下文时仅显示正确字段，请在**获取记录**元素中指定这些特定字段。

**注意：**Omniscript 逻辑在客户端运行，这使得攻击者可以通过浏览器的开发人员工具修改 Omniscript 的预期执行并查看对集成程序、数据映射器和 Apex 方法调用的响应。在使用 Omniscript 时,重要的是(在可能时)在服务器端执行业务逻辑,并为通过 [@InvocableMethod 注解](https://help.salesforce.com/s/articleView?id=sf.os_integration_procedure_invocation_55721.htm&type=5)公开的任何 Apex 方法实施输入验证规则。

**清理输入**

要保护您的组织免受不良行为者的攻击，请使用输入消毒。假设您在可公开访问的表单上有一个输入，可以映射到贵组织内的**富文本**字段。您可能要考虑启用自动化，删除任何可能隐藏恶意 URL 的 HTML。

在表单级别实施消毒并不理想，因为您可能有任意数量的源写入这些字段。为了帮助解决这个问题,请创建一个**快速字段更新流(保存前),**或者使用现有的**Apex触发器**来删除或修改可能在表单中输入的任何潜在的HTML。

#### 最佳实践

- 允许流在其默认上下文中运行（除非您需要提升当前用户对特定操作的访问权限）。

- 避免为来宾用户在系统上下文中运行流。创建具有有限字段访问权限的权限集，并将其分配到 Experience Cloud 来宾用户的简档。

- 在 Experience Cloud 站点的系统上下文运行流中查询记录时，仅将您需要的字段存储在**获取记录**元素或**可调用操作**中。

- 如果流执行各种操作（所有这些操作都不需要提升访问权限），请使用子流来隔离应该在系统上下文中运行的操作。

- 如果您在外部网页中嵌入表格，可能需要将其映射到**富文本**字段，以帮助防止潜在的网络钓鱼攻击。为此,请使用**快速字段更新流**或 **Apex 触发器**对用户输入进行消毒,以删除 HTML。

#### 其他备注

- 默认情况下，Omniscript、FlexCard 和 LWC 在用户上下文中运行。

- 默认情况下，LWC 在用户上下文中运行。

- 流在用户上下文中运行，但您可以使用 Apex 控制器覆盖它。

- 在 UI API 中执行的操作在用户上下文中运行。

- 使用 Apex 控制器执行的操作取决于特定类。要在系统模式下执行这些操作，请将 **Apex 类**设置为共享或不共享。

#### 访问控制

如果您需要控制谁可以访问表格，请查看嵌入表格的容器（例如，您可以分配 Lightning 页面用于特定应用程序、记录类型或简档）。如果某些输入敏感，请使用可见性规则进一步控制向谁显示的内容。此功能适用于动态表单和屏幕流。

您可以将[流限制](https://help.salesforce.com/articleView?id=flow_distribute_security.htm)为特定简档或权限集(类似于 Apex 类或 Visualforce 页面)。默认情况下，流不受限制，这意味着任何具有**运行流**用户权限的用户都可以访问它们。

如果您正在使用 Omnistudio，您可以配置 [Apex 类权限检查](https://help.salesforce.com/s/articleView?id=sf.os_add_an_apex_class_permissions_checker_1.htm&type=5)器，要求用户对管理 Omniscript、Flexcard、Classic Card 或 REST API 远程操作的 Apex 类拥有明确访问权限。

**注意：**Apex 类权限检查仅适用于 Apex 类。还建议为[集成程序和数据映射](https://help.salesforce.com/s/articleView?id=sf.os_security_for_dataraptors_and_integration_procedures_48147.htm&type=5)器设置简档级权限。

#### 访问控制最佳实践

- 如果您向来宾用户公开流，您应仅授予来宾用户简档对他们绝对需要的流的访问权限。可以将**运行流**添加到来宾用户简档；但是，这种做法有风险。

- 在使用在系统上下文中操作的流时，请谨慎小心。您应将这些流限制为一组特定的用户，因为他们在保护您的数据方面的制衡措施较少。

- 确保在来宾用户社区内运行 Apex 的任何 Omniscript 具有 Apex 类定义中列出的**共享**。

- 对于来宾用户简档，仅分配要允许来宾用户调用的 Apex 类。通过遵循这种做法，它有助于防止无意中向来宾用户暴露额外的业务逻辑。

对于 LWC，您可以检查当前用户的权限分配，以确认他们是否有特定的标准或自定义权限。您可以从 `@salesforce/userPermission` 导入 Salesforce 权限，并直接在 **JavaScript** 中`@salesforce/customPermission`范围模块。您也可以使用 Apex 检查权限。

#### 嵌入控件

LWC 仅在添加为有效[目标](https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.reference_configuration_tags)后在指定位置可用(例如，您可以使组件在记录页面上可用，而作为实用程序栏项目不可用)。

激活屏幕流后，它可在支持屏幕流的所有位置使用。Flow Builder 支持具有屏幕的多种流类型。最突出的类型是**屏幕流**，但也有一些其他专门类型仅限于特定位置（例如，**Field Service 移动应用程序**仅支持 **Field Service 移动流）**。这类似于**联系请求流**，后者仅在 Experience Cloud 中受支持。

无论流类型如何，创建流的人员都不能控制流的嵌入位置。流在每个支持特定流类型的位置可用。

如果您使用的是 Salesforce Industries，在 Omniscript 方面会稍有提醒。您不能为 Omniscript 指定目标；但是，您可以为要嵌入的 FlexCard 指定目标。

### UI 测试自动化

在 Salesforce 中，有几个端到端的测试自动化工具(例如，查看 [Salesforce UTAM](https://developer.salesforce.com/blogs/2022/05/run-end-to-end-tests-with-the-ui-test-automation-model-utam))允许您模拟用户如何与您的表单交互。您可以为任何标准或自定义 UI 编写测试，包括 Lightning 页面和屏幕流。

**注意：**这些类型的测试无法验证正在执行的方法的输出。在配置 UI 测试自动化要求时，请记住这一点。

#### 要问的问题

- 是否需要对表单进行自动化测试？

- 您计划执行什么类型的测试？

- 测试自动化需要什么级别的粒度？

<table><tr><th colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"></th>
<th colspan="1" rowspan="1">单元测试</th>
<th colspan="1" rowspan="1">端到端自动化</th></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>动态表单</strong></td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用*</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流</strong></td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">可用*</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>奧姆尼斯圖</strong></td>
<td colspan="1" rowspan="1">可用*</td>
<td colspan="1" rowspan="1">可用*</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流 + LWC</strong></td>
<td colspan="1" rowspan="1">可用*</td>
<td colspan="1" rowspan="1">可用*</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>LWC</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="3" rowspan="1" style="border-right: 1px solid #d8dde6;">*需要代码</td></tr></table>

**考虑 UI 测试自动化要求**

**单元测试**提供与行业标准 CI/CD 系统和工具一致的精细自动化和验证，用于测试特定组件的业务逻辑、JavaScript 控制和输出。如果您选择低代码方法，您将无法自行编写测试；但是，Salesforce 会严格测试所有端到端产品。

如果您的组件方法复杂，您可以通过将这些方法放入专用 JavaScript 文件中来单独编写文本。这允许您将它们导入 LWC，然后导入 **Jest 测试（例如**从 'c/utils' 导入{ sort }；）。

您可以从 ISV 使用无代码解决方案，构建自定义测试自动化解决方案，或使用开源测试框架（例如，Selenium WebDriver 或 WebdriverIO）实现端到端自动化。这些解决方案适用于所有 Salesforce UI 交互（例如，Lightning 页面中的动态表单、实用程序栏中的屏幕流或快速操作流中的 LWC）。

### 度量

将表单部署到生产环境后，您需要确保表单得到有效使用。根据您的用例，这可能意味着跟踪您的表单被填写的次数，直到普通用户在提交信息之前填写表单的时间。在选择工具之前，确定您的可跟踪 KPI 非常重要。

#### 要问的问题

- 是否需要跟踪表单使用情况？

- 哪些 KPI 可以确定表单是否得到有效使用？

<table><tr><th colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"></th>
<th colspan="1" rowspan="1">页面视图</th>
<th colspan="1" rowspan="1">在表单上花费的时间</th>
<th colspan="1" rowspan="1">跟踪表单完成情况</th>
<th colspan="1" rowspan="1">跟踪成功率</th></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>动态表单</strong></td>
<td colspan="1" rowspan="1">可用**</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用*</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>奧姆尼斯圖</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用*</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流 + LWC</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用*</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>LWC</strong></td>
<td colspan="1" rowspan="1">可用**</td>
<td colspan="1" rowspan="1">可用*</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="5" rowspan="1" style="border-right: 1px solid #d8dde6;">*在启用基于软件包的 Omnistudio 运行时可用**通过跟踪父 Lightning 页面使用情况可用</td></tr></table>

如果您需要跟踪整体表单使用情况和采用情况，请使用低代码工具。动态表单和屏幕流可通过现成的自定义报表进行跟踪。但是，屏幕流跟踪报表提供了额外的粒度。如果您需要跟踪 LWC 使用情况，现成可用性取决于您使用 LWC 的位置。如果在 Lightning 页面上，所有可用的 Lightning 页面使用情况跟踪元素也适用于您的 LWC。对于嵌入流的 LWC，也是如此。

动态表单不是现成的;但是,您可以通过 [Lightning 使用对象](https://help.salesforce.com/articleView?id=lex_usage_reports.htm)跟踪父 Lightning 页面的使用情况。要跟踪标准 Lightning 页面，请使用按页面度量划分的 **Users with Lightning Usage** 自定义报表。对于自定义 Lightning 页面，使用按 FlexiPage 度量划分的 **Users with Lightning Usage** 自定义报表。

流可以帮助您跟踪特定表单的采用情况。使用**示例流报表：回答这些类型问题的屏幕流**：

- 此表单的完成率如何？它目前是否被很好地采用？

- 用户完成此表单需要多长时间？

- 用户完成哪个屏幕花费的时间最多？

- 用户多久导航一次以前的屏幕？

- 错误多久发生一次？

如果标准报表不符合您的需求，您可以使用**屏幕流**报表从头开始复制它并进行更改或Build Your Own 报表。

如果您正在使用基于软件包的 Omniscript 运行时，您也可以使用 [Omnistudio for Vlocity 跟踪服务](https://help.salesforce.com/s/articleView?id=sf.os_vlocity_tracking_service.htm&type=5)。此服务跟踪所有类型的事件（例如，您可以跟踪完成 Omniscript 中的步骤所需的时间，这有助于确定流程改进）。

**注意：**没有现成的选项可以跟踪未嵌入屏幕流、Omniscript 或 Lightning 页面的 LWC，但您可以使用 Apex 构建自定义解决方案。

### 打包和部署

您可能熟悉使用更改集或 **DevOps Center** 将您的解决方案部署到测试环境或生产环境中。这些部署选项完全支持动态表单、流和 LWC。但是，Omnistudio 需要一个单独的工具 - [IDX 工作台](https://help.salesforce.com/s/articleView?language=en_US&id=sf.os_idx_workbench_desktop_application.htm&type=5)。

#### 要问的问题

- 您计划如何部署表单？

- 表格是否需要分发到多个 Salesforce 组织？

<table><tr><th colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"></th>
<th colspan="1" rowspan="1">第一代受管软件包 (1GP)</th>
<th colspan="1" rowspan="1">第二代受管软件包 (2GP)</th>
<th colspan="1" rowspan="1">解锁的软件包</th>
<th colspan="1" rowspan="1">更改集</th>
<th colspan="1" rowspan="1">DevOps Center</th></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>动态表单</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>奧姆尼斯圖</strong></td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用</td>
<td colspan="1" rowspan="1">不可用*</td>
<td colspan="1" rowspan="1">不可用*</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流 + LWC</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>LWC</strong></td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td>
<td colspan="1" rowspan="1">可用</td></tr>
<tr><td colspan="6" rowspan="1" style="border-right: 1px solid #d8dde6;">*使用 IDX 工作台将 Omnistudio 解决方案部署到其他组织。</td></tr></table>

如果您是 ISV 或合作伙伴，并计划打包解决方案以在 AppExchange 上分发，请查看动态表单、流和 LWC。请记住，Omnistudio 不支持打包。

### 将低代码导航到专业代码连续体

本指南旨在向您展示通过动态表单、屏幕流、Omnistudio 和 LWC 可用的功能和自定义级别。
<image src="https://architect.salesforce.com/ns-assets/guide-forms-lowcode-continuum.png" alt="Low-Code to Pro-Code Continuum" style="width:100%;border:1px solid #e5e5e5;margin-top:1rem;margin-bottom:1rem" />
以下是高级概览。

- 在构建表单方面，LWC 是最强大的可自定义选项，但它的护栏最少。这就是为什么在构建组件时考虑[安全](/docs/architect/zh-cn/well-architected/guide/trust.html)性和[可扩展性](/docs/architect/zh-cn/well-architected/guide/reliability.html#scalability-and-capacity-planning)至关重要。

- 动态表单是最不灵活的选项，但它出错的机会要少得多。

- Flow 和 Omnistudio 在中间稍有下降。它们比动态表单更强大，但还没有达到 LWC 级别。但是，它们的防护栏比动态表单少，比自定义代码更难打破。

您可能会发现多个工具适合您的需求。如果是这样，决策最终取决于哪个工具最适合您的团队。有关需要考虑的其他方面的更多信息，请查看这些[架构决策指南](/docs/architect/zh-cn/decision-guides)。

#### 要问的问题

- 在比较工具时，重要的是评估团队对每个工具拥有多少专业知识？
- 有多少开发人员精通 LWC 或 JavaScript？
- 您的团队中是否有任何开发人员是 Flow Builder 的专家，或者表示有兴趣了解更多信息？

虽然我们不会详述具体细节，但这里有一些关于这些具体工具如何与我们迄今涵盖的评估相关的更多信息。

**交付委派**

请谨记，即使您的一些要求要求使用 LWC，也不要求使用 LWC 构建整个解决方案。确定如何模块化构建解决方案非常重要。为此，您需要确定哪些零件需要编码 LWC，哪些零件不需要。不需要 LWC 的零件应该使用低代码解决方案构建。

在流和 LWC 方面，有各种组件（例如，反应性屏幕组件和屏幕流）可以在同一个屏幕上相互同步，为架构师、管理员和开发人员解锁新的工具。开发人员现在可以创建有针对性的模块化组件，可以在整个组织中重复使用，这有助于提高团队的效率。这允许开发人员通过使用标准和自定义流组件的组合来实现表单动态来节省时间，这使他们能够有更多的时间专注于解决新的挑战。随着在流中引入反应性组件，在构建表单时，将流和 LWC 混合在一起再合适不过了。

**长期所有权和可维护性**

如果您正在创建多步骤表单，请从流或流和 LWC 的组合开始。如果维护表单的团队是低代码团队，请确保解决方案对目标受众来说尽可能可配置和可扩展。为了提高稳定性和维护性,无论您选择哪种工具,将您的解决方案组织成[可组合](/docs/architect/zh-cn/well-architected/guide/resource-and-cost-optimization.html#packaging-and-modularity)单元都非常重要。

### 性能

与动态表单、屏幕流、Omnistudio 或 LWC 相关的性能注意事项基于容纳技术的框架。基于 LWC 的技术往往优于基于 Aura 的技术。由于一些核心功能在 Web 引擎中本地实施（而不是通过框架抽象在 JavaScript 中实施），LWC 提供了增强的性能优势。

那么，我们如何在 Salesforce 中为表单技术利用这些性能优势？让我们仔细看看。

- 动态表单（集成在 Lightning 页面元数据中）建立在 LWC 堆栈的基础上，这使我们能够实施几个期待已久的功能。作为额外的性能奖励，动态表单使用渐进式渲染，这改进了包含大量字段的页面的加载时间。

- 屏幕流构建于 LWC。除了**文件上传**和**图像**组件之外，大多数现成的组件现在已经转换为 LWC。虽然流团队已将流运行时客户端转换为 LWC（及其大部分组件），但客户仍然需要将 Aura 屏幕组件转换为 LWC。请记住，Salesforce 仅支持屏幕流中**反应性组件**框架中的 LWC 组件。有关更多信息，请查看 [Lightning Web Components for Aura Developer](https://trailhead.salesforce.com/en/content/learn/modules/lightning-web-components-for-aura-developers) Trailhead 模块。如果您正在考虑为屏幕流（或任何其他容器）构建自定义组件，请选择 LWC！

- Omnistudio 有几个版本可用。如果您是长期客户，您可能正在使用 **Angular**。我们鼓励所有新客户使用基于 LWC 的 Omniscript 和 FlexCard。我们还鼓励现有客户迁移到 Angular 之外。

- LWC 建立在 LWC 的基础上。

## 资源

<table><tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>动态表单</strong></td>
<td colspan="1" rowspan="1"><a href="https://help.salesforce.com/s/articleView?id=platform.dynamic_forms_overview.htm&language=en_US&type=5">- 使用动态表单拆分记录详细信息</a><br><a href="https://help.salesforce.com/s/articleView?id=platform.lightning_app_builder_overview.htm&type=5">- 获取 Lightning 应用程序生成器的帮助</a></td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>屏幕流</strong></td>
<td colspan="1" rowspan="1"><a href="https://help.salesforce.com/s/articleView?id=platform.create_forms_with_screen_flow_components.htm&type=5">- 使用屏幕流与用户交互</a><br>- <a href="https://help.salesforce.com/s/articleView?id=platform.flow.htm&type=5">使用流自动任务</a></td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>奧姆尼斯圖</strong></td>
<td colspan="1" rowspan="1">- <a href="https://help.salesforce.com/s/articleView?id=release-notes.rn_automate_omnistudio.htm&release=236&type=5">Omnistudio</a><br>- <a href="https://help.salesforce.com/s/articleView?id=xcloud.os_omniscripts_8355.htm&type=5">全名脚本</a><br>- <a href="https://help.salesforce.com/s/articleView?language=en_US&id=sf.os_idx_workbench_desktop_application.htm&type=5">IDX 工作台桌面应用程序</a><br>- <a href="https://help.salesforce.com/s/articleView?id=xcloud.os_customize_omniscripts_and_flexcards_with_the_newport_design_system.htm&type=5">新港设计系统</a><br><a href="https://help.salesforce.com/s/articleView?id=xcloud.os_customize_omniscripts_and_flexcards_with_the_newport_design_system.htm&type=5">- 使用 Newport 设计系统自定义 Omniscript 和 Flexcard</a></td></tr>
<tr><td colspan="1" rowspan="1" style="border-right: 1px solid #d8dde6;"><strong>LWC</strong></td>
<td colspan="1" rowspan="1">- <a href="https://developer.salesforce.com/developer-centers/lightning-web-components">Lightning Web组件</a><br>- <a href="https://developer.salesforce.com/docs/atlas.en-us.lightning.meta/lightning/intro_framework.htm">Lightning Aura组件开发指南</a><br>- 适用于 Aura 开发人员的 <a href="https://trailhead.salesforce.com/en/content/learn/modules/lightning-web-components-for-aura-developers">Lightning Web 组件</a></td></tr></table>
