单据打印与模板设计
网页端每种业务单据的工具栏上都有 🖨 打印,但打出来长什么样——抬头写什么、客户和日期放哪、明细要哪几列、页脚留不留签收栏——不是固定的,由你自己画。这一套可视化模板设计器就是本文的主题。它和门店小票那套「票据打印模板」是两回事:票据打印模板管的是收银小票、厨打单、商品标签;本文管的是业务单据的套打件(销售单、采购单、调拨单这些),一个单据种类一套模板,互不影响。
下面全程用销售单做例子,从建模板、拖版式、绑字段到出纸走一遍。
一、功能概述
整套能力由三个页面组成,都从单据窗口进入:
| 页面 | 怎么进 | 干什么 |
|---|---|---|
| 打印模板管理 | 单据工具栏 🖨 打印 ▾ → ⚙ 打印模板管理 | 看这个单据有哪些模板、新建、改名、设为默认、导出导入、删除、进设计器 |
| 打印模板设计器 | 模板管理列表点该行的 设计 | 拖元素、绑字段、调属性、保存 |
| 打印预览 | 单据工具栏点 🖨 打印 主按钮本身 | 选模板、看真实数据的渲染结果、调起浏览器打印 |
三条规则先记住:
- 模板按单据种类隔离。 你给销售单建的模板,在进货单的打印预览里选不到。系统内部用「模块标识」区分,销售单是
Sales.billsalehead,这个标识出现在上述三个页面的地址栏里,页面顶部标题也带着它。 - 一个单据可以有 N 份模板,其中一份是默认。 打印预览打开时预选中的就是默认那份。
- 设计时看版式,出纸时填数据。 设计器里字段位置、表格列数是看得见的,具体客户名、金额要等打印时才带出来;设计器的 预览 按钮用的是空数据,字段位置出来是空的,这是正常的。
二、界面布局说明
入口:单据工具栏的「打印」

打印是一个「分体按钮」:左边 🖨 打印 是主按钮,右边 ▾ 是下拉。下拉里只有一项 ⚙ 打印模板管理,点了在新标签页打开这个单据的模板清单——也就是说,模板的管理入口藏在单据里,而不是系统菜单里。
打印模板管理列表

列表八列:
| 列 | 说明 |
|---|---|
| ID | 模板编号,系统分配 |
| 模板名称 | 你自己起的名字,打印预览的下拉里显示的就是它 |
| 纸张 | 建档时选的 A4 / A5 / B5 / 自定义 |
| 方向 | 纵向 / 横向 |
| 默认 | 是默认模板的行,名称右侧挂一枚「默认」徽章,且整行排在最上面 |
| 来源 | 在本页建的显示 local |
| 更新时间 | 最后一次保存设计器的时间 |
| 操作 | 设计 / 重命名 / 设默认 / 导出 / 删除 |
操作列几个细节:
- 默认模板那一行没有「设默认」按钮——它已经是默认了。
- 设默认 点一下即生效并刷新列表,原默认行的按钮会回来。
- 导出 把该模板存成一个 JSON 文件,可以拿到同账套的其他机器 从文件导入,做备份或复用。
- 删除 会先弹「确定删除模板「××」?此操作不可恢复。」,删之前建议先导出一份。

右上角两个分体按钮:新增模板 ▾(新增 A5 模板 / 新增横向模板 / 新增自定义模板 三个快捷预设,省去手选纸张)和 导入 ▾(从文件导入 / 从平台导入(二期))。后者目前还没开放,点了会提示「平台公共模板导入功能,二期开发」。

新增弹窗只有三项:模板名称 带红色 * 必填,占位提示「如:客户联、仓库联」;纸张类型 A4 / A5 / B5 / 自定义;排版方向 纵向 / 横向。选「自定义」也不会多出租宽、高两个输入框。
两点要注意: ① 新建的模板不会自动变成默认,默认标记仍留在原来那份上,要换默认得手动点 设默认。 ② 「纸张 / 方向」是建档时记下的一行信息,真正决定出纸尺寸的是设计器画布里那张纸的宽和高。两者不一致时,以设计器里的为准——实测过一份列表标 A5 的模板,画布面板就是 148×210 mm,打出来是 A5。
打印模板设计器

