標準フォーム1Cのコントロールのアクセシビリティプロパティの柔軟な管理:Enterprise 8.x

「1C:Enterprise」で通常のフォームを設計するとき、おそらく最も困難で退屈なタスクの1つは、特定のデータセットに応じて要素の可用性を管理することです。 コントロールのすべてのルールを含むSet VisibilityAvailability()のようなプロシージャから、コード全体に完全にランダムに散在する指定されたプロパティの呼び出しまで、多くの決定に出会いました。



率直に言って、私はさまざまな方法も試しましたが、ある時点で、非常に便利で論理的なものに到達しました(このように思われます)。



すべては、この問題の解決策を探すと、「フォームでのアクセス制御の整理」というタイトルの「開発方法」の記事に導かれたという事実から始まりました。 この記事の重要なポイントは、アクセス制御がSetAccess()プロシージャのみに焦点を合わせていることです。 また、コントロールの状態を変更する必要がある場合は、このプロシージャのみが呼び出されます。 プロシージャ自体はアクセスを決定しませんが、次の関数によって形成されるリストからのデータを処理します。



(); (); (); ();
      
      





つまり、アクセシビリティ条件自体がこれらの関数で設定されており、すでにSetAccess()プロシージャがこれらの事前定義された値をコントロールの対応するプロパティに割り当てています。



コードを3つのコンポーネントに分割しました。 1つ目は、フォーム要素のアクセシビリティプロパティの値を変更するだけのメソッドです。 それらを共通モジュールに実行しました。 条件付きでアクセス制御と呼びます。 以下は、そこに配置されるコードです。 コードのあいまいなセクションについてはできる限りコメントしようとしました。



汎用アクセス制御モジュールのソースコード
 //////////////////////////////////////////////////////////////////////////////// //        ( ,  )  = ;   = [];  ;  ;   (,  ) //       = ;  = (, "."); //      ,  "..", //         .   > 0  //       = (,  - 1); //        = (,  + 1);  = (., );   <>    = (, ".");   > 0   = (,  - 1);  = (,  + 1);  = (, );   =    ; ;  = (, "."); ;  = (, );  = ; ;   = .[]; ;  ;   ()   = .();        = (, .);  () = ("")   .  . = .;  . = ; . = .; . = ; ;  . = .; ; ;  = .();        = (, .); . = .; ;  = .();        = (, .); . = .; ;  = .();        = (, .); . = .; ; 
      
      







たとえば、テーブルフィールドProductsがあり、そこには割引カードの列Discountがあります。 列は、割引カードがドキュメントに添付されている場合にのみ表示されます。 割引カードの要件が満たされています。 したがって、「割引カードによる割引」列の可視性制御リストの条件は次のとおりです。



2番目の部分は、アクセシビリティリストの作成を担当する関数がいつであるかです。 それらはフォームに直接配置され、エクスポートされます。 1C標準から少し離れ、GetAccountListをVisibility Management()メソッドにGetListMessageText Edit Management()に置き換えました。 より便利で論理的であるように思えます。 以下は、これらの機能を備えたコードテンプレートです。



アクセス制御リスト生成ソースコード
 //////////////////////////////////////////////////////////////////////////////// //      ()   =  ;  ;   ()   =  ;  ;   ()   =  ;  ;   ()   =  ;  ; 
      
      







最後に、3番目の部分はInstallAccess()プロシージャで、これもフォームモジュールにあります。 フォーム要素の可用性を再定義するために、フォームのコード内のどこでもこのプロシージャを呼び出します。



 //////////////////////////////////////////////////////////////////////////////// //       () .(); 
      
      





物事をより明確で理解しやすくするために、次の例を見てみましょう。 フォームがあるとします。 その上には、現金販売(ブール)チェックボックス、パンチ会計チェック(ブール)チェックボックス、割引カード入力フィールド(割引カードディレクトリへのリンク)、コメント入力フィールド(行)、および製品表フィールドがあります。 すべてが同じ詳細に関連付けられています。 テーブルフィールドには、Discount By Discount Card(number)という列があります。 さらに、[パンチチェック]ボタンが配置されているコマンドパネルの[フォームの基本アクション]があります。 いくつかの条件を定義します。



  1. Cash Salesチェックボックスが選択されている場合、Punch Fiscal Checkチェックボックスが表示され、Discount Cardフィールドが入力可能です。
  2. Punch Fiscal Checkボックスがチェックされている場合、Punch Checkボタンが利用可能です。
  3. [割引カード]フィールドに入力すると、製品の表部分の[割引カード]列の割引が表示され、[コメント]フィールドを編集できます。


次に、この例では、リスト定義関数は次の形式を取ります。



例の関数のソースコード
  ()   =  ;  = ; .(, "");  =  .(); .(, "..");  ;   ()   =  ;  = ; .(, "..");  ;   ()   =  ;  =    .(); .(, "");  ;   ()   =  ;  = ; .(, "");  ; 
      
      







SetAccess()フォームのプロシージャを呼び出すだけで十分です。設定した要素の状態を取得します。



次のポイントを強調したいと思います。 リストのフォーム要素にパスを追加できます。 たとえば、Productsテーブルを使用した上記の例では、要素名は「Products。Columns。Discount on a discount card」と定義されています。 または、パンチチェックボタンへのパス。 「CommandPanel Name。Buttons。Submenu Name。Buttons。Buttons Name。」など、複数の添付ファイルを使用できます。



提案されたオプションは最終的なものではありません。 処理するリストと処理しないリストを示すなど、多くの小さな追加を行うことができます。 しかし、これはすでに開発者の要点に依存しています。



ご清聴ありがとうございました。



All Articles