1C管理者用ドライバーセット

画像の代替テキスト







数年間、最初に強制され、次に非常に楽しい1C管理を行い、ほとんどの製品機能に対する一連のソリューションを蓄積してきました。 私は、クラスターとSQLチューニングに関する重要事項を脇に置き、1Cで生活を楽にするスクリプトとメカニズムの供給を刷新することを提案します。







新しいユーザーを作成し、全員がデータベースを去ったかどうかを監視するためのシンプルなツール、およびデータベースとその動きの整合性をチェックするためのより洗練されたインターフェースがあります。







キャッシュのクリーン化と正常な状態



ほとんどの複雑なアプリケーションと同様に、1Cでは、しばらくすると、奇妙なエラーがクロールアウトし、時には説明できない動作が発生します。 そのような場合は、1Cの特別な人がキャッシュをクリアすることをお勧めします。







/ ClearCacheオプションを指定して1Cを実行すると、クライアントサーバーリクエストのみがクリアされます。 ローカルメタデータは残り、ファイルおよびフォルダーレベルで個別に削除する必要があります。 このデータは、データベースGUIDの長い名前のフォルダーのユーザープロファイルに保存されます。 サーバー上にデータベースがほとんどない場合、そのようなキャッシュは手動で簡単に削除できます。 しかし、データベースが数十の場合、手動でのクリーニングでは満足できません。







画像の代替テキスト







このような状況では、Powershellスクリプトが役立ちます。これは、ユーザーがログアウトするたびに実行されます。







Get-ChildItem "$env:USERPROFILE\AppData\Local\1C\1Cv8\*","$env:USERPROFILE\AppData\Roaming\1C\1Cv8\*" | Where {$_.Name -as [guid]} |Remove-Item -Force -Recurse
      
      





古いキャッシュには問題ありません。







バグ修正



破損したファイルデータベースを修正するために、1Cにはchdbfl.exeユーティリティが含まれてます。このユーティリティは、データベースの内容を一時ファイルに読み込むだけです。 一部のデータを読み取れない場合、スキップします。 ただし、彼女には自動化のための開始キーがないため、検証を手動で開始する必要があります。







一般に、コンフィギュレーターを使用してデータベースチェックを実行する方が適切ですが、このプロセスにはさらに時間がかかります。 chdbfl.exeを使用した物理的整合性検証のみを使用する場合、データ損失の可能性があるため、バックアップを忘れないでください。







8.1データベースの場合、 Andrey Sklyarovは、「fix found errors」と「database path」という2つの起動パラメーターを備えた適切なCheck1CDツールを作成しました。







ただし、Check1CDには次の2つがありません。









ウィッシュリストと空き時間がありますので、問題を自分で解決してみてください。







