中华人民共和国最高人民法院民 事 判 决 书（2021）最高法知民终504号上诉人（原审被告、原审反诉原告）：江苏引跑网络科技有限公司。住所地：江苏省南京江宁经济技术开发区将军大道37号。法定代表人：汪成海，该公司执行董事、总经理。委托诉讼代理人：何演锋，上海市锦天城（深圳）律师事务所律师。委托诉讼代理人：胡枫，上海市锦天城（深圳）律师事务所律师。被上诉人（原审原告、原审反诉被告）：泰星达（北京）科技有限公司。住所地：北京市西城区黄寺大街26号院1号楼701室（德胜园区）。法定代表人：张晓剑，该公司经理。委托诉讼代理人：王寿龙，男，该公司工作人员。委托诉讼代理人：杨永杰，北京市兆亿律师事务所律师。上诉人江苏引跑网络科技有限公司（以下简称引跑公司）因与被上诉人泰星达（北京）科技有限公司（以下简称泰星达公司）计算机软件著作权许可使用合同纠纷一案，不服江苏省南京市中级人民法院于2020年12月11日作出的（2020）苏01民初1189号民事判决，向本院提起上诉。本院于2021年3月10日立案后依法组成合议庭，并于2021年5月21日询问当事人。上诉人引跑公司的法定代表人汪成海及委托诉讼代理人何演锋，被上诉人泰星达公司的委托诉讼代理人王寿龙、杨永杰到庭参加询问。本案现已审理终结。引跑公司上诉请求：1.撤销原审判决，依法改判泰星达公司向引跑公司支付拖欠的合同款项本金465000元、合同违约金138105元（以418500元为计算基数，以2018年9月18日为起算日，以日利率万分之五为计算利率，暂计算至2020年7月9日，最终计算至实际清偿日），以及向引跑公司支付为本案支出的律师费20000元，并承担一审反诉的全部诉讼费用；2.判令上诉费由泰星达公司承担。事实和理由：（一）原审法院认为“数据迁移”测试需要使用的表结构应当高于引跑公司在《验收报告》所使用的4个字段的表结构，引跑公司设置的软件许可证及期限对泰星达公司后续验收测试工作产生了不利影响，进而认为无法证明涉案软件已经符合合同约定的验收标准，该认定缺乏合理的事实依据。1.引跑公司提供的涉案软件可以满足约定的验收性能要求，但泰星达公司新设一个双方未曾约定的测试环境支持条件，进而主张引跑公司的产品不符合要求，明显不合情理。引跑公司与泰星达公司签订的《软件许可服务及硬件销售合同（版本号V2.0）》（以下简称涉案合同）约定：泰星达公司与XXXXX研究所（以下简称XXX研究所）签订了XXXXX系统研制合同，泰星达公司在此项目中使用的分布式数据库服务器、分布式数据库软件由引跑公司制造，与此部分相关的研制、调试、安装、验收、服务及其它响应支持工作亦由引跑公司承担。涉案合同签订后，引跑公司依约向泰星达公司交付了相关硬件与软件，泰星达公司员工在确认单上予以签字确认。根据涉案合同关于硬件验收标准的约定，泰星达公司应在收货后立即进行验收，若产品存在质量问题，应在三个工作日内告知引跑公司，否则视为验收合格。引跑公司提供的硬件产品符合最终用户的硬件配置要求，且泰星达公司在收到硬件产品后至起诉之日也未曾对硬件产品提出过质量异议，故硬件应视为已验收合格。根据涉案合同关于软件验收标准的约定，泰星达公司在交付涉案软件产品后多次向引跑公司咨询软件的具体操作事宜，引跑公司也予以积极反馈和协助，解决了在此过程中泰星达公司遭遇的技术操作问题。至此，泰星达公司对于其它软件验收标准事项不再有异议，双方仅对“至少具有每秒10万条记录数据的数据导入能力”该验收事项存在争议。引跑公司提供的涉案软件的性能是否达到每秒导入10万条数据的标准，必须事先确认所导入的数据表结构规格的大小，但双方对此并未明确约定，且从最终用户发布的招标信息中也无从得知。泰星达公司在验收过程中提出引跑公司交付的软件因在“200个全float字段的表结构”的条件下不具备10万条/秒的数据导入能力，遂认为涉案软件不能满足验收要求，引跑公司构成根本违约。泰星达公司该项主张不能成立，理由为：首先，根据涉案合同关于软件验收标准的约定，引跑公司交付的软件应视为验收合格。根据涉案合同的约定，软件验收的范围和程序以引跑公司向泰星达公司提供的用户操作手册为准。如果软件在各重要方面的表现均符合用户操作手册的要求，则视为泰星达公司已接收软件并同意软件验收合格。本案中，泰星达公司并没有证据证明涉案软件不符合用户操作手册的要求，用户操作手册中也并没有关于“数据迁移能力”的要求，因此涉案软件根据涉案合同的相关约定应当视为已验收合格。其次，关于涉案软件是否能够实现每秒导入10万条记录数据。引跑公司在《XX-泰星达验收测试报告》中明确说明“数据迁移”的测试步骤和测试环境支持条件，即在备注中注明“表结构Customer(idint,namevarchar（20），salaryfloat,opdatedate)”。根据该测试步骤和测试环境支持条件，涉案软件在“4个字段的表结构”的测试环境条件下可以达到远超十万条每秒的数据导入能力，甚至在当前环境支持条件下，对于100多个全float字段的表结构也可以实现超过十万条每秒的数据导入能力。在双方未约定“数据迁移能力”的具体验收测试条件的情况下，应当通过体系解释、行业惯例等方式对涉案合同相关措辞进行解释。引跑公司提供的涉案软件符合泰星达公司其它所有验收事项，在相应的表结构环境支持条件下也能满足“数据迁移能力”的验收标准要求。双方初始约定仅是要求数据迁移应满足每秒10万条的导入标准，涉案软件在相应的环境支持条件下完全可以满足前述标准。此外，引跑公司所设定的表结构环境支持条件也在行业惯常使用的环境支持条件范围内。由此可见，涉案软件并不存在无法满足涉案合同验收要求的情况，泰星达公司应当对涉案软件进行验收确认。然而，泰星达公司为转嫁其与最终用户即XXX研究所之间关于环境支持条件等事项约定不明的风险，在收到涉案软件后自行以极不合理的“200个全float字段”规格的表结构作为验收测试的标准，主张引跑公司的产品不符合验收标准。从合理性而言，不同的硬件配置有相应的软件运行限制，数据迁移能力与机器硬件性能以及表结构有关，显然并非所有类型的表结构在任何环境下都能达到同样的数据迁移效果。涉案硬件系按照最终用户的要求进行配置且经泰星达公司验收合格，泰星达公司在此硬件基础上提出此前从未约定或告知的“按200个全float字段实现每秒十万条记录数据”的导入要求，明显不合理。引跑公司在此过程中向泰星达公司表明不同的配置会有不同的验收结果，并不代表交付给泰星达公司的软件无法达到验收标准的要求，且引跑公司仅是配合进行测试，在此过程中从未同意按“200个全float字段”的表结构作为最终的验收环境支持条件。泰星达公司使用“200个全float字段”的表结构进行验收测试，却没有说明该验收标准的合理性和必要性，也没有提供相应的证据证明系XXX研究所的实际需求。而且，泰星达公司测试所使用的“全float类型字段”的表结构在实际业务中也很少用到，其也未曾尝试使用其它字段的表结构进行测试并验证是否满足十万条每秒的数据导入能力，便直接以“200个全float字段的表结构下无法达到每秒10万条的数据导入能力”为由，主张涉案软件不符合验收要求，要求引跑公司承担违约责任，不符合公平原则。2.关于涉案软件许可证问题。首先，引跑公司已经清楚告知泰星达公司存在软件许可证的事实，泰星达公司也一直知道软件许可证的存在，却一直未在合理期限内完成验收测试和协商沟通工作。其次，在计算机软件著作权许可使用的商业交易中，设置软件许可证和期限是权利人为保护知识产权而经常采用的合理手段和交易惯例，泰星达公司作为同行业的商事主体理应对此有所了解。再者，泰星达公司可以随时在软件许可证到期后向引跑公司提出延期申请，但直到其提起本案诉讼也从未向引跑公司提出延期申请，反而引跑公司直至向原审法院提出反诉之日仍一直向泰星达公司追索合同尾款，显然软件许可证的问题并非如泰星达公司所主张的对其测试构成实质性障碍。（二）泰星达公司已经收到最终用户XXX研究所验收阶段相应的款项，该款项远高于涉案合同约定的应付款项。这一事实客观上也说明XXX研究所并非对涉案软件的验收不予认可，因此泰星达公司应当向引跑公司支付相应合同款项。泰星达公司辩称：原审判决认定事实清楚，适用法律正确，应当驳回引跑公司的全部上诉请求。（一）涉案合同系经过招投标签订的系列合同，并非引跑公司和泰星达公司单独订立的一次性贸易合同。涉案合同事关招标方即本案合同项下标的最终用户XXX研究所的利益。因此，评价引跑公司交付的软件是否符合标准，应当以招标文件确定的标准为依据。涉案合同虽然不属于主合同，但也是与XXX研究所发布的招标文件、XXX研究所与泰星达公司签订的主合同密切关联的合同，故对软件数据导入导出性能的要求应以招标文件为准。引跑公司也参与了泰星达公司此次投标文件的制作，其明确知晓招标文件对软件数据导入导出的性能要求，并授权以其软硬件产品进行投标。故引跑公司对其交付的软件应当符合招标文件中关于“数据迁移的性能标准即10万条/秒”是明知的。鉴于此，引跑公司理应知晓其要交付给泰星达公司的软件的最终目的，是用于XXX研究所的雷达信号接收设备接收、存储及分析卫星雷达信号返回的数据，故数据迁移速度是评价引跑公司软件是否合格最重要的指标。如果数据迁移速度不够快，则意味着泰星达公司与引跑公司所签订的涉案合同的最终目的无法实现。虽然涉案合同对于在什么样的环境下测试软件数据迁移达到10万条/秒未作明确约定，但根据招标文件、投标文件和涉案合同的订立目的，引跑公司明知其交付的软件既然是使用在接收XX信号的设备上，则区区4个字段的测试环境显然远不能满足XXX研究所设备接收、存储并分析海量信号的目的。引跑公司在与泰星达公司签订涉案合同之前，故意夸大其数据库软件的性能，隐瞒其数据库软件不达标的事实。引跑公司与泰星达公司在签订涉案合同之前从未合作，彼此并不认识。引跑公司在签约前期自行前往XXX研究所，向该所负责人宣传、推广其数据库产品，承诺其数据库性能强大，可以满足该所项目的需求。之后，XXX研究所在与泰星达公司沟通本案相关细节时明确指定购买引跑公司的数据库软件，泰星达公司遂与引跑公司签订涉案合同。事实证明，引跑公司在XXX研究所推介其产品性能时对其数据库性能进行了不实的夸大陈述，从而误导XXX研究所同意购买其产品。（二）引跑公司在软件未完成测试阶段即恶意关停，造成合同无法继续履行并一直拖延至今，应对此负主要责任。引跑公司在其交付的涉案软件未经验收合格的情况下，即向泰星达公司索要货款，且不积极调试其安装的软件，涉案合同明确约定软件正式验收合格后，泰星达公司方可支付下一期款项，但引跑公司却故意关停软件，致使无法继续验收。（三）涉案合同事实上已经无法继续履行。在引跑公司关停涉案软件期间，XXX部于2019年12月发布了《XXXXX产品名录》。该名录的发布导致涉案合同签订时的客观情势发生巨大改变，致使涉案合同无法继续履行。引跑公司单方关停软件导致涉案合同无法履行，且引跑公司的拖延履行是造成客观环境发生重大改变的的主要原因，应对此承担全部责任。泰星达公司向原审法院提起诉讼，原审法院于2020年4月28日立案受理，泰星达公司起诉请求：1.判令解除泰星达公司、引跑公司签订的涉案合同；2.判令引跑公司返还泰星达公司已支付的合同款项465000元，支付违约金279000元、律师费损失30000元；3.判令引跑公司承担本案全部诉讼费。引跑公司原审辩称：（一）关于泰星达公司主张引跑公司在交付硬件设备后，未按照涉案合同约定的测试程序进行软件功能、性能的测试和验收，该主张与事实不符。涉案合同硬件和软件已于2018年9月3日交付，在交付前后引跑公司一直积极向泰星达公司和最终用户XXX研究所提供技术支持，引跑公司提供的软件符合验收标准。（二）关于泰星达公司主张引跑公司恶意对软件进行了权限限制的问题。引跑公司向泰星达公司提供了时长为六个月的软件许可证，后因无法进入到最终用户XXX研究所服务器现场，无法更新许可证。而引跑公司无法进入XXX研究所系泰星达公司未进行协调所致，故泰星达公司所称的“恶意限制”并不存在，在泰星达公司没有支付全部款项前，引跑公司通过技术手段进行自我保护，符合软件行业的一般做法。（三）泰星达公司系恶意解除涉案合同。泰星达公司主张引跑公司拖延履行、限制软件权限，认为引跑公司的产品不符合验收标准，主要是泰星达公司对引跑公司提出了合同以外的更高要求。综上，引跑公司依照合同约定交付硬件设备和软件系统，没有构成违约。引跑公司向原审法院提出反诉请求：1.判令泰星达公司向引跑公司支付拖欠的合同款项本金465000元；2.判令泰星达公司向引跑公司支付合同违约金138105元（以418500元为计算基数，以2018年9月18日为起算日，以日利率万分之五为计算利率，暂计算至2020年7月9日，最终计算至实际清偿日）；3.判令泰星达公司向引跑公司支付引跑公司为本案支出的律师费20000元；4.判令泰星达公司承担反诉的全部诉讼费。泰星达公司原审辩称：（一）涉案合同的相关条款应理解为：如果泰星达公司在收到引跑公司的《软件项目验收报告》三个工作日内没有组织相关人员进行验收，视为验收合格，但是泰星达公司收到《软件项目验收报告》前已经开始组织验收测试。（二）涉案合同虽然约定软件验收标准以用户操作手册文件为准，但引跑分布式数据库只测试了一小部分，后因软件许可证到期，导致无法继续进行测试，因涉案软件没有完成验收测试，故不能视为已验收合格。（三）由于验收涉及到软硬件相配套，如果软件无法与硬件配合完成验收，则硬件不能视为验收合格。（四）引跑公司交付的数据库软件在高可用、高性能以及数据迁移方面，均不符合其在签约时向泰星达公司承诺的标准。（五）由于涉案软件没有验收合格，故泰星达公司不存在拖欠合同款的问题。原审法院认定事实：（一）涉案合同的签订情况及其主要内容2018年2月6日，XXX研究所就“XXXXX系统”项目发布招标文件。2018年2月13日，引跑公司出具制造商授权函，授权泰星达公司在上述项目投标中使用引跑分布式数据库软件V6.5。2018年3月1日，泰星达公司提交了上述项目的投标文件。2018年3月12日，泰星达公司中标，中标金额为2199500元。在上述招标文件和投标文件中，对分布式数据库软件的数据迁移的性能要求均为：提供支持数据迁移的高效导入、导出功能，至少具有每秒10万条记录数据的数据导入能力。2018年4月13日，泰星达公司（甲方）与引跑公司（乙方）签订涉案合同，约定甲方与XXX研究所（最终用户）签订了XXXXX系统研制合同，甲方在此项目中使用分布式数据库服务器、分布式数据库软件为乙方制造。与此部分相关的研制、调试、安装、验收、服务及其它响应支持工作由乙方承担。关于合同标的及合同金额。合同标的包括硬件和软件。其中，硬件为引跑分布式数据库服务器3台，单价36000元，合计108000元；软件为引跑分布式数据库软件V6.5，配置3个节点，单价274000元，合计822000元。合同总金额为930000元。关于实施方案。乙方收到甲方款项后的5个工作日内启动产品安装，安装完毕后的3个工作日内，甲方应签署乙方提交的《软件项目收货确认单》《软件项目安装调试完成确认单》。关于交付与验收。A.实施完成后，乙方应立即通知甲方组织验收。甲方收到乙方《软件项目验收报告》后3个工作日内完成验收并签署反馈《软件项目验收报告》。如甲方在该3个工作日内未进行验收，则视为甲方已同意软件验收合格。B.软件验收标准：软件验收的范围和程序以乙方向甲方提供的用户操作手册为准。如果软件在各重要方面的表现均符合文件的要求，则视为甲方已接收软件并同意软件根据本合同验收合格。C.硬件验收标准：甲方应在收到货后立即对产品进行验收，若产品存在质量问题，甲方应在3个工作日内以电子邮件及电话的方式告知乙方，否则视为验收合格。以收货清单日期为准。关于付款方式。按分期付款方式，共分四次付款：A.合同生效后甲方收到最终用户款7日内，支付20%即186000元。B.方案评审完成甲方收到最终用户款后7日内，支付30%即279000元。C.正式验收合格，产品交付完成后甲方收到最终用户款7日内，支付45%即418500元，乙方需要向甲方提供全额合同款的发票。D.验收合格交付最终用户使用半年内，最终用户确认乙方产品满足需求，甲方收到最终用户款后支付5%即46500元。E.若甲方逾期支付本合同项下任何款项，甲方应按逾期付款金额的万分之五（以每日计算）向另一方支付违约金。逾期付款超过30日的，乙方有权立即解除本合同，甲方应承担合同总价30%的违约金并赔偿由此造成的乙方损失。关于违约责任及合同解除。1.在法律允许的范围内，乙方在本合同项下或与之有关的全部责任，包括但不限于疏忽或重大违约，在任何情况下都不得超过下列款项之较大金额：A.甲方在本合同项下实际已向乙方支付款项的100%；B.甲方在本合同项下应当向乙方支付全部款项的30%。2.本合同生效后，非因不可抗力、双方协商一致或本合同约定之情形，任何一方不得单方面终止本合同；否则，违约方应支付本合同总金额的30%作为终止合同的违约金。3.双方协商解除：合同履行期内，一方提前解除本合同，应提前一个月书面告知对方，经协商一致后方可解除。终止合同给对方造成损失的，按照实际损失进行赔偿。4.约定解除：合同履行期间内，发生以下情形之一的，守约方可经书面通知立即无条件解除本合同。A.一方违反本合同约定，经另一方通知在合理期间内仍未整改的；B.一方提供虚假信息或经营情况严重恶化、破产或涉及重大诉讼、财产被查封等情形的；C.本合同约定的其他情形。5.任何一方违反本合同，给对方造成损失的，应当按照另一方所遭受的损失予以赔偿，该损失包括但不限于诉讼费、律师费、公证费以及为防止损失扩大的费用。（二）涉案合同的履行情况2018年4月28日，泰星达公司向引跑公司支付第一次、第二次合同款465000元。2018年7月26日，引跑公司对泰星达公司的员工进行了产品使用培训，培训内容包含产品用户手册、产品对接方式演示及应用对接方式演示。泰星达公司的员工在《软件项目培训确认单》上签名确认。2018年9月3日，引跑公司在XXX研究所处将3台数据库一体机及其引跑分布式数据库软件V6.5交付给泰星达公司。同日，泰星达公司员工在《软件项目收货确认单》《软件项目安装调试完成确认单》上签名确认。《软件项目收货确认单》记载的收货清单中包括3台数据库一体机及包含用户手册、开发手册、项目产品清单、产品合格证的光盘1张；《软件项目安装调试完成确认单》记载的安装调试内容包括服务器上架、修改IP地址、启动数据库并配置以及执行验收测试用例。其后，泰星达公司、引跑公司及XXX研究所的工作人员对涉案合同在履行过程中遇到的问题进行了沟通交流。2018年9月17日，引跑公司工作人员将名称为“XX所-泰星达验收测试报告.doc”的文件发送到微信群中。上述验收测试报告第2.11项关于“数据迁移”测试用例记载的主要内容如下：“测试目的：提供支持数据迁移的高效导入、导出功能，至少具有每秒10万条记录数据的数据导入能力。测试步骤：1.创建表customer，使用文本往customer表中导入10G的数据；2.根据导入完成时间和记录数，得到每秒导入条数；3.导出上述customer表导文本文件，并且记录时间。预期结果：导入速度大于10万条/秒。备注：表结构Customer（idint，namevarchar（20），salaryfloat，opdatedate）。”2018年9月18日，泰星达公司工作人员发微信给引跑公司工作人员称：“……一个200个字段的表结构，写入数据库，现在DB管理工具都打不开了。”2018年9月18日，引跑公司工作人员在微信群中称：“我不测了，现在导入200个float字段，目前测到的值是5万2到5万3”“峰值到5万6左右，但是现在压力5执行插入程序的41扛不住再高的压力了，因为上面还跑了一堆实例，所以内存不足了，所以如果额外找台性能还可以的机器来执行插入程序，应该还能更高点。”2018年9月21日，引跑公司工作人员在微信群中称：“你最后还有啥问题？发个清单出来”。随后，泰星达公司工作人员将名称为“问题清单.docx”的文件发送到微信群中。2018年10月18日，引跑公司工作人员发微信给泰星达公司工作人员称：“您在群里有什么问题，直接交流吧”。泰星达公司工作人员回复：“是呀，数据库功能测试的事儿，前段时间我们单位又重新测试了下。测试了一下有主要有三个问题，一个城市就自启动的问题，需要解决一下，还有一个是数据写入的速度还不太够。第三个是一个。文档部署文档没有我记得主要就是三个问题啊，详细的我觉得你可以让沟通一下吧”。引跑公司工作人员回复：“第一个问题，你可以找你们技术，我前面有针对性的明确的回复。第二个问题，你们可以同等条件下，做个与oracle对比测试。看我们快多少倍，如果我们比oracle还快，你还要怎么样呢？第三个，合同并没有承诺给这个，如果你们确实需要，我们可以提供。”2018年12月5日，引跑公司工作人员发微信给泰星达公司工作人员称：“王总，请本周把剩余款项尽快支付给我们……”。泰星达公司工作人员回复：“……我们的软件人员说有两个问题需要您处理，一直没有解决，请重视”。引跑公司工作人员回复：“请王总安排你们软件人员明天上午把问题汇总书面给我……”。泰星达公司工作人员回复称：“公司其他工作人员会联系她。”2020年4月1日，引跑公司工作人员发微信给泰星达公司工作人员称：“……咱们合同2年了，后面50%的款，咋整啊……”。泰星达公司工作人员回复：“设备他们一直没有用”“目前没有人过问此事”“有一段时间他们要求更换。后来没人提了。”原审查明的其他事实：（一）关于数据迁移速率。引跑公司述称，涉案软件并不是只有4个字段的表结构导入速度能达到10万每秒，其实在50个字段，甚至在理想状态下100个字段，涉案软件的数据导入能力都能达到每秒10万条。但泰星达公司突然提出的200个字段，是一个极其不合理的表结构。（二）关于软件许可证。泰星达公司述称，涉案软件因为软件许可证到期，在2018年10月底就无法使用了。引跑公司述称，其确实在涉案软件中设置了软件许可证，许可期限为六个月，至2019年3月才到期。（三）双方均确认涉案软件现处于XXX研究所处，因软件许可证已到期，处于无法运行状态。泰星达公司述称，XXX研究所已向其支付了与本案项目相关的合同款项的80%，因为一直没有验收完毕，剩余的尾款未支付。（四）泰星达公司为本案诉讼支付了律师费30000元，引跑公司为本案诉讼支付了律师费20000元。原审法院认为：涉案合同系双方当事人真实意思表示，内容不违反我国法律、行政法规的强制性规定，属合法有效的合同，双方均应按约全面履行合同。本案争议焦点为：（一）泰星达公司支付全部合同余款的条件是否已成就；（二）引跑公司的行为是否构成根本违约。（一）泰星达公司支付全部合同余款的条件尚未成就从涉案合同的相关约定以及实际签订和履行过程可以看出，涉案软件是泰星达公司为最终用户XXX研究所定制的，泰星达公司在投标XXX研究所的研究项目前就获得了在投标中使用引跑公司的分布式数据库软件的授权，泰星达公司在中标了该项目后即与引跑公司签订了涉案合同。故涉案软件实际上是引跑公司按照最终用户XXX研究所的要求研制开发。双方当事人争议的主要问题在于引跑公司交付的软件是否符合XXX研究所关于“数据迁移”的验收标准。XXX研究所发布的招标文件、泰星达公司提交的投标文件以及引跑公司提交的验收测试报告中关于该性能的表述均为“提供支持数据迁移的高效导入、导出功能，至少具有每秒10万条记录数据的数据导入能力”。泰星达公司主张，涉案软件按照XXX研究所的要求，使用200个字段的表结构进行数据迁移速率的测试，测到的数据为每秒5万多条，远远小于每秒10万条的约定。引跑公司主张，涉案软件依照其提交的验收测试报告中的4个字段的表结构进行测试，导入速度大于每秒10万条。对此，原审法院认为，涉案合同及招投标文件中对“数据迁移”需使用多少个字段的表结构进行测试并没有明确的约定，双方当事人也都没有提供足够证据来证明各自的主张。涉案软件主要用于XXX研究所的信号处理系统，且引跑公司在泰星达公司提出要使用200个字段的表结构进行测试时，也没有明确表示必须采用4个字段的表结构进行测试。故从双方签订涉案合同的目的和合同履行过程来看，根据现有证据可以推定，虽然双方对“数据迁移”需使用多少个字段的表结构进行测试没有明确的约定，但应该要远远高于引跑公司在验收测试报告中使用的4个字段的表结构。另外，引跑公司在涉案软件中设置了软件许可证及许可期限，但没有提交证据证明其在软件交付及测试时已将这一信息明确告知泰星达公司及XXX研究所，导致涉案软件在泰星达公司及XXX研究所不知情的情况下出现许可期限到期后无法运行的情况，对后续的验收测试工作产生不利影响。因此，引跑公司提交的证据尚不足以证明涉案软件已经符合合同约定的验收标准并验收合格，原审法院对其要求泰星达公司支付合同余款并支付相应违约金及律师费的诉讼请求不予支持。（二）引跑公司的行为不构成根本违约泰星达公司认为，引跑公司提供的涉案软件在性能方面不符合合同约定，且还恶意对软件进行了权限限制，致使合同目的无法实现，构成根本违约。原审法院认为，首先，根据现有证据可以认定引跑公司交付的软件基本模块和功能均已具备，泰星达公司认为涉案软件存在的主要缺陷是“数据迁移”的问题。如前所述，涉案合同及招投标文件中对“数据迁移”的验收标准没有明确的约定，泰星达公司也没有提交充分证据来证明涉案软件必须使用200个字段的表结构进行数据迁移速率的测试，故涉案软件不符合泰星达公司所称验收标准的责任，不应由引跑公司一方承担。其次，虽然引跑公司在验收测试报告中使用4个字段的表结构对涉案软件的“数据迁移”性能进行验收测试确有不当，但根据本案查明的事实，涉案软件使用200个字段的表结构进行数据迁移速率的测试时，也具有每秒5万余条记录数据的数据导入能力。再次，引跑公司没有在软件交付及测试时将其在涉案软件中设置了软件许可证及许可期限的信息明确告知泰星达公司及XXX研究所的行为虽有不当，但其在涉案软件未完成最终验收前在软件中设置软件许可证的行为具有一定的合理性，泰星达公司据此认为其恶意对软件进行了权限限制的主张没有事实依据。最后，根据泰星达公司的陈述，XXX研究所已向其支付与本案项目相关的80%合同款项，且泰星达公司也没有提供任何证据证明XXX研究所认为引跑公司提供的涉案软件致使其合同目的无法实现。因此，现有证据不足以证明引跑公司存在致使合同目的无法实现的违约行为，泰星达公司以此为由要求解除涉案合同，并要求泰星达公司返还合同款、支付违约金及律师费的诉讼请求，缺乏事实与法律依据，原审法院亦不予支持。综上，软件的研制开发是一个需要双方相互配合、不断完善的过程，合同双方均应以最大诚意履行合同。本案中，因软件的验收测试需要双方的配合与合作，双方均未提供充分证据证明各自主张的对方违约事实，故双方指控对方的诉讼请求原审法院均难以支持，应视为双方对合同未能继续履行均负有责任。涉案软件尚在XXX研究所处，且验收测试工作尚未完成，双方应继续履行合同并加强和XXX研究所的沟通，以完成履行合同之约定，实现合同之目的。原审法院判决：一、驳回泰星达公司的诉讼请求；二、驳回引跑公司的反诉请求。本诉案件受理费11540元，由泰星达公司负担；反诉案件受理费5016元，由引跑公司负担。本案二审期间，引跑公司、泰星达公司均未提交新证据。本院经审理查明，原审法院查明的事实基本属实，本院予以确认。本院另查明：XXX研究所于2018年2月发布的“XXXXX系统”项目国内公开招标文件。泰星达公司在针对该招标项目提交投标文件。本院认为：本案为计算机软件著作权许可使用合同纠纷，《中华人民共和国民法典》（以下简称民法典）于2021年1月1日起施行，根据《最高人民法院关于适用时间效力的若干规定》第一条第二款之规定，民法典施行前的法律事实引起的民事纠纷案件，适用当时的法律、司法解释的规定，但是法律、司法解释另有规定的除外。本案纠纷所涉事实发生于民法典施行之前，故应当适用民法典施行前仍为有效法律的合同法及相关司法解释的规定。结合当事人的上诉请求、答辩意见及查明的事实，本案二审争议焦点问题为：引跑公司向泰星达公司交付的软件是否符合涉案合同约定的性能要求。鉴于该争议焦点问题主要聚焦于引跑公司交付的软件是否满足“导入速度至少达每秒10万条”的数据迁移性能，故可以进一步分解为如下两个具体问题：泰星达公司关于引跑公司交付的软件无法满足“按200个字段的表结构读取要求下数据导入速度至少达到每秒10万条”的性能要求，故不能满足最终用户需求的抗辩主张能否成立；引跑公司关于其向泰星达公司交付的软件已满足涉案合同约定的验收性能要求的上诉主张能否成立。以下围绕二审争议焦点展开评述：（一）泰星达公司关于引跑公司交付的软件因无法满足“按200个字段的表结构读取要求下数据导入速度至少达到每秒10万条”的性能要求，故不能满足最终用户需求的主张能否成立第一，合同法第六条规定：“当事人行使权利、履行义务应当遵循诚实信用原则。”合同法第一百二十五条第一款规定：“当事人对合同条款的理解有争议的，应当按照合同所使用的词句、合同的有关条款、合同的目的、交易习惯以及诚实信用原则，确定该条款的真实意思。”根据涉案合同的约定，引跑公司应向泰星达公司交付的标的物是分布式数据库服务器（E5-2620v4*2/32GDDR4RECC2400MHz*2/1.2T10KSAS*8）与分布式数据库软件（V6.5），前述硬件与软件是相互配套使用的产品，产品最终用户是XXX研究所。泰星达公司与引跑公司签订涉案合同的目的，是为了履行泰星达公司与XXX研究所签订XXXXX系统研制合同。而根据二审查明的有关XXX研究所发布“XXXXX系统项目”的国内公开招标文件以及泰星达公司针对该招标项目提交的投标文件记载的内容，并未对所导入数据的具体字段及类型加以明确界定。虽然招投标文件均没有对数据的具体字段及类型加以界定，但并不代表合同当事人对于导入数据的字段数可以根据自己的主观意愿进行任意解释。涉案软件的最终用户并非泰星达公司而是XXX研究所，泰星达公司既主张引跑公司交付的软件不符合最终用户的需求，则应当证明何以按照200个特定字段的表结构对涉案软件的数据迁移能力进行测试如此重要，以至于如果不能实现“按200个特定字段的表结构读取要求下数据导入速度达到至少每秒10万条”的性能要求，就不符合招投标文件对于数据迁移的要求，进而无法满足最终用户XXX研究所的需求，但泰星达公司在本案一、二审中均未对该待证事实充分举证证明。第二，引跑公司系在XXX研究所处完成涉案合同约定的硬件和配套软件的交付，而泰星达公司提交的现有证据不能证明如下待证事实，即在泰星达公司对涉案软件进行测试的过程中，最终用户XXX研究所以书面或口头的方式向泰星达公司或引跑公司明确提出如果按照200个特定字段的表结构对数据进行读取不能达到至少每秒10万条的导入速度，则交付给XXX研究所的软件没有使用的价值。XXX研究所工作人员在涉案合同的履行过程中曾于2018年9月10日向引跑公司工作人员发送微信。但该微信内容均不足以证明上述待证事实，原因在于泰星达公司的软件测试结果是由于其采用了招投标文件中均没有明确限定的“按200个字段的表结构导入”的测试条件来进行测试，而引跑公司是否曾以明示或默示的方式向泰星达公司承诺其交付的软件无论按照何种数值的字段导入数据库都可以满足至少每秒10万条的迁移速度，恰恰是本案的争议问题。泰星达公司认为引跑公司在与其签订涉案合同之前故意对XXX研究所夸大其数据库软件的性能，隐瞒其数据库软件不达标的事实，但泰星达公司对该待证事实亦未充分举证证明。第三，无论是泰星达公司提交给XXX研究所的投标文件，还是泰星达公司与引跑公司签订的涉案合同，均明确写明标的物是组合配套使用的分布式数据库服务器与分布式数据库软件，且对于分布式数据库的硬件配置规格参数有作详细说明，故涉案软件关于读取和导入数据的性能，客观上受到分布式数据库硬件配置条件的制约。基于常理可知，同一款软件在不同规格配置的硬件环境中的运行表现不可能完全相同，同一款软件按照不同测试条件在同一配置规格硬件中的运行表现亦难以做到完全一致，故脱离一款软件所依赖的硬件运行环境去泛泛评价该软件是否达到性能需求难谓合理。综合上述分析，泰星达公司关于引跑公司交付的软件不能满足“按200个字段表结构读取要求下数据导入速度达到每秒10万条”的性能要求，故无法满足最终用户XXX研究所需求的抗辩主张不能成立。原审法院关于“泰星达公司没有提交充分证据证明涉案软件必须使用200个字段的表结构进行数据迁移速率测试”的认定，并无不当。（二）引跑公司关于其向泰星达公司交付的软件已满足涉案合同约定的验收性能要求的主张能否成立第一，由引跑公司制作并提供给泰星达公司的“XX所-泰星达验收测试”（即分布式数据库验收测试用例）中关于“2.11数据迁移”的内容，强调的是按照“Customer（idint，namevarchar（20），salaryfloat，opdatedate）”的备注表结构进行测试的预期结果是“导入速度大于10万条/秒”。由此说明：其一，引跑公司强调的是要按照其自行设定的表结构来进入数据迁移速度的测试，但在其协助泰星达公司撰写的投标文件中关于“数据迁移”部分的技术内容并没有限定导入数据库的表结构类型和字段数。其二，引跑公司在该份验收测试用例中对数据导入速度描述所使用的措辞是“预期结果”。既谓“预期”即具有一定的主观判断色彩，亦即有可能达到测试者期待的结果，也有可能与测试者的期待结果有落差。可见，即使按照引跑公司所限定的表结构来进行测试，其也仅是给出大致的预期结果，而非确定无疑的测试结论。第二，引跑公司原审庭审述称涉案软件并非只有4个字段的表结构导入速度达到每秒10万条，按50个字段甚至在理想状态下按100个字段进行测试也能达到每秒10万条的导入速度。但是，正如本院就泰星达公司对涉案软件之质疑所作的评述，于泰星达公司而言，其应当证明何以按照200个特定字段的表结构对涉案软件的数据迁移能力进行测试如此重要，以至于如果不能实现“按200个特定字段的表结构读取要求下数据导入速度达到至少每秒10万条”的性能要求，就不符合涉案招投标文件对于数据迁移的要求，进而无法满足最终用户XXX研究所的需求。同理，于引跑公司而言，其亦应当举证证明：何以仅使用4个字段的表结构来对涉案软件进行读取和迁移数据的测试且达到每秒10万条的导入速度，即可视为符合涉案招投标文件对于数据迁移的要求，进而满足最终用户XXX研究所的实际需求。事实上，无论是泰星达公司提交的证据抑或是引跑公司提交的证据，均无法证明XXX研究所在招标文件或涉案软件测试过程中曾经对导入数据库的字段数或表结构提出明确要求。尽管如此，考虑到XXX研究所的招标项目是对海量信号数据的读取和迁移，故原审法院关于双方对“数据迁移”需使用多少个字段的表结构进行测试虽未作明确约定，但应当远高于引跑公司在验收测试报告中使用的4个字段的表结构的推定，不违反日常经验法则与事理逻辑。引跑公司在上诉理由中对原审法院的前述推定未提出异议，还进一步主张涉案软件按50个字段甚至在理想状态下按100个字段进行数据导入能力的测试也均能达到每秒10万条。但是，引跑公司对于前述两个远远大于4个字段的数据字段所给出的测试结论仅是其单方陈述，缺乏相应的测试数据予以佐证。引跑公司上诉还认为，“引跑公司设定的表结构环境支持条件也在行业惯常使用的环境支持条件范围之内”“泰星达公司测试所使用的‘全float类型字段’的表结构在实际业务中很少用到”，但是，引跑公司既未举证证明其所设定的表结构环境支持条件属于行业惯常使用的环境支持条件，也未举证证明采用“全float类型字段”的表结构进行测试在本行业实际业务中属于罕见情形，故本院对引跑公司所主张的该两条上诉理由均不予支持。第三，引跑公司一方面强调按照涉案合同的约定，涉案软件验收的范围和程序应以其向泰星达公司提供的用户操作手册为准，另一方面其在上诉理由中自认用户操作手册中没有“数据迁移能力”的要求，而是否满足“至少每秒10万条的数据迁移速度”正是本案双方关于软件是否符合验收性能的争议所在，亦是XXX研究所招标文件中的关键性能指标，故引跑公司以一份自行制作且缺少“数据迁移能力”内容的用户操作手册来证明所交付的软件满足验收要求，难以自圆其说。最后，合同具有相对性。XXX研究所基于其与泰星达公司签订的招投标合同向泰星达公司支付相应款项，与泰星达公司基于涉案合同应否向泰星达公司支付同等比例的款项，二者不具有必然的对应关系。根据涉案合同的约定，泰星达公司向引跑公司支付第三期和第四期款项的条件是：产品正式验收合格，产品交付完成后，泰兴达公司收到最终用户款7日内向引跑公司支付第三期款项，即合同总价款的45%；验收合格交付最终用户使用半年内，最终用户确认引跑公司产品满足需求，泰星达公司收到最终用户款后，向引跑公司支付第四期款项，即合同总价款的5%。根据原审法院查明的事实，引跑公司向泰星达公司交付的软件并未得到后者正式验收合格的确认，更没有得到最终用户XXX研究所的确认，而引跑公司提交的证据和所作的意见陈述均不足以证明其交付的软件已充分满足最终用户XXX研究所对招标项目中软件产品的数据迁移性能要求，故泰星达公司向引跑公司支付涉案合同第三期及第四期款项的条件尚未成就。综合上述分析，引跑公司关于其向泰星达公司交付的软件满足涉案合同约定验收性能要求的主张不能成立。原审法院关于泰星达公司支付合同余款的条件尚未成就的认定，亦无不当。综上所述，引跑公司的上诉请求不能成立，应予驳回；原审判决认定事实清楚，适用法律正确，应予维持。依照《中华人民共和国民事诉讼法》第一百七十条第一款第一项之规定，判决如下：驳回上诉，维持原判。二审案件受理费10032元，由江苏引跑网络科技有限公司负担。本判决为终审判决。审 判 长  何 鹏审 判 员  欧宏伟审 判 员  梁晓征二〇二一年九月二日法官助理  姜琳浩书 记 员  管 众裁判要点案号（2021）最高法知民终504号案由计算机软件著作权许可使用合同纠纷合议庭审判长：何鹏审判员：欧宏伟、梁晓征法官助理：姜琳浩书记员：管众裁判日期2021年9月2日关键词计算机软件著作权许可使用合同；约定不明；验收；违约当事人上诉人（原审被告、原审反诉原告）：江苏引跑网络科技有限公司；被上诉人（原审原告、原审反诉被告）：泰星达（北京）科技有限公司。裁判结果驳回上诉，维持原判。原判主文：一、驳回原告泰星达（北京）科技有限公司的诉讼请求；二、驳回反诉原告江苏引跑网络科技有限公司的诉讼请求。涉案法条《中华人民共和国合同法》第六条、第八条、第六十条、第一百二十条、第一百二十五条第一款；《最高人民法院关于适用时间效力的若干规定》第一条第二款。法律问题在合同及相关附件对于交付标的特定性能参数未作明确约定的情况下，如何判断交付标的是否达到通过验收的性能要求。裁判观点在合同及相关附件对于交付标的物的特定性能参数未作明确约定的情况下，判断交付标的物是否达到通过验收的性能要求，应当结合合同订立的目的、当事人在履行过程中的沟通情况以及日常经验法则加以综合判断。注：本摘要并非判决书之组成部分，不具有法律效力。