バックグラウンド タスク 1 秒 8.3 を完了します。 普遍的な規制タスク。 日常業務のスケジュール

1C で作業する場合、ドキュメントを投稿したり、Web サイトから 1C にデータをロードしたりするなど、何らかのアクションを実行するために起動またはスケジュールする必要がある多くの日常的な操作があります。

最近、次の記事を投稿しました: これを自動化する時が来ました:

ルーチンタスクとバックグラウンドタスク

ジョブ エンジンは、あらゆるアプリケーションや機能をスケジュールに従って、または非同期で実行するように設計されています。

タスク メカニズムにより、次の問題が解決されます。

  • システム構成段階で規制手順を定義する能力。
  • スケジュールに従って指定されたアクションを実行します。
  • 指定されたプロシージャまたは関数を非同期的に呼び出すこと。 完了を待たずに。
  • 特定のタスクの進行状況を追跡し、その完了ステータス (成功したかどうかを示す値) を取得します。
  • 現在のタスクのリストを取得します。
  • 1 つ以上のタスクが完了するまで待機する機能。
  • ジョブ管理(キャンセル可能、実行阻止等)。

ジョブ メカニズムは次のコンポーネントで構成されます。

  • 日常業務のメタデータ。
  • 定期的なタスク。
  • バックグラウンドジョブ。
  • タスクスケジューラ。

バックグラウンド ジョブは、アプリケーション タスクを非同期的に実行するように設計されています。 バックグラウンド タスクは、組み込み言語を使用して実装されます。

スケジュールされたタスクは、スケジュールに従ってアプリケーション タスクを実行するように設計されています。 ルーチンタスクは情報ベースに保存され、構成で定義されたメタデータに基づいて作成されます。 規制タスクのメタデータには、名前、方法、用途などの情報が含まれます。

定型タスクには、その定型タスクに関連付けられたメソッドを実行する必要がある時刻を決定するスケジュールがあります。 スケジュールは、原則として情報ベースで指定されますが、構成段階で指定することもできます (たとえば、事前定義されたルーチン タスクの場合)。

タスク スケジューラは、日常的なタスクの実行をスケジュールするために使用されます。 スケジュールされたジョブごとに、スケジューラは現在の日時がスケジュールされたジョブのスケジュールと一致するかどうかを定期的に確認します。 一致する場合、スケジューラはそのタスクを実行に割り当てます。 これを行うために、このスケジュールされたタスクに対して、スケジューラは実際の処理を実行するバックグラウンド タスクを作成します。

この説明はこれで十分だと思います。実装に移りましょう。

ルーチンタスクの作成

メソッド名– 指定されたスケジュールに従ってバックグラウンド ジョブで実行されるプロシージャへのパス。 プロシージャは共通モジュール内に存在する必要があります。 標準の共通モジュールを使用せず、独自のモジュールを作成することをお勧めします。 バックグラウンド ジョブはサーバー上で実行されることを忘れないでください。

使用法– 日常的なタスクを使用している兆候。

所定の– ルーチンタスクが事前に決定されているかどうかを示します。

ルーチンタスクをデータベースに配置した直後に動作させたい場合は、属性を指定します 所定の。 それ以外の場合は、「ジョブ コンソール」処理を使用するか、タスクをプログラムで実行するようにトリガーする必要があります。

ジョブ異常終了時のリトライ回数– バックグラウンド ジョブがエラーで実行された場合に、バックグラウンド ジョブが再起動された回数。

ジョブ異常終了時のリトライ間隔– バックグラウンド ジョブがエラーで完了した場合に再起動される頻度。

スケジュールの設定

スケジュールタスクを完了する:

1時間ごと、1日だけRepeatDays 期間 = 0、RepeatDays 期間 = 3600
毎日1日1回RepeatDays 期間 = 1、RepeatDays 期間 = 0
ある日、一度だけ期間繰り返し日 = 0
一日おきに一日一回期間繰り返し日数 = 2
毎日01.00から07.00まで毎時PeriodRepeatDays = 1RepeatPeriodDuringDay = 3600StartTime = 01.00

終了時間 = 07.00

