Skip to content

单据打印与模板设计 ​

网页端每种业务单据的工具栏上都有 🖨 打印,但打出来长什么样——抬头写什么、客户和日期放哪、明细要哪几列、页脚留不留签收栏——不是固定的,由你自己画。这一套可视化模板设计器就是本文的主题。它和门店小票那套「票据打印模板」是两回事:票据打印模板管的是收银小票、厨打单、商品标签;本文管的是业务单据的套打件(销售单、采购单、调拨单这些),一个单据种类一套模板,互不影响。

下面全程用销售单做例子,从建模板、拖版式、绑字段到出纸走一遍。

一、功能概述 ​

整套能力由三个页面组成,都从单据窗口进入:

页面怎么进干什么
打印模板管理单据工具栏 🖨 打印 ▾ → ⚙ 打印模板管理看这个单据有哪些模板、新建、改名、设为默认、导出导入、删除、进设计器
打印模板设计器模板管理列表点该行的 设计拖元素、绑字段、调属性、保存
打印预览单据工具栏点 🖨 打印 主按钮本身选模板、看真实数据的渲染结果、调起浏览器打印

三条规则先记住:

  • 模板按单据种类隔离。 你给销售单建的模板,在进货单的打印预览里选不到。系统内部用「模块标识」区分,销售单是 Sales.billsalehead,这个标识出现在上述三个页面的地址栏里,页面顶部标题也带着它。
  • 一个单据可以有 N 份模板,其中一份是默认。 打印预览打开时预选中的就是默认那份。
  • 设计时看版式,出纸时填数据。 设计器里字段位置、表格列数是看得见的,具体客户名、金额要等打印时才带出来;设计器的 预览 按钮用的是空数据,字段位置出来是空的,这是正常的。

二、界面布局说明 ​

入口:单据工具栏的「打印」 ​

销售单查看态工具栏,打印按钮右侧下拉展开显示「打印模板管理」,单据正文已做虚化处理

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

打印模板管理列表 ​

销售单打印模板管理列表:两份模板「客户联」A4 纵向带默认徽章、「仓库联」A5 纵向,操作列为设计/重命名/设默认/导出/删除

列表八列:

列说明
ID模板编号,系统分配
模板名称你自己起的名字,打印预览的下拉里显示的就是它
纸张建档时选的 A4 / A5 / B5 / 自定义
方向纵向 / 横向
默认是默认模板的行,名称右侧挂一枚「默认」徽章,且整行排在最上面
来源在本页建的显示 local
更新时间最后一次保存设计器的时间
操作设计 / 重命名 / 设默认 / 导出 / 删除

操作列几个细节:

  • 默认模板那一行没有「设默认」按钮——它已经是默认了。
  • 设默认 点一下即生效并刷新列表,原默认行的按钮会回来。
  • 导出 把该模板存成一个 JSON 文件,可以拿到同账套的其他机器 从文件导入,做备份或复用。
  • 删除 会先弹「确定删除模板「××」?此操作不可恢复。」,删之前建议先导出一份。

列表右上角「新增模板 ▾」下拉展开:新增 A5 模板、新增横向模板、新增自定义模板

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

新增模板弹窗:模板名称(必填,占位文字「如:客户联、仓库联」)、纸张类型 A4/A5/B5/自定义、排版方向 纵向/横向,底部取消与确定

新增弹窗只有三项:模板名称 带红色 * 必填,占位提示「如:客户联、仓库联」;纸张类型 A4 / A5 / B5 / 自定义;排版方向 纵向 / 横向。选「自定义」也不会多出租宽、高两个输入框。

两点要注意: ① 新建的模板不会自动变成默认,默认标记仍留在原来那份上,要换默认得手动点 设默认。 ② 「纸张 / 方向」是建档时记下的一行信息,真正决定出纸尺寸的是设计器画布里那张纸的宽和高。两者不一致时,以设计器里的为准——实测过一份列表标 A5 的模板,画布面板就是 148×210 mm,打出来是 A5。

打印模板设计器 ​

设计器整体:左侧基础元素与业务字段两栏、中间空白 A4 画布、右侧属性设置,顶部预览/清空/保存三个按钮

设计器是标准三栏加一条顶部按钮:

区域内容
顶部按钮预览、清空(弹「确定清空?」)、保存
左栏上:基础元素文本、长文本、图片、表格、条形码、二维码、横线、竖线、矩形、椭圆——按住往画布拖
左栏下:业务字段 (点击复制)当前单据种类可用的字段清单,按「基本信息 / 物流信息 / 汇总信息 / 备注 / 明细」分组;点一下即复制成 标题#字段 的形式,右下角弹绿色提示「已复制:××」
中间:画布一张带刻度的纸,元素可拖动、可拉伸、可多选;底部有分页标记区
右栏:属性设置选中某个元素后,这里列出它的全部可调属性

三、以销售单为例做一份「客户联」 ​

假设要做一张 A4 竖版、给客户随货签字的销售单。

  1. 打开任意一张销售单 → 🖨 打印 ▾ → ⚙ 打印模板管理。
  2. 点右上角的 新增模板 打开弹窗(默认就落在 A4 / 纵向;要别的规格可以从 新增模板 ▾ 里挑预设),命名 客户联,确认纸张 A4、方向 纵向,点 确定。列表里出现这一行。
  3. 点这一行的 设计,进入设计器。
  4. 从 基础元素 拖一个 文本 到画布顶部,属性里「标题」写 MSTAR 烘焙 · 销售单、「字段名」留空——这是一行不打数据的固定标题。
  5. 做表头信息区。以「客户名称」为例:拖一个 文本 到画布 → 到左下 业务字段 里点 客户,剪贴板里就是 客户#fclientid → 在元素属性里把「字段名」填成这个串。同理做出 单据日期#fbillday、单据金额#fbillsum、原始单号#fhandwrtten。
  6. 做明细。从 基础元素 拖一个 表格 到画布中部,属性里「字段名」填 detail_products;表格默认给的是 列1/列2/列3(field1/field2/field3)三个空列,把列标题逐个改成带 # 的写法,例如 物料名称#fInvName、数量#fInputQty、含税单价#fPrice、含税金额#fMoney、批号#fBatNumNo,多余的列删掉。
  7. 补页脚:拖 横线 或 文本 做出 送货地址#fsendaddress,再加一行静态文本「签收人:____」留给手写。
  8. 选中「单据日期」那个元素,在右栏把 数据类型 改成 日期时间、格式 选 yyyy/MM/dd——不改的话会打成 2026-11-04 00:00:00。
  9. 点顶部 保存,右下角提示「保存成功」。
  10. 回列表点这一行的 设默认(如果希望它成为默认那份)。
  11. 回销售单点 🖨 打印,预览页顶部下拉选 客户联,看排版没问题再点 打印。

客户联版式载入到设计器画布:标题、表头四行字段、五列明细表、页脚横线与签收栏

打印预览页渲染出的客户联:标题、客户名称、单据日期、单据金额、明细表格(物料名称/数量/含税单价/含税金额/批号)、送货地址与签收人栏,敏感数据已脱敏

明细表格的绑定规则(最容易出错的一处) ​

  • 表格元素本身的「字段名」填 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 重新 从文件导入。

「从平台导入(二期)」点了没反应? 会提示「平台公共模板导入功能,二期开发」,该功能尚未上线,目前只能 从文件导入。

相关文档 ​