1Cデータベースからデータを抽出する方法





COM接続に基づいて1Cからデータをアップロードする方法を共有したいと思います。 このオプションは、標準および非標準の1C治療の代わりに使用できます。 たとえば、C#言語が使用され、アップロードが1つの大きなXMLファイルに実行されます。



どこで申請できますか



専門家にとって、2つのシステム間でのデータ交換は、作業を理解する必要があるという意味で、なじみのない環境で複雑です。 1Cからのデータが必要であるが、1Cを勉強することはあなたにとって有望な方向ではない場合、オプションとして、1Cを視覚的に開かずに外部接続を介してデータを受信する方法を提案します。

このメソッドをさまざまなタスクに適用してみることができます。



この方法の短所についてすぐに言いたいです。 1Cでは、さまざまな目的のために多くのデータアップロード処理が記述されています。 1C処理の使用は、データを取得する最も公式な方法と言えます。 通常の処理では、データベースからデータをアンロードするだけでなく、クエリ内の接続および埋め込み言語で計算を実行することにより、データを便利に変換およびコンパイルします。 記事で説明されているようにデータをアップロードすると、データベースに格納されているプラ​​イマリテーブルのみが取得され、それらのさらなる処理が必要になる場合があります。



結果の詳細



何が得られますか?



外部接続を介して、中間ファイルをまったく保存せずに、任意の形式のファイルにデータをアップロードしたり、受信したレコードを別のデータベースに転送したりできます。 ここでは、xmlファイルへのアップロードは、アップロード機能のデモとして行われます。

データは1Cデータベースから抽出され、1つのxmlファイルに配置されます。 結果のファイルの例を次に示します。



<?xml version="1.0" encoding="utf-8"?> <database> <catalog name=""> <item> <attribute name="" value="0cc56775-0daa-11e3-bf95-f46d04eec7f5" /> <attribute name="" value="AAAAAQAAAAA=" /> <attribute name="" value="false" /> <attribute name="" value="false" /> <attribute name="" value="000000001" /> <attribute name="" value=" " /> <attribute name="" value="1111111111" /> <attribute name="" value="222222222" /> </item> <item> <attribute name="" value="0cc56776-0daa-11e3-bf95-f46d04eec7f5" /> <attribute name="" value="AAAAAwAAAAA=" /> <attribute name="" value="false" /> <attribute name="" value="false" /> <attribute name="" value="000000002" /> <attribute name="" value="" /> <attribute name="" value="3333333333" /> <attribute name="" value="444444444" /> </item> </catalog> <catalog name=""> <item> <attribute name="" value="0cc56777-0daa-11e3-bf95-f46d04eec7f5" /> <attribute name="" value="AAAAAgAAAAA=" /> <attribute name="" value="false" /> <attribute name="" value="false" /> <attribute name="" value="000000001" /> <attribute name="" value="" /> <attribute name="" value="15000" /> </item> <item> <attribute name="" value="0cc56778-0daa-11e3-bf95-f46d04eec7f5" /> <attribute name="" value="AAAAAwAAAAA=" /> <attribute name="" value="false" /> <attribute name="" value="false" /> <attribute name="" value="000000002" /> <attribute name="" value="" /> <attribute name="" value="25000" /> </item> </catalog> <document name=""> <attribute name="" value="0cc56779-0daa-11e3-bf95-f46d04eec7f5" /> <attribute name="" value="AAAAAQAAAAA=" /> <attribute name="" value="false" /> <attribute name="" value="000000001" /> <attribute name="" value="2013-08-25T21:19:56" /> <attribute name="" value="true" /> <attribute name="" value="0cc56776-0daa-11e3-bf95-f46d04eec7f5" /> <attribute name=""> <line> <attribute name="" value="0cc56779-0daa-11e3-bf95-f46d04eec7f5" /> <attribute name="" value="1" /> <attribute name="" value="0cc56778-0daa-11e3-bf95-f46d04eec7f5" /> <attribute name="" value="1" /> <attribute name="" value="25000" /> <attribute name="" value="25000" /> </line> </attribute> </document> <document name=""> <attribute name="" value="0cc5677a-0daa-11e3-bf95-f46d04eec7f5" /> <attribute name="" value="AAAAAwAAAAA=" /> <attribute name="" value="false" /> <attribute name="" value="000000002" /> <attribute name="" value="2013-08-25T21:22:49" /> <attribute name="" value="true" /> <attribute name="" value="0cc56775-0daa-11e3-bf95-f46d04eec7f5" /> <attribute name=""> <line> <attribute name="" value="0cc5677a-0daa-11e3-bf95-f46d04eec7f5" /> <attribute name="" value="1" /> <attribute name="" value="0cc56778-0daa-11e3-bf95-f46d04eec7f5" /> <attribute name="" value="1" /> <attribute name="" value="25000" /> <attribute name="" value="25000" /> </line> <line> <attribute name="" value="0cc5677a-0daa-11e3-bf95-f46d04eec7f5" /> <attribute name="" value="2" /> <attribute name="" value="0cc56777-0daa-11e3-bf95-f46d04eec7f5" /> <attribute name="" value="2" /> <attribute name="" value="15000" /> <attribute name="" value="30000" /> </line> </attribute> </document> <document name=""> <attribute name="" value="0cc5677b-0daa-11e3-bf95-f46d04eec7f5" /> <attribute name="" value="AAAAAgAAAAA=" /> <attribute name="" value="false" /> <attribute name="" value="000000001" /> <attribute name="" value="2013-08-25T21:23:10" /> <attribute name="" value="true" /> <attribute name="" value="0cc56776-0daa-11e3-bf95-f46d04eec7f5" /> <attribute name="" value=" .." /> <attribute name=""> <line> <attribute name="" value="0cc5677b-0daa-11e3-bf95-f46d04eec7f5" /> <attribute name="" value="1" /> <attribute name="" value="0cc56777-0daa-11e3-bf95-f46d04eec7f5" /> <attribute name="" value="15000" /> <attribute name="" value="15000" /> <attribute name="" value="15000" /> </line> </attribute> </document> </database>
      
      





