外部データソース 1C 8.3 mysql。 外部データソース

20.10.2023 携帯電話会社

1C エンタープライズ モードのリストでそれらを操作します。

ただし、仕事では、データの一部が別の場所に保存されている状況がよくあります。

  • オンライン ストア (通常、データは外部の MySQL/SQL データベースに保存されます)
  • もう一つの基地。

他のデータベースに保存されているこのようなデータを操作するには、特別なメカニズムを開発する必要があります。

バージョン 1C 8.2.14 では、1C 外部データ ソースと呼ばれる新しいデータ ソースが登場しました。これにより、プログラマの作業が大幅に容易になります。

  • データを取得するための特別なメカニズムを作成する必要はなくなりました。
  • そのようなデータには通常の方法でアクセスできます
  • このようなデータは 1C リストで表示できます。
    • 外部データ ソース 1C – 外部 SQL データベース

      必要なデータが保存されている SQL データベースがあるとします。 1C 外部データ ソース メカニズムを使用して、そこからデータを読み取ってみましょう。

      外部 1C データ ソースを追加しましょう。 コンフィギュレータに移動する必要があります。外部データ ソースは、ツリーの最下部の設定ウィンドウにあります。

      1. 接続

      新しい外部データ ソース 1C を追加して、任意の名前を付けてみましょう。

      データベースはテーブルで構成されます。 追加した外部データ ソース内にそれらを追加する必要があります。 それを右クリックし、「テーブルの追加」を選択します。

      初めて、接続文字列を入力するように求められます。 手動で入力することも、「…」ボタンをクリックして生成することもできます。

      この特定のケースでは、ドライバーとして「SQL Server」を選択します。

      SQL に接続するための基本パラメータを入力しましょう。 サーバー名は入力することも、リストから選択することもできます。

      1C は SQL に接続し、リストから特定のデータベースを選択するよう提案します。

      この後、1C はこのデータベース内のテーブルとその列のリストを表示します。 必要なテーブルを選択するには、ボックスをチェックする必要があります。

      テーブルと列が追加されます。 名前は、リモート データベースで定義されているものと同じになります。 1C では、(プロパティで) 名前を変更できます。

      追加されたテーブルの例を次に示します。

      追加された列の例を次に示します。

      1C プラットフォームが 1C ディレクトリの場合と同じ方法で外部テーブルを操作できるようにするために、テーブルに追加のパラメータを指定できます。

      • 「キー フィールド」プロパティで、行の一意の識別を提供する列の 1 つを指定します。 複数の行が一意性を提供する場合、このメソッドは機能しません (Code フィールドと同様)
      • [プレゼンテーション フィールド] プロパティで、行の簡単な表現を提供する列の 1 つを指定します ([名前] フィールドに似ています)。
      • 「テーブル データ タイプ」プロパティで、「オブジェクト データ」を指定します。

      2. 見る

      リモート拠点への接続は自動では行われません。 接続するには標準メニューを選択する必要があります。

      標準ブランチには、外部データ ソースの管理という特別なコマンドがあり、これを使用して接続パラメータ (1C エンタープライズ モードに固有) を指定して接続を確立できます。

      まず、データベースに接続するためのパラメータを指定する必要があります。

      コンフィギュレータで設定を行うと、結果として接続文字列が表示されます。 コンフィギュレータで [テーブルの追加] を再度クリックすると、再度表示できます。

      接続文字列をコピーし、1C Enterprise モードで指定します。

      この後、実際の接続を行う必要があります。

      接続が確立されると、リストを操作できるようになります。

      3. 1C 言語での使用

      1C言語のプログラムコードからも接続可能です。

      接続パラメータは次のように指定します。
      ConnectionParameters = ExternalDataSources.SourceNameConfigurator.GetGeneralConnectionParameters();

      ConnectionParameters.AuthenticationStandard = True;
      ConnectionParameters.UserName = "sa";
      ConnectionParameters.Password = "パスワード";
      ConnectionParameters.ConnectionString = “コンフィギュレータからの接続文字列”;
      ConnectionParameters.DBMS = "MSSQLServer";

      ExternalDataSources.SourceNameConfigurator.SetGeneralConnectionParameters(ConnectionParameters);
      ExternalDataSources.SourceNameConfigurator.SetUserConnectionParameters(UserName(), Parameters);
      外部データソース.ソース名コンフィギュレーター.SetSessionConnectionParameters(パラメーター);
      外部データソース.ソース名コンフィギュレーター.SetConnection();

      通常の を使用してデータベースのデータをクエリできます。 外部ソース OurExternalSource およびテーブル ExternalSource Table のクエリ テキストの例:

      選ぶ
      外部ソーステーブル.フィールド名
      から
      外部データソース.当社外部ソース.テーブル.外部ソーステーブル"

      外部データ ソース 1C - Excel ファイルの操作

      別のオプションを試してみましょう - 外部 1C データ ソースを介して Excel ファイルを操作します。

      簡単な Excel ファイルを作成してみましょう。

      外部ソースを追加して、FileExcel という名前を付けてみましょう。 そこにテーブル「Sheet1$」を追加しましょう。 簡単にわかるように、これは Excel のシート名に「$」記号を追加したものです。

      SQLの場合と同様に列を追加してみましょう。 これらは手動で追加できます。 追加する列の型が一致していることを確認することが重要です。一致しないと、後で「データ型が一致しません」などのエラーが表示される可能性があります。

      列には、1C での名前とデータ ソースでの名前を指定する必要があります。

      Excel には次の機能があります (「パラメータが少なすぎます。3 つ必要です」のようなエラー):

      • Excel テーブルの最初の行に列名が含まれている場合は、この列の名前 (たとえば「コード」) を指定するだけで済みます。
      • それ以外の場合は、テーブル名「Sheet1$.Code」でフルネームを指定する必要がありますが、パラメーターに「HDR=NO;」を追加します。

      Excel ファイルの接続パラメータは次のようになります。

      • XLSX ファイル (Office 2007 以降)
        Driver=(Microsoft Excel ドライバー (*.xls、*.xlsx、*.xlsm、*.xlsb));DBQ=D:\FileExcel.xlsx;
      • XLS ファイル (以前)
        Driver=(Microsoft Excel ドライバー (*.xls)); ドライバーID=790; DBQ=D:\FileExcel.xls;
        ファイルへの独自の名前とパスを指定する必要があります。

