1s 8.3 値の表から選択します。 どのようなメソッドが存在し、複数の値を同時に検索する方法

17.03.2024 モニター

1C 8.3 (8.2) プラットフォームの値のテーブルは、開発者がソフトウェア開発中にアルゴリズムを実装するために使用できる値の普遍的なコレクションです。 基本的に、1C 値テーブルは列と列を持つ動的な値のセットです。

1C のその他の普遍的な値のコレクションに関する記事

私の著書「11 ステップで 1C でプログラミング」の場所で 1C でプログラミングを学びましょう

  1. この本は初心者向けに、明確でシンプルな言葉で書かれています。
  2. 1C アーキテクチャを理解することを学びます。
  3. 1C 言語でコードを書き始めます。
  4. 基本的なプログラミング技術をマスターします。
  5. 問題集を使って知識を定着させましょう。

初心者の開発者と経験豊富なプログラマの両方を対象とした、マネージド 1C アプリケーションでの開発に関する優れたガイド。

  1. 非常にアクセスしやすく、わかりやすいプレゼンテーション言語
  2. 書籍はPDF形式で電子メールで送信されます。 どの端末でも開けます!
  3. マネージド 1C アプリケーションのイデオロギーを理解する
  4. マネージド アプリケーションの開発方法を学びます。
  5. マネージド 1C フォームの開発方法を学びます。
  6. 管理フォームの基本的かつ必要な要素を操作できるようになります。
  7. マネージドアプリケーションでのプログラミングが明確になる

15% 割引のプロモーション コード - 48PVXヘユ


このレッスンが問題の解決に役立った場合、気に入った場合、または役立つと感じた場合は、任意の金額を寄付して私のプロジェクトをサポートできます。

手動で支払うことができます。

Yandex.Money - 410012882996301
ウェブマネー - R955262494655

私のグループに参加してください。

infostart読者の皆様、こんにちは。 この記事では、マネージド アプリケーションのフォームに値の任意のテーブルをプログラムで作成する問題について取り上げます。

タスクの特徴。

通常のアプリケーションでプログラミングをしたことがある人なら誰でも、フォーム上の任意の値のテーブルを取得するというタスクに直面したことがあります。 任意の値のテーブルとは、列の数と種類が事前に不明なテーブルです。 つまり、列が 3 つ、場合によっては 6 つ、あるいは 8 つになる可能性があります。通常のアプリケーションでは、すべてが単純です。処理フォームに「値のテーブル」要素を配置し、作成した値のテーブルを転送できます。プログラムでこの要素に追加します。 次に、簡単なコマンドを使用します。

フォーム要素.TableField.CreateColumns();

フォーム上の既製の値のテーブルを取得します。 もっと簡単にできるように思えます。

これはすべて通常のアプリケーションに含まれていました。 マネージド アプリケーションでは、すべてが変わりました。 任意のテーブルを作成するのはそれほど簡単ではありません。 次に、フォーム上の値のテーブルを厳密にパラメータ化するか、プログラムで作成する必要があります(まあ、実際、これがマネージドアプリケーション自体の本質です)。 これが私たちがやろうとしていることです: 制御されたフォーム上に値の任意のテーブルをプログラムで作成します。

問題の解決策。

最初に行う必要があるのは、テーブルがフォーム上でどのように表示されるかを決定することです。 重要なことは、処理中にフォーム要素を作成する必要がないことです。 テーブル全体と同様に、プログラムで作成します。 つまり、必要な人に応じて、フォームを開いた瞬間、またはボタンを使用したときにテーブルが記述され、作成されます。

