データ共有メカニズム 1s. bsp でのデータ分離。 フォームの詳細を編集する

14.02.2024

1C セパレーター要素は、現時点でユーザーにとって便利なようにフォームの領域を再配分するために必要です。 ほぼすべての Windows ユーザーは区切り文字を使用できます。 2 つのコントロールを持つ単純なフォームを作成したとします。

従来、リストの項目は左側に配置できました。 したがって、右側には、これらの同じ点の詳細が記載されています。 左側のリストが短いタイトルで構成されている場合、この列を最小限に減らすのが論理的です。 したがって、この場合、右側の可読性が向上します。 逆に、左側に長い名前がある場合は、列を拡張する必要があります。 境界線をマウスでドラッグするだけで、形状を自由にカスタマイズできます。

この制御方法は、Word や Excel で表を編集するときに使用されます。 フォームを作成するときは、垂直方向と水平方向の両方のフォーム要素であるセパレーターを作成できます。 一般に、画面内に視覚的に収まるフォームを作成することが最も望ましいです。

区切り文字 8.2、8.3 (管理フォーム)

管理フォーム 1c では区切り文字を追加できません。区切り文字はテーブルフィールドの前後にプログラムによって自動的に追加されます。

1C の一般的な詳細 8.3 は、多くの構成オブジェクト (ディレクトリ、ドキュメント、勘定科目表など) に対して 1 つの属性を使用できるようにするプラットフォーム メタデータ オブジェクトです。 このオブジェクトは、主に開発者の作業を容易にし、データを分離するために作成されました。

一般的な詳細は最初にバージョン 1C 7.7 に実装されましたが、開発者はそれをすぐにはプラットフォーム バージョン 8 に含めませんでした。 一般的な詳細のメカニズムは、1C 開発者によってリリース 8.2.14 でのみ導入されました。

構成内の標準オブジェクトを変更しないように、一般的な詳細を追加すると非常に便利です。私はこれらを とともに使用することがよくあります。

一般属性を追加した後、クエリで使用してオブジェクト フォームに表示できます。 外見上は通常の小道具と変わりません。

一般的な詳細の唯一の制限は、それらを で使用できないことです。

他の構成オブジェクトとは異なる一般的な詳細の基本設定とプロパティを見てみましょう。

コンパウンド- 一般的な詳細が使用されるオブジェクトのリスト。この設定は交換計画の設定を思い出させます。

1C の 267 ビデオ レッスンを無料で入手:

自動使用— この設定は、コンポジションで「自動」使用モードが指定されているオブジェクトに一般的なプロップを使用するかどうかを決定します。

データの分離— この設定については別途検討します。

共通の詳細を使用した 1C でのデータの分離

データの分離- メカニズムと同様のメカニズム。 ただし、このメカニズムのパフォーマンスはより効率的であり、構成も簡単です。

このメカニズムにより、ユーザーが見ることができる要素のみの表示を構成できます。 たとえば、特定の組織がインストールされているすべてのオブジェクト (ドキュメント、ディレクトリなど) を区別できます。

一般的な 1C の詳細を使用したデータ分離のセットアップ

一般的な詳細を設定するには、データ分離を指定する必要があります。 分ける。 クリックするとすぐに、システムはデフォルトの会計パラメータを作成するよう提案します。

この場合、システムの起動時にセッション パラメータを指定する必要があります。これを行う方法については、記事の例で説明しています。

これでセットアップが完了します。ユーザーは、選択したセッション パラメータで指定された情報にのみアクセスできるようになります。

共通プロップの使用例

フレーム構成とプロップの例を使用して、1C 8.3 での一般的なプロップのセットアップを見てみましょう。 組織:

このシステムには、組織の詳細を示す必要がある 3 つの文書があります。これらは、領収書請求書、支出請求書、および給与計算書です。

セットアップは簡単です:

  1. 新しい General 属性を作成し、タイプ DirectoryLink.Organization を指定します。
  2. 構成では、文書を整理します- 使用.

以上で、セットアップは完了です。

結果を見てみましょう:

システムは、リクエスト、フォームの詳細、その他の場所に、一般的な詳細を「自分のものであるかのように」表示します。 これはとても魔法です! 🙂

一般要件 1C 8.3 は追加されません

注意! これはレッスンの入門バージョンであり、教材が不完全である可能性があります。