なぜこの機会がこれほど注目されるのでしょうか? 1C でプログラミングしたことがあり、SQL に精通していて、ビジネス アプリケーション用の他のテクノロジ プラットフォームの開発のアーキテクチャと原則に少なくとも一般的に精通している人なら、1C の何が最も気に入っているかを自信を持って語るでしょう。 もちろん、クエリ ビルダーは、私がこれまで個人的に遭遇した中で、リレーショナル構造からデータを取得するためのクエリを作成するための最も便利で思慮深いメカニズムです。 そして今、1C は、1C だけでなく他のテーブルでも使用できる素晴らしい機会を与えてくれました。 ただ、この「蜂蜜の樽」には「軟膏の中にハエ」がたくさんいるのです。 まず最初に:

1) セットアップと使用方法- 「タンバリンで踊らなければ」うまくいかない
a) 外部データソースを追加します - 複雑ではないようです
b) 「リストから選択」チェックボックスをオンにします - 必須 - これは最初に機能を確認するために必要であり、不要なトラブルを避けることができます。
c) - 必ず「...」をクリックしてください。接続は ODBC です。 私たちが慣れ親しんでいる OLEDB ではなく、1 つ下のレベルです

D) ただし、ここでは非常に注意してください。

これは ODBC ドライバーです。クライアントサーバー バージョンを使用する場合は、サーバー上に存在する必要があります。 あるシステムで開発し、別のシステムで作業している場合 (通常の場合です)、予期せぬことが待っていないか確認してください。 奇妙な推奨事項ですが、速度を特に気にせず、SQL92 標準の機能を超えるつもりがない場合は、最も古い、または最も一般的なドライバーを選択してください。 これにより、互換性が向上します。 たとえば、SQL Server 2008 の場合、最適なドライバーは SQL Server Native Client 11 ですが、SQL Server だけを選択することをお勧めします。そうしないと、この非常にネイティブなクライアントをサーバーまたはすべてのクライアント マシン (SQL Server を使用している場合) にインストールする必要があります。ファイルバージョン)、そしてその利点は、彼があなたにタスクを与えないシンプルな場合に特別です。
e) 標準のサーバー選択ダイアログ