毎週土曜日と日曜日の09:00RepeatDays 期間 = 1WeekDays = 6、7StartTime = 09.00
1週間毎日、1週間スキップ期間繰り返し日 = 1期間週 = 2
01:00に1回開始時間 = 01.00
毎月最終日9:00。PeriodRepeatDays = 1DayInMonth = -1StartTime = 09.00
毎月5日9:00PeriodRepeatDays = 1DayInMonth = 5StartTime = 09.00
毎月第2水曜日 9:00期間繰り返し日 = 1日週月 = 2日週 = 3

開始時間 = 09.00

ファイルおよびクライアント/サーバー バリアントでバックグラウンド ジョブを実行する機能

ファイル バージョンとクライアント サーバー バージョンでバックグラウンド ジョブを実行するメカニズムは異なります。

ファイルバージョン内バックグラウンド ジョブを実行する専用のクライアント プロセスを作成する必要があります。 これを行うには、クライアント プロセスはグローバル コンテキスト関数 ExecuteJobProcessing を定期的に呼び出す必要があります。 インフォベースごとに 1 つのクライアント プロセスだけがバックグラウンド ジョブを処理する必要があります (したがって、この関数を呼び出します)。 バックグラウンド ジョブを処理するクライアント プロセスが作成されていない場合、プログラムでジョブ エンジンにアクセスすると、「ジョブ マネージャーがアクティブではありません」というエラーが表示されます。 他の機能のバックグラウンド ジョブを処理するクライアント プロセスを使用することはお勧めできません。

バックグラウンド ジョブを処理するクライアント プロセスが開始されると、他のクライアント プロセスはプログラムによってバックグラウンド ジョブ エンジンにアクセスできるようになります。 バックグラウンドジョブを実行および管理できます。

クライアントサーバー版の場合バックグラウンド ジョブを実行するには、クラスタ マネージャに物理的に配置されているタスク スケジューラが使用されます。 キューに入れられたすべてのバックグラウンド ジョブについて、スケジューラは最も負荷の低いワーカー プロセスを取得し、それを使用して対応するバックグラウンド ジョブを実行します。 ワーカープロセスはジョブを実行し、実行結果をスケジューラに通知します。

クライアントサーバーバージョンでは、日常的なタスクの実行をブロックすることができます。 次の場合、定型業務の実行がブロックされます。

  • 日常業務の明示的なブロックが情報ベースにインストールされています。 ロックはクラスター コンソール経由で設定できます。
  • 情報ベースに接続ブロックがあります。 ロックはクラスター コンソール経由で設定できます。
  • True パラメーターを指定した SetExclusiveMode() メソッドが組み込み言語から呼び出されました。
  • その他の場合 (データベース構成を更新する場合など)。

スケジュールされたタスクの起動と表示の処理ここからダウンロードできます。

おそらく、すべての 1C 8.3 プログラマは、遅かれ早かれ、スケジュールに従って特定のタスクの実行を設定する必要がありました。 以下にこれらのメカニズムについて詳しく説明します。これが初心者の 1C プログラマーにとって有益な情報になることを願っています。 これは人間の操作を必要とせず、定型タスクは一度設定すればスケジュールに従って動作するため、非常に便利です。

詳細な手順については、以下の例を使用して説明します。

1C のルーチン タスクとバックグラウンド タスクとは何ですか

  • スケジュールされたタスクは、指定されたスケジュールに従って特定のアクションを実行するように設計された特別な 1C エンタープライズ 8.3 メカニズムです。
  • バックグラウンドジョブ- ユーザーまたは 1C 8.2 プログラマの参加なしに、意図したアクションを直接実行するルーチン タスクによって生成されるオブジェクト。

スケジュールされたジョブとバックグラウンド ジョブのメカニズムは、DBMS の機能のおかげで、クライアント サーバー モード (SQL) で動作します。 ファイル データベースがある場合は、タスクを構成することもできますが、その原則は少し異なります。

1C クライアント/サーバー モードでのバックグラウンド ジョブのセットアップ

