与1C快速集成:企业

我认为,在本文中,我将讨论将第三方应用程序与1C配置集成在一起的最简单方法。 本文将主要吸引使用.Net CorePHPPython编写的开发人员。

与1C集成的方法有很多, 1C本身的出色文章甚至致力于此。 从中您将特别了解到1C支持Web服务的机制,这意味着我们可以在1C端实现我们自己的服务,因此,可以在客户端应用程序端实现我们自己的ORM库。 这些库之一将在后面讨论。

对该技术的一般描述


在1C方面


这一切都始于将“ Brom”扩展名添加到1C配置中,从而添加了新的Web服务。 该扩展程序是免费提供和许可的(MIT)。 该扩展本身不依赖于特定的数据模型,因此可以安装在支持兼容模式8.3.10或更高版本的任何配置上。

安装扩展程序后,您必须配置有权访问Web服务方法的用户的权限,并在Web服务器上发布配置,以便可以通过http(s)协议访问添加的服务。 在1C方面,不需要任何其他操作。

在客户端


在客户端,连接了Brom软件包,例如,对于.Net Core,可以使用以下命令完成:

Install-Package Brom -Version 1.0.1-beta08 

或对于Python:

 pip install brome 

安装软件包后,创建一个客户端对象就足够了,通过该对象将与远程1C配置进行交互。 在下文中,我将用C#给出代码,但是在PHP和Python中,它是相似的。 因此,您可以使用一个命令创建客户端:

 dynamic  = new (@"  = http://mydomain.com/publication_name;  = 1c_user_name;  = 1c_user_pass "); 

在构造函数中,足以表明已发布的1C配置的地址,以及我们向其授予扩展名访问权限的用户的数据。 一旦创建了客户端,我们就可以进行最有趣的操作。

调用程序和功能1C


通过创建的溴客户端,我们可以调用1C中定义的过程和函数。 在这种情况下,被调用的方法必须在服务器端,并且包含在全局上下文中或服务器模块(通用模块或管理器模块)中。 例如,这是全局上下文“ Number Prescription”的函数调用的样子:

 string  = .(2547, " = fr_FR"); 

第二个参数是指示本地化(法语)的格式字符串。 参数以自然形式传输,不需要任何其他转换或包装。

这就是对目录管理器模块的按代码查找功能的调用的样子:

 var  = ...(840); 

在这里,我们通过模块管理器目录“货币”调用该函数。 调用的结果将是“ DirectoryReference”类型的对象。 现在,可以将该对象的链接作为参数传递给另一个函数:

 var  = ..(, DateTime.Today); 

这次,我们转向通用模块“使用币种”,并恢复其方法“获取课程币种”。

该库支持处理复杂的数据类型,因此可以调用接受输入或返回的方法:链接,数组,结构,值表,值树,系统枚举等。...某些类在客户端库中专门实现,以简化使用1C的工作。

通过在设置中指定远程方法的范围,可以灵活地配置它们。 因此,例如,如果您指定“目录。*。按代码查找”区域,则在所有配置目录中仅“按代码查找”方法将可用。 因此,您可以清楚地指示集成应用程序可以使用哪些方法。

使用链接


对对象的引用不仅允许将指针传输到1C对象,而且还可以接收对象本身的数据。 在客户端使用链接就像在1C中一样简单。 例如:

 var  = ...("00-000018", new Date(2017, 1, 1)); var  = .; var  = .; var  = ..; foreach (var  in .) { Console.WriteLine((., .)); } 

在这里,我们通过管理器模块找到了指向文档的链接,并获得了文档字段及其表格部分“产品”的值。 首次访问对象字段之后,所有数据都从1C服务器下载并存储在客户端上,直到垃圾回收器删除链接为止。

也可以在客户端访问对象的链接,而无需访问服务器。 为此,只需知道对象的唯一标识符即可:

 var  = ...(new Guid("5a32b6ab-4661-11e9-912a-38d547755ef7")); 

您还可以仅获取指向预定义集合项的链接:

 var  = ...18_118; 


编辑物件


通过链接到对象,我们可以编辑对象的数据。 为此,只需创建一个对象上下文:

 var  = .(); . = DateTime.Today; . = "00-000055"; ..(); var  = ..() . = ...("000000104"); . = 3; .(.); 

在此示例中,我们通过指向文档的链接创建了文档的上下文,并填充了一些字段,在表格部分“产品”中添加了一行,并以发布模式记录了文档。

如果您需要创建一个新对象,那么这也是可能的:

 //     var  = ...(); . = " "; .(); //     var  = ...(); . = .; . = " "; . = "T-00012321"; //    .(); //      var  = .; 

在这里,我们在“ Nomenclature”目录中创建了一个新组,然后创建了目录元素并将其放置在创建的组中。

取样方式


像任何体面的ORM一样,溴客户端允许您从各种1C对象集合中创建样本。 选择是对满足一组选择条件的集合对象的引用的集合。 要创建选择,只需创建“ Selector”对象:

 var  = ...(""); var  = ...(); . (", , , ."). ("", false). ("", , .). (""). ("", .); foreach (var  in ) { Console.WriteLine(": {0}; : {1}, : {2}; : {3}", ., ., ., .. ); } //         var  = .(); 

