IX. アイテムを選択すると、ドキュメント内の価格が自動的に置き換えられます。 品目の選択時に価格を伝票に自動置換する 伝票で置換する主組織を設定する方法

私たちの任務は次のとおりです。 商品の価格を別の情報レジスタに保存するようになりました。 サービス提供文書を作成または変更し、表形式部分に項目を追加するとき、情報登録から取得され、文書の日付に対応するこの項目の現在の価格を文書に即時に挿入したいと考えています。

これを行うには、2 つのことを行う必要があります。

まず、アイテムの現在の価格を返す特定の関数を作成し、アイテムがドキュメントに追加された時点でこの関数を呼び出し、この関数が返すアイテムの価格をドキュメントに置き換えます。

このような「サービス」は、この文書だけでなく、表形式の部分に命名法を含む他の文書でも必要になる可能性が高いため、この関数を「公的にアクセス可能な」場所、つまり共通モジュール内に配置します。

コンフィギュレーターモードの場合

商品の価格を返す関数

まず、商品の現在の小売価格を返す RetailPrice() 関数を作成し、それを一般構成モジュールに配置します。

コンフィギュレータを開き、[一般] 一般モジュール ブランチで新しい構成オブジェクト モジュールを追加し、それを WorkWithDirectories という名前にします。

モジュールの [サーバー] チェックボックスがデフォルトで選択されていることがわかります。 これは、このモジュールのインスタンスがサーバー側でのみコンパイルされることを意味します。

「サーバーを呼び出す」チェックボックスをチェックして、このモジュールのエクスポート手順と関数をクライアントから呼び出せるようにしましょう (図 9.9)。

その中に次のテキストを入れてみましょう (リスト 9.1)。

この機能について説明しましょう。

小売価格を取得するには、関数に 2 つのパラメーターを渡します。

CurrentDate は、小売価格値に関心がある時間軸上の点を定義する Date タイプのパラメーターです。

関数の本体では、まず、Selection ヘルパー オブジェクトを作成します。

これはレジスタ次元による選択を含む構造体です。 その助けを借りて、Nomenclature レジスタの次元が関数に渡されるディレクトリ要素への参照と等しいレジスタ エントリに興味があることがわかります。

構造キーの名前 (「Nomenclature」) は、コンフィギュレータで指定されたレジスタ次元の名前と一致する必要があり、構造要素 (Nomenclature Element) の値は、この次元に選択された値を指定します。

2 行目では、価格情報レジスター (Information Registers.Prices) のマネージャーに連絡し、GetLast() メソッドを実行します。このメソッドは、関数に渡された日付に対応する最新のレジスター レコードのリソース値を返します ( CurrentDate) とレジスタの次元 (選択) の値。

GetLast メソッドは、ResourceValues 変数に格納されているリソース値を含む構造体を返します。 一般に、レジスタには複数のリソースを含めることができます。 レジスタにはリソースが 1 つだけありますが、単一の要素を含む構造体が返されます。

したがって、次の行では、必要なレジスタ リソースの名前をドット (ResourceValues.Price) で指定するだけで、探している小売価格を取得し、関数の実行時にそれを返します。

この関数は、ドキュメントの実行のある時点で呼び出す必要があります。

アイテムを選択してドキュメントに価格を入力するときに関数を呼び出す

したがって、私たちに課せられた課題は次のとおりです。 サービス提供文書を編集するときは、ユーザーがサービスを選択した後に価格フィールドが自動的に入力されるようにする必要があります。 また、サービスの価格は文書の作成日に基づいて決定される必要があります。


コンフィギュレータでサービス プロビジョニング ドキュメントを見つけて、そのフォーム [ドキュメント フォーム] を開きます。

フォーム要素の List of ItemsNomenclature をダブルクリックするか、右クリックしてそのプロパティ パレットを開きます ([プロパティ] コンテキスト メニュー項目)。 リストの最後までスクロールすると、フィールド値が変更された後に発生する OnChange イベントが見つかります。

入力フィールドに虫眼鏡アイコンが表示された「開く」ボタン B をクリックします。

システムは、フォーム モジュールでこのイベントのハンドラー プロシージャのテンプレートを作成し、[フォーム エディター モジュール] タブを開きます。