E) パスワードの保存に関する質問には「はい」と答えることをお勧めします。そうしないと、このビジネスを開始できなくなります。
g) テーブルと詳細を選択します...素晴らしい機会です。すぐに好きなように名前を変更できます (詳細も)。プロパティにはデータ ソースのフィールドの名前が表示されます。

Z) そして今、それを起動し、クエリデザイナーを開きます - 愚かにもテーブルからすべてのレコードを選択し、OPA - エラーが発生します。 何をするか? マネージド インターフェイスを使用している場合はサービス メニューを確認し、通常のインターフェイスの場合は...
私は個人的にこのコードを使用しました:
コード 1C v 8.x パラメーター = ExternalDataSources.DAX.GetGeneralConnectionParameters();
パラメータ.AuthenticationStandard = True;
パラメータ.ユーザー名 = "sa";
パラメータ.パスワード = "pas";
Parameters.ConnectionString = "DRIVER=(SQL Server);SERVER=servet;UID=sa;PWD=;DATABASE=データベース";
パラメータ.DBMS = "MSSQLServer";

外部データソース.DAX.SetCommonConnectionParameters(パラメータ);
ExternalDataSources.DAX.SetUserConnectionParameters(UserName(), Parameters);
外部データソース.DAX.SetSessionConnectionParameters(パラメータ);

外部データソース.DAX.SetConnection();
一部の部分は必要ないかもしれませんが、機能します。
コードを 1 回実行する必要があります。 その後は接続が正常になります...もちろん神秘主義ですが、なぜこれが必要だったのかは明らかではありません...

2) 読み取り専用データソース- そう、奇跡は起こらない…でも時にはそれを望むこともある…

3) 内部データソースと一緒に使用することはできません
個人的には、この事実は私をその場で殺しました。

これは一体どういうことなのでしょうか...私たちは、データを 1 つのリクエストで 1C と結合し、折りたたんでグループ化し、レポートに挿入する方法についてすでに想像し、口をなめながら待っていたのですが、実際はそうではありませんでした。 ...
しかし、もちろん、これは経験豊富な人々を止めるものではありません...どんな考えが頭に浮かびましたか? そうです - 一時テーブル:

4) 一時テーブルと一緒に使用することはできません

しかし、これはもはや技術的な問題のようには見えませんが、「人生が楽園のように見えないように」彼らが私たちに望んでいることによく似ています:)。

5) ACS 接続でのみ使用可能
知らない人のために説明すると、これは ACS の [データ セット リンク] タブにあります。 よく使いますか? 快適? どうやら彼らは私たちにもっと頻繁に使用するよう強制したいようです。 「通信条件」と「通信パラメータ」の欄があるだけです。 標準構成での使用例は見つかりませんでした。ドキュメントや Khrustaleva の作品でも、どういうわけかすべてが透明ではありません。 誰か「接続条件」がどのように機能するかを説明してもらえますか。 そこに Source Attributes = Receiver Attributes と書いても機能しません。 もちろん、条件は「式」フィールドに書き込むことができます。ほとんどの場合、これで十分です...しかし、どういうわけか、なかなかうまくいきません。

合計すると、この問題は以前は次のような場所で解決されていました。
コード 1C v 8.x 関数 InitializeDataSource()

DateStart = SettingsComposer.Settings.DataParameters.Items.Value;
DataCon = SettingsBuilder.Settings.DataParameters.Items.Value;
DataCon > "20100101" の場合
データコン = "20100101";
endIf;

CN = 新しい修飾子番号(15,2);
KS = NewStringQualifiers(255);

