ここでは、初心者向けのちょっとした事実を示します。値のテーブルを操作する簡単な例です。
1. 値の表を作成する
値テーブル = 新しい値テーブル;
ValueTable.Columns.Add("名前");
値 Table.Columns.Add("姓");
NewLine.Name = "ヴァシリー";
NewLine.LastName = "パプキン";
FoundRow = ValueTable.Find(SearchValue);
FoundRow = ValueTable.Find(SearchValue, "サプライヤー、バイヤー");
SearchStructure = Structure("従業員", SearchValue);
FoundRows の配列 = ValueTable.FindRows(SearchStructure);
7. 値のテーブルをランダムな順序で反復処理する方法
値のテーブルからの現在の行ごとのループ
Report(CurrentRow.Name);
エンドサイクル;
インデックスを使用しても同じこと:
SeniorIndex = ValueTable.Quantity() - 1;
アカウント = 0 から SeniorIndex サイクルの場合
Report(TableValues[アカウント].名前);
エンドサイクル;
ValueTable.Delete(削除する行);
インデックスによる
ValueTable.削除(0);
ValueTable.Columns.Delete(ColumnDeleted);
ValueTable.Columns.Delete(0);
値のテーブルの「中央」から行(または列)を削除すると、削除された行(または列)の「後」にある行のインデックスが 1 つ減少することを考慮する必要があります。
10. 列名が変数に含まれている場合、値のテーブルを埋めるにはどうすればよいですか?
NewRow = ValueTable.Add();
NewRow[列名] = 値;
値の表。値を入力します (False、「会計フラグ」)。
12. 値テーブル「SourceTable」のデータを値テーブル「Receiver Table」に入力するにはどうすればよいですか?
操作時に受信者テーブルがまだ存在していないか、以前の列を保存する必要がない場合は、元のテーブルの完全なコピーとして作成できます。
受信者テーブル = ソーステーブル.Copy();
名前が一致する列の部分的なデータ転送:
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("オブジェクト");
データ型を示す列の追加
// 列のデータ型の制限:
// 「Counterparty」ディレクトリの要素のみ。
値の表.Columns.Add("Account", タイプの新しい説明("DirectoryLink.Accounts"));
修飾子を使用して値テーブル列のデータ型を指定する
// String型のデータを準備し、制限を設定します。
文字列修飾子 = 新しい文字列修飾子(20、AllowedLength.Variable);
ValidTypes = NewTypeDescription("String", StringQualifiers);
ValueTable.Columns.Add("NoteStringShort", ValidTypes);
既存の型宣言を使用して値テーブル列のデータ型を指定する
// 以前に使用した型の説明の拡張。
QualifiersNumbers = New QualifiersNumbers(10, 2, ValidSign.Non-negative);
DateQualifiers = New DateQualifiers(DateParts.Date);
Extended ValidTypes = New TypeDescription(ValidTypes, "数値, 日付", 数値修飾子, 日付修飾子);
ValueTable.Columns.Add("メモ", ExtendedAcceptableTypes);
2011 年 9 月 21 日発行
この記事では、「不明な」構造の値のテーブルを操作する方法、値のテーブルの列を反復処理する方法、列名を使用せずに列と行からデータを抽出する方法について説明します。 (この記事は、「ゼロからの 1C」シリーズ、「ゼロからの 1C プログラミング」、「1C 値の表」シリーズに属しています)
内容を説明し、コード例を「ライブ」で実行できるようにするには、いくつかのものが必要です。 テスト値表 1C。 例の中には値のテーブルからデータを抽出するものもありますので、「姓」、「名」、「ミドルネーム」という 3 つの列を持つテーブルを作成し、そこに少量のデータ (最大 3 つ) を入力します。行:)
MyTZ = 新しい値テーブル; // 変数 "MyTZ" に格納される値の新しいテーブルを作成します MyTZ.Columns.Add("Last Name"); // 列「姓」を作成 MyTZ.Columns.Add("Name"); // 列 "Name" を作成します MyTZ.Columns.Add("Patronymic"); // 列 "Middle name" を作成します // 最初の行を値テーブルに追加 NewLine = MyTZ.Add(); NewString.LastName = "チャパエフ"; NewLine.Name = "ヴァシリー"; NewString.ミドルネーム = "イワノビッチ"; // 2 行目を追加 NewLine = MyTZ.Add(); NewString.LastName = "ジェルジンスキー"; NewRow.Name = "フェリックス"; NewString.ミドルネーム = "エドムンドヴィッチ"; // 3 行目を追加 NewLine = MyTZ.Add(); NewLine.LastName = "コトフスキー"; NewLine.Name = "グレゴリー"; NewString.ミドルネーム = "イワノビッチ";
私たちのテストテーブルは、名、姓、父称の 3 つの列で構成されています。 南北戦争の英雄の名前が記入された 3 行があります。
私たちのサイクルでは、1C メッセージ ウィンドウにすべての列名が表示されます。
列名:姓 列名:名 列名:ミドルネーム
列を反復処理するには、(前の記事の) 行反復サイクルと同様に、特別なコレクション反復サイクルが使用されることがわかります。 MyTK.Columns- これは 1C 値テーブルの列のコレクションです 「マイツ」。 コレクションには次のタイプのオブジェクトが含まれています 「値テーブルの列」このタイプの各オブジェクトは値テーブルの列であり、プロパティとメソッドが含まれています。 これらのプロパティとメソッドにアクセスすることで、1 つの列に関する必要な情報を取得したり、列に対して他のアクションを実行したりできます。
たとえば、プロパティにアクセスすると、 "名前" (列.名前) 現在の列の名前を取得します。
シリーズのタイトル「すべての人へ」に注目していただきたいです。 カラム「MyTZ.Column Cycle から」という名前の変数 "カラム"私たちが発明したもの。 同じ名前を使用する必要はありません。 この変数には好きな名前を付けることができます。たとえば、 「私の現在の列」上記の例は次のようになります。
// TK For Each MyCurrentColumn From MyTK.Columns Cycle Report("Column name: " + MyCurrentColumn.Name); のすべての列の名前を表示します。 エンドサイクル;
1C 実行サブシステムがこのタイプのサイクルに遭遇すると、サイクルの各パスで、コレクションから 1 つの要素を指定された名前の変数に割り当てます。この場合は - 1 つのコレクション要素値テーブルの列 MyTK.Columns次に、現在の列を含む変数にアクセスし、プロパティを使用します。 "名前".
列名の横に、列のコレクション内の各列の番号を表示することを提案します。
// 値のテーブルのすべての列の番号と名前を表示します。 For Each Column From MyTZ.Columns Cycle ColumnNumber = MyTZ.Columns.Index(Column); // 列番号を取得します。 ColumnName = Column.Name; // 列名を取得 Report("列番号:" + 列番号 + " 列名: " + 列名); エンドサイクル;
次のテキストが 1C メッセージ ウィンドウに表示されます。
列番号:0 列名: 姓 列番号:1 列名: 名 列番号:2 列名: ミドルネーム
1C 値テーブルの列には、値テーブルの行と同様に、0 から始まる番号が付けられていることに注意してください。
値のテーブル内の列の数を確認するには、列のコレクションに対して "Count()" メソッドを使用します。
列数 = MyTK.Columns.Quantity(); レポート(列数);
画面に「3」という数字が表示されます。 実際、このテーブルには「姓」、「名」、「父称」の 3 つの列があります。
列インデックス (数値) を使用して、値テーブルのすべての列を検索するサイクルを作成しましょう。 列の番号付けは 0 から始まることに注意してください。 したがって、サイクル カウンター「Sch」を 0 から列数から 1 を引いた値まで増加する必要があります。
アカウント = 0 By MyTZ.Columns.Quantity() - 1 サイクル CurrentColumn = MyTZ.Columns[Act]; レポート(現在の列.名前); エンドサイクル;
画面には次のものが表示されます
フルネーム
この例は明白だったと思います。 私たちはその方法に目を向けました 量()コラムコレクション」 MyTZ.Columns.Quantity()"、列数を取得し、からのカウンターを使用してループを開始しました。 ゼロ前に 列数から 1 を引いた数。 ループ内で、列のコレクションから各列を取得し、現在の列オブジェクトを変数に割り当てます。 現在の列次に変数 現在の列物件にアクセスします 名前このプロパティの値を画面に表示します。 レポート(現在の列.名前);
プロパティは特定の静的な値であり、その値へのアクセスは括弧なしで記述されます。たとえば、 現在の列の名前。 メソッドは本質的にはオブジェクトのプロシージャまたは関数であり、プロシージャと関数の呼び出しは常に (入力パラメータがない場合でも) かっこで記述されます。 例えば: MyTZ.Columns.Quantity()
メソッドにアクセスしてかっこを書き忘れると、1C インタプリタはエラー メッセージを表示し、コードは実行されません。 インタプリタは、括弧がないため、メソッドではなくプロパティにアクセスしているとみなします。 ただし、その名前のプロパティは見つかりません (その名前のメソッドしか存在しないため)。これはエラー メッセージに記載されます。
これは、メソッド呼び出しに括弧を間違った方法で入れるのを忘れた場合にインタプリタが書き込む内容です。 MyTK.Columns.数量(「Quantity()」の後の括弧なし):
オブジェクトフィールドが見つかりません(数量)
この場合、「フィールド」と「プロパティ」は同義語、または 1C 開発者の用語の不正確さとして理解される必要があります。 彼らは同じ概念を指すためにこれらの単語を両方使用します。 ただし、他のプログラミング言語では、これらの用語の意味は異なる場合があります。
まず、テーブルの最初の行からデータを取得する簡単な例を示します。 記事の冒頭で事前に入力されたテーブルを使用していることに注意してください。 テーブルには最初の行と少なくとも 1 つの列があることが確実にわかっています。 この例を空のテーブルに適用すると、エラーが発生します。 それで:
FirstLine = MyTK; // 最初の行 (0 から番号付け) を取得します FirstColumnValue = FirstRow; // 最初の列の値を取得します (列番号も最初から付けられます) Report(Value of the FirstColumn); // テーブルの最初の行の最初の列の値を表示します
画面には次のように表示されます。
チャパエフ
まず、[...] 演算子を使用して値テーブルにアクセスし、値テーブル行オブジェクトを取得しました。 (これを行う方法を忘れた場合は、以前の記事を参照してください) 演算子の内部に引数「0」を渡しました。 これは、値テーブルの最初の行のインデックスです。 FirstLine = MyTK;
さらに、[...] 演算子を使用して文字列オブジェクトにアクセスする権利もあります。 この演算子の内部では、値テーブルの列番号を渡しました。この場合も「0」です。 したがって、現在のテーブル行番号「0」の列番号「0」の値を受け取りました。 この値を画面に表示しました。これは文字列「Chapaev」を表します。
例を少し複雑にしてみましょう。
FirstLine = MyTK; // 最初の行を取得します (0 から番号を付けます) Report(FirstLine); // テーブルの最初の行の最初の列の値を表示します Report(FirstRow); // テーブルの最初の行の 2 番目の列の値を表示します。 Report(FirstRow); // テーブルの 1 行目の 3 列目の値を表示します
これで、値テーブルの最初の行の 3 つの列すべての値が表示されました。
チャパエフ・ヴァシリー・イワノビッチ
次に、変数なしで実行できるようにこの例も変更します。 「最初の行」
レポート(MyTZ); // テーブル Report(MyTZ) の最初の行の最初の列の値を表示します。 // テーブル Report(MyTZ) の最初の行の 2 番目の列の値を表示します。 // テーブルの 1 行目の 3 列目の値を表示します
画面上でも同様になります
チャパエフ・ヴァシリー・イワノビッチ
上の例では、値のテーブルの特定の行と特定の列にある値にアクセスするには、次の形式で 2 つの演算子 [...] の連続呼び出しを使用できることがわかりました。 値テーブル[行インデックス][列インデックス]
これで、ループを作成し、行インデックスと列インデックスを使用してすべての行とすべての列のデータを取得する準備が整いました。
For RowCounter = 0 By MyTZ.Quantity() - 1 Loop // 行を循環 For ColumnCounter = 0 By MyTZ.Columns.Quantity() - 1 Loop // 列をネストしたループ // (現在の行から) セル値を取得しますおよび現在の列) CellValue = MyTK[RowCounter][ColumnCounter]; // 行番号、列番号、セルの値を表示 Report("Row No" + Row Count + "column No" + Column Count + " = " + CellValue); エンドサイクル; エンドサイクル;
画面には次のように表示されます。
ライン0列0=チャパエフ ライン0列1列=ヴァシリー ライン0列2列=イヴァノビッチ ライン1列0列=ジェルジンスキー ライン1列1列=フェリックスライン1番列2=エドムンドビッチ ライン2番列0=コトフスキー ライン2番列1=グリゴリー ライン2列2番=イワノビッチ
1 つがもう 1 つのサイクル内にネストされている 2 つのサイクルを使用して、1C 値テーブルのすべての行のすべての列の値を表示しました。 この場合、列名は使用せず、インデックスによって列と行にアクセスしました。 より深く理解するには、例内のコメントに注目してください。
結論として、列番号の代わりにその名前を画面上に表示するように例を少し変更することを提案します。 さらに、画面上にコンテンツを表示するための、より見栄えの良いデザインを作成します。
For LineCounter = 0 By MyTZ.Quantity() - 1 Loop // 行をループします Report(" ======= 行番号 " + LineCounter + " ========); 報告する(" "); // 改行 (空行の挿入) For ColumnCounter = 0 By MyTZ.Columns.Quantity() - 1 Loop // 列を通るネストされたループ // セル値を (現在の行と現在の列から) 取得します CellValue = MyTZ [行カウンター][列カウンター]; // 列の名前を取得します。 ColumnName = MyTK.Columns[ColumnCounter].Name; // 列名とセル値を表示 Report(ColumnName + ": " + CellValue); エンドサイクル; 報告する(" "); // 改行(空行挿入) EndCycle;
さて、画面上の情報はより代表的なものに見え始めました。
行番号 0 ======= 姓: チャパエフ 名: ヴァシリー 父称: イワノビッチ ======= 行番号 1 ======= 姓: ジェルジンスキー 名: フェリックス 父称:エドムンドヴィッチ ===== == 行番号 2 ======= 姓: コトフスキー 名: グリゴリー 愛称: イヴァノヴィチ
はい、ほとんど忘れていました。 2 つの [...][...] 演算子を続けて使用する場合、列インデックスの代わりにこの列の名前を渡すことができます。 値テーブル[行インデックス][列名]
For LineCounter = 0 By MyTZ.Quantity() - 1 Loop // 行をループします Report(" ======= 行番号 " + LineCounter + " ========); 報告する(" "); // 改行 (空行の挿入) For ColumnCounter = 0 By MyTZ.Columns.Quantity() - 1 Loop // 列をネストしたループ ColumnName = MyTZ.Columns[ColumnCounter].Name; // 列名を取得Cell Value = MyTZ[RowCounter][ColumnName]; //
矢印 " でマークされた行に注目してください。この行では、現在の列のインデックスの代わりに、現在の列の名前を角かっこ内の引数に渡します [...] 結果は同じになります。
さて、この記事の最後です。
この例では、2 つのループが使用されています。 列のコレクションをループするループは、行をループするループの内側にネストされています。 上記の例を学習し、以前の記事を読んだことがあれば、この例がどのように機能するかを理解するのは難しくありません。
最後に、中間変数の使用を排除することで、最後の例のコード行数を可能な限り減らします。 実際の問題で使用される「業界コード」のサンプルを入手します。
これは、自分が何をしているのかを十分に理解している場合にのみ実行してください。 コードが非常に複雑な場合は、後で独自のコードを理解しやすくするために、中間変数を残してもかまいません。 また、しばらくするとプログラムのテキストが理解しやすくなるように、コードには少なくとも最小限のコメントを付ける必要があります。
For Each CurrentLine From MyTZ Cycle // 行を反復処理します Report(" ======= 行番号 " + MyTZ.Index(CurrentLine) + " =======" + Symbols.PS); For Each CurrentColumn From MyTZ.Columns Loop // 列を反復処理します Report(CurrentColumn.Name + ": " + CurrentRow[CurrentColumn.Name]); エンドサイクル; 報告する(" "); エンドサイクル;
画面上の出力は変更されておらず、前の例と同じままです。
2週間コース
「初心者のための 1C でのプログラミング」
講座はメールでお送りいたします。 段階的なタスクを完了してプログラマーになりましょう。
参加するにはコンピューターとインターネットだけが必要です
コースへの無料アクセス:
Sp-force-hide (表示: なし;).sp-form (表示: ブロック; 背景: #eff2f4; パディング: 5px; 幅: 270px; 最大幅: 100%; 境界半径: 0px; -moz-border -radius: 0px; -webkit-border-radius: 0px; font-family: "Helvetica Neue"、sans-serif: no-repeat; .sp-form input (表示: インラインブロック;不透明度: 1; 可視性: 表示;).sp-form .sp-form-fields-wrapper (マージン: 0 自動; 幅: 260px;).sp-form .sp -form-control (背景: #ffffff; border-色: #cccccc; 境界線の幅: 15px; 境界線の半径: 4px; 4px; -webkit-border-radius: 4px; width: 100%;).sp-form .sp-field label (色: #444444; フォント サイズ: 13px; フォント スタイル: 標準; フォントの太さ: 太字; ).sp-form .sp-button ( border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; background-color: #f4394c; color: #ffffff; width: 100% ; フォントスタイル: 通常; フォントファミリー: Arial、「Helvetica Neue」、サンセリフ; ボックスシャドウ: なし。 -moz-box-shadow: なし。 -webkit-box-shadow: なし。 背景: 線形グラデーション(トップへ、 #e30d22 、 #f77380);).sp-form .sp-button-container ( text-align: center; width: auto;)
ビジネスでは金銭や物品を管理するために、さまざまな表が広く使用されています。 ほとんどすべてのドキュメントは表です。
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 にアップロードしたりできます。
これを行うには、テーブル内の空のスペースを右クリックし、「リスト」を選択します。
管理対象 (シン) クライアントでは、メニュー項目 [すべてのアクション/表示リスト] を使用して同様のアクションを実行できます。