1. 业务场景与需求分析
在财务日常工作中,凭证打印是最基础也最频繁的操作之一。金蝶云星空作为主流ERP系统,其凭证打印功能直接影响着财务人员的工作效率。传统单张A4纸打印一张凭证的方式存在明显的资源浪费问题——不仅消耗双倍纸张,还增加了凭证册的厚度和存档空间。
我曾在某制造企业实施金蝶系统时,财务主管提出一个具体痛点:每月凭证量约800份,按传统打印方式需要消耗8包A4纸,年度纸张成本超过5000元。更麻烦的是厚重的凭证册给审计查阅带来不便。这就是为什么"一张A4纸打印两张凭证"会成为高频需求。
从技术角度看,标准凭证内容实际占用的版面通常不足A4纸的1/2。通过合理排版完全可以在保持可读性的前提下实现双凭证打印。这既符合绿色办公理念,又能直接降低企业运营成本。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统配置准备工作
2.1 凭证模板调整
金蝶云星空采用BOS设计器进行凭证模板定制。要实现双列打印,需要先复制默认模板进行修改:
- 登录系统后进入【系统配置】-【BOS设计器】
- 找到"总账凭证"业务对象,右键选择"复制模板"
- 将新模板命名为"双栏凭证打印模板"
关键调整参数:
- 页面宽度设为21cm(标准A4横向)
- 单栏宽度设置为10cm(含0.5cm栏间距)
- 页边距统一调整为1cm
- 字体大小建议不小于10.5pt保证可读性
注意:修改前务必备份原模板!我曾遇到客户误操作覆盖标准模板导致所有凭证打印异常的情况。
2.2 打印参数设置
在模板设计界面需要特别注意以下参数:
xml复制<PageSettings>
<PaperSize>A4</PaperSize>
<Landscape>true</Landscape> <!-- 横向打印 -->
<Margins Left="100" Right="100" Top="100" Bottom="100"/>
</PageSettings>
同时需要在凭证项属性中设置:
xml复制<TextBox Name="txtVoucher">
<Size Width="950" Height="1200"/> <!-- 单栏尺寸 -->
<Location X="100" Y="150"/> <!-- 第一栏位置 -->
</TextBox>
<TextBox Name="txtVoucher2">
<Size Width="950" Height="1200"/>
<Location X="1100" Y="150"/> <!-- 第二栏位置 -->
</Location>
3. 凭证数据分栏处理
3.1 数据源绑定逻辑
双栏打印的核心难点在于数据分栏处理。需要通过脚本实现凭证数据的智能分配:
javascript复制function OnAfterLoadData(){
// 获取当前凭证数据集
var vouchers = this.View.Model.GetValue("FEntity");
// 计算总行数
var totalRows = vouchers.Count();
// 设置每栏显示行数(根据凭证高度动态计算)
var rowsPerColumn = Math.floor((this.Height - 200)/25);
// 数据分栏处理
var column1 = [];
var column2 = [];
for(var i=0; i<totalRows; i++){
if(i < rowsPerColumn){
column1.push(vouchers[i]);
}else{
column2.push(vouchers[i]);
}
}
// 绑定到对应栏位
this.View.Model.SetValue("FColumn1", column1);
this.View.Model.SetValue("FColumn2", column2);
}
3.2 分页控制逻辑
当凭证行数超过单页容量时,需要自动分页处理。在模板的OnPrint事件中添加:
javascript复制function OnPrint(){
var currentPage = 1;
var rowsProcessed = 0;
while(rowsProcessed < totalRows){
// 计算当前页行数
var pageRows = Math.min(rowsPerPage, totalRows - rowsProcessed);
// 打印当前页
PrintPage(currentPage, pageRows);
rowsProcessed += pageRows;
currentPage++;
}
}
4. 常见问题解决方案
4.1 打印内容错位
这是实施初期最常见的问题,通常由以下原因导致:
- 打印机驱动不兼容:建议使用官方PS驱动而非PCL驱动
- 边距设置冲突:检查系统打印对话框与模板设置的边距是否一致
- DPI设置不当:确保打印质量设置为600dpi以上
实测案例:某客户使用HP M403dn打印机时出现第二栏内容偏移,更新至最新PS驱动后问题解决。
4.2 分页异常
当凭证行数较多时可能出现:
- 最后一页只打印单栏
- 分页后栏高不一致
解决方案:
- 在脚本中添加分页校验逻辑
javascript复制// 确保每页行数为偶数
var adjustedRows = Math.ceil(rowsPerPage/2)*2;
- 设置最小行高保证版面整齐
xml复制<RowStyle MinHeight="25"/>
4.3 打印速度优化
双栏打印会显著增加模板复杂度,可能影响打印速度。通过以下方式优化:
- 禁用不必要的控件事件
- 预加载静态资源
- 使用缓存机制存储分页结果
5. 进阶应用场景
5.1 智能凭证匹配
对于需要连续打印的凭证,可以实现智能配对:
- 自动将相同日期的凭证配对打印
- 借贷方金额相等的凭证组合打印
- 按凭证字号顺序自动编排
sql复制-- 获取待打印凭证列表时添加排序规则
SELECT * FROM t_GL_Voucher
WHERE FDate BETWEEN @StartDate AND @EndDate
ORDER BY FDate, FGroupID, FVoucherID
5.2 二维码关联打印
在每张凭证旁打印专属二维码,方便后续扫描查阅电子档案:
- 在模板中添加二维码控件
- 绑定凭证唯一标识字段
- 设置合适尺寸(建议2cm×2cm)
xml复制<BarcodeControl Type="QRCode">
<Value>=Fields!FVoucherID.Value</Value>
<Size Width="200" Height="200"/>
</BarcodeControl>
5.3 批量打印自动化
通过二次开发实现:
- 定时自动打印未打凭证
- 异常凭证自动跳过并记录
- 打印完成发送微信通知
csharp复制// 示例代码片段
public void AutoPrintVouchers()
{
var unprinted = GetUnprintedVouchers();
foreach(var voucher in unprinted){
try{
PrintVoucher(voucher);
MarkAsPrinted(voucher);
}catch(Exception ex){
LogError(voucher, ex);
continue;
}
}
SendWechatNotify();
}
6. 实施效果评估
在某大型零售企业实施双栏打印方案后:
- 纸张消耗降低42%(从月均12包降至7包)
- 凭证装订时间缩短35%
- 审计查阅效率提升50%
- 年节约直接成本约8000元
关键成功因素:
- 前期与财务人员充分沟通实际需求
- 进行多型号打印机兼容性测试
- 提供详细的操作培训文档
- 建立问题快速响应机制
特别提醒:实施后需持续收集用户反馈,我们曾遇到凭证字号较小导致老花眼财务人员阅读困难的情况,后来通过提供大字号可选模板解决了这个问题。