设计器是标准三栏加一条顶部按钮:
| 区域 | 内容 |
|---|---|
| 顶部按钮 | 预览、清空(弹「确定清空?」)、保存 |
| 左栏上:基础元素 | 文本、长文本、图片、表格、条形码、二维码、横线、竖线、矩形、椭圆——按住往画布拖 |
| 左栏下:业务字段 (点击复制) | 当前单据种类可用的字段清单,按「基本信息 / 物流信息 / 汇总信息 / 备注 / 明细」分组;点一下即复制成 标题#字段 的形式,右下角弹绿色提示「已复制:××」 |
| 中间:画布 | 一张带刻度的纸,元素可拖动、可拉伸、可多选;底部有分页标记区 |
| 右栏:属性设置 | 选中某个元素后,这里列出它的全部可调属性 |
三、以销售单为例做一份「客户联」
假设要做一张 A4 竖版、给客户随货签字的销售单。
- 打开任意一张销售单 → 🖨 打印 ▾ → ⚙ 打印模板管理。
- 点右上角的 新增模板 打开弹窗(默认就落在 A4 / 纵向;要别的规格可以从 新增模板 ▾ 里挑预设),命名
客户联,确认纸张 A4、方向 纵向,点 确定。列表里出现这一行。 - 点这一行的 设计,进入设计器。
- 从 基础元素 拖一个 文本 到画布顶部,属性里「标题」写
MSTAR 烘焙 · 销售单、「字段名」留空——这是一行不打数据的固定标题。 - 做表头信息区。以「客户名称」为例:拖一个 文本 到画布 → 到左下 业务字段 里点 客户,剪贴板里就是
客户#fclientid→ 在元素属性里把「字段名」填成这个串。同理做出单据日期#fbillday、单据金额#fbillsum、原始单号#fhandwrtten。 - 做明细。从 基础元素 拖一个 表格 到画布中部,属性里「字段名」填
detail_products;表格默认给的是 列1/列2/列3(field1/field2/field3)三个空列,把列标题逐个改成带#的写法,例如物料名称#fInvName、数量#fInputQty、含税单价#fPrice、含税金额#fMoney、批号#fBatNumNo,多余的列删掉。 - 补页脚:拖 横线 或 文本 做出
送货地址#fsendaddress,再加一行静态文本「签收人:____」留给手写。 - 选中「单据日期」那个元素,在右栏把 数据类型 改成 日期时间、格式 选
yyyy/MM/dd——不改的话会打成2026-11-04 00:00:00。 - 点顶部 保存,右下角提示「保存成功」。
- 回列表点这一行的 设默认(如果希望它成为默认那份)。
- 回销售单点 🖨 打印,预览页顶部下拉选 客户联,看排版没问题再点 打印。