フォーム上でのテーブルの作成は、属性としての値テーブルの記述によって行われます。
SelectionTypeArray = 新しい配列; SelectionType.Add(Type("値テーブル")) の配列。 ChoiceTypeDescription = 新しい TypeDescription(ChoiceTypeArray); 詳細の配列 = 新しい配列; 属性の配列.Add(New Form Attributes("スケジュール テーブル", SelectionType の説明, "", "TZN")); 次に、データを含むプログラム値テーブルを作成する必要があります。 値のテーブルがクエリから取得された場合、すべてが多かれ少なかれ順番に整います。 テーブルを手動で作成する場合、数値または日付を含む列の意味は、「タイプの説明」を通じて作成できます。 重要なのは、値のテーブルの列には何らかの型が必要であるということです。 たとえば、ユーザーがこれらの列に対話的にデータを入力することが予想される場合、名前だけで値テーブルの列を追加することはできません。その列には型が必要です。 覚えておいてください - これは非常に重要です... これらのタイプをフォーム上のテーブルに転送します。
いくつかの列を含むテーブルを作成します。
CD = NewDateQualifiers(DateParts.Time); ArrayKD = 新しい配列; ArrayCD.Add(Type("日付")); 説明タイプ時間 = 新しい説明タイプ(ArrayCD,CD); TZ = 新しい値テーブル。
TK.Columns.Add("With", descriptionTypesTime);
TK.Columns.Add("Before", descriptionTypesTime);
TK.Columns.Add("名前");
TK.Columns.Add("Note"); // フルネームとメモ - 行 次に、TK プログラム テーブルに必要なデータを入力します。 必要な値を含む TK テーブルを取得し、作成されたフォーム属性に転送する準備ができています。 TK の列ごとにサイクルします。

Attributes.Add(New Form Attributes(Column.Name, Column.ValueType,"ScheduleTable")) の配列;
エンドサイクル;
ChangeDetails(ArrayDetails);
SelectionFieldsTable = Elements.Add("TZN", Type("FormTable"));
SelectionFieldsTable.DataPath = "スケジュールテーブル";
SelectionFieldTable.Display = TableDisplay.List;

これは簡単な組み合わせで、テーブルの準備が整いました。

TK からの各列のサイクル。

NewElement = Elements.Add(Column.Name, Type("FormField"), SelectionFieldTable);
NewElement.View = FormFieldView.InputField;
NewElement.DataPath = "スケジュールテーブル"。 + 列.名前;
NewElement.Width = 10;
エンドサイクル;

条件付き設計は、必要に応じて、コマンド メニューを手動で作成します。 テーブル ハンドラーも手書きで作成されます。 たとえば、「選択」テーブルのイベント ハンドラーを追加するには、次のようにします。

SelectionFields.SetAction("Selection","TZNSelection"); のテーブル

このイベントを処理するには、別のプロシージャがプロシージャの形式で規定されています。

&OnClient
プロシージャ TKNSelection(TK, SelectedRow, Field, StandardProcessing)
//プロセッサコマンド EndProcedure

テーブル ハンドラーはクライアント上で起動されるため、コンパイラ ポインター コマンドが必要であることに注意してください。

&OnClient

最後に付け加えておきたいのは、これらの手順をすべて行った後、完成したテーブルを忘れずに form 属性に渡すことです。

ValueВFormProperties(ToR, "ScheduleTable");

その結果、次のようになります。


「Selection」イベントの処理は次のとおりです。



あとがき。

この記事が、プログラムでフォーム上にテーブルを作成し始めている 1C プログラマーに役立つことを願っています。

値のテーブルをプログラムで作成し、独自のテーブルの作成に役立つコメント付きで管理可能なフォームに表示する処理をダウンロードできます。

1C値の表を検索する

どのようなメソッドが存在するのか、また複数の値を同時に検索する方法は何か。

値のテーブルを検索するには、次の 2 つの特別な方法があります。

1. 探す

TVHorizo​​n = Directorys.Nomenclature.FindByName("TVHorizo​​n");
FoundString = TZNomenclature.Find(TVHorizo​​n);
//検索を高速化するために、検索する列を指定することもできます
FoundString = TZNomenclature.Find(TVHorizo​​n, "命名法");

このメソッドは、目的の値が含まれる最初の行を返します。見つからない場合は Unknown を返します。 したがって、一意の値を検索するために使用すると便利です。 そうしないと、値が見つかったときに、次の値を見つけるためにテーブルからその値を削除する必要があります。

この面倒を避けるために、一致する文字列の配列を見つけることができる次のメソッドがあります。

2.文字列の検索


選択構造.Insert("命名法", TVHorizo​​n); // 最初に検索する列を指定し、次に何を検索するかを指定します。

このメソッドは常に配列を返しますが、何も見つからない場合は空になる可能性があります。 そして、このメソッドは、前のメソッドと同様に、別の配列の値そのものではなく、値のテーブル自体の行を返します。 したがって、配列文字列の値を変更するか、前の方法と同様に、見つかった文字列の値を変更することにより、処理された値のテーブルの値が変更されます。

このメソッドのもう 1 つの優れた点は、値テーブルの複数の列を一度に検索できることです。