そのため、AutoItにはメガスクリプトがありました
 #NoTrayIcon #include <GUIConstantsEx.au3> #include <File.au3> #include <Date.au3> #include <Inet.au3> Global $oMyError = ObjEvent("AutoIt.Error","MyErrFunc") Global $Basepath="D:\Base\” ;    ,   ;,    1. If ProcessExists("1cv8.exe") or ProcessExists("chdbfl.exe") Then Msgbox(0,"!", "1c  ,   ") Exit EndIf ;,     ,     if FileExists ($Basepath&"_$NEW$_.1CD") Then MSGbox(0,"!", "   !    ") Exit EndIf ;  ,       If not FileExists ($Basepath&"1Cv8.1CD") Then Msgbox(0,"!", "   !") Exit EndIf ;,  $hgui = GUICreate(" " , 200, 200) GUICtrlCreateLabel("    ",2,2) GUICtrlCreateLabel("    30 ",2,22) GUICtrlCreateLabel(" ? ",2,42) $yes = GUICtrlCreateButton("", 5, 150, 70, 25) $no= GUICtrlCreateButton("", 75, 150, 70, 25) GUISetState(@SW_SHOW) While 1 $msg = GUIGetMsg() Select Case $msg = $GUI_EVENT_CLOSE GUIDelete() Exit Case $msg = $yes GUIDelete() _check () ExitLoop Case $msg = $no GUIDelete() Exit EndSelect WEnd ;   func _check () $sTitle="    " ProgressOn(" ", "   ", "0%",-1,-1,18) run ("C:\Program Files\1cv81\bin\chdbfl.exe","", @SW_HIDE,7) WinWait($sTitle) local $size = filegetsize($Basepath&"1Cv8.1CD") ;! ControlSend($sTitle,"", "V8FormElement9",$Basepath&"1Cv8.1CD") ControlClick($sTitle,"", "V8FormElement8") ControlClick($sTitle,"", "V8FormElement7","left",2) $filename = $Basepath&"\1Cv8.1CD" local $size1 =0 ;        While 1 $size1 = filegetsize($Basepath&"_$NEW$_.1CD") $perc=round(($size1/$size)*100) ProgressSet($perc, ", .  "& $perc & "%") sleep (1500) ;,         ;    If not FileInUse($filename) and not FileExists ($Basepath&"\_$NEW$_.1CD") Then ExitLoop EndIf WEnd sleep(5000) ; ,         ; - ! WinSetState ( $sTitle, "", @SW_SHOW ) WinSetOnTop($sTitle, "", 1) WinActivate($sTitle, "") WinWaitActive($sTitle) ControlClick($sTitle,"", "V8FormElement4") sleep(50) ControlSend($sTitle,"", "V8FormElement4","^{home}") sleep(50) ControlSend($sTitle,"", "V8FormElement4","+^{end}") sleep(50) ControlSend($sTitle,"", "V8FormElement4","^{ins}") sleep(50) $text = ClipGet() ControlClick($sTitle,"", "V8FormElement6","left",2) ProgressSet(100, "100%", " ") sleep (500) ProgressOff() ; -,     ,   . ;  e-mail ;   Outlook Express.     $sender = RegRead("HKEY_CURRENT_USER\Software\Microsoft\ _ Internet Account Manager\Accounts\00000001","SMTP Email Address") $sendername = RegRead("HKEY_CURRENT_USER\Software\Microsoft\ _ Internet Account Manager\Accounts\00000001","SMTP Display Name") If not FileExists($Basepath&"check.Log") then _FileCreate($Basepath&"\check.Log") FileWrite ($Basepath&"check.Log", _NowCalc()&@CRLF ) If $text <> "" Then FileWrite ( $Basepath&"check.Log", " :"&@CRLF) FileWrite ( $Basepath&"check.Log", $text&@CRLF) FileWrite ( $Basepath&"check.Log", " .."&@CRLF) ;   smtp. -,   If Ping("smtp-server") <> 0 then if $sender = "" or $sendername="" Then MSGbox(0,"!", "  ,    !") Else email($sender, $sendername,$text) EndIf endif ;   ,      Else FileWrite ( $Basepath&"check.Log", " "&@CRLF) EndIf $hgui = GUICreate(" " , 200, 200) GUICtrlCreateLabel("  ",2,2) $ok = GUICtrlCreateButton("", 5, 150, 70, 25) GUISetState(@SW_SHOW) While 1 $msg = GUIGetMsg() Select Case $msg = $GUI_EVENT_CLOSE or $msg=$1 GUIDelete() Exit EndSelect WEnd EndFunc Func FileInUse($filename) $handle = FileOpen($filename, 1) $result = False if $handle = -1 then $result = True FileClose($handle) return $result EndFunc func email($sender, $sendername,$text) local $array[1] $array[0]=$text $t=_INetSmtpMail("smtpserver", $sendername,$sender, "[helpdesk@domain.com](mailto:helpdesk@domain.com)", _ " " ,$array,"EHLO " & @ComputerName,-1 ) $error=@error if $t <> 1 Then FileWrite ( $Basepath&"check.Log", "  e-mail  "&$sendername& " "&$sender&@CRLF) FileWrite ( $Basepath&"check.Log", "  "&$error&@CRLF) Else FileWrite ( $Basepath&"check.Log", "email "&@CRLF) EndIf EndFunc ;---------------------------------------------------------------------------------------------------------- ; Com Error Handler ;---------------------------------------------------------------------------------------------------------- Func MyErrFunc() Local $HexNumber Local $strMsg $HexNumber = Hex($oMyError.Number, 8) $strMsg = " " & $HexNumber & @CRLF $strMsg &= " " & $oMyError.WinDescription & @CRLF $strMsg &= ": " & $oMyError.ScriptLine & @CRLF FileWrite ( $Basepath&"check.Log", " -: "&$strMsg) FileWrite ( $Basepath&"check.Log", "e-mail  "& @CRLF) SetError(1) Endfunc
      
      





