1Cのレポートシステムの作成:OLAPおよびExcelに基づくERP

プログラマとユーザーの両方が、1Cでどれだけ長く複雑なレポートが作成されるかを知っています。 ただし、検討のために非標準ソリューションを提供できます。これはデータをOL​​APにロードすることです。 OLAP-テーブルやグラフを作成できる企業向けのオンライン分析レポート。 1C:ERPを使用している企業の一般ユーザー向けの通常の方法で、Microsoft Excelで分析レポートを作成するための非常に便利なツールであることが判明しました。



この例では、Visual Studio C#、2つのMicrosoft SQL Serverデータベースを使用します。1つは1C、ERPはOLAP分析レポート用、もう1つはMicrosoft Excelのピボットテーブルです。


1C:ERPデータベースのテーブルと構造に関する情報を取得するには、既にインターネット上にある既製の処理(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ドキュメント識別子のリストをメモリにロードします。 1Cのドキュメントの一意性は、主にIDRRefおよびバージョンによってサポートされています。 必要に応じて、タプルを使用して複合インデックスを作成できます。


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でテーブルを描画します。結果は次のようになります(例)




任意の1C構成からOLAPおよびExcelで分析レポートを生成するために、個別のSQLデータベースにデータをロードする簡単な例を検討しました。 このような開発の過程で取得したスライスとインジケーターのセットは、エンドユーザーがMicrosoft Excelピボットテーブルで使用する準備ができており、ユーザーにとって便利なレポートオプションを生成します。


GitHubの例については、ソースコードを詳しく見てください。

Source: https://habr.com/ru/post/J449264/


All Articles