選択構造 = 新しい構造;
選択構造.Insert("命名法", TVHorizo​​n);
選択構造.Insert("数量", 10);
行の FoundArray = TZNomenclature.FindLines(SelectionStructure);

ご覧のとおり、唯一の欠点は、「等しい」以外の他のタイプの比較を使用できないことです。

ここでは、初心者向けのちょっとした事実を示します。値のテーブルを操作する簡単な例です。

1. 値の表を作成する

値テーブル = 新しい値テーブル;


2. 値のテーブルの列を作成します。

ValueTable.Columns.Add("名前");
値 Table.Columns.Add("姓");


3. 列名を使用して新しい行を追加します。


NewLine.Name = "ヴァシリー";
NewLine.LastName = "パプキン";


4. 値テーブルで値を検索する方法:
目的の値を含むテーブル行を見つける必要があります。

FoundRow = ValueTable.Find(SearchValue);


5. 値の表の特定の列で最初に出現するものを検索します。

FoundRow = ValueTable.Find(SearchValue, "サプライヤー、バイヤー");


6. 値の表内のすべての出現箇所を検索する必要がある場合は、次のようにします。
検索構造を使用します。

SearchStructure = Structure("従業員", SearchValue);
FoundRows の配列 = ValueTable.FindRows(SearchStructure);


検索構造を作成しましょう。その各要素には、キーとして列の名前が含まれ、この列の目的の値が値として含まれます。 検索構造をパラメータとして FindLines() メソッドに渡します。 その結果、テーブル行が得られます。
たとえば、責任者列などの検索構造に目的の値の検索を追加すると、FindLines() メソッドを適用した結果、従業員と責任者の両方が一致するすべての行が取得されます。検索された値。

7. 値のテーブルをランダムな順序で反復処理する方法

値のテーブルからの現在の行ごとのループ
Report(CurrentRow.Name);
エンドサイクル;

インデックスを使用しても同じこと:

SeniorIndex = ValueTable.Quantity() - 1;
アカウント = 0 から SeniorIndex サイクルの場合
Report(TableValues[アカウント].名前);
エンドサイクル;


8. 既存の値テーブル行の削除

ValueTable.Delete(削除する行);

インデックスによる

ValueTable.削除(0);


9. 値テーブルの既存の列の削除

ValueTable.Columns.Delete(ColumnToDelete);


インデックスによる

ValueTable.Columns.Delete(0);

値のテーブルの「中央」から行(または列)を削除すると、削除された行(または列)の「後」にある行のインデックスが 1 つ減少することを考慮する必要があります。

10. 列名が変数に含まれている場合、値のテーブルを埋めるにはどうすればよいですか?

NewRow = ValueTable.Add();
NewRow[列名] = 値;


11. 値テーブルの列全体に希望の値を入力するにはどうすればよいですか?
値表の値表の「会計フラグ」列には、値「False」を入力する必要があります。

値の表。値を入力します (False、「財務会計フラグ」)。


値テーブルには FillValues() メソッドを使用します。 最初のパラメータは、入力される値です。 2 番目のパラメータは、入力される列の名前です。

12. 値テーブル「Receiver Table」に値テーブル「SourceTable」のデータを入力するにはどうすればよいですか?

操作時に受信者テーブルがまだ存在していないか、以前の列を保存する必要がない場合は、元のテーブルの完全なコピーとして作成できます。

受信者テーブル = ソーステーブル.Copy();


オプション 2: ReceiverTable テーブルは存在しますが、その列と列のデータ型の制限が失われるのは残念です。 ただし、ソーステーブルの名前と名前が一致する列のデータを入力する必要があります。

名前が一致する列の部分的なデータ転送:

SourceTable サイクルからの SourceTable の各行について
FillPropertyValues(NewRow, SourceTableRow);
サイクルの終わり


ソーステーブルの行ごとに、新しい行が受信テーブルに追加され、ソーステーブルの列の名前と名前が一致する新しいテーブルの列に値が入力されます。

テーブルに同じ名前の列がない場合、宛先テーブルには、ソース テーブルに存在した行と同じ数の NULL 値を持つ行が含まれることになります。
同じ名前の一部の列について、ソース テーブルのデータ値の型が宛先テーブルで許可されている列の型の配列に該当しない場合、そのようなフィールドでは空の値が取得されます。
3 番目のケースを考えてみましょう。 同じ名前の列の場合、宛先テーブルの列はソース テーブルの列と完全に一致する必要があります。