ArrayNumber = 新しい Array();
ArrayNumber.Add(Type("数値"));

ArrayString = 新しい Array();
ArrayString.Add(Type("String"));

ArrayData = 新しい Array();
ArrayDate.Add(Type("日付"));

//表に会計コストを記入していきます
TypeNumber = 新しい説明タイプ(ArrayNumber, CN);
TypeString = 新しい TypeDescription(ArrayString, KS);
TypeDate = 新しい TypeDescription(ArrayDate);

//SQLからデータをロードするためのテーブル
TZ = 新しい ValueTable();
TK.Columns.Add("NomenclatureCode", TypeString);
TK.Columns.Add("数量", TypeNumber);
TK.Columns.Add("期間", DateType);

TK.Indices.Add("期間");

//SQLに接続する
接続文字列 = "プロバイダー = SQLOLEDB.1;永続セキュリティ情報 = True;ユーザー ID = sa;Pwd =;データ ソース =;準備の手順を使用 = 1;自動変換 = True;パケット サイズ = 4096;ワークステーション ID =;使用データの暗号化=False;可能な場合は列の照合を伴うタグ=False;初期カタログ=レポート";
接続 = 新しい COMObject("ADODB.Connection");
コマンド = 新しい COMObject("ADODB.Command");
RecordSet = New COMObject("ADODB.RecordSet");
日付 = "";
試み
Connection.Open(AbbrLP(ConnectionString));
Command.ActiveConnection = 接続;
Command.CommandText = "S_elect * from PH where period >= "" + String(Format(DateStart, "DF=yyyyMMdd"))) + "" and ピリオド<= "" + Строка(Формат(ДатаКон, "ДФ=ггггММдд")) + """;
RecordSet = Command.Execute();
RecordSet.MoveFirst();
例外
技術仕様の返却。
試行の終了;

While RecordSet.EOF = False ループ
行 = TZ.Add();
Row.NomenclatureCode = RecordSet.Fields(RecordSet.Fields.Item(1).Name).Value;
Row.Qnty = RecordSet.Fields(RecordSet.Fields.Item(12).Name).Value;
Row.Period = RecordSet.Fields(RecordSet.Fields.Item(13).Name).Value;
RecordSet.MoveNext();
エンドサイクル;

リクエスト = 新しいリクエスト();
VrTable = 新しい TemporaryTableManager();
Query.SetParameter("vrDataTable", TK);
Query.SetParameter("開始日", 開始日);
Request.SetParameter("DataCon", DateCon);
Query.Text = "SELECT
| vrDataTable.NomenclatureCode、
| vrDataTable.Qnty、
| vrDataTable.Period
|データテーブルの配置
|から
| &vDataTable AS vrDataTable
|どこで
| vrDataTable.Period >= &DateStart
| そして vrDataTable.Period<= &ДатаКон";
Request.Run();
TZ = 未定義;

リクエスト = 新しいリクエスト。
Query.TemporaryTableManager = VrTable;
Query.Text = "これは変数テーブルを含むクエリです";

結果 = Query.Run();
結果を返します。

エンドファンクション

外部セット = InitializeDataSource();
DataSet = 新しい構造();
DataSet.Insert("SQL テーブル", ExternalSet);
TypicalReports.GenerateTypicalReport(ThisObject, Result, 復号化データ, OutputToReportForm, DataSet);

実際には、コード行はそれほど多くなく、非常に標準的です...この場合、クエリ デザイナーのすべての機能を使用し、ACS に DATA COMPOSITION 関数のみを与えることができます。

しかし、それは確かにそれほど見栄えはよくありません...そして、テーブルに値をアップロードし、詳細の名前が間違っていないかどうかを確認するコードを記述する必要があるたびに...そして、私たちが与えられたもの1Cはなんだか中途半端に見えます。 どちらが使いやすいかはまだ決めていません。 あなたが決断し、その決断とその決断をしたきっかけについて書きます。

サイトから取得した情報