コマンドラインスイッチを介してパラメーターを渡すためのコードを変更することは技術的な問題です。







画像の代替テキスト







だった







画像の代替テキスト







それで







1C 8.2のリリースで問題が発生しました-chdbflへのパスは、新しいリリースのインストールで変更されました。 さて、スクリプトを追加しましょう。







 ;      chdbfl    $path=_FileListToArrayRec(@ProgramFilesDir&"\1cv8\","chdbfl.exe",1,1,0,2) If @error then Msgbox("","","1c  ,    " Exit Endif ;   Run ($path[1],"", @SW_HIDE,7)
      
      





私は言わなければならない、Check1CDソースコードは最近公開されました 。 はい、AutoITでも。







同様のメカニズムを使用して、さまざまな規制メカニズムを自動的に開始することができます。1Cを開始し、操作が完了するのを待つ必要があります。







フィクションでベースから追​​い出す



1Cでのさまざまなスケジュールされた操作(夜間の構成更新または.dtでのバックアップ)では、ユーザーが接続されていないことを確認することが重要です。 もちろん、 / Cスイッチを使用して1C:Enterpriseを開始することもできますが、これは必ずしも便利ではありませんが、後で硬化症を除去するための推奨事項を記載した個人的な手紙も書きたいと思います。







COMConnectorおよびAutoITのスクリプトを介して1Cに接続する標準機能を使用できます。 コードは1C 8.1で記述されており、ログに記録があるユーザーをデータベースから除外できます。







 global $obj = ObjCreate("v81.comconnector") $AgentConnection = $obj.ConnectAgent("tcp://servername:1540") $Cluster = $AgentConnection.GetClusters()[0] $AgentConnection.Authenticate($Cluster, "", "") $WorkingProcess = $AgentConnection.GetWorkingProcesses($Cluster)[0] $ConnectString = $WorkingProcess.HostName & ":" & $WorkingProcess.MainPort $WorkingProcessConnection = $obj.ConnectWorkingProcess($ConnectString) $WorkingProcessConnection.AddAuthentication("","") $ibDesc = $WorkingProcessConnection.CreateInfoBaseInfo() $ibDesc.Name = " " $connections = $WorkingProcessConnection.GetInfoBaseConnections($ibDesc) for $temp in $connections if $temp.username <> "" and ($temp.AppID <> "COMConsole" _ or "COM-") then FileWriteLine ( " ", @MDAY&"."&@MON&"."&@YEAR&" _ "&@HOUR&":"&@MIN&"    "&$temp.username &" _   "&$temp.AppID) $WorkingProcessConnection.Disconnect($temp) endif Next $AgentConnection="" $connect=""
      
      





ただし、「ヘビー」レポートを起動して1Cをハングさせたユーザー自身の要求に応じて、操作を実行する必要がある場合があります。 これらの問題を自分で解決したくない場合は、「ヘビー」レポートのファンのためにコンパイルされたスクリプトへのショートカットを表示するだけです。







 $a=Msgbox(4," ?","     ?") If $a<>6 then exit Else global $obj = ObjCreate("v83.comconnector") $AgentConnection = $obj.ConnectAgent("tcp://servername:1540") $Cluster = $AgentConnection.GetClusters()[0] $AgentConnection.Authenticate($Cluster, "", "") $infobases=$AgentConnection.GetInfoBases($Cluster) for $base in $infobases if $base.name="basename" Then $connections=$AgentConnection.GetInfoBaseSessions($Cluster, $base) for $temp in $connections ;     ,     If $temp.username = @username then $AgentConnection.terminatesession($cluster,$temp) EndIf next Exit EndIf next Endif
      
      





また、COMConnectorは、構成の更新を確認し、データベースから情報を取得し、1Cのユーザーエクスペリエンスを自動化するのに役立ちます。







新規ユーザーの技術的創造



私の意見では、システム管理者は1Cプログラマーではなく、新しい1Cユーザーを作成すべきです。 しかし、後者はプロセスを可能な限りシンプルにする必要があります。 管理者が各データベースを個別に「調べる」必要がないように、別のスクリプトを使用できます。







例として、標準のBookkeeping 2.0でユーザーを作成する機能を示します。
 ;     , ,    func _1cBuh($username, $surname,$name,$fathername) FileWriteLine($logfile, "  1 8.3  "& $Username) $obj = ObjCreate("v83.comconnector") $connect=$obj.Connect("Srvr=""servername"";Ref=""basename"";Usr=""login"";Pwd=""password"";") Local $avArray[1], $i=0 ;     $hgui = GUICreate("" , 200, 200) GUICtrlCreateLabel("   ?",2,2) GUICtrlCreateLabel("  ?",2,22) $1 = GUICtrlCreateButton("", 5, 150, 70, 25) $2= GUICtrlCreateButton("", 75, 150, 70, 25) GUISetState(@SW_SHOW) While 1 $msg = GUIGetMsg() Select Case $msg = $1 GUIDelete() $rght="" ExitLoop Case $msg = $2 GUIDelete() $rght="" ExitLoop EndSelect WEnd $mt=$connect.Metadata.Roles.find($rght) ;   $newuser= $connect..createuser() $newuser.name = $surname&" "&$name $newuser.fullname = $surname&" "&$name&" "&$fathername $newuser.StandardAuthentication = "False" $newuser.OSAuthentication="True" $newuser.OSuser="\\DOMAINNAME\"&$Username $newuser.Roles.add($mt) $newuser.write() ;    $bject=$connect.NewObject(".") $newuserS=$bject.CreateItem() $newuserS.code=$surname&" "&$name $newuserS.Description=$surname&" "&$name&" "&$fathername $newuserS.write() ;  () $query=$connect.Catalogs..() while $query.() if StringInStr ( $query.Description, "") then _ArrayAdd($avArray, $query.Description) $i+=1 endif wend $avArray[0]=$i GUICreate(" ", 200,$i*20+70) for $i=1 to $avArray[0] assign ("var"&$i, GUICtrlCreateCheckbox( $avArray[$i], 2, 0+20*$i));, 90, 20)) next $OK_Btn = GUICtrlCreateButton("", 50,$i*20+20, 60) GUISetState() While 1 $msg = GUIGetMsg() Select Case $msg = $OK_Btn For $i=1 to $avArray[0] if BitAND(GUICtrlRead(eval("var"&$i)), $GUI_CHECKED) = _ $GUI_CHECKED Then $grp=$connect... _ ($avArray[$i]).() $t=$grp..add() $t. = $newuserS. $grp.write() endif next GUIDelete() ExitLoop EndSelect WEnd $connect="" endfunc
      
      





画像の代替テキスト







法人が多すぎる-列に分割する必要があります。







興味深いことですが、遠い昔からある会社の数世代の管理者が変わった後、新しい管理者はユーザーを手動で作成する方法を知りませんでした。







自動データベース移動



1C:EnterpriseデータベースとSQL内のデータを別のサーバーに転送する必要がある場合は、1-2データベースの場合にのみ手動で行うことをお勧めします。







それらの数が多いと、ルーチンは退屈になります-スクリプトを使用することをお勧めします。
 #include <GUIConstantsEx.au3> local $name GUICreate("", 200, 180) GUICtrlCreateLabel("   ",2,35) $name1 = GUICtrlCreateInput($name, 2, 50, 300, 20) $OK_Btn = GUICtrlCreateButton("", 70, 180, 60) GUISetState() While 1 $msg = GUIGetMsg() Select Case $msg = $GUI_EVENT_CLOSE Exit Case $msg = $OK_Btn $name = GUICtrlRead($name1) exitloop endselect WEnd GUIDelete() GUICreate("", 200, 180) GUICtrlCreateLabel(" ",2,2) GUISetState() $constrim="DRIVER={SQL Server};SERVER=_;DATABASE=master;uid=sa;pwd=;" $adCN = ObjCreate ("ADODB.Connection") $adCN.Open ($constrim) $sQuery = "sp_detach_db @dbname = N'"&$name&"'" $adCN.Execute($sQuery) $adCN.Close GUICtrlCreateLabel(" ",2,15) $u=FileCopy ("\\_\    SQL-\"&$name&".mdf","\\_\    SQL-\"&$name&".mdf") if $u = 0 Then GUICtrlCreateLabel("!  !!!!",2,15) $OK_Btn = GUICtrlCreateButton("", 336,40, 60) GUISetState() While 1 $msg = GUIGetMsg() Select Case $msg = $GUI_EVENT_CLOSE exit Case $msg = $OK_Btn exit endselect WEnd GUIDelete() EndIf $u=FileCopy ("\\_\    _ SQL-\"&$name&".ldf","\\_\    SQL-\"&$name&".ldf") if $u = 0 Then GUICtrlCreateLabel("!  !!!!",2,15) $OK_Btn = GUICtrlCreateButton("", 336,40, 60) GUISetState() While 1 $msg = GUIGetMsg() Select Case $msg = $GUI_EVENT_CLOSE exit Case $msg = $OK_Btn exit endselect WEnd GUIDelete() EndIf GUICtrlCreateLabel("   "&$name,2,28) GUISetState() $constrim="DRIVER={SQL Server};SERVER=_;DATABASE=master;uid=sa;pwd=;" $adCN = ObjCreate ("ADODB.Connection") $adCN.Open ($constrim) $sQuery = "CREATE DATABASE "&$name&" ON (FILENAME = '    _ \"&$name&".mdf'), (FILENAME = '    \"&$name&".ldf') FOR ATTACH" $adCN.Execute($sQuery) $adCN.Close GUICtrlCreateLabel(" 1c-  "&$name,2,41) GUISetState() run ("""C:\Program Files (x86)\1cv8\common\1cestart.exe"" createinfobase_ ""Srvr=localhost;Ref="&$name&";DB="&$name&";DBMS=MSSQLServer;DBSrvr=localhost;DBUID=sa;DBPwd=""") GUICtrlCreateLabel(",  ",2,54) $OK_Btn = GUICtrlCreateButton("", 336,40, 60) GUISetState() While 1 $msg = GUIGetMsg() Select Case $msg = $GUI_EVENT_CLOSE exitloop Case $msg = $OK_Btn exitloop endselect WEnd GUIDelete()
      
      





画像の代替テキスト







移行するデータベースのリストはファイルから取得することもでき、ログをテキストファイルに出力することもできます。 同様に、数十個のデータベースを.dtで簡単にアップロード/ダウンロードすることにより、ファイルからSQLに変換できます







このセットで終了



もちろん、これは1Cと組み合わせて自動化できるすべてではありません。 しかし、他のアプリケーションや他のシナリオで1Cからリアルタイム情報を受信するすべての種類の交換は、焦点と特異性が狭いため、このレビューに該当しませんでした。







もちろん、1Cを管理するための独自のノウハウもあります。コメントで同僚と共有するのは素晴らしいことです。







スクリプトとノウハウはavelorによって提供されています。








All Articles