マネージド フォーム モジュールのコードは次のようになります。 &On the Client Procedure StartBackgroundJob(Command) StartBackgroundJobOnServer(); プロシージャの終了 &On the Server Procedure Start Background Job On Server () // パラメータを使用して配列を形成 Job Parameters = New Array;
実行結果
バックグラウンド ジョブの実行の結果、情報レジスタにエントリが生成されます (これが必要なものです)。
非同期プログラミングの概念
非同期プログラミングの概念は、関数の実行結果はすぐには得られず、しばらくしてから非同期 (通常の実行順序に違反する) 呼び出しの形で得られるというものです。
それらの。 非同期プログラミングの主な考え方は、個々のメソッド呼び出しを発行し、呼び出しの終了を待たずに他の作業を並行して実行し続けることです。 例外の可能性を最小限に抑えるメソッドの中には、非同期アプローチを必要としないものもありますが、開発の最初の段階で非同期アプローチを必要とするものもあります。グラフからわかるように、同期プログラミング モデルでは、システムがブロックするため、有用な対話型ユーザー アクションの係数はありません。
ユーザーインターフェース
一方、非同期モデルでは、ユーザーはシステム内でアクティブに作業を続けます。
同期的に実行する場合、アプリケーションにはスレッドが 1 つだけあります。 非同期プログラミング モデルを使用すると、複数のスレッドを並行して実行し、実行時に新しいユーザー アクションに反応できます。 n スレッドが実行されると、結果が画面に表示されます。
特定のアプリケーション基準に基づいて、同じメソッドを持つバックグラウンド ジョブの実行を制限することができます。 バックグラウンド ジョブのプログラムによる作成と管理は、システム情報ベースへの任意のユーザー接続から可能です。 バックグラウンド ジョブは、それを作成したユーザーに代わって実行されます。
タスク メカニズムは、クライアント/サーバー モードとファイル モードの両方の動作モードで機能しますが、両方のバージョンでタスクを管理および実行する機能は多少異なります。
クライアントサーバーオプション
クライアント サーバー バージョンでは、タスク スケジューリングは、クラスタ マネージャーに物理的に配置されているタスク スケジューラによって実行されます。
スケジューラは、バックグラウンド ジョブを実行するリクエストを受信したかどうかを定期的にチェックします。 実行する必要があるジョブがある場合、スケジューラはクラスター内で最も負荷の低いワーカー プロセスを特定し、それぞれに実行する独自のジョブを順番に割り当てます。 したがって、同じワーカー プロセスで複数のジョブを並行して実行できる可能性があります。 ワーカー プロセスがジョブを受信すると、ワーカー プロセスはインフォベースへの接続を確立し、その接続内でジョブを実行します。 ジョブが完了すると、ワーカー プロセスはジョブが正常に完了したか失敗したかをスケジューラに通知します。
ファイルオプション
プラットフォームのバージョン 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 操作を非同期で実行します。
& クライアント上でのプロシージャ 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()
この関数は、識別子によってバックグラウンド ジョブの実行をチェックします。
BSP が開発したことに注意してください。 共通モジュール長期的なサーバー運用をサポートします。
したがって、1C:Enterprise 8 の非同期プログラミングの概念は、開発者にとって問題解決の複雑さをわずかに増加させますが、ユーザーの観点からはプログラムの機能を大幅に向上させます。
おそらく、すべての 1C 8.3 プログラマは、遅かれ早かれ、スケジュールに従って特定のタスクの実行を設定する必要がありました。 以下にあげます 詳しい説明これらのメカニズムがそうなることを願っています 役立つ情報初心者の 1C プログラマー向け。 これは人間の操作を必要とせず、定型タスクは一度設定すればスケジュールに従って動作するため、非常に便利です。
詳細な手順については、以下の例を使用して説明します。
スケジュールされたジョブとバックグラウンド ジョブのメカニズムは、DBMS の機能のおかげで、クライアント サーバー モード (SQL) で動作します。 ファイル データベースがある場合は、タスクを構成することもできますが、その原則は少し異なります。
まず、新しいメタデータ オブジェクト、つまり日常的なタスクを作成しましょう。 私のタスクを「通貨レートの読み込み」と呼びます。 プロパティパレットを見てみましょう このオブジェクトの構成:
1C の 267 ビデオ レッスンを無料で入手:
そして最も興味深い設定は、 スケジュール:
ここでは、「メソッド名」フィールドで指定したプロシージャの起動間隔を設定します。 設定したとしましょう
注意! DBMS レベルでルーチン タスクとバックグラウンド タスクのブロックを無効にすることを忘れないでください。
これは、クライアント サーバー バージョンの管理ユーティリティで行うか、新しいデータベースを作成するときに実行できます。
ファイル モードでは、このようなジョブのセットアップは多少難しくなります。 このようなタスクを実行するには、1C プログラムの別のセッションを起動する必要があります。 この問題は、セッションが常に実行されている「技術」ユーザーを作成することで解決されることがよくあります。
ファイルモードでは、「RunTaskProcessing()」メソッドが起動されると、ルーチンジョブが初期化されます。
特定のユーザーに対して、別の方法を使用してこのメソッドを実行するように構成できます-
ここでは、バックグラウンド ジョブ マネージャーとその「Run」メソッドが使用されていることがわかります。 開発者はバックグラウンド ジョブの一意の ID を保存することに注意してください。 <ИмяПроцедуры>, <Интервал>, <Однократно>).
ConnectWaitHandler、3600 ) ;
1C コンフィギュレーターで日常的なタスクを設定する方法を示す 2 分間のビデオ:
おそらく、1C 8.3 または 8.2 の本格的な構成は、ルーチン タスクやバックグラウンド タスクを使用せずに実行できるものは 1 つもありません。 これらは、ユーザーやプログラマの介入なしに、明確に定義されたスケジュールに従って実行されるため、非常に便利です。
たとえば、1 日に 1 回、別のプログラムとデータを交換する必要があります。 1C は、ルーチン タスクとバックグラウンド タスクを使用して、たとえば勤務時間外にこれらのアクションを独立して実行できます。 この方法はユーザー エクスペリエンスにはまったく影響せず、時間の節約に役立ちます。
まず、それらの意味と違いを理解しましょう。
私たちの会社が何かを販売しており、価格が記載されている独自の Web サイトを持っていると仮定しましょう。 関連性を維持するために、1 日に 1 回アップロードしたいと考えています。
構成を開き、スケジュールされたタスクを追加します。
一番考えてみましょう 重要なパラメータ、プロパティに入力する必要があります。
最後のステップは、プロパティ パレットの対応するハイパーリンクを使用して、サイトへのアップロードのスケジュールを設定することです。
あなたの目の前で開きます 一般的な設定 1C 8.3のスケジュール。 ここでは複雑なことは何もありません。 内で この例当社では、サイトへの価格のアップロードを毎日午前 5 時から 7 時まで開始するように設定しています。 スケジュールされたタスクが 7:00 までに完了できない場合は、翌日に完了します。
標準ユーティリティ「1C Enterprise Servers の管理」を実行し、ルーチン タスクを作成した情報ベースのプロパティを開きます (1C のクライアント/サーバー バージョンの場合)。
(情報セキュリティにアクセスするためのログイン名とパスワードを入力した後) 開いたウィンドウで、「定型タスクのブロックが有効になっています」チェックボックスが選択されていないことを確認します。 タスクが機能しない状況が発生した場合は、まずこの設定を確認してください。
同様に、1C 8.3 では日常的なタスクを完全に無効にすることができます。 特定のバックグラウンド ジョブを無効にするには、組み込みの 最新リリース「バックグラウンドジョブのコンソール」を処理しています。
で このモードこれらのジョブを設定して実行することは、整理するのがはるかに困難です。 ほとんどの場合、追加の アカウント、セッションは常に開いています。
スケジュールされたタスクのアクティブ化 この場合「RunTaskProcessing()」メソッド使用時に実行されます。
次の構造を使用することもできます。
プロシージャ名として、実行されるクライアント プロシージャの名前を指定する必要があります。 間隔は、実行が何秒後に行われるかを示します。 「One time」パラメータは必要ありません。 それが満たされるかどうかを反映します この手順一度か数回。
バックグラウンド タスクの進行状況と可用性を表示します。 考えられるエラーログブックで確認できます。 フィルターで「バックグラウンド ジョブ」アプリケーションを選択し、必要に応じて、関心のある重要度 (たとえば、「エラー」のみ) を選択します。
ログには、選択に一致するすべてのエントリが、エラーの理由を理解するのに役立つコメントとともに表示されます。
1C で作業する場合、ドキュメントを投稿したり、Web サイトから 1C にデータをロードしたりするなど、何らかのアクションを実行するために起動またはスケジュールする必要がある多くの日常的な操作があります。
最近、次の記事を投稿しました: これを自動化する時が来ました:
ジョブ エンジンは、あらゆるアプリケーションや機能をスケジュールに従って、または非同期で実行するように設計されています。
タスク メカニズムは次のタスクを解決します。
ジョブ メカニズムは次のコンポーネントで構成されます。
バックグラウンド ジョブは、アプリケーション タスクを非同期的に実行するように設計されています。 バックグラウンド タスクは、組み込み言語を使用して実装されます。
スケジュールされたタスクは、スケジュールに従ってアプリケーション タスクを実行するように設計されています。 ルーチンタスクは情報ベースに保存され、構成で定義されたメタデータに基づいて作成されます。 規制タスクのメタデータには、名前、方法、用途などの情報が含まれます。
定型タスクには、その定型タスクに関連付けられたメソッドを実行する必要がある時刻を決定するスケジュールがあります。 スケジュールは、原則として情報ベースで指定されますが、構成段階で指定することもできます (たとえば、事前定義されたルーチン タスクの場合)。
タスク スケジューラは、日常的なタスクの実行をスケジュールするために使用されます。 スケジュールされたジョブごとに、スケジューラは現在の日時がスケジュールされたジョブのスケジュールと一致するかどうかを定期的に確認します。 一致する場合、スケジューラはそのタスクを実行に割り当てます。 これを行うために、このスケジュールされたタスクに対して、スケジューラは実際の処理を実行するバックグラウンド タスクを作成します。
この説明はこれで十分だと思います。実装に移りましょう。
メソッド名– 指定されたスケジュールに従ってバックグラウンド ジョブで実行されるプロシージャへのパス。 プロシージャは共通モジュール内に存在する必要があります。 標準の共通モジュールを使用せず、独自のモジュールを作成することをお勧めします。 バックグラウンド ジョブはサーバー上で実行されることを忘れないでください。
使用法– 日常的なタスクを使用している兆候。
所定の– ルーチンタスクが事前に決定されているかどうかを示します。
ルーチンタスクをデータベースに配置した直後に動作させたい場合は、属性を指定します 所定の。 それ以外の場合は、「ジョブ コンソール」処理を使用するか、タスクをプログラムで実行するようにトリガーする必要があります。
タスク異常終了時のリトライ回数– バックグラウンド ジョブがエラーで実行された場合に、バックグラウンド ジョブが再起動された回数。
ジョブ異常終了時のリトライ間隔– バックグラウンド ジョブがエラーで完了した場合に再起動される頻度。
スケジュールタスクを完了する:
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:00 | RepeatDays 期間 = 1WeekDays = 6、7StartTime = 09.00 |
1週間毎日、1週間スキップ | 期間繰り返し日 = 1期間週 = 2 |
01:00に1回 | 開始時間 = 01.00 |
毎月最終日9:00。 | PeriodRepeatDays = 1DayInMonth = -1StartTime = 09.00 |
毎月5日9:00 | PeriodRepeatDays = 1DayInMonth = 5StartTime = 09.00 |
毎月第2水曜日 9:00 | 期間繰り返し日 = 1日週月 = 2日週 = 3 開始時間 = 09.00 |
ファイル バージョンとクライアント サーバー バージョンでバックグラウンド ジョブを実行するメカニズムは異なります。
ファイルバージョン内バックグラウンド ジョブを実行する専用のクライアント プロセスを作成する必要があります。 これを行うには、クライアント プロセスはグローバル コンテキスト関数 ExecuteJobProcessing を定期的に呼び出す必要があります。 1 つにつき 1 つのクライアント プロセスのみ 情報ベースバックグラウンド ジョブを処理する必要があります (したがって、この関数を呼び出します)。 バックグラウンド ジョブを処理するクライアント プロセスが作成されていない場合、プログラムでジョブ エンジンにアクセスすると、「ジョブ マネージャーがアクティブではありません」というエラーが表示されます。 他の機能のバックグラウンド ジョブを処理するクライアント プロセスを使用することはお勧めできません。
バックグラウンド ジョブを処理するクライアント プロセスが開始されると、他のクライアント プロセスは ソフトウェアアクセスバックグラウンドジョブのメカニズム、つまり バックグラウンドジョブを実行および管理できます。
クライアントサーバー版の場合バックグラウンド ジョブを実行するには、クラスタ マネージャに物理的に配置されているタスク スケジューラが使用されます。 キューに入れられたすべてのバックグラウンド ジョブについて、スケジューラは最も負荷の低いワーカー プロセスを取得し、それを使用して対応するバックグラウンド ジョブを実行します。 ワーカープロセスはジョブを実行し、実行結果をスケジューラに通知します。
クライアントサーバーバージョンでは、日常的なタスクの実行をブロックすることができます。 次の場合、定型業務の実行がブロックされます。
スケジュールされたタスクの起動と表示の処理ここからダウンロードできます。