バージョン 8.3.5 以降、プラットフォームには外部データ ソースのテーブルにデータを書き込む機能が実装されました。 この記事では、構成をサードパーティ システムと統合するための既存の機能を拡張するこの機能について説明します。

適用性

この記事では、1C 8.3.5 プラットフォームについて説明します。 この資料は、現在のプラットフォーム リリースにも関連します。

1C:Enterprise 8 での外部データ ソースへの記録

プラットフォーム 8.2.14 では、新しいオブジェクト (外部データ ソース) がメタデータ ツリーに追加されました。 このメカニズムの目的は、1C に関連するデータを外部データベースから取得することです。

新しいプラットフォームのリリースに伴い、外部データソースは進化し、一時テーブルに配置したり、通常のテーブルと接続したりできるようになりました。

この記事では、開発者が外部データ ソースに記録するために必要なツールについて説明します。

すべてのアクションは Microsoft SQL Server 2008 R2 DBMS 上で実行されました。

プラットフォーム 8.3.4 では、外部データ ソースで記述された関数を使用する機能が導入されました。

この機能を使用すると、SQL Server 側でストアド プロシージャを実行し、書き込みを含む外部ソースからのデータにアクセスできるようになります。

例を見てみましょう。 SQL Management Studio を使用して、kursy_test という名前の新しいデータベースを作成しましょう。 さらなる実験はすべてそれに対して実行されます。

このデータベースにテーブル nomenklatura を作成します。このために、次の内容のスクリプトを作成します。