学生としてサイトにログインする

学校の教材にアクセスするには学生としてログインしてください

初心者プログラマー向けの内部プログラミング言語 1C 8.3: 1C の形式

1C でプログラミングする場合、多くの場合、さまざまなタイプ (文字列、日付、数値など) の値を (同じレポート内で) 表示する必要があります。 それぞれの値には異なる表現があります。

たとえば、同じ日付「01/01/2005」は次のように文字列として表現できます。

  1. "01.01.2005"
  2. 「2005年1月1日」
  3. "01.01.05"

これらはすべて同じ値 d の文字列表現です。 1Cで特殊機能を使用した編成の場合 形式.

1C での Format 機能の使用

数字のグループ化を無効にする

数値 10000 を出力する必要があるとします。

次のように書くとします。

フォーマット文字列は通常、等号で区切られた 2 つの部分で構成されます。 「equal」の左側には設定されているパラメータの名前があり (ヘルプまたは例を参照してください)、右側にはこのパラメータの値が表示されます。

上の例では、書式文字列「HH=0」に HH パラメータと値 0 が含まれています。この組み合わせにより、数値の桁のグループ化がキャンセルされます。 そして、ご覧のとおり、10000 が出力されるようになりました。

先行ゼロを出力する

もう 1 つの一般的なタスクは、数字の前に先行ゼロを出力することです。 たとえば、数字の 5 を先頭にゼロを付けて、つまり「05」の形式で表示するとします。

Report(Format(5, "CHZ=2; CHVN=" ) ) ;

// 05を出力します

フォーマット文字列「CC=2; CHVN=」を見てみましょう。 これは、セミコロンで区切られた 2 つのフォーマット文字列で構成されます。 それぞれを個別に見てみましょう。

「CC=2」行は、整数部と小数部に表示される小数点以下の合計桁数を指定します。 したがって、出力中に数値が占める位置の合計数は 2 になります。

ヘルプにあるように、「ChVN=」という行は、数値が宣言された長さに達しない場合 (この場合のように、2 つの位置を示し、5 は 1 つだけを占めるため)、先頭にある形式を関数に示します。ゼロを使​​用する必要があります。 このフォーマット文字列の特徴は、パラメータ名と等号のみを持ち、値を持たないことです。 あなたはレッスンのトライアル版を読んでいますが、完全なレッスンが利用可能です。

2 つのフォーマット文字列を組み合わせると、必要な結果、「5」ではなく「05」が得られます。

整数部と小数部の間の区切り記号を変更する

小数をドットではなくアスタリスクで区切って表示する必要があると仮定しましょう。 つまり、25.46 は「25*46」として出力されます。 形式フォーマット文字列は DF パラメータと値 dddd で、関数を示します。

曜日の長い表現を出力します (「d」がいくつ含まれているかに注目してください)。

日付月表現

日付ごとに月の説明が次のように表示されます。 Report(Format("20050101" , "DF=MMMM" ) ) ;

// 1 月を印刷します

フォーマット文字列には、前の場合と同じ DF パラメータが含まれます。 しかし、意味は異なります。 これで、MMMM と等しくなります。

テストを受けてください

テストの開始

1.Format("19050505", "DF=MMMM") が返されます。

2. 小数点と整数の区切り文字を ^ に変更する文字列の書式設定

3. Format 関数が 5 ではなく「00005」を返すには、フォーマット文字列が適切です。

4. Format 関数が 10,000 ではなく「10000」を返すには、フォーマット文字列が適切です。

5. Format 関数は、次のタイプの値を返します。

1 つの情報セキュリティ システムで 2 つの組織の会計を整理する必要がありました。 この状況は特殊なものではありませんが、たまたま、非常に珍しい 250 ギガバイトの USB ドライブの動作が非常に遅くなったため、RLS の代わりにデータ分離を試みることにしました。 それが何であるかは、例えば、または。 つまり、RLS が SQL クエリに条件を追加する場合、データ セパレータは DBMS レベルのテーブルの追加列となり、そのためセパレータ メカニズムは RLS よりも高速に動作するはずです。

したがって、LLC No. 1 の記録が保存されていたデータベースに、LLC No. 2 の別のデータベースから情報を転送し、共同作業を組織する必要があります。 写真のように:

単なる人間は自分の LLC とのみ連携し、主任会計士は 2 つの法人のデータを参照することがあります。 両方の LLC へのアクセス モードでは、データの読み取りのみができるため、主任会計士は、「すべて読み取り」/「1 つの組織のみ書き込み」モードを対話的に切り替えて、LLC を選択できる必要があります (つまり、共通の詳細)を使用して、コスト計算などを実行します。

2. 実装

プラットフォーム 8.2.19.90、互換モードなし。 DBMS - MSSQL Server 2008 R2 標準。

「数値」タイプの一般属性 OrganizationSeparator を作成し、セッション パラメータを作成する提案に同意し、詳細の構成を記入しました (いくつかのディレクトリ、すべてのドキュメント、蓄積、会計および計算レジスタが含まれます)。 データの分離 - 「独立および共同」。 セッションパラメータの値は、セッションモジュールのSettingSessionParametersプロシージャの標準ユーザー設定から設定されます。

組織 = UserManagement.GetDefaultValue(chCurrentUser,"PrimaryOrganization");
SessionParameters.OrganizationSeparatorValue = Organization.SeparatorValue;

主任会計士のインターフェイスでは、組織間の切り替えと分離モードのオン/オフを切り替える機能を備えたフォームを作成しました。

分離が無効になっている場合、SessionParameters.OrganizationSeparatorUsage = False の場合、プラットフォームはドキュメントの書き込みを拒否し、「SDBL エラー: 式が必要です (pos=12)」などのエラーでクラッシュするため、このオプションでユーザーにドキュメントの書き込みを許可することはできません。 信頼性を高めるために、一般属性の一部であるオブジェクトの「記録前」イベントへのサブスクリプションを作成しました。

IfSessionParameters.OrganizationSeparatorUsage = False then
#クライアントの場合はその後
Warning("データ共有が無効になっているため書き込めません!");
#EndIf
拒否 = True;
endIf;

私たちの行動計画は次のとおりです。IS No. 1 の受信機構成を準備し、一般属性の値 = 1 を設定し、ロード後に IS No. 2 からデータをロードし、すべてのオブジェクトに対して空 (0 に等しい) を設定します。 ) 区切り値、OrganizationSeparator = 2 を設定します。

構成が準備されましたが、疑問が生じました。貸借対照表の数値が変動するリスクを冒さずに、文書の一般的な詳細の値とクローズ期間内のその移動をどのように設定するか? 1C オブジェクト モデルを使用すると、オブジェクトとは別にセパレータを記述することは不可能なので、使用許諾契約に違反して MS SQL のクエリを作成する必要がありました。 一般属性にはオブジェクトが多く、そのオブジェクトのテーブルにはさらに多くのテーブルがあるため、SQLのクエリを生成する処理を書きました(セパレータに含まれるメタデータオブジェクトごとに、「update」+DB_Nameを書きました) + ".dbo._" + TableName + "set _" + FieldGeneralAttributes + "= 1";)

値を入力し、IS 2 号機からデータの一部を転送してテストを開始しました。

結果は残念なものでした。 まず、会計記録簿の問題です。 分離が有効になっている場合、アナリストは表示されません。

これは、DBMS レベルの会計記録簿が複数のテーブルとして格納されており、すべてのテーブルに一般属性の値が入力されているわけではない (構造を表示するために処理が使用された) という事実によるものです。


それでは、MS SQL を使用して区切り値を入力しましょう。分析が表示されます。 レポートは機能しなくなりました。 会計記録簿「Turnover」および「TurnoverDtKt」の仮想テーブルへのクエリに問題があることが判明しました。

(Fld27033 は会計登録テーブルの一般的な属性にすぎません)

セパレータはすべてのテーブルにインストールされていますが、これは DBMS レベルで表示されますが、エラーが何であるかは明らかではありません。 標準の空の SCP を展開し、上記の構成変更を行い、いくつかのドキュメントを入力します (このバージョンでは、プラットフォーム自体がすべての会計登録テーブルに区切り値を入力します)。しかし、エラーが再現されます。 悪いですが、一般的な詳細から会計レジスターを除外し、テストを続けます。

さらに、演算レジスタの変位機構が動作しなくなっていることが判明した。 計算レジスタのテーブルと再計算で問題を探そうとしているため、計算タイプの計画を分離しませんでした。 確認し、主要な詳細の値を入力し、T&I を実行しますが、無駄です。