まず、新しいメタデータ オブジェクト、つまり日常的なタスクを作成しましょう。 私のタスクを「通貨レートの読み込み」と呼びます。 この構成オブジェクトのプロパティ パレットを見てみましょう。

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

  • メソッド名— 指定されたスケジュールに従ってバックグラウンド ジョブで実行されるプロシージャへのパス。 プロシージャは共通モジュール内に存在する必要があります。 標準のものを使用するのではなく、独自のものを作成することをお勧めします。 バックグラウンド ジョブはサーバー上で実行されることを忘れないでください。
  • 使用法— ルーチンタスクを使用している兆候。
  • 所定の— 定型タスクが事前に決定されているかどうかを示します。 ルーチン タスクをデータベースに配置した直後に動作させる場合は、このフラグを指定します。 それ以外の場合は、ジョブ コンソール処理を使用するか、ジョブをプログラムで実行する必要があります。
  • ジョブ異常終了時のリトライ回数— バックグラウンド ジョブがエラーで実行された場合に、バックグラウンド ジョブが再起動された回数。
  • ジョブ異常終了時のリトライ間隔— バックグラウンド ジョブがエラーで完了した場合に再起動される頻度。

そして最も興味深い設定は、 スケジュール:

ここでは、「メソッド名」フィールドで指定したプロシージャの起動間隔を設定します。 設定したとしましょう

注意! DBMS レベルでルーチンおよびバックグラウンド ジョブの実行のブロックを無効にすることを忘れないでください。

これは、クライアント サーバー バージョンの管理ユーティリティで行うか、新しいデータベースを作成するときに実行できます。

1C ファイルモードでのルーチンタスクの設定

ファイル モードでは、このようなジョブのセットアップは多少難しくなります。 このようなタスクを実行するには、1C プログラムの別のセッションを起動する必要があります。 この問題は、セッションが常に実行されている「技術」ユーザーを作成することで解決されることがよくあります。

ファイルモードでは、「RunTaskProcessing()」メソッドが起動されると、ルーチンジョブが初期化されます。

特定のユーザーに対して、別の方法を使用してこのメ​​ソッドを実行するように構成できます-

ConnectWaitHandler( <ИмяПроцедуры>, <Интервал>, <Однократно>).

  • プロシージャ名— 待機ハンドラーとして接続されているプロシージャの名前。 マネージド アプリケーション モジュール (通常のアプリケーション モジュール) またはグローバル共有モジュールのエクスポートされたプロシージャの名前。 プロシージャはクライアント上に存在する必要があります.
  • 間隔— 操作の実行間隔 (秒単位)。
  • 一度- タスクを一度完了するかどうか。

ConnectWaitHandler、3600 ) ;

1C コンフィギュレーターで日常的なタスクを設定する方法を示す 2 分間のビデオ:

1C のスケジュールされたタスクは、スケジュールに従って特定の手順をある程度の頻度で実行するように設計されています。

日常的なタスクは情報ベースに保存され、起動スケジュールが設定されています。 情報ベースがクライアントサーバー モードで動作している場合、起動自体は完全に自動です。 データベースがファイルベースの場合は、次の手順を実行する必要があります。

  • 日常的なタスクを実行するために特別なユーザーを割り当てます。
  • このユーザーの下でデータベースを開く必要があり、その関数を定期的に実行する必要があります。 TaskProcessing()を実行します。

ルーチンタスクの作成

スケジュールされたタスクは、1C 構成メタデータ オブジェクトです。 一般グループにあります。 ルーチンタスクのパラメータとプロパティを考えてみましょう。

メソッド名— 一般モジュール内のエクスポート手順へのパス。指定されたスケジュールに従って実行されます。 このプロシージャはサーバー上で実行する必要があります。 この点では、日常的なタスクはオブジェクトに似ています。 イベントを購読します。

— 同じタイプの定型タスクを複数作成できます。 たとえば、単一のメタデータ オブジェクトを使用して、複数の情報ベース間のデータ同期を実装できます。 ルーチンタスク一方で、いくつかの定型タスク自体が (交換用のデータベースの数に応じて) 作成されます。 これらの日常的なタスクは、次のプロパティを使用して区別されます。 鍵。同じキーを持つジョブは一度に 1 つだけ実行できます。