[kursy_test] を使用する
行く
テーブル[dbo]を作成します。 [命名法](
[id] [int] NOT NULL、
[説明] [nvarchar ](150) NOT NULL、
[価格] [数値](15, 2) NULL,
制約 [ PK_id ] 主キー ([ id ])
行く

実行の結果、次の構造のテーブルが作成されます。

ここで、データ変更を実行するための 2 つのストアド プロシージャを作成する必要があります。

最初のプロシージャを insert_nomenklatura と呼びましょう。 テーブルに新しい行を追加するように設計されます。 これを作成するスクリプトは次のようになります。

[kursy_test] を使用する
行く
CREATE PROCEDURE insert_nomenklatura
@id int
@説明nvarchar(150)、
@price 数値 (15, 2)
として
始める
[kursy_test].dbo に挿入します。 [名前] ([ ID ]、[ 説明 ]、[ 価格 ])
VALUES (@id、@description、@price)
終わり
行く

2 番目のプロシージャは、update_nomenklatura という名前で、テーブル内の既存のエントリを更新します。 これを作成するために、次のスクリプトが起動されました。

オブジェクト ブラウザーでは、作成されたテーブルと 2 つのストアド プロシージャは次のように表示されます。

Microsoft SQL Server 側の準備手順がすべて完了したので、1C:Enterprise 8 コンフィギュレーターに進みます。

Nomenklatura という名前の新しい外部データ ソースを作成します。 このデータ ソースに新しいテーブルを作成するときは、データ ソースに接続するための次のパラメーターを指定します。

次の接続文字列を指定します。

ドライバー = (SQL Server) ; サーバー =(ローカル); データベース = kursy_test ; ユーザー ID = sa ; パスワード =;

sa ユーザーがパスワードを持っている場合は、接続行の Password パラメーターにパスワードを指定する必要があります。

すべての接続パラメーターが正しく指定されている場合、「OK」をクリックすると、データ・ソースで使用可能なテーブルを含むウィンドウが開きます。

興味のあるテーブルフィールドにチェックを入れます。 ボタンを押したとき 準備ができて dbo_nomenklatura テーブルは外部データ ソース Nomenklatura に作成されます。

次に、データ ソースの [関数] タブに切り替えます。

同様のウィザードを使用して、2 つのストアド プロシージャを追加します。

「関数」タブは次のようになります。

次に、外部データ ソースを操作できるようにユーザー インターフェイスをプログラムしましょう。

コマンド パネルのリスト フォームに、次のハンドラーを含む [追加] ボタンを配置します。

&OnClient
プロシージャAdd()
アラート = 新規 説明アラート(「オープンテーブルコンプリート」、ThisObject );
オープンフォーム (
「外部データソース.Nomenklatura.Table.dbo_nomenklatura.ObjectForm」
, , , , , ,
警告、 FormWindowOpenMode.LockEntireInterface);
手順の終了

&OnClient
プロシージャの保存(コマンド)
サーバー上に保存();
サーバー上で手順の終了(&O)
手順 サーバー上に保存()
もし オブジェクト.リンク.空() それから
外部データソース.Nomenklatura.dbo_insert_nomenklatura
さもないと
外部データソース.Nomenklatura.dbo_update_nomenklatura
(オブジェクト.id、オブジェクト.説明、オブジェクト.価格);
EndIf ;
手順の終了

エンタープライズ モードでは、リスト フォームは次のようになります。

オブジェクトの形状を以下に示します。

拡大するには、画像をクリックしてください。

そこで、ストアド プロシージャを使用して、外部データ ソースへの記録を実装しました。

プラットフォーム 8.3.5 では、上で説明したストアド プロシージャ メカニズムをバイパスして、外部データ ソースに直接書き込むという新機能が登場しました。

データはプログラム的にまたは対話的に編集できます。 この例では、構成に頼る必要はありません。

コマンド パネルと「その他」メニューには、「作成」、「コピー」、「編集」などの標準ボタンが表示されます。

拡大するには、画像をクリックしてください。

そして、オブジェクト フォームに [保存] ボタンと [保存して閉じる] ボタンが表示されました。

ご覧のとおり、外部ソースの操作は、参考書やドキュメントなどの操作と似ています。

外部データ ソースへの書き込みを可能にするためにメタデータ レベルでどのような変更が加えられたかを見てみましょう。

新しいプロパティがデータテーブルに追加されました 読むだけ(タイプ - ブール値)。

このプロパティが True に設定されている場合、プラットフォーム ツールを使用してこのテーブルにデータを書き込むことはできません。

データ テーブル フィールドには次のプロパティが追加されました。

  • 読むだけ(type – boolean) – このフィールドのデータを変更することは可能ですか。
  • ヌルを許可します(type – boolean) – このフィールドに NULL 値を格納できるかどうか。

財産 読むだけに設定する必要があります 真実自動変更のあるデータベース フィールド、自動生成されたキー フィールド、計算フィールドなど。

組み込み言語を使用して、外部ソースのデータを追加、変更、削除できます。

これを行うには、オブジェクト 外部データソーステーブルレコードセットそして 外部データソーステーブルオブジェクト新しいメソッドが実装されました 書く()そして 消去().

上で説明した外部データ ソースに新しいレコードをプログラムで追加する例を見てみましょう。

&OnClient
手順 プログラムによる作成(チーム )
サーバー上でプログラム的に作成();
サーバー上で手順の終了(&O)

手順 サーバー上でプログラム的に作成()
書き込み可能なオブジェクト=
外部データソース.Nomenklatura.Tables.dbo_nomenklatura.CreateObject();
WriteableObject.id= 5 ;
WriteableObject.description= 「ワードローブ」 ;
WriteableObject.価格= 5000 ;
WriteableObject.Write();
手順の終了

外部データ ソース テーブル オブジェクト モジュールで、次のような書き込みイベント ハンドラーを指定できるようになりました。 BeforeWrite(), OnWrite()等。:

この記事では、外部データ ソースにデータを書き込むための 2 つのオプション (ストアド プロシージャを使用する方法と 8.3.5 プラットフォームの新しいメカニズムを使用する方法) を検討しました。

したがって、プラットフォームは外部アプリケーションと完全に統合するためのメカニズムを実装するようになりました。

バージョン 8.3.6 では、上記の機能が、新しい特別なメソッド GetModifiableFields() および SetModifiableFields() を利用して拡張されました。 これらを使用すると、コンフィギュレータで読み取り専用としてマークされている VIEW テーブルのフィールドで書き込み操作を実行できます。 これにより、アプリケーションのビジネスロジックに合わせて必要な場合のみVIEWテーブルの各フィールドへの書き込みが可能となるシナリオが実現可能となりました。

バージョン 8.3.7 では、VIEW テーブルのどの特定のフィールドに NULL 値を含めることができるかを決定するメカニズムが改善されました。 この時点までは、すべての VIEW テーブルがこの値を受け入れることができました。 この変更は、これらのフィールドによる動的リストの並べ替え速度の向上によるものです。

バージョン 8.3.8 では、外部データ ソースがトランザクション状態にあることを検出できるようになりました。 この機能は、新しいメソッド ExternalDataSourceManager.TransactionActive() によって提供されます。

結論として、外部データ ソースの場合、上に示したように、古典的なリレーショナル モデルのデータ テーブルが記述されていることに注意してください。 このプラットフォームは、データの操作に異なるパラダイムを使用し、開発者に特定の種類のアプリケーション オブジェクト (ディレクトリ、ドキュメント、レジスタなど) のセットを提供します。 そのため、システムは、外部データ ソースのテーブルを操作するときに、その「ネイティブ」オブジェクトに固有の機能のほとんどをサポートしません。 したがって、既存のシステムとの統合タスクに関連しない場合は、VID テーブルの使用を考慮したビジネス ロジックの開発を控えることをお勧めします。 簡単に言うと、アプリケーションでアクティブに使用されているデータがこのシステムで使用されていない場合は、外部システムの他のテーブルに保存しないようにする必要があります。

次の記事では、1C:Enterprise システムで外部データ ソースのテクノロジを使用する論理的な継続について説明します。

外部データ ソース 1C - 比較的新しいメタデータ オブジェクト 1C 8.3 および 8.2。1C 外部データ ソースに接続できます: SQL テーブル、Excel、Access、FoxPro (dbf)、別の 1C データベース、Oracle、Paradox (db) 、 - 単純な txt/csv ファイルからの読み取りも可能です。

これにより、他のシステムでも多くの可能性が得られます。 詳しく見てみましょう。

1C 8 での外部データ ソースのセットアップ

外部ソースのセットアップは、システムのタイプごとに個別に行われます。 ただし、原則として、セットアップの一般的な部分は同じです。これは、接続文字列の設定です。

1C の 267 ビデオ レッスンを無料で入手:

接続文字列が正しく指定されている場合、システムはデータベースから目的のテーブルを選択するように求めるプロンプトを表示します。 その結果、キー フィールド (一意のフィールド) とプレゼンテーション フィールド (レコードが 1C にどのように反映されるか) を指定できる既製のテーブルが得られます。

1C 8.3 での外部データ ソースの使用

1C の外部データ ソースは、他のデータベース テーブルと同様に使用できます。 フォームが指定されていない場合、プラットフォームは自動的にフォームを生成します。 外部ソースからのデータをクエリで使用することもできます。

プラットフォーム バージョン 8.3.5.1068 (以降) では、1C ソフトウェアを使用して外部ソースのデータを追加、変更、削除できるようになりました。 この機能の例はこの記事で紹介されています。

外部ソースへの記録を可能にするために、1C 社は外部ソースのデータ テーブルとフィールドに新しいプロパティを追加しました。

  • テーブル全体 - プロパティ 読むだけ. 読み取り専用 = Trueこのテーブルのデータを変更することは不可能であることを意味します。
  • 個々のテーブルフィールド - プロパティ 読むだけ, ヌルを許可しますそして 値を埋める:
    • 読み取り専用 = Trueこのフィールドのデータを変更することが不可能であることを意味します。
    • AllowNull = Trueこのフィールドに値を書き込むことができることを意味します ヌル;
    • 値を埋めるこのフィールドのデフォルト値が含まれます (存在する場合)。

ユーザー (手動でテーブルを記述する場合) またはプラットフォーム (デザイナを使用してテーブルを作成する場合) は、これらのプロパティを次のように使用できます。

  • 読み取り専用 = True例えば、ビューや式(関数の結果)に基づいて得られるテーブルなどを設定する。 このようなテーブルのデータは変更できません。
  • 読み取り専用 = True自動的に設定されるフィールドを指定します ( 自動増加)、計算フィールドなど。 このようなフィールドのデータは変更できません。
  • AllowNull = Trueキー フィールドと外部ソースで次のように記述されているフィールドを除くすべてのフィールドに設定されます。 NULLではありません;
  • 値を埋めるフィールドは、外部ソースがこのフィールドの標準値 (値) を指定する場合に設定する必要があります。 デフォルト).