これに次のテキストを追加してみましょう (リスト 9.2)。

ハンドラーの内容についてコメントしてみましょう。

ハンドラーの最初の行は、「変更時の品目数量のリスト」および「変更時の品目価格のリスト」プロシージャですでにおなじみです。 まず、後で必要になるため、ドキュメントの表形式部分の現在の行を取得し、TabularPart Row 変数に保存します。

次に、汎用モジュール Working With Directorys から RetailPrice() 関数を呼び出します。

最初のパラメータとして、価格を取得する必要があるドキュメントの日付をこの関数に渡します。 メインフォーム属性 - Object.Date からドキュメントの日付を取得します。



この関数は最後の価格値を返し、この値をドキュメントの表形式部分 (TabularPartRow.Price) の現在の行の Price フィールドに割り当てます。

Item List NomenclatureOnChange() プロシージャ自体は、フォームの対話型イベントのハンドラーであるため、クライアント側のフォーム モジュールで動作を開始することに注意してください。 このプロシージャのテンプレートを作成するとき、プラットフォームはプロシージャの記述の前に &OnClient コンパイル ディレクティブを自動的に配置します。

次に、RetailPrice() 関数が呼び出されます。 この関数はクライアント側には見つからないため、実行はサーバー上で実行される共通モジュール Working with Directorys に転送されます。 関数が完了した後も、プログラム コードはクライアント上で実行を続けます。

なぜこの事件でそのような「トリック」が使われたのでしょうか? コードの実行をサーバーに転送する必要があったのはなぜですか?

実際には、データベースのあらゆる作業 (データの読み取り、書き込み) はサーバー上でのみ可能です。 この場合、ある項目の情報レジスタから最新のデータを読み込む必要がありました。

このようなアクションはサーバー上でのみ実行できます。構文アシスタントで情報レジスタの GetLast() メソッドの説明を調べると、このメソッドはサーバー上、シック クライアント、およびサーバー上でのみ使用できることがわかります。外部接続で。

シック クライアントと外部接続は、レガシー アプリケーション ソリューションとの互換性のために存在するレガシー プラットフォーム クライアント アプリケーションです。

私たちは、シン クライアントまたは Web クライアントで動作するまったく新しいアプリケーション ソリューションを開発しています。 したがって、私たちの場合、データベースからデータを取得するには、コードの実行をサーバーに転送し、そこで必要なデータを受信して​​、このデータをクライアントに返す必要があります。 それが私たちがやったことです。

1C:エンタープライズモードの場合

ドキュメントがどのように機能するかを確認してみましょう。

1C:Enterprise をデバッグ モードで起動し、価格情報レジスタを開きます。

フィリップス製トランジスタの場合、別の数値で新しい価格を追加してみましょう (図 9.10)。

次に、文書「サービスの提供 No. 1」を開いてみましょう。覚えているとおり、この文書では、そのようなトランジスタを 1 つ「使い果たした」だけです。

文書の日付を変更しないままにして、文書の表部分の「名称」列でトランジスタの選択を繰り返してみましょう。 トランジスタの価格は、2009 年 7 月 1 日に自動的に設定されます。 これは文書日における最新の価格値です (図 9.11)。

ここで、文書の日付を 2009 年 7 月 13 日に変更して、トランジスタの選択を再度繰り返してみましょう。 この日付の最新の新しい価格値が設定されます (図 9.12)。

したがって、ドキュメントの作成時点での現在のサービスの価格がドキュメントに表示されます。


コントロールの質問

1. 情報レジスタ設定オブジェクトの目的は何ですか?

2. Information Register 構成オブジェクトにはどのような機能がありますか?

3. 情報レジスタと蓄積レジスタの主な違いは何ですか。

4. どのフィールドが蓄積レジスタの一意性キーを決定するか。

5. 定期的な情報登録とは何ですか、また独立した情報登録とは何ですか。

6. 情報の定期的な登録の作成方法。

7. レジスターの先頭の次元はどれくらいですか。

8. 組み込み言語を使用して最新のレジストリ エントリのリソース値を取得する方法。