使用法— スケジュールされたタスクが有効かどうかを示すフラグ。

所定の— ここで、事前定義されたディレクトリ要素との類似性を引き出すことができます。 事前定義された要素はコンフィギュレーターで作成され、ユーザーが作業で使用します。 通常の要素はユーザーが自分で作成します。 ルーチンタスクも同様です。事前に定義されているタスクは存在し、コンフィギュレーターで作成した直後にスケジュールに従って実行できます。 フラグの場合 所定のがインストールされていない場合、ユーザーはこのタイプのルーチン タスクを 1 つ以上作成する必要があります (たとえば、 ジョブコンソール).

ジョブ異常終了時のリトライ回数— バックグラウンド ジョブがエラーで完了した場合に、バックグラウンド ジョブを再起動する回数を決定します。

ジョブ異常終了時のリトライ間隔— バックグラウンド ジョブがエラーで完了した場合に、バックグラウンド ジョブを再起動する頻度を決定します。

定型業務を伴うプログラム作業

これらの例では、事前定義されていない通常のルーチン タスクの処理を検討します。

プログラムによる定型タスクの作成

//タスクを作成する
「通常のタスク名」) ;

// スケジュールされたタスクのキーを設定します (オプション)
エクササイズ。 キー = "タスクキー" ;

//ルーチンタスクを有効にする
エクササイズ。 使用法 = True ;

//ルーチンタスクを書く
エクササイズ。 書く() ;

パラメータを変更するためのスケジュールされたタスクのプログラムによる受信

この例では、特定の種類のルーチン タスクが 1 つだけ存在すると仮定します。 複数のタスクがある場合、 を知っていれば、コードに適切な変更を加えるのは難しくありません。


「ルーチンタスク名」] ) ) ;


タスクの場合。 数量() > 0 の場合
ジョブ= ジョブ[ 0 ] ;


さもないと
タスク = 通常のタスク。 ルーチンタスクの作成( 「ルーチンタスク名」) ;

EndIf ;

//ルーチンタスクは Task 変数にあります。 パラメータを変更できます。

定型タスクのスケジュールを変更するためのダイアログを呼び出す

日常的なタスクのスケジュールを操作するための特別なタイプのダイアログがあります。 このタイプの日常的なタスクは 1 つだけであると依然として想定しています。

//必要なタイプのルーチンタスクを含む配列を取得します
タスク = 通常のタスク。 Get RoutineTasks(new Structure("Metadata" , Metadata.RoutineTasks[ 「ルーチンタスク名」] ) ) ;

// タスクが存在する場合、条件によりそれは 1 つとなります
タスクの場合。 数量() > 0 の場合
ジョブ= ジョブ[ 0 ] ;

//タスクがない場合は作成する
さもないと
タスク = 通常のタスク。 ルーチンタスクの作成( 「ルーチンタスク名」) ;

EndIf ;

スケジュール=タスク。 スケジュール;

// 定型タスクのスケジュールを変更するためのダイアログを作成します
編集ダイアログ = RoutineTask (スケジュール) の新しい ScheduleDialog ;

// ユーザーにダイアログを表示し、スケジュールの変更を処理します
IfEditダイアログ。 OpenModal() 次に
エクササイズ。 スケジュール = 編集ダイアログ。 スケジュール;
エクササイズ。 書く() ;
EndIf ;

1C のバックグラウンド ジョブは、スケジュールに従って自動的に起動することも (つまり、日常的なジョブのインスタンスである)、または開発者自身がバックグラウンド ジョブの起動を開始して任意のアルゴリズムを実行することもできます (顕著な例は、1C でのレポートの生成です)背景)。
重要!!!ファイル データベースの場合、プラットフォーム バージョン 8.3.3.641 以降では、バックグラウンド ジョブが実行される別のセッションを起動する必要はありません。 それらの。 以前は、ファイル データベースでバックグラウンド ジョブを実行するには、グローバル コンテキスト メソッドを実行する必要がありました。 「RunTaskProcessing()」。 詳細はこのリンクをご覧ください。