組み込み言語を使用して、または対話的に外部ソースのデータを追加、変更、削除できます。 組み込み言語は、これを行うために次のテーブル マネージャー メソッドを使用します。

  • CreateRecordSet()- 非オブジェクトテーブルの場合。
  • 新しい方法 CreateObject()- オブジェクトテーブルの場合。

したがって、オブジェクトは、 外部データソーステーブルレコードセットそして 外部データソーステーブルオブジェクト新しい手法が登場しました 書く()そして 消去().

データの追加

外部ソースにデータを追加するときは、オブジェクト (またはレコードセット) を作成し、フィールド値を設定して、書き込みます。 ただし、知っておくと便利な機能がいくつかあります。

たとえば、次のようなフィールドの値を設定しようとすると、 読み取り専用 = True、エラーがスローされます。 式でデータベースに直接書き込む場合 入れるそのようなフィールドはスキップされます。 残りのフィールドには、割り当てた値が含まれています。 したがって、値は ヌルまた、デフォルト値はフィールドに明示的に割り当てる必要があります。

  • ID(AllowNull = True);
  • 名前(AllowNull = True);
mFeature = ExternalDataSources.TableIm.shop_feature.CreateObject(); mCharacteristic.id = コード; mCharacteristic.name = 名前; mCharacteristic.Write();

