MSSQLに直接アクセスして1Cの速度を100倍にする方法

文書の削除を1年間マークするタスクがありました。 この操作は、トレースレス削除の前に実行され、レジスタ内の移動のマーキングと削除が含まれます。 1か月の定期的な手段を使用したトライアル削除には4時間かかりました。 つまり、12か月が48時間(2日間)削除されます。 今後、1Cドキュメントへの直接アクセスは30〜40分で削除されます。 MSSQLは、.Netフレームワークと.Net Bridgeコンポーネントを介してアクセスされました。



MSSQLテーブル名の定義



1Cデータベースの構造は非常に紛らわしく、人間にとってほとんど意味のない名前で構成されています。 1Cには、オブジェクトの名前によってストレージ構造を決定する機能が含まれています。 開発の基礎はこの関数GetStructureStore Databaseであり、ロシア語の名前に従って構造の説明を返します。 この構造には、2つの重要なフィールドがあります。「メイン」に等しい「目的」と、テーブルStorageTableNameの名前です。







日付オフセット検出



_YearOffsetテーブルには、日付の年オフセットを示す数値が含まれています。 値は0または2000です。したがって、2000のオフセットでは、日付01.01.2014は01.01.4014としてデータベースに保存されます。 したがって、日付で選択する場合(削除は一定期間にわたって発生します)、オフセットを考慮する必要があります。 オフセットは、次の1Cコードで取得できます。

 = sqlConnection.CreateCommand(); .CommandText = "select top 1 Offset from _YearOffset"; .CommandTimeout = timeout;  = .ExecuteReader();  .Read()   = .GetInt32(0); ; .Dispose();
      
      







文書を削除するためのマーキング



ドキュメントテーブルの名前を持ち、フィールド_Date_Time、_Marked、および_Postedがそれぞれ日付、削除のマーク、および投稿のマークを担当することを知っているので、単一のSQLクエリでそれらすべてを削除用にマークできます。 これは次のように行われます。

  = sqlConnection.CreateCommand(); .CommandText = "UPDATE " + . + " SET _Marked = 0x01, _Posted = 0x00 WHERE _Date_Time BETWEEN @StartDate AND @EndDate"; .Parameters.AddWithValue("@StartDate", StartDate); .Parameters.AddWithValue("@EndDate", EndDate); .ExecuteNonQuery(); .Dispose();
      
      







文書ログでの削除のマーク付け



文書に削除マークを設定しても、各文書の重複する削除マークは文書ジャーナルに保存されます。 ドキュメントが参加しているジャーナルのリストは、次のようにドキュメントのメタデータから取得できます。

_Markedおよび_Postedフィールドを介した削除のマーク付けは、コマンドを介して同様に行われます。

 .CommandText = .CommandText + "UPDATE " +  + " SET _Marked = 0x01, _Posted = 0x00 WHERE _DocumentRRef IN (SELECT _IDRRef FROM " + . + " WHERE _Date_Time BETWEEN @StartDate AND @EndDate);"
      
      







レジスタの動きの削除



文書を削除する場合、1Cはレジスター全体の文書の移動を削除します。 直接アクセスの場合、これらの移動は個別に削除する必要があります。 レジスタのリストは、メタデータDocumentMetadata.Motionから取得できます。

動きを削除するコマンドは次のとおりです。

 .CommandText = .CommandText + "DELETE FROM " +  + " WHERE _RecorderRRef IN (SELECT _IDRRef FROM " + . + " WHERE _Date_Time BETWEEN @StartDate AND @EndDate);";
      
      







おわりに



結局のところ、1Cを約2桁高速化することはそれほど難しくなく、3種類のコマンドを実行するだけで十分です。 最終処理では、タイプ別にドキュメントを選択し、タイムアウトを追加し、トランザクションを追加し、コマンドをバッチ実行することにより、ロジックが拡張されます。



PS。 問題と解決策のリスト:

1.処理は、登録エントリの調整など、実行が禁止されているドキュメントを無視します。 登録エントリの調整では、文書の削除は登録エントリのアクティビティの無効化に関連付けられます。

2.削除の結果は、交換計画に反映されません。 関連するデータベースの処理を同時に開始することで解決します。

3.合計テーブルには影響しません。 Configurator-TestingおよびCorrection-Recalculation of totalsによる合計の再計算によって解決されます。



処理自体はここからダウンロードできます:

MarkUninstallation By Direct Request.epf(13.77 kb)



All Articles