この基本的な形式で処理を行います。
このフォームから追加のフォームを開く必要があり、フォームフィールドのテキストを開いたフォームに転送する必要があります。 追加フォームは以下の通りです。
したがって、「実行」ボタンをクリックすると、追加のフォームが開き、フィールドにすでに入力されているテキストが表示されます。
このような問題を解決する方法を考えてみましょう。
通常のフォーム間でパラメータを転送するには、フォーム モジュールのグローバル エクスポート変数を使用するか、フォーム属性を作成します。 このタスクでは両方の方法を検討してみましょう。
1. フォームモジュールのグローバルエクスポート変数を使用します。
「実行」ボタン ハンドラー プロシージャのメイン フォームに次のコードを追加します。
プロシージャ ButtonExecutePress(Button)Form = GetForm(" 追加フォーム" ) ; // "Text" は開かれているフォーム モジュールのグローバル エクスポート変数です形状。 テキスト = フォーム要素。 文章。 意味; 形状。 開ける(); 手順の終了テキスト変数は、「BeforeOpen」イベント ハンドラーとともに開かれているフォームのモジュールに追加されています。
可変テキストのエクスポート ; // 別のフォームからの値が渡される変数 BeforeOpen(Failure, StandardProcessing)FormElements のプロシージャ。 送信されたテキスト。 値 = テキスト;手順の終了
問題は非常に簡単に解決されました。
2. フォームの詳細を使用します。
結論
マネージド フォームでは、パラメーターを渡すのがはるかに簡単です。 従来の形式では、ほとんどの場合、上記のアプローチが使用されます。 記事の例を処理できます.
リンクからダウンロード
マネージド 1C アプリケーションでプログラムによってフォームを開くことは、通常のアプリケーションでフォームを開くこととは大きく異なります。 まず古い方法を見てみましょう。 これは、フォームを受信し、それを通常モードまたはモーダル モードで開くことで構成されます (モーダル モードで開くと、フォームはプログラムをブロックします)。
GetForm() 。 開ける()
これはフォームを開く最も遅い方法です。 ただし、フォームを開く前にプログラムでフォームを処理することができます。 コードを処理するには、少し変更する必要があります。 「文書。商品およびサービスの受領。文書フォーム」)
;
// ここではフォームを使用してアクションを実行します
形状。 開ける();
フォームを受信すると、別のイベント プロシージャが実行されることを考慮する必要があります。 サーバー上で作成されたとき。
マネージド 1C アプリケーションでフォームをより速く、より便利に開くことができる他の方法を見てみましょう。 特定の状況に応じて、異なる方法が使用される場合があります。
この場合、すべてが非常にシンプルです。
RefLink = ディレクトリ。 命名法。 FindByCode("000000001" ) ;
OpenValue(RefLink) ;
これには機能があります EnterValue()。この関数には 3 つのパラメータがあります。
関数を実行すると、指定したタイプのオブジェクトのデフォルトの選択フォームが開きます。
変数値。
配列 = 新しい配列;
配列。 Add(タイプ( 「DirectoryLink.命名法」)
)
;
配列。 Add(タイプ( 「ディレクトリリンク。取引相手」)
)
;
TypeDescription= 新しい TypeDescription(Array) ;
Res = EnterValue(Value, "Hint" , TypeDescription) ;
以前の方法では、オブジェクトのデフォルト フォーム (オブジェクト フォームまたは選択フォーム) のみを開くことができました。 カスタムフォームを開く必要がある場合は、関数を使用できます オープンフォーム()。
この関数にはかなりの数のパラメータがあります。 それらのいくつかを見てみましょう:
関数の使い方を見てみましょう オープンフォーム()さまざまな状況で。
各フォームには 1 つのキー属性があります。 フォームの詳細リストでは太字で強調表示されており、通常は次のように呼ばれます。 物体参考書や文書の要素の形で。 他のオブジェクトには別の名前が付いている場合があります。 既存のオブジェクトのフォームを開くには、開かれているフォームにパラメータを渡す必要があります。 鍵値をオブジェクトへの参照として使用します。
&OnClient
手順 Command1 (コマンド)
パラメータ = 新しい構造体;
パラメータ。 Insert("キー" , FindC() ) ;
OpenForm(, パラメータ) ;
手順の終了
サーバー上(&O)
関数 FindC();
ディレクトリを返します。 取引相手。 FindByRequisites ("TIN"、"745107734623")
エンドファンクション
ここでは単純な関数で十分です オープンフォーム()パラメータなしで。
&OnClient
手順 Command1 (コマンド)
オープンフォーム( 「ディレクトリ、取引相手、オブジェクトフォーム」)
;
手順の終了
パラメータを渡す必要があります ベース、その値は塗りつぶしベース オブジェクトへの参照になります。 これで手続きが始まります ProcessFill()。
&OnClient
手順 Command1 (コマンド)
パラメータ = 新しい構造体;
パラメータ。 Insert("Base", LinkToBuyerAccount) ;
オープンフォーム( 「文書。商品およびサービスの販売。オブジェクトフォーム」、パラメータ) ;
手順の終了
この例ではドキュメントを作成します 商品およびサービスの販売購入者への支払いのための請求書に基づいて記入され、リンクが送信されます。
1C フォームでの選択は単純な場合もあれば、複雑な場合もあります。 単純な選択には次のような式が含まれます 組織 = Horns and Hooves LLC.複雑な選択には、他のタイプの比較が含まれます。 リストに載ってる。 この記事では単純な選択の構成について検討し、別の記事で複雑な選択について説明します。
単純な選択を整理するには、開かれているフォームにキーを含むパラメーターを渡す必要があります。 選択の場合、値は、キーが動的リスト フィールドの名前、値が検索対象のデータである構造になります。
たとえば、ディレクトリ リスト フォームを開いてみましょう。 GTD 数値そして、所有者によってそこで選択を行います - ディレクトリ要素 命名法.
&OnClient
手順 Command1 (コマンド)
パラメータ = 新しい構造体;
選択 = 新しい構造;
選択。 Insert("所有者", LinkToNomenclature) ;
パラメータ。 Insert("選択範囲", 選択範囲) ;
オープンフォーム( 「ディレクトリ.GTD番号.リストフォーム」、パラメータ) ;
手順の終了
これを行うには、情報レジスタのエントリキーが必要です。
レコードキー— これらはすべての測定値と周期(レジスタが周期的である場合)です。 つまり、レコードキーはレコードを一意に識別できるパラメータです。
オープニングアルゴリズムは次のとおりです。
&OnClient
手順 Command1 (コマンド)
パラメータ = 新しい構造体;
KeyParameters= 新しい構造;
主要なパラメータ。 Insert("命名法", LinkToNomenclature) ;
主要なパラメータ。 Insert("価格タイプ", LinkToPriceType) ;
主要なパラメータ。 Insert("期間", 日付) ;
KeyArray = 新しい配列;
キー配列。 Add(キーパラメータ) ;
EntryKey = New( 「情報登録レコードキー.価格命名法」、キー配列) ;
パラメータ。 Insert("キー", RecordKey) ;
オープンフォーム( 「情報の登録、名称の価格、記録フォーム」、パラメータ) ;
手順の終了
印刷 (Ctrl+P)
フォーム パラメーター ([オプション] タブ) は、次の 2 つの目的を果たします。
● フォームの開き方に影響を与えるデータセットを記述します (フォームパラメータ化)。 これを行うには、必要なパラメータをすべてリストし、そのタイプを示す必要があります。
● フォームの一意性キーに影響を与えるパラメータを決定します。 これを行うには、プロパティを設定する必要があります キーパラメータフォームの一意性キーの形成に参加する必要があるパラメーター。 フォームを開こうとすると、システムは生成されたフォームの一意性キーを使用して既存のフォームを検索します。 受け取ったキーを持つフォームがシステム内に存在する場合
一意性、返されるのはこの形式です。 そうでない場合は、新しいフォームが作成されます。
フォームを呼び出すとき、開発者が作成したパラメータの値は、フォームのシステム パラメータ (存在する場合) とともにパラメータ構造体で指定できます。
フォームパラメータは、フォームの作成時にフォームに渡すことができます。 渡されたパラメータの分析はイベント内で実行できます WhenCreatingOnServer()
(Parameters コレクションはオブジェクトのプロパティです マネージドフォーム):
// 呼び出し場所で。
// フォームパラメータを作成する.
パラメータ = 新しい構造();
オプション.挿入("重要性"、 事前定義された値(「列挙.重要.重要」));
// パラメータを指定してフォームを開きます。
OpenForm (「GeneralForm.ViewForm」、パラメータ);
…
// フォームモジュール内。
サーバー上(&O)
手順 WhenCreatingOnServer(失敗、標準処理)
もし パラメータ.重要性 = 列挙.重要性.重要 o それから
…
endIf;
手順の終了
注意! イベントハンドラーを呼び出した後サーバー上で作成されたとき
キー以外のフォーム パラメーターはすべて Parameters コレクションから削除されます。
フォーム間の自動対話をサポートするために、システムはフォームを開いたときにフォームを制御するために使用される標準パラメータを多数提供します。 これらのパラメータを使用して、システムは選択フォームからの選択、オブジェクトフォームのオープン、標準コマンドの操作などをフォームフィールドに実装します。つまり、システムに組み込まれたさまざまなインターフェイス操作シナリオを提供します。
ただし、開発者はこれらのパラメータを組み込み言語で使用し、OpenForm() メソッドを呼び出すときに渡すこともできます。
フォーム拡張機能のタイプに応じた標準フォーム パラメータのリストは、次のセクションにあります。 内蔵言語 - インターフェース
(管理対象) – 管理対象フォーム – 拡張... 組み込み証明書
フォーム パラメーターがどのように機能するかを示すために、入力フィールドで要素を選択する実装を見てみましょう。 この例の本質は、組み込み言語のリストから要素を選択するメカニズムの実装です。
この例の作業を開始するまでに、次のプロパティを備えた構成が必要になります。
● グループと要素の階層を持つ Products ディレクトリがあります。
● SelectedProduct type の詳細を含む Analogues のディレクトリがあります。 ディレクトリリンク.製品;
● 両方のディレクトリに要素形式があります。
次に、プラットフォームが組み込み言語のリストから要素を選択するために使用するすべてのメカニズムをこの構成に実装しましょう。 この場合、次のことがわかります。
● 標準フォームパラメータの使用方法。
● システム自体がそれらをどのように使用するか。
● 開発者がそれらをどのように使用できるか。
要素を選択した後に選択フォームを閉じることを制御するパラメータを追加しましょう。 このパラメータを呼び出しましょう 選択後に閉じる(ブール型)。 これを、ディレクトリ Products を選択するためのフォーム パラメータ Form として追加しましょう。
要素選択フォームを開くには、Selected Product フォーム要素のフォーム要素に Start of Selection イベントのイベント ハンドラーを作成する必要があります。
&OnClient
手順 SelectedProductStartSelection(品目、標準処理)
標準加工= 偽;
選択オプション= 新しい構造;
選択オプション.挿入(“SelectionMode”、True);
選択オプション.挿入(「グループと要素の選択」, GroupsAndElements.Elements の使用);
選択オプション.挿入(「AllowRootSelection」、False);
選択オプション.挿入(「現在の行」、 オブジェクト.選択された製品);
選択オプション.挿入(「CloseAfterSelection」、False);
OpenForm(“Directory.Products.SelectionForm”, 選択オプション, Items.SelectedItem);
手順の終了
OpenForm() メソッドの 3 番目のパラメータについては別途検討する必要があります。 このパラメータは、選択フォームの所有者が誰になるか、および選択内容について誰が通知を受けるかを決定します。 この例では、フォーム要素自体を選択フォームの所有者として指定しましたが、このパラメータでフォーム自体を指定することもできます。 この場合、ハンドラーを実装する必要があります。 処理選択 form モジュールを開き、その中で選択したデータを配置するフォーム属性を決定します。
注記。 StartSelection イベント ハンドラーを実装しない場合、そのアクションはシステム自体によって実行されます。 これは、この例で使用されているすべてのハンドラーに当てはまります。
次に、選択フォームで渡されたパラメータを処理する必要があります。 これをハンドラーでやってみましょう イベントハンドラーを呼び出した後選択フォームモジュールの()。
サーバー上(&O)
手順 WhenCreatingOnServer(失敗、標準処理))
標準加工= 偽;
Elements.List.SelectingGroupsAndElements = Parameters.SelectingGroupsAndElements;
Elements.List.AllowRootSelection = パラメータ.AllowRootSelection;
Elements.List.CurrentRow = パラメータ.CurrentRow;
CloseOnSelection = Options.CloseAfterSelection;
手順の終了
設定したフォームパラメータの機能を確認するために、コンフィギュレータを使用して、選択フォームのテーブルの List プロパティを設定します。 グループと要素の選択 Groups 値に設定します (パラメータを使用しないと、ディレクトリ要素を選択できません)。
注記。 製品のリストを表示するリスト テーブルの SelectionMode プロパティが True に設定されていない場合、製品を選択することはできません。
次に、選択フォームで目的の要素の選択を処理する必要があります。 これを行うには、フォーム テーブルの SelectValue イベントのハンドラーを定義する必要があります。
&OnClient
手順 ListValueSelection(要素、StandardProcessing、値)
標準加工= 偽;
NotifyOfSelection(値);
手順の終了
入力フィールド自体に要素の選択処理を実装するだけです。 これを行うには、イベントを処理する必要があります 処理選択入力フィールドSelectedProduct。
&OnClient
手順 SelectedItemSelectionProcessing(Item, SelectedValue, StandardProcessing)
標準加工= 偽;
オブジェクト.SelectedProduct = SelectedValue;
手順の終了
フォーム上の入力フィールドの値を選択するためのシステム メカニズムを独自に実装しました。
注意!この例は完全ではありません。 その唯一の目的は、フォーム パラメーターを操作するメカニズムを示すことです。
If パラメータ作成時(ハンドラ) SelectedProductStartSelection()) 次の行を置き換えます。
選択オプション.挿入(「CloseAfterSelection」、True);
1 行あたり:
選択オプション.挿入(“CloseAfterSelection”、False) ;
そうすれば、選択後に選択フォームが閉じなくなります。 これは、たとえば、選択フォーム (選択フォームを閉じずに複数の製品を選択する) を実装するために使用できます。
フォーム間の自動対話をサポートするために、システムはフォームを開いたときにフォームを制御するために使用される標準パラメータを多数提供します。 これらのパラメータを使用して、システムは選択フォームからの選択、オブジェクトフォームのオープン、標準コマンドの操作などをフォームフィールドに実装します。つまり、システムに組み込まれたさまざまなインターフェイス操作シナリオを提供します。 ただし、開発者はこれらのパラメータを組み込み言語で使用し、OpenForm() メソッドを呼び出すときに渡すこともできます。
システムによって提供されるパラメータとその目的をリストします。
フォーム パラメーターがどのように機能するかを示すために、入力フィールドで要素を選択する実装を見てみましょう。 この例の本質は、組み込み言語のリストから要素を選択するメカニズムの実装です。
この例の作業を開始するまでに、次のプロパティを備えた構成が必要です。
次に、プラットフォームが組み込み言語のリストから要素を選択するために使用するすべてのメカニズムをこの構成に実装しましょう。 そうすることで、標準フォームパラメータがどのように使用されるかを見ていきます。 システム自体がそれらをどのように使用するか。 開発者がそれらをどのように使用できるか。
要素を選択した後に選択フォームを閉じることを制御する追加のフラグを追加しましょう。 このフラグを CloseAfterSelection (ブール型) と呼びます。 Products ディレクトリを選択するためのフォーム パラメーター Form として追加しましょう。
要素選択フォームを開くには、Analogues ディレクトリ要素の形式で、Selected Product フォーム要素の選択開始イベントのイベント ハンドラーを作成する必要があります。
&OnClient
プロシージャ SelectedProductStartSelection(Item, StandardProcessing)
標準処理 = False;
選択パラメータ = 新しい構造;
SelectionParameters.Insert("SelectionMode", True);
OpenForm() メソッドの 3 番目のパラメータには特別な注意を払う必要があります。 このパラメータは、選択フォームの所有者が誰になるか、および選択内容について誰が通知を受けるかを決定します。 この場合、フォーム要素自体を選択フォームの所有者として指定しましたが、このパラメータでフォーム自体を指定することもできます。 この場合、フォーム モジュール選択処理ハンドラーを実装し、その中で選択したデータをどのフォーム属性に配置するかを決定する必要があります。
この記事では、マネージド フォーム 8.2 を開くときに標準的な手段を使用してパラメータとして値を渡す方法を、通常のフォームで同様の操作を実装する方法と比較して説明します。
パラメーターが通常の形式で渡される方法
通常の形式では、パラメータを渡す方法は 2 つあります。
1) それほど一般的ではない方法: [詳細] タブのオブジェクト フォームに属性が追加され、必要に応じて視覚的な手段でアクセスが決定されました。
2) より一般的な方法: エクスポート変数がフォーム モジュールで宣言され、値が「開く前」ハンドラーで処理されました。
どちらの場合も、フォーム呼び出しは次のようになります。
Form = Object.GetForm("SelectionForm",FormOwner, UniquenessKey);
フォーム.パラメータ = パラメータ値;
Form.Open();
マネージドフォームでパラメータが渡される方法
マネージド フォームには、フォームを受信したときにすぐにパラメーターを渡す機能が追加されました。 パラメータは構造体として渡されます。
パラメータ = 新しい構造("CurrentValue", LastElement);
SelectionForm = GetForm("ディレクトリ.命名法.選択フォーム", パラメータ);
FoundItem = SelectionForm.OpenModal();
また、管理フォームには「フォーム拡張機能」(オブジェクト、リファレンスブック、ドキュメント、レポート)が追加されました。 オブジェクトのタイプに応じて、使用可能なパラメータの構成が決まります。 たとえば、ディレクトリ選択フォームで特定の要素に配置する必要がある場合は、「CurrentValue」パラメータが使用されます。 大きな利点は、フォーム自体に事前定義されたパラメーターのハンドラーを記述する必要がないため、コードの量が削減されることです。
開発者は、独自のパラメーターを定義することもできます (マネージド フォーム デザイナーの [パラメーター] タブ)。 パラメーターの有効期間は OnCreationOnServer ハンドラーによって制限されますが、これは論理的な理由です。 パラメーターはフォームを作成する場合にのみ必要ですが、このパラメーターがフォームの一意性を決定する場合 (パラメーターのプロパティで「キー パラメーター」フラグが設定されている場合)、他のハンドラーでも使用できるようになります。
特定の操作パラメータを渡すには、さらにもう少し行う必要があります。
1) 制御された形式でパラメータを定義します。
OnCreationOnServer ハンドラーで、このパラメーターの処理を定義します (FormDataStructure タイプを持つ「Parameters」プロパティを通じて、渡されたパラメーターにアクセスします)。
2) フォームの受信を記述し、GetForm 関数のパラメータに新しいパラメータの値を渡します。
したがって、コードは次のようになります。
- フォームを受け取った場所で
パラメータ = 新しい構造("NewParameter", LastElement);
SelectionForm = GetForm("ディレクトリ.命名法.選択フォーム", パラメータ);
マネージドフォームモジュール内
サーバー上(&O)
CreatedOnServer時の手順(失敗、標準処理)
If Parameters.Property("NewParameter") then
// ここにパラメータ処理コードがあります
endIf;
手順の終了
結論
おそらくこの記事は誰かにとって役立つでしょう。時間を節約し、不要なコードを省くことができます。 マネージド フォーム パラメーターの完全なリストの詳細については、ヘルプ「マネージド インターフェイス\マネージド フォーム」を参照することをお勧めします。
[リンクを表示するには登録が必要です]