明细表格的绑定规则(最容易出错的一处)
- 表格元素本身的「字段名」填
detail_products(销售单明细的固定标识),不是某个列名。 - 每一列的标题写成
列标题#字段名,设计器会按第一个#拆开:前半段是打印出来的表头文字,后半段是取数用的字段。 - 只写标题、漏了
#字段名,那一列就取不到数,打出来是空白行——明细看着有行、有列头,但格子里什么都没有。 - 标题里的
#是分隔符,别在列名里真要用井号。
四、销售单可用字段
左下 业务字段 (点击复制) 面板列出的就是全部可绑的东西:表头 30 项(其中「联系人」重复出现两次,去重后 29 个不同字段)+ 1 张明细表(21 列)。
表头字段
| 分组 | 可绑字段(界面名 → 字段名) |
|---|---|
| 基本信息 | 单据日期 fbillday、客户 fclientid、出库仓库 fstorageid、销售人员 fsellmanid、经营部门 fdeptid、默认税率 ftaxid、负责人 fownerid、原始单号 fhandwrtten |
| 物流信息 | 联系人 flinkman、电话 ftel、发货日期 fsendday、送货时间 fsendtime、送货地址 fsendaddress、送货方式 fmodeid、回款日期 fgatherday、检货员 fcheckinvid、送货员 fdeliveryman |
| 汇总信息 | 单据金额 fbillsum、总数量 fsumqty、折扣金额 fdiscmoney、成本金额 fcostmoney、总重量 fsumweight、总体积 fsumbulk、开票金额 fsuminvoicemoney、已收款金额 freceivermoney、运输费用 fcarriage、代垫费用 freplacepaycharge |
| 备注 | 单据摘要 fbillremark、自动摘要 fautoremark |
明细列(detail_products 这张表的列)
| 列名 → 字段名 | 列名 → 字段名 | 列名 → 字段名 | 列名 → 字段名 |
|---|---|---|---|
物料编号 fInvNo | 条码 fBarCode | 自定义码 fManSign | 物料名称 fInvName |
规格 fInvSpec | 单位 fUnitName | 数量 fInputQty | 不含税单价 fNoTaxPrice |
不含税金额 fNoTaxMoney | 含税单价 fPrice | 含税金额 fMoney | 原价 fOldPrice |
销售定价 fStdSprice | 行备注 fLineRemark | 是否赠品 fIsLargess | 价格类型 fPriceType |
保存价格 fSavePrice | 毛重 fGrossWt | 皮重 fTareWt | 周转箱 fTareQty |
批号 fBatNumNo |
单据号不在面板里。 业务字段清单里没有
fbillno,但打印数据里是带它的——在元素属性的「字段名」里手输fbillno就能把单号打出来。同理,任何面板上没列出的字段,只要该单据的数据里有,手输字段名即可。代价是拿到的是原始值:比如状态字段会打成2而不是「已生效」。
其他单据种类(进货单、调拨单、领料单……)的面板内容各不相同,但入口、列、属性、绑定规则完全一样,换一张单照着做即可。
五、属性能改什么