1C プログラムで作業しているときに、いくつかのドキュメントをすばやく入力したり、新しいオブジェクトをディレクトリ (品目の種類、組織、倉庫、レジなど) に追加したりする必要が非常によくあります。 同時に、誰もが基本的な値の入力を自動化する方法を理解しているわけではないため、値を作成するときに必要な値がフィールドにすぐに代入されます。 この記事ではその方法を説明します。
1C プログラムには、文書や参考書の詳細な値を素早く記入できる仕組みがあります。 アクションに基づいて、次のタイプに分類できます。

  • 単一値の置換
  • 選択による値の置換
  • 統計の詳細を入力する
  • 以前に入力した詳細の置き換え
  • パターンを使用した値の置換
  • コピーして新しい文書を入力する

ユーザーが権限を持つ単一の値の置換。

組織に 3 つの倉庫があり、それらがデータベースに入力されているとします。 同時に、マネージャーは商品を1つからのみ販売できます。 新しいドキュメントを作成すると、このウェアハウスが自動的に挿入されます。 これは、ユーザーの設定された権限に基づいて機能します。 つまり、ユーザーが作業しないオブジェクトに対する権限をオフにすることで、データ入力を自動化できます。

リスト フォームで指定された選択に基づいて値を置き換えます。

リストが特定の詳細 (レジ、銀行口座、倉庫) によって選択されるように設定されている場合、この詳細は新しいドキュメントに自動的に入力されます。 たとえば、レジ​​文書のリストの形式でレジによる選択を設定します。 新しい支払文書を発行すると、選択したレジに関する情報がリストから自動的に取得されます。 また、レジには組織が指定されているため、組織に関する情報が自動的に入力されます。 ドキュメントの任意のリストで選択内容を使用できます。

統計の詳細を入力します。

1C プログラムは、各ユーザーの基本値の入力に関する統計を保持します。 新しい文書を作成するときに、同じ組織、部門、倉庫、取引などを 2 回入力した場合、プログラムは最後に入力した値を分析します。 したがって、統計的充填アルゴリズムは各ユーザーに自動的に「調整」されます。
ユーザーが新しい文書でこの連鎖に違反した場合、プログラムはこれを理解し、しばらくしてから新しい値の置換を開始しますが、最初のそのような文書では値は置換されません。
たとえば、すべての主要フィールド (倉庫、支払いスケジュール、価格など) が入力されている貿易協定または契約を選択した場合、別の詳細の値を選択するときに以前に入力した詳細を入力することができます。 契約書や契約書を文書に記載する場合は、以下のルールに従って記載します。

合意書または契約書に指定されたすべてのデータが入力されます。

合意書または契約書に値 (分割など) が指定されていない場合、この値は統計に従って入力されます。 新しい文書を入力するときに統計に従って値が入力された場合、契約書または契約書で定義されていれば再度入力されます。

テンプレートを使用した値の置換。

新しいタイプのアイテムが作成されるとき、新しいオブジェクトに置き換えられるデフォルト値を指定できることに注意してください。 このタイプのアイテムを新規登録する場合、これらの値は自動的に入力されます。 もう 1 つの例は、ドキュメントを作成するユーザーがユーザーのカードに定義されている部門に関する情報を持っている場合に、その部門に関する情報をドキュメントに自動的に置き換えることです。

コピーして新しい文書を入力します。

ここではすべてがシンプルです。 ユーザーが同様の文書をすでに入力している場合は、それをコピーして、変更されたデータを修正できます。 日付などの詳細に特に注意して、すべての詳細を確認してください。

類似の文書や参考書を入力しやすくするための主な方法を 5 つ紹介します。 ぜひ日々の業務に活かしてください

1C に詳細の値をすばやく入力するにはどうすればよいですか?

質問: フィールド 1c のコードを置き換える


こんにちは、日付間の日数をカウントするプロシージャをどのフィールドに挿入する必要があるのか​​教えてください。プロシージャ自体は見つかりましたが、この質問に対する答えは「いいえ」です。

フィールドには、チェックイン日、チェックアウト日、数量フィールドがあり、最初の 2 つの値の差がどこに収まるかを示します。
どのイベントにプロシージャを追加する必要がありますか?

答え:「出発日」フィールドの「OnChange」イベント:

質問: 自動データ置換が機能しません

答え:

ご回答いただきありがとうございます:
1) 1C:Enterprise 8.3 (8.3.4.437)、ウクライナの会計: バージョン 2.0.4.3。
2) 特に nsk1C: 「あなたはいつも、必要のないところに目を向けてしまう癖があります。私の質問には基本付加価値税税率について一言もありません。これは第一に、第二に、ウクライナでの 1C 製品を禁止する法令を注意深く読んでください。それなら、もう自分の考えを書いてください。」

ご回答ありがとうございます。コードのどこに設定されているかをより正確に知りたいです。

質問: 入力フィールドと最後に Enter


Web クライアントで動作する管理フォーム。
状況: スキャナーを F7 + バーコード + Enter にプログラムしました。 いろいろ試してみましたが、「ShowValueInput」でコードを読み込むことができません。 私はこの選択肢を放棄しました。
2. 入力フィールドのあるフォームを作成しました。 F7 キーを使用すると、フォームが開き、入力フィールドにコードが表示され、入力してからそれを押します (テキスト ドキュメント フィールドで確認しました)。 テキスト入力の終了イベントをキャッチしようとしていますが、次の理由で機能しません... キーボードの Enter キーを物理的に押すと機能します。 AutoFit イベントは私にとって最良の選択肢ではありません。なぜなら... バーコードは手動で入力できますが、クリック間のわずかな遅延を回避するには、何らかの手段を考え出す必要があります。
教えてください、もっと簡単なオプションはありますか?

答え:() フォームが開き、コードが送信されます - イベントは処理されません

質問: ACS レポートとテーブル フィールド


ACSを使用してレポートを作成しています。 結果をテーブルフィールドに表示するにはどうすればよいですか? スプレッドシート文書のフィールドではなく、テーブルフィールドにあります。

答え:スプレッドシート ドキュメント フィールドは、スプレッドシート ドキュメント属性 (フォーム) に属するフォーム要素 (データがその中に表示されます) です。
スプレッドシート ドキュメントに値を書き込むと、スプレッドシート ドキュメント フィールドにこの値が表示されます。
そこに値を書き込むにはどうすればよいでしょうか?

質問: フィールドへのフォーカスが奇妙に機能します


1C (8.3.8.2088) での自己作成の設定、管理されたフォーム、タクシー インターフェイス。

次のコードを使用して、OnChange イベントをフィールドにアタッチします。

1C
1 2 3 4 標準処理 = False ; 選択データ = NewValueList; 選択データ。 Add(オブジェクト.番号) ;

テキスト入力の最後にコードを付けます

すべては機能しますが、どういうわけか歪んでいます。

要素はフォーカスを取得しますが、図に見られるように、どういうわけか半分しかフォーカスされていません。

コードの後は次のようになりました。

つまり、黄色の枠とフィールドのデザインが消えています。 機能しますが、きれいではなく、目を引きます。

答え:つまり、数値が変更されるとレタリング フォームが表示され、変更の理由を記入します。フォームを閉じると古い値が返され、フォーカスはフィールドに残ります。 これを行う最善の方法について他にアイデアはありますか?

質問: フォームテーブルのフィールド


良い一日。
品名が表示されず品番のみが表示される標準品目選択フォーム(ut11)もございます!

標準のフォーム設定に戻そうとしましたが、役に立ちませんでした。フィールド/列は表示されません。

コンフィギュレータ:

畑には騒音があります。 リストは「常に使用」に設定されています。
OnOpen() だけでなく OnFormCreate() をデバッグしても、

Elements.ListAdvancedSearchNomenclature.SubownedElements

利用可能、すべてが可視性とアクセシビリティ モードになっており、機能的なオプションはありません。

データへの同じパスを持つ独自のフィールドを追加しようとしましたが、それも表示されません。
1時間経過してもフィールドが表示されません。 助けてください

答え:

それからああ! 名前フィールドを別のグループにドラッグすることができましたが、表示されませんでした。
そして最初のボタンで それはまだ復元されていませんでした、私はそれがあなたを助けるだろうと確信していました。

質問: ディレクトリ要素を選択するときに、名前ではなくコードを表示するにはどうすればよいですか?