バックグラウンドジョブで任意のアルゴリズムを実行する手順

別のバックグラウンド ジョブでアルゴリズムを実行するには、次のメソッドを使用します。 "走る()"バックグラウンドジョブマネージャー: 構文:実行する(<ИмяМетода>, <Параметры>, <Ключ>, <Наименование>)
  • <ИмяМетода>(必須); タイプ: 文字列
    サーバー上で実行できる非グローバル共通モジュールのエクスポートされたプロシージャまたは関数の名前 (ModuleName.MethodName の形式)。
  • <Параметры>(オプション); タイプ: 配列
    メソッドに渡されるパラメータの配列。 パラメータの数とタイプはメソッドのパラメータと一致する必要があります。 (詳細については、構文アシスタントを参照してください)
  • <Ключ>(オプション); タイプ: 文字列
    キーを指定する場合、そのキーは、バックグラウンド ジョブと同じメソッド名を持つアクティブなバックグラウンド ジョブのキーの中で一意である必要があります。
  • <Наименование>(オプション); タイプ: 文字列。
    タスクの説明。

バックグラウンドジョブの実行手順

この例では、一般モジュールにあるエクスポート手順を使用します。 「一般モジュールサーバー」(モジュールがサーバーサイドである必要があることは説明の必要はないと思います) 手順 バックグラウンドで製品に関する情報を書き込みます (BackgroundTask パラメーター) Export Data Request = New Request ("SELECT | Products. Link AS Nomenclature | FROM | Directory. Nomenclature AS 製品」); フェッチ = DataRequest.Execute().Select(); While Selection.Next() MH Cycle = Information Registers.Product Data.CreateRecordManager(); MZ.Period = 現在の日付(); MZ.命名法 = サ​​ンプリング.命名法; MH.Information = BackgroundTaskParameter; MZ.Write(); エンドサイクル; 手順の終了 バックグラウンド ジョブの操作をデモンストレーションするために、項目ごとに情報レジスタにエントリを作成し、バックグラウンド ジョブが起動されるフォームからパラメータを渡します。

バックグラウンドジョブ開始コマンド

実行プロシージャに渡すパラメーターは、マネージド フォームの属性 (「文字列」タイプの属性) から取得されます。

マネージド フォーム モジュールのコードは次のようになります。 &On the Client Procedure StartBackgroundJob(Command) StartBackgroundJobOnServer(); プロシージャの終了 &On the Server Procedure Start Background Job On Server () // パラメータを使用して配列を形成 Job Parameters = New Array; JobParameters.Add(TaskParameter); // BackgroundTasks.Execute アルゴリズムのバックグラウンド実行を開始します(// 一般モジュール "GeneralModuleServer.WriteInformationOnProductsInBackground" のエクスポート メソッド、 // パラメーターを含む配列を渡しますTaskParameters、 // タスク キーを指定します New UniqueIdentifier、 // を指定しますバックグラウンド ジョブの名前 "私たちのバックグラウンド ジョブ "); 手順の終了

実行結果

バックグラウンド ジョブの実行の結果、情報レジスタにエントリが生成されます (これが必要なものです)。

非同期プログラミングの概念

非同期プログラミングの概念は、関数の結果はすぐには利用できないが、しばらくしてから非同期 (通常の実行順序に違反する) 呼び出しの形式で利用できるというものです。

それらの。 非同期プログラミングの主な考え方は、個々のメソッド呼び出しを発行し、呼び出しの終了を待たずに他の作業を並行して実行し続けることです。

例外の可能性を最小限に抑えるメソッドの中には、非同期アプローチを必要としないものもありますが、開発の最初の段階で非同期アプローチを必要とするものもあります。

グラフからわかるように、同期プログラミング モデルでは、システムがユーザー インターフェイスをブロックするため、有用な対話型ユーザー アクションの係数はありません。一方、非同期モデルでは、ユーザーはシステム内でアクティブに作業を続けます。

同期的に実行する場合、アプリケーションにはスレッドが 1 つだけあります。 非同期プログラミング モデルを使用すると、複数のスレッドを並行して実行し、実行時に新しいユーザー アクションに反応できます。 n スレッドが実行されると、結果が画面に表示されます。

1C:Enterprise 8 のバックグラウンド タスク

1C:Enterprise 8 では、バックグラウンド ジョブはアプリケーション タスクを非同期で実行するように設計されています。 たとえば、クライアント/サーバー動作モードでクラスターの異なる稼働サーバー間で複雑な計算を並列化するために、子バックグラウンド ジョブを生成できます。

特定のアプリケーション基準に基づいて、同じメソッドを持つバックグラウンド ジョブの実行を制限することができます。 バックグラウンド ジョブのプログラムによる作成と管理は、システム情報ベースへの任意のユーザー接続から可能です。 バックグラウンド ジョブは、それを作成したユーザーに代わって実行されます。

タスク メカニズムは、クライアント/サーバー モードとファイル モードの両方の動作モードで機能しますが、両方のバージョンでタスクを管理および実行する機能は多少異なります。

クライアントサーバーオプション

クライアント サーバー バージョンでは、タスク スケジューリングは、クラスタ マネージャーに物理的に配置されているタスク スケジューラによって実行されます。

スケジューラは、バックグラウンド ジョブを実行するリクエストを受信したかどうかを定期的にチェックします。 実行する必要があるジョブがある場合、スケジューラはクラスター内で最も負荷の低いワーカー プロセスを特定し、各ワーカー プロセスに実行するタスクを順番に割り当てます。 したがって、同じワーカー プロセスで複数のジョブを並行して実行できる可能性があります。 ワーカー プロセスがジョブを受信すると、ワーカー プロセスはインフォベースへの接続を確立し、その接続内でジョブを実行します。 ジョブが完了すると、ワーカー プロセスはジョブが正常に完了したか失敗したかをスケジューラに通知します。

ファイルオプション

プラットフォームのバージョン 8.3.3.641 以降、開発者はファイル バージョンでのバックグラウンド ジョブの作業を大幅に簡素化しました。

以前は、タスクを自動的に実行するには、タスク スケジューラとして使用される別の追加の 1C:Enterprise セッションを起動する必要がありました。 そして、このセッションでは、組み込み言語メソッドを定期的に実行する必要がありました TaskProcessing()を実行します。このアプローチは非常に面倒で不便であり、ファイル バージョンの作業でのバックグラウンド タスクやルーチン タスクの使用が大幅に制限されていました。

今ではすべてがはるかに簡単になりました。 シン クライアントまたはシック クライアントが起動し、Web サーバーにクライアント接続がある場合、これらの各アプリケーションで、データベースへの接続を使用して別のスレッドが自動的に起動されます。 これらのスレッドは、バックグラウンド タスクやルーチン タスクの実行に従事します。

リストされている各アプリケーションは、独自のバックグラウンド タスクを実行します。 アプリケーションが複数のバックグラウンド ジョブを開始した場合、それらは受信した順序で順番に実行されます。

1C バックグラウンドジョブの明らかな欠点: これらはサーバー側で実行されるため、ユーザーとの対話型作業の可能性はありません (たとえば、メッセージやその他の情報を表示することは不可能です。このデータはすべて情報ベース内に保存され、さらに処理される必要があります)何らかの方法で)。