その過程で、リストフォームから独立したレジスタに情報を書き込むときの問題を診断します。 この場合、データは記録され、再起動後に確認できるようになります。 この問題はテストベースでも再現されます。


SQL で操作して情報レジスタを「修正」することはできませんでした (すべてのテーブルの区切り値が設定されています)。そのため、単純に一般属性から除外しました。 数日間の実験の後、プリエンプションの機能を復元する試みも失敗したことが判明しました。

この時点で、データ分離をオフにして RLS を使用することにします。 パーティションを「使用しない」に設定すると、「Microsoft OLE DB Provider forSQL Server: インデックスに重複キーが見つかったため、CREATE UNIQUE INDEX が終了しました...」というエラーが発生します。 つまり、分割前の状態に戻ることはそう簡単ではないのです。 変換テーブルのインデックス、合計を保存するための設定などに問題があります。 実際のところ、これらのテーブルには同一の行が格納されており、一般属性の値が異なるだけです。 共通属性を削除すると、一意でないレコードが表示されます。 次のように、MS SQL で不要なレコードを直接削除する必要があります (変換テーブルの場合)。

ベースを使用してください。
ALTER TABLE_CRgRecalc1399
ID を追加 INT IDENTITY(1,1);
行く
_CRgRecalc1399 から削除
どこでID< (SELECT MAX(id)
FROM _CRgRecalc1399 AS T1
WHERE _CRgRecalc1399._RecorderTRef = T1._RecorderTRef および
_CRgRecalc1399.[_RecorderRRef] = T1.[_RecorderRRef] および
_CRgRecalc1399.[_CalcKindRRef] = T1.[_CalcKindRRef] および
_CRgRecalc1399.[_Fld1400RRef] = T1.[_Fld1400RRef] および
_CRgRecalc1399.[_Fld1401RRef] = T1.[_Fld1401RRef] および
_CRgRecalc1399.[_Fld1402RRef] = T1.[_Fld1402RRef]
);
行く
ALTER TABLE_CRgRecalc1399
列 ID をドロップします。

また、数十のテーブルをクリーニングした後でのみ、データ分離をオフにすることができます。 分離をオフにした後は問題はありません。

3. 結論。

8.3 では問題が解決されるという希望の光がありました。 私たちは怠け者ではなく、8.3.4.482 (互換モードは無効) でチェックしました。 私たちは、一般的な詳細についてのみ構成を変更した、ほぼ標準的な制御ユニットを検討しました。 このテストベースでは、情報を入力する前に分離が有効になっていました。 プラットフォームは区切り値をすべてのテーブルに正しく書き込む必要があり、MS SQL 自体には直接何も書き込まれませんでした。

結果:

    仮想テーブル「Turnover」および「TurnoverDtKt」へのクエリの問題が再現されます。

    弾圧の問題が再現される。

    独立した情報レジスタへの書き込みに関する問題が再現されます。

    分離をオフにする場合の問題は、ボタンを 1 回クリックするだけでは分離を解除できないことです。

したがって、RLS を新しいメカニズムに置き換えることはできませんでした。 この仕組みはクラウドサービス向けに考えられたものらしく、共有データを「単独」で利用する場合は分割しても良いのかもしれないが、共通のマスターデータが必要となる。 1C が誤りを修正するか、あるいはさらに良いことに、標準構成で組織ごとに分離するための標準メカニズムを実装するかどうかはまだわかりません。

この記事から何を学ぶことができますか?

  • この記事では、合計分離モードの目的について説明しています。
  • 多数のユーザーの並列操作中の 1C:Enterprise 8 システムの動作が分析されます。
  • 分割合計モードの欠点を示します
  • レジスタ合計の除算の正しい使用に関する推奨事項が示されています。

1C:Enterprise 8 プラットフォームには、誰もがその操作と効果的な使用方法を完全に理解しているわけではない機能とメカニズムが含まれています。 合計分離モードです。

合計分離メカニズムは非常に重要かつ有用な機能を実行します。 会計台帳と蓄積台帳の並行入力が可能になります。.

例を使用してこのモードの有効性を示してみましょう。 これを行うには、合計分離モードをオンにする前後の状況を考慮してください。

分割合計モードを有効にする前に

番号 001 と 002 が付いた 2 つの同一の文書があります。