タブがあります。 この部分には、directorylink タイプのフィールドが含まれています。 このフィールドで要素を選択するときに、名前ではなく属性コードを表示するにはどうすればよいですか? (管理フォーム)

答え: トゥクルウェグスド、))) はい、まさにこれが質問です

からのメッセージ ポラックス

コードフィールドをテーブルに追加することはできないでしょうか?

質問: SKD レポートの選択選択フィールド


こんにちは皆さん、質問があります。 レポートに選択項目を表示したいのですが、何かが妨げになっています。アドバイスが必要です...

このフィールドに対して、取引先は次のコードを入力し、内部選択を行いますが、左側のフィールドの比較ビューを表示してユーザーにリンクするにはどうすればよいですか?

1C
1 2 3 4 5 6 7 8 9 10 11 プロシージャ UsersOnChange(Element) エクスポート パラメータ = ComposerSettings。 設定。 データパラメータ。 Find ParameterValue(NewDataCompositionParameter("Users") ) ; パラメータ。 値 = ユーザー。 パラメータ。 使用法 = True ; 選択要素 = 設定コンポーザー。 設定。 選択。 要素。 Add(タイプ( 「データ構成選択要素」) ) ; 選択要素。 ComparisonView = DataCompositionComparisonView。 等しい; 選択要素。 LeftValue = NewDataCompositionField( 「ResponsiveRequestの責任者」) ; 選択要素。 RightValue = ユーザー; 手順の終了

答え: デスモント, コードを削除すると、フォームにはアクセス制御システムと選択フィールドだけが残り、空のレポートが表示されます...

1時間50分後に追加
デスモント、アクセス制御システムを選択するときに空のレポートがあった理由がわかりました。ユーザーに対するアクセス制御システムのリクエストに条件がありました。それを削除したところ、すべてが機能しました。 ヒントをありがとう)

質問: コードを使用せずに動的リスト内のフィールドの構成を変更することはできますか?


みなさん、良い一日を。 クリーンなフォームがあり、その上にカスタムクエリを含む動的リストがあり、1つのテーブル(ディレクトリ、メインのDSテーブル)、1つのリンクフィールド、および特性があります。

特性のあるフィールドは、選択、並べ替え、デザインにすぐに使用でき、グループ化のために選択できます。 すべてが機能しています。 ただし、これを追加フィールドとして単純に選択することはできません (別の列のリンクの隣に表示されるようになります)。 どういうわけか、これがすべてコードの助けを借りて行われることは明らかですが、本当にこれはコードなしでは実行できないのでしょうか?
フォーム上に配置できるカスタム データ レイアウト要素はたくさんありますが、フィールドを追加するだけの方法はありませんか? それとも私が何か間違ったことをしているのでしょうか?

答え:一般に、データ コンポジターで列をどのように回転させても、(コードなしで) 列を追加することはできませんでした。 列を担当するのは ds form 属性ではなく、論理的な form 要素であるため、これはおそらく不可能です。 リンカーは、データ、フォーム要素、表示 (列を含む) を制御します。
つまり、プログラムで Form 要素の下位要素を増やさない限り、それらを変更することはできません。
ありがとうございます。

質問: PM のメッセージフィールドに基づいて入力しても入力されません


同僚のヘルプ ZUP 2.5 のドキュメントに基づく一般的な入力ではありません。メッセージ - PM のフィールドは入力されていますが、入力されていません - 日付と入力します。 塗りつぶし処理のコード。
フォームに詳細を入力すると、実行されます...

答え:ああ、彼は別のフィールドで悪態をつきました - この列が非表示になっているだけです) インターフェイスに入力すると、開始日フィールドからコピーされます

次の問題を解いてみましょう。 サービス提供文書を作成または変更するとき、および表形式部分にサービスの範囲を追加するときは、情報登録から取得され、文書の日付に対応する現在価格がすぐに挿入される必要があります。

これを行うには、次のものが必要です。

    現在の価格を返す RetailPrice 関数を作成します。

    新しい項目がドキュメントに追加されたときに関数を呼び出します。

このような関数は将来必要になる可能性があるため、「パブリックにアクセスできる」場所、つまり共通モジュールに記述します。