ステートメントの実行 書く()イベントハンドラーが最初に呼び出されます 録音前、その後、外部ソーステーブルへの物理的な書き込みが実行されます( 入れる)、イベント ハンドラーが呼び出されます。 録音時.

外部ソース テーブルのキー フィールドを使用して、次のことを実行できます。 キー フィールドが変更可能な場合は、書き込む前にその値を「手動で」設定します。 キーフィールドの変更が禁止されている場合、プラットフォームは独自にキーを受け取ります。 入れるまたはその直後。 次のメソッドを使用してこのプロセスに干渉できます。 SetLinkNew()物理的な記録の前 (イベント ハンドラー内) 録音前) または物理的な記録の直後 (イベント ハンドラー内) 録音時).

データの変更

データが変更されると、テーブルのすべてのフィールドの値が変更されます。 読み取り専用 = False.

MFeature = ExternalDataSources.TableIm.shop_feature.FindByField("id",code); mObject = mCharacteristic.GetObject(); mObject.name = 名前; mObject.Write();

一部のフィールドのみを記録する必要がある場合は、次のメソッドを使用して組み込み言語からフィールドのリストを直接指定できます。 SetWritableFields()そして GetWrittenFields().

データの削除

データを削除すると、データベース テーブルから行が直接削除されます。 この場合、削除されるオブジェクトへの参照の検索は実行されません。 このような機能が必要な場合は、イベント ハンドラーで自分でプログラムできます。 BeforeDelete().

MFeature = ExternalDataSources.TableIm.shop_feature.FindByField("id",Code); mObject = mCharacteristic.GetObject(); mObject.Delete();

取引

外部ソースからのデータの読み取りは、以前と同様、トランザクションの外部で実行され、書き込み時には、プラットフォームは暗黙的なトランザクションを開きます。 同時に、オブジェクト メソッドを使用して明示的なトランザクションで読み取りと書き込みの両方を実行できます。 外部データソースマネージャー:

  • StartTransaction();
  • CommitTransaction();
  • CancelTransaction().

ロック

  • 自動;
  • 管理された;
  • 自動および制御.

外部ソーステーブルのプロパティと同様に トランザクション分離レベル:

さらに、メソッドでロック レベルを個別に設定できます。 StartTransaction().

標準記事に例を追加しました)時間があれば、さらに例を追加します。