名前が一致する列のデータを完全にコピーする

同じ列 = New Array();

SourceTable.Columns の各列のサイクル
MatchingColumn = TableReceiver.Columns.Find(Column.Name);

列が一致する場合<>未定義その後

// 列のプロパティを取得します。
名前 = 列.名前;
値タイプ = 列.値タイプ;
ヘッダー = 列.ヘッダー;
幅 = 列.幅;

// 宛先テーブルの列を置換します。
インデックス = TableReceiver.Columns.Index(MatchingColumn);

TableReceiver.Columns.Delete(インデックス);
ReceiverTable.Columns.Insert(インデックス、名前、値の種類、ヘッダー、幅);

// 一致する列の次の名前を配列に追加します。
同じ Columns.Add(Column.Name);

endIf;

エンドサイクル;

// ソーステーブルの行を循環します。
SourceTable サイクルからの SourceTable の各行について

// 宛先テーブルに新しい行を追加します。
NewRow = TableReceiver.Add();

// 一致するセルに値を入力します。
それぞれの名前の列 同じ名前の列から サイクル
NewRow[列名] = SourceTableRow[列名];

エンドサイクル;

エンドサイクル;


宛先テーブルの列を新しい列に置き換える必要があります。そのプロパティはソース テーブルの列に完全に対応します。
したがって、同じ名前の列が受信者のテーブルで見つかった場合は、新しい列のすべてのプロパティを変数に収集します。 次に、古い列を削除して新しい列を作成します。 次に、ソーステーブルの行をループします。
ループでは、受信テーブルに新しい行を追加し、一致する列の配列内の列名に対してループを開きます。
このネストされたループ内で、宛先テーブルのセルにソース テーブルのセルのデータを入力します。

13. 型制限のある値の「ValueTable」テーブルに列を追加するにはどうすればよいですか?

列を追加するときは、その名前を指定するだけで、Add() メソッドの 2 番目のパラメーターはそのままにすることができます。 この場合、列のデータ型は任意です。

データ型を指定せずに列を追加する

// 型の制限なしで列を追加します。
ValueTable.Columns.Add("オブジェクト");


2 番目のパラメータの値を入力できます。 そこでは、列に許可されている型の説明を渡す必要があります。 説明自体は、コンストラクターを使用して、型の文字列名 (型が多い場合はカンマで区切る) または有効な型の配列をパラメーターとして渡すことで取得できます。

データ型を示す列の追加

// 列のデータ型の制限:
// 「Counterparty」ディレクトリの要素のみ。
値の表.Columns.Add("Account", タイプの新しい説明("DirectoryLink.Accounts"));


列データの入力に許可されている型の中に文字列がある場合は、そのビット深度 (長さ) を制限し、可変長または固定長の使用を指定できます。 これはすべて、String Qualifiers コンストラクターを使用してオブジェクトを作成することによって実現されます。 次に、このオブジェクトは TypeDescription コンストラクターのパラメーターの 1 つとして使用されます。

修飾子を使用して値テーブル列のデータ型を指定する

// String型のデータを準備し、制限を設定します。
文字列修飾子 = 新しい文字列修飾子(20、AllowedLength.Variable);
ValidTypes = NewTypeDescription("String", StringQualifiers);
ValueTable.Columns.Add("NoteStringShort", ValidTypes);


同様のアクションを数値修飾子と日付修飾子に対して実行できます。
注: 型の説明は、コンストラクターによって「最初から」構築することも、既存の型の説明を基礎として使用することもできます。

既存の型宣言を使用して値テーブル列のデータ型を指定する

// 以前に使用した型の説明の拡張。
QualifiersNumbers = New QualifiersNumbers(10, 2, ValidSign.Non-negative);
DateQualifiers = NewDateQualifiers(DateParts.Date);
Extended ValidTypes = New TypeDescription(ValidTypes, "数値, 日付", 数値修飾子, 日付修飾子);

ValueTable.Columns.Add("メモ", ExtendedAcceptableTypes);

ビジネスでは金銭や物品を管理するために、さまざまな表が広く使用されています。 ほとんどすべてのドキュメントは表です。

1 つのテーブルには、倉庫から出荷される商品がリストされています。 別の表は、これらの商品に対する支払い義務を示しています。

