問題の問題の本質は見出しに記載されており、ストーリーは3つの部分に分けられます。 別途、スクリプトテキストを以下に示します。
1)はじめに
自動バックアップの必要性の問題は、著名人にとっても初心者にとっても疑いの余地はありません。 この記事では、1Cを使用したバックアップを検討します(DBMSを使用したコピーよりもいくつかの利点があります)。 同時に、1Cプラットフォーム、powershell、およびWindowsタスクスケジューラのバッチ起動用のツールが使用されます。
情報を更新するタスクは長い間自動化されていますが、これは標準構成、または標準サブシステムのライブラリを使用する構成の場合のみです。 私の場合、12台のサーバーにまで及ぶ古いAlfa-Autoエディション4を使用しています。 変更は週に約2回行われるため、自動化の利点は明らかです。
どちらの場合も、次の初期データがあります。
- Windows Serverオペレーティングシステム(2008年から2012年のバージョン);
- プラットフォーム1C 8.3のクライアントサーバーバージョン(必要なコンポーネントCOM接続付き)。
もちろん、管理者権限を持つOSおよび1Cの資格情報があります。
構成を更新するには、ftpサーバーも必要です。
この記事を膨張させないために、 PowerShellとWindowsスケジューラについて別々に読むことをお勧めします。
2)バックアップ
これらのリンクを読んだ後、powershellスクリプトを実行するために何をする必要があるかは既にわかっているので、すぐに説明します。
バッチモードで情報ベースのバックアップコピーを作成するのは非常に簡単です。すべてのユーザーを「追い出す」だけです。 これを行うには、COMオブジェクトをデータベースに接続します。 この例では、ExitAll関数がこれを行います。 これは、実際には1Cサーバークラスターがインストールされているサーバーで呼び出される関数本体に縫い付けられています。 サーバー上のスクリプトにパラメーターを指定せずにこの関数を呼び出すと、クラスター内のすべてのデータベースのすべてのユーザーが飛び出します。
この手順を書いたときにコードを使用した人に謝罪します-原作者を復元できませんでした。
その後、パラメーター(情報ベースの名前)を指定してBackUpBase関数を呼び出す必要があります。 すべてのIBで、同じ資格情報を持つサービス管理者がいるため、それらをハードコーディングしました。 必要に応じて、それらをパラメーター化するか、OS認証を使用できます。
結果のスクリプトはファイルに保存されます。
タスクスケジューラで、もちろん、自分の判断で「単純なタスク」という名前を作成します。
私にとっては毎日有効ですが、ここでも所有者がマスターです。 誰も働いていない夜、たとえば3:00に始めるのが最善です。 タスクのアクションは「プログラムの実行」です。 プログラム自体は「powershell.exe」です。 そして、ここに彼女の議論があります-
-File "D:\1C_automatization\ExitAllUsersAndBackup.ps1" -ExecutionPolicy RemoteSigned
ExitAllUsersAndBackup.ps1は保存されたスクリプトです。
-ExecutionPolicy RemoteSigned-システムでグローバルに許可されていない場合に、Powershellバッチスクリプトの実行を有効にするキー。 1回おきに機能します(おそらく、それを理解するのに十分な能力がありませんが、パターンは見つかりませんでした)。 このキーで機能しない場合は、サーバー全体でスクリプトの実行を許可する必要があります。
このWin + Rの場合、powershell.exe、
Set-ExecutionPolicy RemoteSigned
アクションを確認します。
これらのスクリプトを使用する時間は3か月以上です。 中断は、停電やその他の外部要因に関連していました。
3)構成の更新
すべてのユーザーがログアウトした(または前の場合のように追い出された)後、構成を更新できます。 すべてのユーザーを切断し、コンフィギュレーターを開いて構成をダウンロードした瞬間から、一部のタスクが動作を開始する可能性があるため、スケジュールされたタスクの存在が更新を妨げる場合があります。 したがって、スケジュールを考慮する必要があります。
構成をftpサーバーに保存し、その上に手動で配置します。 構成ファイルはGK.cfと呼ばれ、この例では1つの構成が更新されます。 潜在的に、いくつかの異なる構成をアップグレードすることもできます。
GK.cfの横のftpに、flag.txtというファイルを配置します。 このファイルの存在は、更新が必要であることを示しています。 GK.cfファイル自体の存在を確認できますが、他の目的にもフラグを使用します。
スクリプトは次のように機能します。
- 作業ディレクトリ内のGK.cfおよびflag.txt(存在する場合)を削除します(スケジューラを起動するユーザーは、このディレクトリに書き込む権利が必要です)。
- フラグファイルをダウンロードしようとしました。
- そのようなファイルのダウンロードに成功した場合は、.cfをダウンロードしてください。
- 実際には、UpdateCf関数を使用して更新します。
前のケースとは対照的に、1C起動パラメーターはアレイではなく、コマンドラインの通常モードで転送されました。
このスクリプトの信頼性はわずかに劣ります。 メタデータ構造が変更された場合、更新は最後まで100%行われます。 他のケースでは、以前に警告したように、アクティブユーザーの外観が発生します。 その結果、構成はデータベースにロードされますが、データベース構成は更新されません(1Cに関係のない人々にこのような曲がった用語をおaびします)。 それ以外の場合、飛行は正常です。
バックアップスクリプト
# ++ $BAKUPDIR="D:\1C_automatization\BACKUP\" $CEXE="C:\Program Files (x86)\1cv8\common\1cestart.exe" # -- function ExitAll{ # 1 # , # : , #$SrvAddr = "tcp://y001-ap-01:1640" $SrvAddr = "tcp://127.0.0.1" ######################################## $V83Com = New-Object -COMObject "V83.COMConnector" # $ServerAgent = $V83Com.ConnectAgent($SrvAddr) $ClusterFound = $FALSE # $Clasters = $ServerAgent.GetClusters() foreach ($Claster in $Clasters){ # # , , # $ServerAgent.Authenticate($Claster,"","") # $Sessions = $ServerAgent.GetSessions($Claster) write-host "" $Sessions.Count "..." foreach ($Session in $Sessions){ $ServerAgent.TerminateSession($Claster,$Session)} if (($Sessions.Count -eq 0)){ continue} # # , "" # $WorkingProcesses = $ServerAgent.GetWorkingProcesses($Claster) foreach ($WorkingProcess in $WorkingProcesses){ if ($WorkingProcess.Running -eq 1){ write-host " PID =" $WorkingProcess.PID #!!! 1 Stop-Process $WorkingProcess.PID -Force}} } $V83Com = "" } function BackUpBase($IbName){ # $NOWDATETIME = Get-Date -UFormat "%Y_%m_%d_%H-%M" #, ( , ) $TARGETDIR = $BAKUPDIR # $BAKFN=$TARGETDIR + $IbName + "_" + $NOWDATETIME + ".dt" # $PARAMS = ("DESIGNER","/UseHwLicenses+","/S","127.0.0.1\$IbName","/N","1","/P","1","/DumpIB",$BAKFN) #, &$CEXE $PARAMS } # ExitAll # BackUpBase RingAlpha BackUpBase MazdaAlpha BackUpBase RingAcc BackUpBase RingZup BackUpBase MazdaHRM BackUpBase MazdaAcc BackUpBase RingAcc48 BackUpBase RingHRM48 BackUpBase RingAccNorth BackUpBase RingHRMNorth
構成更新スクリプト
function Download_File ($si_UserName, $si_Password, $si_Source_Path, $si_Target_Path){ $oi_Credentials = New-Object System.Net.NetworkCredential($si_UserName,$si_Password) $oi_Web_Client = New-Object System.Net.WebClient $oi_Web_Client.Credentials = $oi_Credentials $oi_Web_Client.DownloadFile($si_Source_Path, $si_Target_Path) while($oi_Web_Client.IsBusy){} } Clear-Host; $curDir = $MyInvocation.MyCommand.Definition | split-path -parent $curDir = $curDir + "\" $server = "111.222.33.4" #FTP $flagfoldername = "/1C/flag.txt" # - $flagurl = "ftp://$server$flagfoldername" #url $cffoldername = "/1C/GK.cf" # $cfurl = "ftp://$server$cffoldername" #url $login = "MYFTPUSER" #ftp- $password = "MYFTPPWD" #ftp- $flagfile = $curDir + "flag.txt" $cffile = $curDir + "GK.cf" # $SERVERNAME="127.0.0.1" $CEXE="C:\Program Files (x86)\1cv8\common\1cestart.exe" $ADMINNAME="1CUSER" $ADMINPASS="1CPWD" function UpdateCf($IBNameLocal){ &$CEXE 'DESIGNER' '/S' $SERVERNAME'\'$IBNameLocal '/N' $ADMINNAME '/P' $ADMINPASS '/LoadCfg' $cffile '/UpdateDBCfg' '-Server' } function FileExist($fpath){ $isfile = Test-Path $fpath return ($isfile -eq "True") } #, if (FileExist $flagfile){ Remove-Item $flagfile } if (FileExist $cffile){ Remove-Item $cffile } Download_File $login $password $flagurl $flagfile if (FileExist $flagfile){ Download_File $login $password $cfurl $cffile if (FileExist $cffile){# UpdateCf "MazdaAlpha" UpdateCf "RingAlpha" } }
ご清聴ありがとうございました。 建設的な批判の準備ができています。