
## 一、现象
二开新增的单据转换,例如采购申请单—>采购合同,当配置好单据转换规则以及反写规则后,采购申请单整单关闭后部分下推采购合同(这里下推时没有去校验关闭状态,因此可以下推),然后下游的采购合同保存—提交—审核—反审核,此时发现上游源单明明之前已经手工整单关闭了,但此时的关闭状态却被改为了“未关闭”
## 二、原因

这里的采购合同到采购申请单的反写规则中设置了关闭控制,且关闭控制的整单关闭策略是“全部分录均关闭后,关闭整单”,那就意味着,当还有部分分录未关闭时,整单关闭状态应当是处于未关闭状态的。因此这里的反写规则的关闭控制逻辑会控制上游单据的整单关闭状态。
相信大家会问,手工关闭的还会受这个逻辑影响,应该是不正常的吧。的确是,我们系统正常的单据转换是不会有这个问题的,之前就已经指明过,是二开新增的单据转换且设置了反写规则的这个地方,才会发生上述情况。那这个问题如何解决呢?
## 三、办法
解决这个问题的核心就是在反写规则控制整单关闭状态时,需要识别上游单据是手工关闭的还是非手工关闭的,如果是手工关闭的那么无论如何都不让他进行更改。因此我们需要在上游单据上新增一个字段来标记该单是手工关闭还是非手工关闭。采购申请单系统在其他页签上已经预设了一个复选框为“手工关闭”,其他单据没有的需要自己增加。然后再书写反写插件进行注册即可。代码示例如下,反写插件注册在“单据关联配置”属性中,如截图

## 四、案例
反写插件
```python
import clr
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.Core')
clr.AddReference('Kingdee.BOS.App')
from Kingdee.BOS import *
from Kingdee.BOS.Core.DynamicForm.PlugIn import *
from Kingdee.BOS.Core.BusinessFlow.PlugIn import *
from Kingdee.BOS.Core.Base import *
dicPrManualCloseInfo = {}#全局变量,记录上游手工关闭的单据的关闭信息
#申明上游单据必须加载的字段
def AfterCustomReadFields(e):
e.AddFieldKey("FMANUALCLOSE")#采购申请单上【手工关闭】复选框字段
#关闭上游行前调用
def BeforeCloseRow(e):
global dicPrManualCloseInfo#加载全局变量
srcFormId = e.SourceBusinessInfo.GetForm().Id#获取上游单据标识
if srcFormId == "PUR_Requisition" and e.SourceDataObject["ManualClose"]:#判断上游是否是采购申请单并且手工关闭处于勾选状态
sBillID = e.SourceDataObject["Id"]#上游单据ID
sCloseStatus = e.SourceDataObject["CLOSESTATUS"]#上游关闭状态