したがって、1C では、テーブルの操作が重要な位置を占めます。

1C の表は「表部品」とも呼ばれます。 ディレクトリ、文書などにそれらがあります。

クエリを実行すると、2 つの異なる方法でアクセスできるテーブルが返されます。

最初の - より高速な - 選択、そこからの行の取得は、順番にのみ可能です。 2 つ目は、クエリ結果を値のテーブルにアップロードし、それにランダムにアクセスすることです。

//オプション 1 – クエリ結果への順次アクセス

//テーブルを取得する
選択 = Query.Run().Select();
// クエリ結果のすべての行を順番に調べます
While Select.Next() ループ
レポート(選択内容.名前);
エンドサイクル;

//オプション 2 – 値のテーブルへのアップロード
Request = New Request("SELECT Name FROM Directory.Nomenclature");
//テーブルを取得する
テーブル = Query.Run().Unload()。
//さらに、すべての行を反復処理することもできます
テーブルの各行のサイクル
レポート(文字列.名前);
エンドサイクル;
//または文字列に任意にアクセスする
Row = Table.Find("シャベル", "名前");

重要な特徴は、クエリ結果から取得されるテーブルでは、すべての列が厳密に型指定されることです。 これは、Nomenclature ディレクトリから Name フィールドをリクエストすると、許容される長さが N 文字以下の String 型の列を受け取ることを意味します。

フォーム上のテーブル (シッククライアント)

ユーザーは、テーブルをフォーム上に配置すると、テーブルを操作します。

フォームの操作の基本原則については、 のレッスンと のレッスンで説明しました。

それでは、フォーム上にテーブルを配置しましょう。 これを行うには、コントロール パネルからテーブルをドラッグします。 同様に、メニューから「フォーム/コントロールの挿入」を選択できます。

データは構成に保存できます。その場合、フォームを編集している構成オブジェクトの既存の (以前に追加された) 表形式の部分を選択する必要があります。

「データ」プロパティの「...」ボタンをクリックします。 表形式パーツのリストを表示するには、「オブジェクト」ブランチを展開する必要があります。

表形式の部分を選択すると、1C 自体がフォーム上の表に列を追加します。 このようなテーブルにユーザーが入力した行は、参考書/ドキュメントとともに自動的に保存されます。

同じデータ プロパティで、任意の名前を入力し、値テーブル タイプを選択できます。

これは、任意の値のテーブルが選択されたことを意味します。 列は自動的に追加されず、自動的に保存されませんが、必要に応じて何でも行うことができます。

テーブルを右クリックすると列を追加できます。 列のプロパティでは、その名前 (1C コードでの参照用)、フォーム上の列見出し、表形式部分の属性との接続 (後者 - 任意の表が選択されていない場合は、表部分)。

フォーム上のテーブルのプロパティで、ユーザーが行を追加/削除できるかどうかを指定できます。 より高度なフォームは、「表示のみ」チェックボックスです。 これらのプロパティは、編集ではなく情報の表示を目的としたテーブルを整理するために使用すると便利です。

テーブルを管理するには、フォーム上にコマンド パネルを表示する必要があります。 メニュー項目「フォーム」/「コントロールの挿入」/「コマンド バー」を選択します。

コマンド バーのプロパティで、[自動入力] チェックボックスを選択すると、パネル上のボタンが自動的に表示されます。

フォーム上のテーブル (シン/マネージド クライアント)

管理フォームでは、これらのアクションは少し異なって見えます。 フォーム上に表形式パーツを配置する必要がある場合は、「オブジェクト」ブランチを展開し、表形式パーツの 1 つを左側にドラッグします。 それだけです!

値のテーブルを配置する必要がある場合は、新しいフォーム属性を追加し、そのプロパティでタイプ (値のテーブル) を指定します。

列を追加するには、このフォーム属性を右クリックしてメニューを使用し、「属性列の追加」を選択します。

次に、表も左にドラッグします。

テーブルにコマンド バーを持たせるには、テーブルのプロパティで、[使用法 – コマンド バーの位置] セクションの値を選択します。

テーブルを Excel にアップロードする

フォーム上にある 1C テーブルは、印刷したり Excel にアップロードしたりできます。

これを行うには、テーブル内の空のスペースを右クリックし、「リスト」を選択します。

管理対象 (シン) クライアントでは、メニュー項目 [すべてのアクション/表示リスト] を使用して同様のアクションを実行できます。