アップロードされるデータ



数値および文字列タイプは、アップロードされたファイルに通常の文字列形式で保存されます。 3つのドット「...」が付いた選択ボタンを持つフォームに表示されるリンクフィールドは、GUID値としてアンロードされます。 たとえば、値が「0cc56776-0daa-11e3-bf95-f46d04eec7f5」の「Counterparty」属性が請求書に示されています。 取引先ディレクトリでは、このリンクの下に「取引所」があります。

特定の構成やデータ構造に依存することなく、アンロードが実行されます。 メタデータを列挙することにより、すべてのディレクトリとすべてのドキュメントがアップロードされます。 各ディレクトリ項目および各ドキュメントに対して、すべての属性がアンロードされます。 ドキュメントに表部分がある場合、すべての行は表部分ごとにアンロードされます。

この例では、主な種類のテーブル(ディレクトリ、ドキュメント、ドキュメントの表部分)のみがアンロードされます。 定数、情報レジスタ、およびディレクトリの表部分のアンロードは実装されていません。 累積レジスタおよびアカウンティングレジスタのアンロードは実行されません。 このデータは、プライマリドキュメントから取得できます。 ただし、分析の目的では、レジスタエントリをアップロードする方が便利な場合があります。



データの受信方法



プログラムの起動は、インストールされた1Cで実行する必要があります。 COM接続を介して接続されます。 例の接続文字列はファイルバージョン用に作成されていますが、必要に応じて転送して1Cサーバーに接続できます。 指定されたパスワードを持つユーザーは、データベースに登録する必要があります。 ユーザーには、すべてのデータに対する読み取り権限と、外部接続を確立する機能が必要です。

排他モードは不要です。 したがって、ユーザーの作業を中断せずにデータベースを「アンロード」できます。



代替方法



データ抽出のこの方法は唯一のものではありません。 COM接続を介したアクセスが最も遅く、以下にリストした方法の方が生産性が高いと言えます。 しかし、これらの方法には根本的な欠点があります。



外部または統合処理



XMLファイル形式の同じ結果は、外部または組み込みの1C処理から取得できます。 その速度で1C処理を実行する利点。 それでも、これは内部キッチンであり、時間接続の観点からCOM接続からの呼び出しには価値があります。

処理を使用することの欠点は、自動化がそこで終了することです。 ユーザーは、処理フォームを手動で開き、パラメーターを指定して、アップロードボタンをクリックする必要があります。



外部接続に使用できるモジュールでの手順



アップロード手順は、外部接続に使用できる共通モジュールに配置できます。 プロシージャ自体をエクスポートとして宣言する必要があります。



  ExportDatabase()   =  XML; .(); .XML(); .("database"); ... .(); .(); 
      
      





これで、C#からのアンロード手順を参照するだけで十分です。



  Connection.ExportDatabase(path);
      
      





この方法の利点は、迅速な実行です。 アップロード手順を実装すると、サーバー呼び出しとサーバーとクライアント間のデータ交換を効率的に使用できます。

主な欠点は、共通モジュールを編集するために構成を変更する必要があることです。



典型的なツール



多くの構成には、アップロード処理が組み込まれています。 多くのプロセスはすべてのデータをダウンロードしませんが、受信者によって制限されます。 取引ベースから、プライマリドキュメントのみが会計部門にダウンロードのためにダウンロードされ、命名ディレクトリのアイテム、および商品の価格と特性がオンラインストアにダウンロードされます。 データベース全体のアンロードは通常、次のエディションに進むために行われます。 特定のタスクに一般的なツールを使用できる場合、これがおそらく最良のソリューションになります。



