1C:Enterprise 8.2などのソフトウェア製品をご存知だと思います。 そして、おそらく、あなたの多くは、OLE / COM接続を使用して1C:Enterpriseに接続できるという事実を知っています。 しかし、OLE / COM接続を使用して1Cプログラムコードを実行できるだけでなく、1C:Enterpriseサーバーを「管理」できることを知っている人はどれくらいいますか。 たとえば、1Cに接続できます。エンタープライズサーバークラスターエージェント、開いているクライアントセッションのリストを取得し、それらに発行されたライセンスに関する情報を読み取ります。組み込み言語1Cから:エンタープライズ。 VB.Net、C#.Net、Java、または... Perlであっても、OLE / COMコンポーネントを操作できる任意の言語を選択できます。 はい、あなたは正しいと聞きました。 Perlです。
だから...
チャレンジ。
Windowsタスクスケジューラを使用して、Agent 1C:Enterprise 8.2サーバーサービスの自動再起動を実装する必要があります。 ただし、再起動する前に、1C:EnterpriseサーバーにあるBaseデータベースで誰かが作業しているかどうかを確認する必要があります。 誰かが働いている場合、サービスの再起動は許可されません。
解決策。
サーバーエージェントサービスを定期的に再起動する必要があるのはなぜかという質問があります。 実際のところ、バージョン1C:Enterprise 8.2 x64には「小さな」エラーが1つあります。 これは、インフォベースの動的更新中に発生し、データベースを更新して作業することを不可能にします。 開発者は公式に(彼らと個人的に連絡して)このエラーはバージョン8.2で修正される予定はないと述べています。 公式リリース8.3までは、「生き残る」必要があります。 私はどういうわけかこのエラーを修正する方法を知っています(必要であれば、コメントでお知らせするか、記事を更新します)。 しかし、開発者が保証するように、この回避策はデータベースを完全に破壊する可能性があります。 このバイパス方法を使用して1年間、私のベースは崩壊していません。 しかし、この記事についてはそうではありません。
だから。 タスクが設定されます。 私にとっての主な問題は、特定のデータベースへの既存の接続をチェックする条件でした。 この目標を達成するために、組み込みの1Cを使用しないことに決めました。エンタープライズ言語、.Net言語、Java(コンソールのみ、真のlinux-wayのみ)のいずれでもありません。
1C:Enterprise構文アシスタントで、データベース接続を確認する方法が見つかりましたが、Agent 1C:EnterpriseサーバーへのOLE / COM接続の使用を想定しています。 さて...始めましょう。
ヘルパー構文からの抜粋
サーバーエージェント接続(IServerAgentConnection)
GetInfoBaseConnections(GetInfoBaseConnections)
構文:
GetInfoBaseConnections(<クラスター>、<情報ベース>)
パラメータ:
<cluster>(必須)
タイプ:サーバークラスター 接続の説明の配列を取得するサーバークラスター。
<InformationBase>(必須)
タイプ:情報ベースの説明。 接続の説明の配列を取得する情報ベース。
戻り値:
タイプ:COMSafeArray。 クラスター接続の説明の配列。 各接続記述は、接続記述インターフェースを備えたオブジェクトによって表されます。
説明:
インフォベース接続の説明の配列を取得します。
可用性:
統合
GetInfoBaseConnections(GetInfoBaseConnections)
構文:
GetInfoBaseConnections(<クラスター>、<情報ベース>)
パラメータ:
<cluster>(必須)
タイプ:サーバークラスター 接続の説明の配列を取得するサーバークラスター。
<InformationBase>(必須)
タイプ:情報ベースの説明。 接続の説明の配列を取得する情報ベース。
戻り値:
タイプ:COMSafeArray。 クラスター接続の説明の配列。 各接続記述は、接続記述インターフェースを備えたオブジェクトによって表されます。
説明:
インフォベース接続の説明の配列を取得します。
可用性:
統合
Perlを使用してOLE / COMオブジェクトを操作するには、Win32 :: OLEモジュールを使用する必要があります。 私が使用するStrawberryPerlアセンブリでは、このモジュールは既にプリインストールされています。 ただし、そうでない場合でも、CPANからインストールできます。
C:\Perl\perl\bin\cpan Win32::OLE
データベース接続1Cのリストを取得するには、次のものが必要です。
- V82.COMConnectorオブジェクトへのCOM接続を作成します。
- サーバークラスター1C:Enterpriseのエージェントに接続します。
- 1Cクラスターオブジェクトを取得します。
- クラスターにログインします。
- このクラスター上の1Cデータベースのリストを取得します。
- 必要なベースを見つけます。
- このデータベースへのアクティブな接続のリストを取得します。
これは、1C:Enterpriseサーバーにある1C:Enterpriseデータベースとのアクティブなクライアント接続のリストを受け取るコメント付きのコードです。
use strict; use warnings; use Win32::OLE; use Data::Dumper; sub getConnectionsCount { # ( ) my ($server, $dbname) = @_; # COM- my $ole1c = Win32::OLE->new("V82.COMConnector") or die "Could not create OLE-connector!\n"; # 1: my $_agent = $ole1c->ConnectAgent($server) or die "Could not connect to server!\n" . cnv(Dumper $ole1c->ErrorDescription()); # ( ) my $_cluster = $_agent->GetClusters()->[0] or die "Could not get cluster 0 from array\n"; # . # , # 1:. # , # . # , . $_agent->Authenticate($_cluster, "", ""); # , my $_basesinfo = $_agent->GetInfoBases($_cluster); # my @_bases = grep { defined $_->{Name} && $_->{Name} =~ m/^$dbname$/ } @$_basesinfo; # my $_base = $_bases[0]; # my $connCounter = 0; # 0 my $_baseconns = $_agent->GetInfoBaseConnections($_cluster, $_base) or return 0; # “” , . # , # 1: foreach (@$_baseconns) { # if ($_->{Application} !~ m/JobScheduler/ && $_->{Application} !~ m/SrvrConsole/) { $connCounter++; } } return $connCounter; } # . # , 1: print “There are “ . getConnectionsCount(“localhost:1540”, “Base”) . “ active connections\n”;
「net start」および「net stop」コマンドを使用して、Agentサービスを再起動できます。
net stop <> net start <>
Bitbucketに配置したタスクを実行する完全なコード。