バックグラウンド ジョブは純粋にソフトウェア オブジェクトであり、データベースに保存できないことに注意してください。 つまり、クラスのインスタンスを作成し、そのプロパティを初期化し、実行のために起動することしかできません。

1C:Enterprise 8 での非同期コード実行の例

「関数呼び出しの結果がいつ届くかわからないプログラムを書くのは、普通のプログラムよりもはるかに難しいです。 ネストされた呼び出し、エラー処理、何が起こっているかの制御 - すべてがより複雑になります。」プラットフォームの機能を適切に使用する方法を知らない人だけがこれを言うでしょうが、私たちはそうではありません。

1C:Enterprise 8 での非同期コード実行のシンプルさと優雅さを実証してみましょう。

ステップ1。新しい情報セキュリティシステムを構築して構成開発をしてみよう

ステップ2。設定では、汎用モジュール「非同期ハンドラー」を追加します。

なぜ共有モジュールを追加したのでしょうか? ここではすべてが簡単です。1C:Enterprise 8 で非同期操作を実行するには、独自のマネージャー「BackgroundTask Manager」を持つバックグラウンド ジョブが使用されます。 このオブジェクトには「Run」メソッドがあり、これを使用してバックグラウンド タスクが起動されます。

構文アシスタントに目を向けましょう。