どちらの文書も蓄積レジスターを通過します。 残留物を制御することはできません。 累積レジスタの構造:

2 人のユーザーがドキュメントで作業をしながら、同時に作業を開始します。 同じ種類の 2 つのドキュメントが同時に移動しようとする状況が発生します。

この場合、DBMS レベルでは次の図が表示されます。

システム内では次のことが起こります。

  1. 文書が蓄積記録簿に登録されようとしています
  2. DBMS レベルでは、累積レジスタは、移動テーブルと残高テーブル (合計テーブル) の 2 つのテーブルで表されます。
  3. 移動テーブルでは、ドキュメントはデータを並行して記録できます。 これは、「Registrar」フィールドの異なる値によって保証され、それに応じて、テーブルの異なる行で作業が実行されます。
  4. しかし、残高テーブルには「登録者」フィールドはなく、このテーブルのデータはレジスタ自体の次元のコンテキストで保存されます。
  5. ここでは、2 つのドキュメントで 1 つのレコードを変更する必要があるが、1 つのレコードを同時に変更できない状況を観察します。
  6. 記録されたデータを失わないようにするために、一方のドキュメントは、もう一方のドキュメントがその動きを記録するまで記録の順番を待たなければなりません。 そして、最初のドキュメントが移動した後、2 番目のドキュメントが独自のドキュメントを作成できるようになります。

その結果、時間のロスが発生します。2 番目のユーザーは、最初のユーザーがドキュメントの処理を完了するまで待たなければなりません。 一方では、すべてが正しく論理的ですが、他方では、システム内でのユーザー作業の並列性が損なわれます。

生じた問題を解決するために、結果を分割するメカニズムが作成されました。

その使用は、蓄積レジスターおよび会計レジスターのみを対象としています。

分割合計モードを有効にする

このモードを有効にするのは非常に簡単です。

合計分離モードは、作成されたすべての累積レジスターおよび会計レジスターに対してデフォルトで有効になっていることに注意してください。 ユーザー モードのコンフィギュレータに加えて、どのレジスタに対してモードが有効になっているかを確認できます。

分割合計モードをオンにするとどうなりますか?

累計・会計レジスター合計表に「セパレータ」という新しい列が表示されます。 DBMS 自体では「スプリッター」と呼ばれます。

この場合、動きの表は「Recorder」のままです。 概要テーブルに変化が表示されます。

このフィールドは、2 つ (またはそれ以上) のトランザクションが合計テーブルの同じ行を変更しようとした場合にのみ設定されます。 これが発生すると、Separator フィールドにはトランザクションごとに異なる値が格納されます。

この合計分離モードの実装により、すべてのトランザクションの並行記録を実行できるようになります。

2 つのドキュメントを含むこの例では、モードがオンになっていると、次のことが観察されます。

新しい Delimiter フィールドのおかげで、両方のドキュメントでデータが並行して記録されました。 その結果、ロックの待機がなくなり、ユーザーの同時実行性が向上します。

分割合計モードの欠点

このモードを有効にすると、新しいフィールドが追加されるため、レジスタ合計テーブルのサイズが増加し、ディメンションのセットに対して 1 行ではなく複数の行が表示されます。

レジ残高を受け取る場合、データを照合する必要があり、わずかではありますが時間の無駄につながります。

この例では、「メイン」倉庫の「テーブル」製品の残高を取得するための 2 つのドキュメントがあるため、最終値「7」を取得するには 2 行を追加する必要があります。 セパレータをオフにすると、行のグループ化(追加)は必要ありません。

分割合計モードを使用する必要があるのはどのような場合ですか?

これを行うには、次の条件を満たす必要があります。

  1. レジスターによる残高の制御はありません。トランザクションでのデータの読み取りはありません。 原則として、会計帳簿の残高を管理することはできません。 しかし、残留制御が存在する場合、パフォーマンスの向上は得られません。 また、残高を監視する場合はデッドロックが発生する可能性があるため、「LockForChange」レコードセットプロパティを使用する必要があります。
  2. ユーザーによる並行作業はレジスターで実行され、そこでアクティブな作業が行われます。

レジスターを順次操作する場合、または少数のユーザーを操作する場合、分割合計モードを有効にする意味はありません。競合するトランザクションがないためロックの待機が発生することはなく、したがって、分割合計モード。

ブルミストロフ・アンドレイ