1. 関数を作成する 小売価格一般ブランチ – という名前の一般モジュール ディレクトリの操作。 フラグを設定する サーバー呼び出し(エクスポート手順とこのモジュールの関数をクライアントから呼び出せるようにするため) (図 71a)。

米。 71a. 共通モジュールプロパティ

2. 次のテキストをモジュールに配置します。

関数 RetailPrice(CurrentDate,ServiceNomenclatureElement)Export

//補助オブジェクトの選択を作成します

選択 = 新しい構造("サービス命名",サービス命名要素);

// 現在のレジストリ リソース値を取得します

ResourceValues=InformationRegisters.Prices.GetLast(現在の日付, 選択);

戻りリソース値.価格;

エンドファンクション

機能を説明しましょう。

小売価格を取得するには、関数に 2 つのパラメーターを渡す必要があります。

    現在の日付– Date タイプのパラメーター。小売価格の値に関心がある時間軸上の点を定義します。

この構造には以下が含まれます 選択レジスタの測定に従って。 その助けを借りて、サービスレジスタの命名規則に必要な次元が決定されます。これは、関数に渡されるディレクトリ要素への参照と等しくなります。

構造体キー名("H サービスの命名法") は、コンフィギュレータで指定されたレジスタ次元の名前、および構造要素 ( サービスの命名法の要素) は、このディメンションに対して選択された値を指定します。

2 行目には、情報登録マネージャーの呼び出しが含まれています。 情報の登録、価格) とメソッドの実行 RunLast()、関数に渡された日付に対応する最新のレジスタ エントリのリソース値を返します ( 現在の日付) と測定値を登録します 選択.

方法 最新の取得変数に格納されているリソース値を含む構造体を返します。 リソース値。

次の行では、必要なレジスタ リソースの名前をドットで区切って指定することで、必要な小売価格を取得します ( 値リソース.価格)、関数が実行されるときにそれを返します。

それ。 この関数は、ある時点で呼び出すことができます。

開く必要があります 文書形式のサービスの実行(以前に作成されました)。 で フォームモジュール必要 変更時の手順を追加.

これを行うには、フォーム要素「アイテムとサービスのリスト」をダブルクリックします (図 71b)。

米。 71b. サービスパフォーマンス文書の要素

イベントのプロパティウィンドウ内 変化するとき次のテキストを使用してイベント ハンドラーを作成します。

&OnClient

変更時の名称サービス(要素)の手順一覧

//テーブルセクションの次の行を取得します

TabularPart Row = Elements.List of Nomenclature.CurrentData;

//価格を設定する

TabularPart Row.Price = Directorys.RetailPrice(Object.Date, TabularPartLine.Service) の操作;

手順の終了

機能を説明しましょう。

最初の行はすでにわかっています。まず、文書の表部分の現在の行を取得します。 後で必要になり、変数に保存します 行表パーツ.

次に関数を呼び出します 小売価格()共通モジュールから ディレクトリの操作.

この関数の最初のパラメータは、価格を取得する必要があるドキュメントの日付を渡します。 フォームの主な詳細から文書の日付を取得します。 オブジェクト.日付.

この関数は最後の価格値を返し、この値はドキュメントの表形式部分の現在の行の Price フィールドに割り当てられます ( RowTabularPart.Price).

手順に注意してください 命名規則のリストServiceWhenChanged()クライアント側のフォームモジュールで動作を開始します。 これはフォームの対話型イベント ハンドラーです。 このプロシージャのテンプレートを作成すると、プラットフォームはプロシージャの説明の前にコンパイル ディレクティブを自動的に配置します。 &OnClient.

次に関数を呼び出します 小売価格()。 なぜなら この関数はクライアント側で見つからないため、実行は一般モジュールに転送されます。 ディレクトリの操作、サーバー上で実行されます。 関数が完了した後も、プログラム コードはクライアント上で実行を続けます。

上記の手順を確認して、1C:エンタープライズモードでアプリケーションを起動してみましょう。 開発した構成を使って作業してみましょう.

DB へのデータの入力

1. サービスの提供に関する少なくとも 8 つの文書をアプリケーションに入力します。