したがって、共通モジュールが必要になります。

ステップ3。一般モジュール「非同期ハンドラー」に、エクスポート プロシージャ OurLongOperation() を追加します。

Procedure OurLongOperation(Duration) Export // 長期アクションのシミュレーション (Duration 秒)。 OperationStartDate = 現在の日付(); While CurrentDate() - 操作の開始日< Длительность Цикл КонецЦикла; КонецПроцедуры

ステップ4。「非同期プログラミングの概念」処理を構成に追加(外部処理を作成可能)

フォームに属性を 1 つ追加します。

期間 (数値)

そして2つのチーム

LongOperation を実行します。

Long-Long 操作を非同期で実行します。

ステップ5。構文アシスタントに従って、フォームモジュールに記入します

& クライアント上でのプロシージャ Perform Long-RunningOperation(Command) ExecuteLong-RunningOperationOnServer(); EndProcedure &OnServer プロシージャ ExecuteLongOperationOnServer() AsynchronousHandlers.OurLongOperation(Duration); 手順の終了&クライアント上での手順 長時間実行操作を非同期的に実行する (コマンド) サーバー上で長時間実行操作を非同期的に実行する (); プロシージャの終了(&On the Server) プロシージャ サーバー上で長時間実行操作を非同期に実行する() パラメータ = New Array; パラメータ.Add(期間); BackgroundTasks.Execute("AsynchronousHandlers.OurLongOperation", Parameters, New UniqueIdentifier, "非同期プログラミングの概念の例"); 手順の終了

ステップ6。起動して確認してみましょう!

結果:

「長時間の操作を実行」ボタンをクリックすると、ユーザー・インターフェースは「Duration」秒間ブロックされます。

[長時間実行操作を非同期で実行する] ボタンをクリックすると、ユーザー インターフェイスはブロックされず、プログラム コードが並列実行されます。

ログを見ることで、プログラム コードが非同期で実行されていることを確認できます。

デバッグ パラメーターに適切なプロパティを設定すると、「バックグラウンド」で実行されるプログラム コードをデバッグできます。

BSP を使用した 1C:Enterprise 8 での非同期コード実行の例

1C:Enterprise 8 における非同期プログラミングの概念を BSP に実装する例を、「時事」の処理を例にして考えてみましょう。

ロジックは次のとおりです。プログラムが起動すると、スタート ページの作業領域が初期化され、「時事」処理フォームが表示されます。 このフォームはユーザーの近況を記入するもので、記入には時間がかかります。 開発者にコードを非同期に実行する機能がなかった場合、処理フォームの入力中にユーザー インターフェイスがブロックされてしまいます。

フォームのプログラムコードを解析してみましょう。

フォーム イベント「When CreatedOnServer」は「RunBackgroundTask」プロシージャを呼び出します。これが必要なものです。

ニュアンスに惑わされずに、この手順を分析してみましょう

ここでは、バックグラウンド ジョブ マネージャーとその「Run」メソッドが使用されていることがわかります。 開発者はバックグラウンド ジョブの一意の ID を保存することに注意してください。

これを行うには、開発者は次のメソッドを使用します。 ConnectWaitHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>).



フックされたプロシージャ内で Connectable_CheckTaskComplete()開発者が関数を呼び出す ジョブ完了(タスクID)


この関数は、識別子によってバックグラウンド ジョブの実行をチェックします。

BSP は長期的なサーバー運用をサポートするための汎用モジュールを開発していることに注意してください。

したがって、1C:Enterprise 8 の非同期プログラミングの概念は、開発者にとって問題解決の複雑さをわずかに増加させますが、ユーザーの観点からはプログラムの機能を大幅に向上させます。