在此示例中,我们获得了一个示例,其中包含“命名”目录中的元素,这些元素按层次结构位于“家具”组中。 我们指出,除了链接本身之外,还需要加载某些字段的数据。 因此,这些字段的数据将通过单个请求加载,对它们的访问不会导致其他服务器调用。

查询执行


通常,存储在一个集合中的数据变得不足,因此我们需要获取由复杂查询生成的数据。 为了满足请求,客户端库中提供了一个特殊的类“ Request”。 在客户端处理请求与在1C进行处理非常相似:

 var  = .(@"  .  , .  , .    .    . = & "); .("", "-0001"); var  = .(); foreach (var  in ) { Console.WriteLine((., .)); } 

在这里,我们创建了一个带有参数的简单查询,该参数从“命名法”目录中选择数据。 作为参数,我们传递了元素的字符串文章。 在一般情况下,参数值还可以是链接,系统枚举甚至数组。 作为查询的结果,我们返回了“ Values Table”,该类在客户端实现。 在此示例中,我们使用循环来推断表行的字段。

在1C端,所有请求都通过查询构建器执行,因此您不仅可以将现成的请求指定为文本,还可以指定包含构建器标记的请求模板:

 var = .(@"   5 .  , .  , .   { .*}  ..( {(&)}, { ().*, ().*} )   { .} {  .*, .*} "); //         .("..", ""); //      .("", 100, .); //       .("."); .("", .); var  = .(.); 

在此示例中,我们指定了一个标准化请求,可以根据需要在客户端动态更改其设置。 因此,可以在主程序代码的主体中而不是在请求主体中指示字段,选择和排序。

Run方法接受可选参数“结果的爬网类型”。 如果将爬网类型指定为“按分组”或“按层次结构分组”,则该方法将返回值树,而不是值表。

另外,可以代替运行方法,而可以调用运行包方法(一次执行多个请求)。 在这种情况下,将根据遍历的类型返回一个表数组或一个树数组。

代码段执行


在某些特殊情况下,您可能需要直接在1C端执行特定的代码段。 为此,Brom客户端提供了“运行”方法。 该方法采用包含可执行代码和一个可选参数的输入文本,这些参数将在“ Parameter”变量的代码中提供:

 var  = .(@"  = 0;        =  + ; ; ", new double[] { 45, 67, 12.56, 11.9 }); 

在此示例中,我们执行了一段代码,将数组中的数字求和。 数组本身作为参数传递,并放置在“ Parameter”变量中。 计算结果放置在变量“结果”中。 如果在可执行代码中填充了具有此名称的变量,则执行结束时将返回其值作为“运行”功能的结果。

执行代码片段的能力由扩展中的单独访问角色控制。 建议仅出于测试目的启用此角色,并确保在工作草案中将其禁用,因为 这是一个明显的漏洞。

优点该技术的缺点


所描述的方法的优点当然应该包括:

  • 跨平台 。 所有交互都基于SOAP和HTTP协议,并且它们的实现是在所有流行的开发平台上进行的;
  • 代码的简单性 。 客户端应用程序一侧的代码几乎与1C一侧的代码相同;
  • 内置的序列化机制 。 我们不需要打包和解包数据即可与1C交换数据;
  • 支持使用链接 。 我们可以通过链接轻松访问1C对象。
  • 支持1C特定的数据类型 。 我们可以交换1C表,树,结构和其他复杂结构;
  • 访问应用程序上下文 。 我们不仅可以访问数据库数据,还可以调用在1C端定义的方法,还可以访问会话状态。

这种技术的缺点也可以解决:

  • 低数据率 。 由于SOAP协议基于XML序列化,因此大量数据的传输需要时间来交换多余的流量以及打包和拆包数据。 在这种情况下,通过COM连接进行通信似乎是可取的。
  • 并非所有平台都提供方便的客户端 。 如果您不是.Net Core,PHP或Python程序员,那么您将不得不使用SOAP机制自己实现溴客户端,这通常很耗时;
  • 查询语言1C的局限性 。 由于与数据库的所有工作都是通过1C查询机制进行的,因此存在一些限制。 例如,您无法实现经典的数据分页,因为 在查询语言1C中,没有分页机制。

与OData的比较


从上述1C 文章中,您可以发现在1C中:使用标准化的OData协议实现对数据的企业访问。 因此,不提他也是愚蠢的。
这是一个简短的比较表:
数据
通过复杂的选择和排序条件获取收集数据++
集合数据的页面输出+
添加和编辑数据++
支持使用1C类型:企业(链接,表,树等)+
执行任意查询+
调用服务器的过程和功能+
任意服务器代码执行+
现成的可视化工具/用户界面+
JSON数据传输+

可以看出,这些方法有其优点和缺点,并且在一般情况下是不可互换的。

结论


我希望这篇评论文章能在将来帮助您快速轻松地创建与基于1C:Enterprise的会计系统紧密集成的门户,个人帐户和服务。 您可以在官方文档中找到有关溴成分的详细信息,这里只是主要功能的简要概述。

Source: https://habr.com/ru/post/zh-CN462453/


All Articles