データベースへの物理的アクセス



外部からデータにアクセスする方法はまだありますが、データベース構造の知識に依存しています。 1CデータベースがSQLサーバー上にある場合、実際には、テーブルは読み取り用に開かれています。 要求を行い、すべてのデータを取得できます。 唯一の問題は、データ構造が複雑であり、非常に慎重な処理が必要なことです。

1Cデータベースのファイルバージョンから読み取ることはさらに困難です。 1CDファイルの構造は文書化されておらず、原則として変更できます。 ここでは、情報にアクセスするために、ファイルモードからSQLへ、またはその逆に変換できることに注意してください。



プログラムの全文



1Cデータベースへの接続を確立し、データをアップロードするためのクラスのC#コードと、このクラスの使用例を示します。



 using System; using System.Text; using System.Xml; namespace ConsoleApplication { class Export1C { dynamic Connection; public void Connect(string path, string user = "", string password = "") { dynamic connector = Activator.CreateInstance(Type.GetTypeFromProgID("V82.COMConnector")); string connectionString = "File=\"" + path + "\""; if (user != "") connectionString += ";Usr=\"" + user + "\""; if (password != "") connectionString += ";Pwd=\"" + password + "\""; Connection = connector.Connect(connectionString); } public void Export(string path) { XmlTextWriter xml = new XmlTextWriter(path, Encoding.UTF8); xml.Formatting = Formatting.Indented; xml.WriteStartDocument(); xml.WriteStartElement("database"); // Catalogs foreach (dynamic catalog in Connection.Metadata.Catalogs) { xml.WriteStartElement("catalog"); xml.WriteAttributeString("name", catalog.Name); dynamic query = Connection.NewObject("Query"); query.Text = "select * from catalog." + catalog.Name; dynamic items = query.Execute().Unload(); for (int i = 0; i < items.Count(); i++) { xml.WriteStartElement("item"); for (int j = 0; j < items.Columns.Count(); j++) { xml.WriteStartElement("attribute"); xml.WriteAttributeString("name", items.Columns.Get(j).Name); xml.WriteAttributeString("value", Connection.XMLString(items.Get(i).Get(j))); xml.WriteEndElement(); } xml.WriteEndElement(); } xml.WriteEndElement(); } // Documents foreach (dynamic document in Connection.Metadata.Documents) { dynamic query = Connection.NewObject("Query"); query.Text = "select * from document." + document.Name; dynamic table = query.Execute().Unload(); for (int i = 0; i < table.Count(); i++) { xml.WriteStartElement("document"); xml.WriteAttributeString("name", document.Name); dynamic docref = null; for (int j = 0; j < table.Columns.Count(); j++) { xml.WriteStartElement("attribute"); string field = table.Columns.Get(j).Name; xml.WriteAttributeString("name", field); dynamic tabular = document.TabularSections.Find(field); if (tabular == null) { xml.WriteAttributeString("value", Connection.XMLString(table.Get(i).Get(j))); if (field == "") docref = table.Get(i).Get(j); } else { dynamic subquery = Connection.NewObject("Query"); subquery.Text = "select * from document." + document.Name + "." + field + " as lines where lines.Ref=&Ref"; subquery.SetParameter("Ref", docref); dynamic lines = subquery.Execute().Unload(); for (int line = 0; line < lines.Count(); line++) { xml.WriteStartElement("line"); for (int col = 0; col < lines.Columns.Count(); col++) { xml.WriteStartElement("attribute"); xml.WriteAttributeString("name", lines.Columns.Get(col).Name); string value = Connection.XMLString(lines.Get(line).Get(col)); xml.WriteAttributeString("value", value); xml.WriteEndElement(); } xml.WriteEndElement(); } } xml.WriteEndElement(); } xml.WriteEndElement(); } } xml.WriteEndElement(); xml.WriteEndDocument(); xml.Close(); } } class Program { static void Main(string[] args) { Export1C export = new Export1C(); export.Connect("D:\\TestBase", "User", "pass"); export.Export("D:\\Export.xml"); } } }
      
      





エクスポートは、ディレクトリのアンロードとドキュメントのアンロードの2つのブロックに分かれています。 ディレクトリの種類とドキュメントの種類を取得するには、メタデータにアクセスします。

各テーブルのデータは、個別のクエリで取得されます。 ドキュメントは、表形式のパーツもアンロードします。 このため、アップロードされたドキュメントへの参照による選択により、表形式の部分へのサブクエリが形成されます。

特定のタスクについては、コードを変更する必要がある場合があります。 生成されたxmlファイルのタグ名(カタログ、ドキュメント、属性、名前、値)は任意に選択されます。 コードにわずかな変更を加えると、結果のxmlファイルの構造を変更できます。 メタデータフェッチサイクルの条件を使用して、特定のテーブルと属性のみにアップロードされるデータを制限することもできます。



All Articles