选中画布上的元素后,右栏按分组列出属性。常用的这些:
| 属性 | 可选值 / 作用 |
|---|---|
| 标题 / 字段名 | 元素显示的文字与取数字段;文本类元素用 标题#字段 一次写完 |
| 字号、字体、粗细、颜色 | 字体可选 宋体 / 微软雅黑;粗细常规与加粗 |
| 左右对齐 | 默认 / 居左 / 居中 / 居右 / 两端对齐 |
| 上下对齐 | 默认 / 垂直居中 / 底部 |
| 文本修饰 | 默认 / 下划线 / 上划线 / 穿梭线 |
| 数据类型 | 默认 / 日期时间 / 布尔——日期字段要打成人话必须改成「日期时间」 |
| 格式 | M/d、MM/dd、yy/M/d、yy/MM/dd、yyyy/M/d、yyyy/MM/dd,以及带 H:m、H:m:s、HH:mm 的时分秒变体 |
| 打印类型 | 默认 / 文本 / 条形码 / 二维码——把某个字段直接打成条码 |
| 条形码格式 | CODE128A/B/C、CODE39、EAN-13/8/5/2、UPC(A)、ITF、ITF-14、MSI、MSI10/11/1010/1110、Pharmacode |
| 显示规则 | 默认 / 首页 / 奇数页 / 偶数页 / 尾页——多页单据的页眉页脚靠它控制,避免每页都重复表头 |
| 标题显示 | 默认 / 显示 / 隐藏——只想打值、不想打「客户名称:」这段前缀时选隐藏 |
表格元素另有一组专属属性:表格边框、表头边框、表头单元格边框(各有 有边框 / 无边框 / 实线 / 虚线 等选项)、表头行高、表头字体大小、表头字体粗细、表头背景、表体行高,以及列的增删与列宽调整。套打格子纸时,把表头边框设成无边框、表体行高对齐纸张格距即可。
六、常见场景
| 场景 | 做法 |
|---|---|
| 客户联与仓库联分开打 | 同一单据建两份模板:客户联 A4 带金额,仓库联 A5 只留物料名称、数量、单位、批号(不绑金额字段),仓库拣货用 |
| 同一单据要竖版和横版 | 用 新增横向模板 预设另建一份,打印预览时下拉切换 |
| 让某份模板每次默认打开 | 列表里点它的 设默认 |
| 把销售单调好的版式给进货单参考 | 销售单列表 导出 JSON,到进货单的模板管理 从文件导入(字段名不同,导入后要重绑) |
| 改坏了想回退 | 有导出过的重新 从文件导入;没有的话 清空 后重做,或另建一份新的 |
| 单据上要印条码或二维码 | 拖一个 文本,「字段名」填要编码的那个字段(如条码号),选中它后在属性里把 打印类型 改成 条形码 或 二维码,再选 条形码格式(EAN-13、CODE128 等)——打出来的图形就是该字段值对应的码 |
| 只在第一页打表头 | 表头元素属性里 显示规则 选 首页 |
七、权限与前置条件
- 打印能力跟着单据走。 单据工具栏上看得到 🖨 打印 这个按钮,就能进模板管理、能设计、能打印;按钮被隐藏(该账号没有该单据的打印能力)时,整套设计器也就进不去了。默认情况下打印是放行的。
- 它不是系统菜单里的一项。 「打印模板管理」没有独立的菜单项,也不出现在角色授权的菜单清单里,因此唯一正规入口就是单据工具栏的打印下拉。想给别人演示,可以直接把这个单据的模板管理地址发给他。
- 数据前提。 明细表格要有内容,单据就得有明细行;草稿态和已生效态的单据都能打印,不限状态。
- 纸张匹配。 画布尺寸、套打纸、打印机里设的纸张三者要一致,否则打出来会缩放或裁边。设计器里那张纸的宽高是最终依据。
- 影响面。 模板是这个账套共享的:你改的默认模板,别人打同一张单也会跟着变。改前先 导出 一份留底。
- 除单据窗口外,部分编码类窗口的按钮区同样带 打印 与 打印模板管理,机制与本文一致,只是可绑字段换成该编码自己的字段。
八、常见问题
打印下拉里只有「打印模板管理」,没有模板名? 正常。下拉只负责进管理页;选模板、出纸在点主按钮 打印 之后弹出的打印预览里做。
点打印后提示「无可用模板」「请选择模板」? 说明这个单据种类一份模板都还没建——先走 打印 ▾ → 打印模板管理 → 新增模板。

明细表格打出来有列头、有行,但格子里全是空白? 列标题漏了 #字段名,或表格元素的「字段名」没写成 detail_products。回到设计器,把每列标题改成 物料名称#fInvName 这种形式。
日期打成「2026-11-04 00:00:00」这样的尾巴? 那个日期元素的数据类型还是「默认」。选中它,数据类型 改 日期时间,格式 选 yyyy/MM/dd。
想把单据号打出来,但业务字段里找不到? 手动在属性「字段名」里输入 fbillno。同理其他没列出的字段也能手输,只是打出来是原始值(状态会显示成数字而不是「已生效」)。
列表里纸张写 A5,打出来却是 A4(或反过来)? 纸张那一列只是建档时记录的信息,出纸尺寸看设计器画布里那张纸的宽高。进设计器把纸张改对,保存后再打。
设计器里点「预览」出来的是一张空表? 设计器的 预览 用空数据渲染,只用来核版式,字段值本就是空的。要看真数据,回单据点 打印。
改了模板,打印还是老样子? 确认设计器右下角出现过「保存成功」——没点 保存 的改动不落库;另外打印预览页要重新打开(它是新标签页拉取的)。
误删模板能恢复吗? 不能。删除的确认文案就写着「此操作不可恢复」。所以要恢复只能靠之前 导出 的 JSON 重新 从文件导入。
「从平台导入(二期)」点了没反应? 会提示「平台公共模板导入功能,二期开发」,该功能尚未上线,目前只能 从文件导入。
