为1C创建报告系统:基于OLAP和Excel的ERP

程序员和用户都知道在1C中创建了多长时间和困难的报告。 但是,我们可以考虑提供非标准解决方案-这是将数据加载到OLAP中。 OLAP-具有构建表和图形功能的企业的在线分析报告。 对于那些尝试过此操作的人来说,事实证明,对于使用1C:ERP的企业中的普通用户来说,它是用Microsoft Excel构建分析报告的一种极为方便的工具。



在我们的示例中,我们将使用Visual Studio C#,2个Microsoft SQL Server数据库-一个是1C:ERP,另一个是OLAP分析报告,以及Microsoft Excel中的数据透视表。


要获取有关表和1C:ERP数据库的结构的信息,我们将使用Internet上已经存在的现成处理(GetDatabaseStructure.epf或base_structure.epf)。




使用这样的工具,我们将看到1C对象的字段列表(目录,文档,文档行,枚举等)及其用途,这对将来对将数据加载到OLAP中进行编程很有用。 根据获得的数据,我们将在单独的数据库中准备表,以使用Microsoft SQL进行分析报告。


在Visual Studio中,将1C表结构添加到Linq to SQL




我们还将在Linq中将分析数据库的表结构添加到SQL中,并在它们之间创建关系。




在Visual Studio中创建一个类,以将数据从1C结构重新加载到OLAP结构


public class DocProductionImporter { DataClasses1DataContext dataContext; s1_DataClasses1DataContext dataContextS1; public DocProductionImporter() { dataContext = new DataClasses1DataContext(); dataContextS1 = new s1_DataClasses1DataContext(); } .... } 

我们将OLAP数据库中已经可用的1C文档标识符列表加载到内存中。 IDCRef和Version主要支持1C中文档的唯一性。 必要时,元组将帮助我们创建一个复合索引。


填写OLAP数据库的SQL表中的索引


  HashSet<Tuple<System.Data.Linq.Binary, // IDRRef, Version System.Data.Linq.Binary>> fndDocVer = new HashSet<Tuple<System.Data.Linq.Binary, System.Data.Linq.Binary>>(); foreach (DocProduction doc in docs) { fndDocVer.Add(Tuple.Create(doc.IDRRef, doc.Version)); } 

我们从1C:ERP中选择文件,并在OLAP数据库中检查其可用性。 _Version字段包含用于协调1C中文档修改的值


  var prodDocs = from c in dataContextS1._Document581s where c._Posted == posted select c; int i = 0; foreach (_Document581 doc in prodDocs) { if (fndDocVer.Contains(Tuple.Create(doc._IDRRef, doc._Version)) == true) { i++; continue; } .... 

创建新文件或更新现有文档


  // NEW DocProduction dp = new DocProduction(); dp.NumberPrefix = doc._NumberPrefix; dp.DocNumber = doc._Number; 

在文档循环内,我们从预填字典中选择目录和其他对象的链接。


填写字典以在内存中进行后续搜索(与从SQL数据库表中搜索相比,大大加快了处理过程)


  Dictionary<System.Data.Linq.Binary, Int64> fndDepartments = new Dictionary<System.Data.Linq.Binary, Int64>(); var fDepartments = from g in dataContext.DimDepartments select g; foreach (DimDepartments fd in fDepartments) { fndDepartments.Add(fd.IDRRef, fd.ID); //   1    OLAP } 

我们在下载文件的过程中选择目录元素


  if (fndDepartments.ContainsKey(doc._Fld15867RRef)) { Int64 val; fndDepartments.TryGetValue(doc._Fld15867RRef, out val); dp.DepartmentID = val; } else throw new Exception(); //      

在周期结束时,将文档保存在OLAP数据库中


  dp.IDRRef = doc._IDRRef; dp.Version = doc._Version; if (doc._Posted == posted) //     1 dp.Active = true; else dp.Active = false; dataContext.DocProductions.InsertOnSubmit(dp); dataContext.SubmitChanges(); 

至此,Visual Studio中完成了填充板的工作,我们转到Excel中的数据透视表。 添加一个新的数据透视表



我们通过在表格部分中添加必要的字段在Excel中绘制表格,结果应如下所示(示例)




我们研究了一个简短的示例,该示例将数据加载到单独的SQL数据库中,以便从任何1C配置中在OLAP和Excel中生成分析报告。 在这种开发过程中获得的一组切片和指示符已准备好供最终用户在Microsoft Excel数据透视表中使用,从而生成任何对用户方便的报告选项。


仔细查看GitHub上示例的源代码

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


All Articles