1C RAC เชฎเชพเชŸเซ‡ GUI เชฒเช–เชตเซเช‚, เช…เชฅเชตเชพ เชซเชฐเซ€เชฅเซ€ Tcl/Tk เชตเชฟเชถเซ‡

เชœเซ‡เชฎ เชœเซ‡เชฎ เช†เชชเชฃเซ‡ Linux เชชเชฐเซเชฏเชพเชตเชฐเชฃเชฎเชพเช‚ 1C เช‰เชคเซเชชเชพเชฆเชจเซ‹ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡เชจเชพ เชตเชฟเชทเชฏเชฎเชพเช‚ เชคเชชเชพเชธ เช•เชฐเซ€, เชเช• เช–เชพเชฎเซ€ เชฎเชณเซ€ - 1C เชธเชฐเซเชตเชฐเชจเชพ เช•เซเชฒเชธเซเชŸเชฐเชจเซ‡ เชธเช‚เชšเชพเชฒเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช…เชจเซเช•เซ‚เชณ เช—เซเชฐเชพเชซเชฟเช•เชฒ เชฎเชฒเซเชŸเซ€-เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ เชŸเซ‚เชฒเชจเซ‹ เช…เชญเชพเชต. เช…เชจเซ‡ เชฐเซ‡เช• เช•เชจเซเชธเซ‹เชฒ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เชฎเชพเชŸเซ‡ GUI เชฒเช–เซ€เชจเซ‡ เช† เช–เชพเชฎเซ€เชจเซ‡ เชธเซเชงเชพเชฐเชตเชพเชจเซ‹ เชจเชฟเชฐเซเชฃเชฏ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹. Tcl/tk เชจเซ‡ เชตเชฟเช•เชพเชธ เชญเชพเชทเชพ เชคเชฐเซ€เช•เซ‡ เชชเชธเช‚เชฆ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€, เช•เชพเชฐเชฃ เช•เซ‡ เชฎเชพเชฐเชพ เชฎเชคเซ‡, เช† เช•เชพเชฐเซเชฏ เชฎเชพเชŸเซ‡ เชธเซŒเชฅเซ€ เชฏเซ‹เช—เซเชฏ เช›เซ‡. เช…เชจเซ‡ เชคเซ‡เชฅเซ€, เชนเซเช‚ เช† เชธเชพเชฎเช—เซเชฐเซ€เชฎเชพเช‚ เช‰เช•เซ‡เชฒเชจเชพ เช•เซ‡เชŸเชฒเชพเช• เชฐเชธเชชเซเชฐเชฆ เชชเชพเชธเชพเช“ เชฐเชœเซ‚ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚.

เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ tcl/tk เช…เชจเซ‡ 1C เชตเชฟเชคเชฐเชฃเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡. เช…เชจเซ‡ เชฎเซ‡เช‚ เชคเซƒเชคเซ€เชฏ-เชชเช•เซเชท เชชเซ‡เช•เซ‡เชœเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเชพ เชตเชฟเชจเชพ เชฎเซ‚เชณเชญเซ‚เชค tcl/tk เชกเชฟเชฒเชฟเชตเชฐเซ€เชจเซ€ เชฎเชนเชคเซเชคเชฎ เช•เซเชทเชฎเชคเชพเช“ เชฌเชจเชพเชตเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚ เชนเซ‹เชตเชพเชฅเซ€, เชฎเชจเซ‡ เชธเช‚เชธเซเช•เชฐเชฃ 8.6.7 เชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡, เชœเซ‡เชฎเชพเช‚ ttk - เชตเชงเชพเชฐเชพเชจเชพ เช—เซเชฐเชพเชซเชฟเช• เช˜เชŸเช•เซ‹ เชธเชพเชฅเซ‡เชจเซเช‚ เชชเซ‡เช•เซ‡เชœ เชถเชพเชฎเซ‡เชฒ เช›เซ‡, เชœเซ‡เชฎเชพเช‚เชฅเซ€ เช…เชฎเชจเซ‡ เชฎเซเช–เซเชฏเชคเซเชตเซ‡ ttk เชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. ::TreeView, เชคเซ‡ เชตเซƒเช•เซเชทเชจเชพ เชฌเช‚เชงเชพเชฐเชฃเชจเชพ เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚ เช…เชจเซ‡ เชŸเซ‡เชฌเชฒ (เชธเซ‚เชšเชฟ)เชจเชพ เชฐเซ‚เชชเชฎเชพเช‚ เชฌเช‚เชจเซ‡ เชฐเซ€เชคเซ‡ เชกเซ‡เชŸเชพ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. เช‰เชชเชฐเชพเช‚เชค, เชจเชตเชพ เชธเช‚เชธเซเช•เชฐเชฃเชฎเชพเช‚, เช…เชชเชตเชพเชฆเซ‹ เชธเชพเชฅเซ‡เชจเซเช‚ เช•เชพเชฐเซเชฏ เชซเชฐเซ€เชฅเซ€ เช•เชพเชฐเซเชฏ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡ (เชŸเซเชฐเชพเชฏ เช•เชฎเชพเชจเซเชก, เชœเซ‡ เชฌเชพเชนเซเชฏ เช†เชฆเซ‡เชถเซ‹ เชšเชฒเชพเชตเชคเซ€ เชตเช–เชคเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชฎเชพเช‚ เชตเชชเชฐเชพเชฏ เช›เซ‡).

เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชฎเชพเช‚ เช˜เชฃเซ€ เชซเชพเช‡เชฒเซ‹เชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡ (เชœเซ‹เช•เซ‡ เช•เช‚เชˆเชชเชฃ เชคเชฎเชจเซ‡ เชเช•เชฎเชพเช‚ เชฌเชงเซเช‚ เช•เชฐเชตเชพเชฅเซ€ เช…เชŸเช•เชพเชตเชคเซเช‚ เชจเชฅเซ€):

rac_gui.cfg - เชกเชฟเชซเซ‰เชฒเซเชŸ เชฐเซ‚เชชเชฐเซ‡เช–เชพ
rac_gui.tcl - เชฎเซเช–เซเชฏ เชฒเซ‹เชจเซเชš เชธเซเช•เซเชฐเชฟเชชเซเชŸ
lib เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ เชเชตเซ€ เชซเชพเช‡เชฒเซ‹ เช›เซ‡ เชœเซ‡ เชธเซเชŸเชพเชฐเซเชŸเช…เชช เชตเช–เชคเซ‡ เช†เชชเชฎเซ‡เชณเซ‡ เชฒเซ‹เชก เชฅเชพเชฏ เช›เซ‡:
function.tcl - เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“ เชธเชพเชฅเซ‡เชจเซ€ เชซเชพเช‡เชฒ
gui.tcl - เชฎเซเช–เซเชฏ เช—เซเชฐเชพเชซเชฟเช•เชฒ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ
images.tcl - base64 เช‡เชฎเซ‡เชœ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€

rac_gui.tcl เชซเชพเชˆเชฒ, เชตเชพเชธเซเชคเชตเชฎเชพเช‚, เชฆเซเชญเชพเชทเชฟเชฏเชพ เชถเชฐเซ‚ เช•เชฐเซ‡ เช›เซ‡, เชตเซ‡เชฐเชฟเชฏเซ‡เชฌเชฒเซเชธ เชถเชฐเซ‚ เช•เชฐเซ‡ เช›เซ‡, เชฎเซ‹เชกเซเชฏเซเชฒเซ‹, เชฐเซ‚เชชเชฐเซ‡เช–เชพเช“ เชตเช—เซ‡เชฐเซ‡ เชฒเซ‹เชก เช•เชฐเซ‡ เช›เซ‡. เชŸเชฟเชชเซเชชเชฃเซ€เช“ เชธเชพเชฅเซ‡ เชซเชพเช‡เชฒเชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€:

rac_gui.tcl

#!/bin/sh
exec wish "$0" -- "$@"

# ะฃัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ั‚ะตะบัƒั‰ะธะน ะบะฐั‚ะฐะปะพะณ
set dir(root) [pwd]
# ะฃัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ั€ะฐะฑะพั‡ะธะน ะบะฐั‚ะฐะปะพะณ, ะตัะปะธ ะตะณะพ ะฝะตั‚ ั‚ะพ ัะพะทะดะฐั‘ะผ
set dir(work) [file join $env(HOME) .rac_gui]
if {[file exists $dir(work)] == 0 } {
    file mkdir $dir(work)    
}
# ะบะฐั‚ะฐะปะพะณ ั ะผะพะดัƒะปัะผะธ
set dir(lib) "[file join $dir(root) lib]"

# ะทะฐะณั€ัƒะถะฐะตะผ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะธะน ะบะพะฝั„ะธะณ, ะตัะปะธ ะพะฝ ะพั‚ััƒั‚ัั‚ะฒัƒะตั‚, ั‚ะพ ะบะพะฟะธั€ัƒะตะผ ะดะตั„ะพะปั‚ะฝั‹ะน
if {[file exists [file join $dir(work) rac_gui.cfg]] ==0} {
    file copy [file join [pwd] rac_gui.cfg] [file join $dir(work) rac_gui.cfg]
} 
source [file join $dir(work) rac_gui.cfg]
# ะšะพะด ะฟั€ะพะฒะตั€ะบะธ ะฝะฐะปะธั‡ะธั rac ะธ ะฟั€ะฐะฒะธะปัŒะฝะพัั‚ะธ ัƒะบะฐะทะฐะฝะธั ะฟัƒั‚ะธ ะฒ ะบะพะฝั„ะธะณะต
# ะตัะปะธ ะฟั€ะพะณั€ะฐะผะผะฐ ะฝะต ะฝะฐะนะดะตะฝะฐ ั‚ะพ ะฑัƒะดะตั‚ ะฒั‹ะฒะตะดะตะฝ ะดะธะฐะปะพะณ ะดะปั ัƒะบะฐะทะฐะฝะธั ะบะพั€ั€ะตะบั‚ะฝะพะณะพ ะฟัƒั‚ะธ
# ะธ ัั‚ะพั‚ ะฟัƒั‚ัŒ ะฑัƒะดะตั‚ ะทะฐะฟะธัะฐะฝ ะฒ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะธะน ะบะพะฝั„ะธะณ
if {[file exists $rac_cmd] == 0} {
    set rac_cmd [tk_getOpenFile -initialdir $env(HOME) -parent . -title "ะฃะบะฐะถะธั‚ะต ะฟัƒั‚ัŒ ะดะพ rac" -initialfile rac]
    file copy [file join $dir(work) rac_gui.cfg] [file join $dir(work) rac_gui.cfg.bak] 
    set orig_file [open [file join $dir(work) rac_gui.cfg.bak] "r"]
    set file [open [file join $dir(work) rac_gui.cfg] "w"]
    while {[gets $orig_file line] >=0 } {
        if {[string match "set rac_cmd*" $line]} {
            puts $file "set rac_cmd $rac_cmd"
        } else {
            puts $file $line
        }
    }
    close $file
    close $orig_file
    #return "$host:$port"
    file delete [file join $dir(work) 1c_srv.cfg.bak] 
} else {
    puts "Found $rac_cmd"
}

set cluster_user ""
set cluster_pwd ""
set agent_user ""
set agent_pwd ""
## LOAD FILE ##
# ะ—ะฐะณั€ัƒะถะฐะตะผ ะผะพะดัƒะปะธ ะบั€ะพะผะต gui.tcl ั‚ะฐะบ ะบะฐะบ ะตะณะพ ะฝะฐะดะพ ะทะฐะณั€ัƒะทะธั‚ัŒ ะฟะพัะปะตะดะฝะธะผ
foreach modFile [lsort [glob -nocomplain [file join $dir(lib) *.tcl]]] {
    if {[file tail $modFile] ne "gui.tcl"} {
        source $modFile
        puts "Loaded module $modFile"
    }
}
source [file join $dir(lib) gui.tcl]
source [file join $dir(work) rac_gui.cfg]

# ะงะธั‚ะฐะตะผ ั„ะฐะนะป ัะพ ัะฟะธัะบะพะผ ัะตั€ะฒะตั€ะพะฒ 1ะก
# ะธ ะดะพะฑะฐะฒะปัะตะผ ะฒ ะดะตั€ะตะฒะพ
if [file exists [file join $dir(work) 1c_srv.cfg]] {
    set f [open [file join $dir(work) 1c_srv.cfg] "RDONLY"]
    while {[gets $f line] >=0} {
        .frm_tree.tree insert {} end -id "server::$line" -text "$line" -values "$line"
    }    
}

เชœเชฐเซ‚เชฐเซ€ เช›เซ‡ เชคเซ‡ เชฌเชงเซเช‚ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซเชฏเชพ เชชเช›เซ€ เช…เชจเซ‡ เชฐเซ‡เช• เชฏเซเชŸเชฟเชฒเชฟเชŸเซ€เชจเซ€ เชนเชพเชœเชฐเซ€ เชฎเชพเชŸเซ‡ เชคเชชเชพเชธ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เช—เซเชฐเชพเชซเชฟเช•เชฒ เชตเชฟเชจเซเชกเซ‹ เชถเชฐเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช‡เชจเซเชŸเชฐเชซเซ‡เชธเชฎเชพเช‚ เชคเซเชฐเชฃ เช˜เชŸเช•เซ‹เชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡:

เชŸเซ‚เชฒเชฌเชพเชฐ, เชตเซƒเช•เซเชท เช…เชจเซ‡ เชฏเชพเชฆเซ€

เชฎเซ‡เช‚ "เชตเซƒเช•เซเชท" เชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€เชจเซ‡ 1C เชฅเซ€ เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค เชตเชฟเชจเซเชกเซ‹เช เชธเชพเชงเชจเซ‹ เชธเชพเชฅเซ‡ เชถเช•เซเชฏ เชคเซ‡เชŸเชฒเซ€ เชธเชฎเชพเชจ เชฌเชจเชพเชตเซ€ เช›เซ‡.

1C RAC เชฎเชพเชŸเซ‡ GUI เชฒเช–เชตเซเช‚, เช…เชฅเชตเชพ เชซเชฐเซ€เชฅเซ€ Tcl/Tk เชตเชฟเชถเซ‡

เชฎเซเช–เซเชฏ เช•เซ‹เชก เชœเซ‡ เช† เชตเชฟเชจเซเชกเซ‹เชจเซ‡ เชฌเชจเชพเชตเซ‡ เช›เซ‡ เชคเซ‡ เชซเชพเช‡เชฒเชฎเชพเช‚ เชธเชฎเชพเชฏเซ‡เชฒ เช›เซ‡
lib/gui.tcl

# ัƒัั‚ะฐะฝะพะฒะบะฐ ั€ะฐะทะผะตั€ะฐ ะธ ะฟะพะปะพะถะตะฝะธั ะพัะฝะพะฒะฝะพะณะพ ะพะบะฝะฐ
# ะผะพะถะฝะพ ัƒัั‚ะฐะฝะพะฒะธั‚ัŒ ะฒ ะฟะตั€ะตะผะตะฝะฝัƒัŽ topLevelGeometry ะฒ ะบะพะฝั„ะธะณ ะฟั€ะพะณั€ะฐะผะผั‹
if {[info exists topLevelGeometry]} {
    wm geometry . $topLevelGeometry
} else {
    wm geometry . 1024x768
}
# ะ—ะฐะณะพะปะพะฒะพะบ ะพะบะฝะฐ
wm title . "1C Rac GUI"
wm iconname . "1C Rac Gui"
# ะธะบะพะฝะบะฐ ะพะบะฝะฐ (ะฑะตั€ะตั‚ัั ะธะท ั„ะฐะนะปะฐ lib/imges.tcl)
wm iconphoto . tcl
wm protocol . WM_DELETE_WINDOW Quit
wm overrideredirect . 0
wm positionfrom . user

ttk::style theme use clam

# ะŸะฐะฝะตะปัŒ ะธะฝัั€ัƒะผะตะฝั‚ะพะฒ
set frm_tool [frame .frm_tool]
pack $frm_tool -side left -fill y 
ttk::panedwindow .panel -orient horizontal -style TPanedwindow
pack .panel -expand true -fill both
pack propagate .panel false

ttk::button $frm_tool.btn_add  -command Add  -image add_grey_32
ttk::button $frm_tool.btn_del  -command Del -image del_grey_32
ttk::button $frm_tool.btn_edit  -command Edit -image edit_grey_32
ttk::button $frm_tool.btn_quit -command Quit -image quit_grey_32

pack $frm_tool.btn_add $frm_tool.btn_del $frm_tool.btn_edit -side top -padx 5 -pady 5
pack $frm_tool.btn_quit  -side bottom -padx 5 -pady 5

# ะ”ะตั€ะตะฒะพ ั ะฟะพะปะพัะฐะผะธ ะฟั€ะพะบั€ัƒั‚ะบะธ
set frm_tree [frame .frm_tree]

ttk::scrollbar $frm_tree.hsb1 -orient horizontal -command [list $frm_tree.tree xview]
ttk::scrollbar $frm_tree.vsb1 -orient vertical -command [list $frm_tree.tree yview]
set tree [ttk::treeview $frm_tree.tree -show tree 
-xscrollcommand [list $frm_tree.hsb1 set] -yscrollcommand [list $frm_tree.vsb1 set]]

grid $tree -row 0 -column 0 -sticky nsew
grid $frm_tree.vsb1 -row 0 -column 1 -sticky nsew
grid $frm_tree.hsb1 -row 1 -column 0 -sticky nsew
grid columnconfigure $frm_tree 0 -weight 1
grid rowconfigure $frm_tree 0 -weight 1

# ะฝะฐะทะฝะฐั‡ะตะฝะธะต ะพะฑั€ะฐะฑะพั‚ั‡ะธะบะฐ ะฝะฐะถะฐั‚ะธั ะบะฝะพะฟะบะพะน ะผั‹ัˆะธ
bind $frm_tree.tree <ButtonRelease> "TreePress $frm_tree.tree"

# ะกะฟะธัะพะบ ะดะปั ะดะฐะฝะฝั‹ั… (ั‚ะฐะฑะปะธั†ะฐ)
set frm_work [frame .frm_work]
ttk::scrollbar $frm_work.hsb -orient horizontal -command [list $frm_work.tree_work xview]
ttk::scrollbar $frm_work.vsb -orient vertical -command [list $frm_work.tree_work yview]
set tree_work [
    ttk::treeview $frm_work.tree_work 
    -show headings  -columns "par val" -displaycolumns "par val"
    -xscrollcommand [list $frm_work.hsb set] 
    -yscrollcommand [list $frm_work.vsb set]
]
# ะฃัั‚ะฐะฝะพะฒะบะฐ ั†ะฒะตั‚ะพะฒ ะดะปั ั‡ะตั€ะตะดะพะฒะฐะฝะธั ะฒ ั‚ะฐะฑะปะธั†ะต
$tree_work tag configure dark -background $color(dark_table_bg)
$tree_work tag configure light -background $color(light_table_bg)

# ะ ะฐะทะผะตั‰ะตะฝะธะต ัะปะตะผะตะฝั‚ะพะฒ ะฝะฐ ั„ะพั€ะผะต
grid $tree_work -row 0 -column 0 -sticky nsew
grid $frm_work.vsb -row 0 -column 1 -sticky nsew
grid $frm_work.hsb -row 1 -column 0 -sticky nsew
grid columnconfigure $frm_work 0 -weight 1
grid rowconfigure $frm_work 0 -weight 1
pack $frm_tree $frm_work -side left -expand true -fill both

#.panel add $frm_tool -weight 1
.panel add $frm_tree -weight 1 
.panel add $frm_work -weight 1

เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ เชจเซ€เชšเซ‡ เชฎเซเชœเชฌ เช›เซ‡:

1. เชชเซเชฐเชฅเชฎ, เชคเชฎเชพเชฐเซ‡ เชฎเซเช–เซเชฏ เช•เซเชฒเชธเซเชŸเชฐ เชธเชฐเซเชตเชฐ เช‰เชฎเซ‡เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ (เชเชŸเชฒเซ‡ โ€‹โ€‹โ€‹โ€‹เช•เซ‡, เช•เซเชฒเชธเซเชŸเชฐ เชฎเซ‡เชจเซ‡เชœเชฎเซ‡เชจเซเชŸ เชธเชฐเซเชตเชฐ (Linux เชฎเชพเช‚, เชฎเซ‡เชจเซ‡เชœเชฎเซ‡เชจเซเชŸ "/opt/1C/v8.3/x86_64/ras cluster โ€”deemon") เช†เชฆเซ‡เชถ เชธเชพเชฅเซ‡ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡).

เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, โ€œ+โ€ เชฌเชŸเชจ เชชเชฐ เช•เซเชฒเชฟเช• เช•เชฐเซ‹ เช…เชจเซ‡ เช–เซเชฒเชคเซ€ เชตเชฟเช‚เชกเซ‹เชฎเชพเช‚, เชธเชฐเซเชตเชฐ เชธเชฐเชจเชพเชฎเซเช‚ เช…เชจเซ‡ เชชเซ‹เชฐเซเชŸ เชฆเชพเช–เชฒ เช•เชฐเซ‹:

1C RAC เชฎเชพเชŸเซ‡ GUI เชฒเช–เชตเซเช‚, เช…เชฅเชตเชพ เชซเชฐเซ€เชฅเซ€ Tcl/Tk เชตเชฟเชถเซ‡

เชชเช›เซ€เชฅเซ€, เช…เชฎเชพเชฐเซเช‚ เชธเชฐเซเชตเชฐ เชคเซ‡เชจเชพ เชชเชฐ เช•เซเชฒเชฟเช• เช•เชฐเซ€เชจเซ‡ เชตเซƒเช•เซเชทเชฎเชพเช‚ เชฆเซ‡เช–เชพเชถเซ‡, เช•เซเชฒเชธเซเชŸเชฐเซ‹เชจเซ€ เชธเซ‚เชšเชฟ เช–เซเชฒเชถเซ‡ เช…เชฅเชตเชพ เช•เชจเซ‡เช•เซเชถเชจ เชญเซ‚เชฒ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เชฅเชถเซ‡.

2. เช•เซเชฒเชธเซเชŸเชฐเชจเชพ เชจเชพเชฎ เชชเชฐ เช•เซเชฒเชฟเช• เช•เชฐเชตเชพเชฅเซ€ เชคเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เช‰เชชเชฒเชฌเซเชง เช•เชพเชฐเซเชฏเซ‹เชจเซ€ เชธเซ‚เชšเชฟ เช–เซเชฒเชถเซ‡.

3.โ€ฆ

เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชตเชงเซ, เชเชŸเชฒเซ‡ เช•เซ‡. เชจเชตเซเช‚ เช•เซเชฒเชธเซเชŸเชฐ เช‰เชฎเซ‡เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชธเซ‚เชšเชฟเชฎเชพเช‚ เช‰เชชเชฒเชฌเซเชง เช•เซ‹เชˆเชชเชฃ เชเช•เชจเซ‡ เชชเชธเช‚เชฆ เช•เชฐเซ‹ เช…เชจเซ‡ เชŸเซ‚เชฒเชฌเชพเชฐเชฎเชพเช‚ "+" เชฌเชŸเชจ เชฆเชฌเชพเชตเซ‹ เช…เชจเซ‡ เชจเชตเซ‹ เช‰เชฎเซ‡เชฐเซ‹ เชธเช‚เชตเชพเชฆ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เชฅเชถเซ‡:

1C RAC เชฎเชพเชŸเซ‡ GUI เชฒเช–เชตเซเช‚, เช…เชฅเชตเชพ เชซเชฐเซ€เชฅเซ€ Tcl/Tk เชตเชฟเชถเซ‡

เชŸเซ‚เชฒเชฌเชพเชฐเชฎเชพเช‚เชจเชพ เชฌเชŸเชจเซ‹ เชธเช‚เชฆเชฐเซเชญเชจเชพ เช†เชงเชพเชฐเซ‡ เช•เชพเชฐเซเชฏเซ‹ เช•เชฐเซ‡ เช›เซ‡, เชเชŸเชฒเซ‡ เช•เซ‡. เชตเซƒเช•เซเชท เช…เชฅเชตเชพ เชธเซ‚เชšเชฟเชจเซเช‚ เช•เชฏเซเช‚ เชคเชคเซเชต เชชเชธเช‚เชฆ เช•เชฐเซ‡เชฒ เช›เซ‡ เชคเซ‡เชจเชพ เช†เชงเชพเชฐเซ‡, เชเช• เช…เชฅเชตเชพ เชฌเซ€เชœเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

เชšเชพเชฒเซ‹ เชเชก เชฌเชŸเชจ (โ€œ+โ€) เชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เชœเซ‹เชˆเช:

เชฌเชŸเชจ เชœเชจเชฐเซ‡เชถเชจ เช•เซ‹เชก:

ttk::button $frm_tool.btn_add  -command Add  -image add_grey_32

เช…เชนเซ€เช‚ เช†เชชเชฃเซ‡ เชœเซ‹เชˆเช เช›เซ€เช เช•เซ‡ เชœเซเชฏเชพเชฐเซ‡ เชฌเชŸเชจ เชฆเชฌเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ "เช‰เชฎเซ‡เชฐเซ‹" เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช…เชฎเชฒเชฎเชพเช‚ เช†เชตเชถเซ‡, เชคเซ‡เชจเซ‹ เช•เซ‹เชก:

proc Add {} {
    global active_cluster host
    # ะžะฟั€ะตะดะตะปัะตะผ ะธะดะตะฝั‚ะธั„ะธะบะฐั‚ะพั€ ะฒั‹ะดะตะปะตะฝะฝะพะณะพ ัะปะตะผะตะฝั‚ะฐ
    set id  [.frm_tree.tree selection] 
    # ะžะฟั€ะตะดะตะปัะตะผ ะทะฝะฐั‡ะตะฝะธะต ัั‚ะพะณะพ ัะปะตะผะตะฝั‚ะฐ
    set values [.frm_tree.tree item [.frm_tree.tree selection] -values]
    set key [lindex [split $id "::"] 0]
    # ะฒ ะทะฐะฒะธัะธะผะพัั‚ะธ ะพั‚ ั‚ะพะณะพ ั‡ั‚ะพ ะฒั‹ะดะตะปะธะปะธ ะฑัƒะดะตั‚ ะทะฐะฟัƒั‰ะตะฝะฐ ะฝัƒะถะฝะฐั ะฟั€ะพั†ะตะดัƒั€ะฐ
    if {$key eq "" || $key eq "server"} {
        set host [ Add::server ]
        return
    }
    Add::$key .frm_tree.tree $host $values
}

เช…เชนเซ€เช‚ เชŸเชฟเช•เชฒเชจเซ‹ เชเช• เชซเชพเชฏเชฆเซ‹ เช›เซ‡: เชคเชฎเซ‡ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเชพ เชจเชพเชฎ เชคเชฐเซ€เช•เซ‡ เชšเชฒเชจเซ€ เช•เชฟเช‚เชฎเชค เชชเชธเชพเชฐ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹:

Add::$key .frm_tree.tree $host $values

เชเชŸเชฒเซ‡ เช•เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชœเซ‹ เช†เชชเชฃเซ‡ เชฎเซเช–เซเชฏ เชธเชฐเซเชตเชฐ เชคเชฐเชซ เชจเชฟเชฐเซเชฆเซ‡เชถ เช•เชฐเซ€เช เช…เชจเซ‡ "+" เชฆเชฌเชพเชตเซ€เช, เชคเซ‹ เช‰เชฎเซ‡เชฐเซ‹::เชธเชฐเซเชตเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชถเชฐเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡, เชœเซ‹ เช•เซเชฒเชธเซเชŸเชฐ เชชเชฐ - เช‰เชฎเซ‡เชฐเซ‹::เช•เซเชฒเชธเซเชŸเชฐ เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชตเชงเซ (เชนเซเช‚ เชคเซ‡ เชตเชฟเชถเซ‡ เชฒเช–เซ€เชถ เชœเซเชฏเชพเช‚ เชœเชฐเซ‚เชฐเซ€ "เช•เซ€เช“" เชฅเซ‹เชกเซ€ เชจเซ€เชšเซ‡เชฅเซ€ เช†เชตเซ‡ เช›เซ‡), เชธเซ‚เชšเชฟเชฌเชฆเซเชง เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“ เชธเช‚เชฆเชฐเซเชญเชจเซ‡ เช…เชจเซเชฐเซ‚เชช เช—เซเชฐเชพเชซเชฟเช• เช˜เชŸเช•เซ‹ เชฆเซ‹เชฐเซ‡ เช›เซ‡.

เชœเซ‡เชฎ เชคเชฎเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชจเซ‹เช‚เชงเซเชฏเซเช‚ เชนเชถเซ‡, เชธเซเชตเชฐเซ‚เชชเซ‹ เชถเซˆเชฒเซ€เชฎเชพเช‚ เชธเชฎเชพเชจ เช›เซ‡ - เช† เช†เชถเซเชšเชฐเซเชฏเชœเชจเช• เชจเชฅเซ€, เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เชเช• เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชฆเซเชตเชพเชฐเชพ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เชฅเชพเชฏ เช›เซ‡, เชตเชงเซ เชšเซ‹เช•เซเช•เชธเชชเชฃเซ‡ เชซเซ‹เชฐเซเชฎเชจเซ€ เชฎเซเช–เซเชฏ เชซเซเชฐเซ‡เชฎ (เชตเชฟเช‚เชกเซ‹, เชฌเชŸเชจเซ‹, เช›เชฌเซ€, เชฒเซ‡เชฌเชฒ), เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซเช‚ เชจเชพเชฎ เชŸเซ‹เชช เชฒเซ‡เชตเชฒ เช‰เชฎเซ‡เชฐเซ‹

proc AddToplevel {lbl img {win_name .add}} {
    set cmd "destroy $win_name"
    if [winfo exists $win_name] {destroy $win_name}
    toplevel $win_name
    wm title $win_name $lbl
    wm iconphoto $win_name tcl
    # ะผะตั‚ะบะฐ ั ะธะบะพะฝะบะพะน
    ttk::label $win_name.lbl -image $img
    # ั„ั€ะตะนะผ ั ะฟะพะปัะผะธ ะฒะฒะพะดะฐ
    set frm [ttk::labelframe $win_name.frm -text $lbl -labelanchor nw]
    
    grid columnconfigure $frm 0 -weight 1
    grid rowconfigure $frm 0 -weight 1
    # ั„ั€ะตะนะผ ะธ ะบะฝะพะฟะบะธ
    set frm_btn [frame $win_name.frm_btn -border 0]
    ttk::button $frm_btn.btn_ok -image ok_grey_24 -command { }
    ttk::button $frm_btn.btn_cancel -command $cmd -image quit_grey_24 
    grid $win_name.lbl -row 0 -column 0 -sticky nw -padx 5 -pady 10
    grid $frm -row 0 -column 1 -sticky nw -padx 5 -pady 5
    grid $frm_btn -row 1 -column 1 -sticky se -padx 5 -pady 5
    pack  $frm_btn.btn_cancel  -side right
    pack  $frm_btn.btn_ok  -side right -padx 10
    return $frm
}

เช•เซ‰เชฒ เชชเชฐเชฟเชฎเชพเชฃเซ‹: เชถเซ€เชฐเซเชทเช•, เชชเซเชธเซเชคเช•เชพเชฒเชฏ (lib/images.tcl) เชฎเชพเช‚เชฅเซ€ เชšเชฟเชนเซเชจ เชฎเชพเชŸเซ‡ เช›เชฌเซ€ เชจเชพเชฎ เช…เชจเซ‡ เชตเซˆเช•เชฒเซเชชเชฟเช• เชตเชฟเชจเซเชกเซ‹ เชจเชพเชฎ เชชเชฐเชฟเชฎเชพเชฃ (เชกเชฟเชซเซ‰เชฒเซเชŸ .add). เช†เชฎ, เชœเซ‹ เช†เชชเชฃเซ‡ เชฎเซเช–เซเชฏ เชธเชฐเซเชตเชฐ เช…เชจเซ‡ เช•เซเชฒเชธเซเชŸเชฐ เช‰เชฎเซ‡เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช‰เชชเชฐเซ‹เช•เซเชค เช‰เชฆเชพเชนเชฐเชฃเซ‹ เชฒเชˆเช, เชคเซ‹ เช•เซ‰เชฒ เชคเซ‡ เชฎเซเชœเชฌ เชนเชถเซ‡:

AddToplevel "ะ”ะพะฑะฐะฒะปะตะฝะธะต ะพัะฝะพะฒะฝะพะณะพ ัะตั€ะฒะตั€ะฐ" server_grey_64

เช…เชฅเชตเชพ

AddToplevel "ะ”ะพะฑะฐะฒะปะตะฝะธะต ะบะปะฐัั‚ะตั€ะฐ" cluster_grey_64

เช เซ€เช• เช›เซ‡, เช† เช‰เชฆเชพเชนเชฐเชฃเซ‹ เชธเชพเชฅเซ‡ เชšเชพเชฒเซ เชฐเชพเช–เซ€เชจเซ‡, เชนเซเช‚ เชเชตเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“ เชฌเชคเชพเชตเซ€เชถ เชœเซ‡ เชธเชฐเซเชตเชฐ เช…เชฅเชตเชพ เช•เซเชฒเชธเซเชŸเชฐ เชฎเชพเชŸเซ‡ เชเชก เชกเชพเชฏเชฒเซ‹เช—เซเชธ เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡.

เช‰เชฎเซ‡เชฐเซ‹::เชธเชฐเซเชตเชฐ

proc Add::server {} {
    global default
    # ะฒั‹ะฒะพะดะธะผ ะพัะฝะพะฒะฝัƒัŽ ั„ะพั€ะผัƒ
    set frm [AddToplevel "ะ”ะพะฑะฐะฒะปะตะฝะธะต ะพัะฝะพะฒะฝะพะณะพ ัะตั€ะฒะตั€ะฐ" server_grey_64]
    # ะดะพะฑะฐะฒะปัะตะผ ะตั‚ะบะธ ะธ ะฟะพะปั ะฒะฒะพะดะฐ ะฝะฐ ัั‚ัƒ ั„ะพั€ะผัƒ
    label $frm.lbl_host -text "ะะดั€ะตั ัะตั€ะฒะตั€ะฐ"
    entry  $frm.ent_host
    label $frm.lbl_port -text "ะŸะพั€ั‚"
    entry $frm.ent_port 
    $frm.ent_port  insert end $default(port)
    grid $frm.lbl_host -row 0 -column 0 -sticky nw -padx 5 -pady 5
    grid $frm.ent_host -row 0 -column 1 -sticky nsew -padx 5 -pady 5
    grid $frm.lbl_port -row 1 -column 0 -sticky nw -padx 5 -pady 5
    grid $frm.ent_port -row 1 -column 1 -sticky nsew -padx 5 -pady 5
    grid columnconfigure $frm 0 -weight 1
    grid rowconfigure $frm 0 -weight 1
    #set frm_btn [frame .add.frm_btn -border 0]
    # ะฟะตั€ะตะพะฟั€ะตะดะตะปัะตะผ ะพะฑั€ะฐะฑะพั‚ั‡ะธะบ ะฝะฐะถะฐั‚ะธั ะบะฝะพะฟะบะธ
    .add.frm_btn.btn_ok configure -command {
        set host [SaveMainServer [.add.frm.ent_host get] [.add.frm.ent_port get]]
        .frm_tree.tree insert {} end -id "server::$host" -text "$host" -values "$host"
        destroy .add
        return $host
    }
    return $frm
}

เช‰เชฎเซ‡เชฐเซ‹::เช•เซเชฒเชธเซเชŸเชฐ

proc Add::cluster {tree host values} {
    global default lifetime_limit expiration_timeout session_fault_tolerance_level
    global max_memory_size max_memory_time_limit errors_count_threshold security_level
    global load_balancing_mode kill_problem_processes 
    agent_user agent_pwd cluster_user cluster_pwd auth_agent
    if {$agent_user ne "" && $agent_pwd ne ""} {
        set auth_agent "--agent-user=$agent_user --agent-pwd=$agent_pwd"
    } else {
        set auth_agent ""
    }
    # ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ะณะปะพะฑะฐะปัŒะฝั‹ะต ะฟะตั€ะตะผะตะฝะฝั‹ะต ()
    set lifetime_limit $default(lifetime_limit)
    set expiration_timeout $default(expiration_timeout)
    set session_fault_tolerance_level $default(session_fault_tolerance_level)
    set max_memory_size $default(max_memory_size)
    set max_memory_time_limit $default(max_memory_time_limit)
    set errors_count_threshold $default(errors_count_threshold)
    set security_level [lindex $default(security_level) 0]
    set load_balancing_mode [lindex $default(load_balancing_mode) 0]
    
    set frm [AddToplevel "ะ”ะพะฑะฐะฒะปะตะฝะธะต ะบะปะฐัั‚ะตั€ะฐ" cluster_grey_64]
    
    label $frm.lbl_host -text "ะะดั€ะตั ะพัะฝะพะฒะฝะพะณะพ ัะตั€ะฒะตั€ะฐ"
    entry  $frm.ent_host
    label $frm.lbl_port -text "ะŸะพั€ั‚"
    entry $frm.ent_port 
    $frm.ent_port  insert end $default(port)
    label $frm.lbl_name -text "ะะฐะทะฒะฐะฝะธะต ะบะปะฐัั‚ะตั€ะฐ"
    entry  $frm.ent_name
    label $frm.lbl_secure_connect -text "ะ—ะฐั‰ะธั‰ั‘ะฝะฝะพะต ัะพะตะดะธะฝะตะฝะธะต"
    ttk::combobox $frm.cb_security_level -textvariable security_level -values $default(security_level)
    label $frm.lbl_expiration_timeout -text "ะžัั‚ะฐะฝะฐะฒะปะธะฒะฐั‚ัŒ ะฒั‹ะบะปัŽั‡ะตะฝะฝั‹ะต ะฟั€ะพั†ะตััั‹ ั‡ะตั€ะตะท:"
    entry  $frm.ent_expiration_timeout -textvariable expiration_timeout
    label $frm.lbl_session_fault_tolerance_level -text "ะฃั€ะพะฒะตะฝัŒ ะพั‚ะบะฐะทะพัƒัั‚ะพะนั‡ะธะฒะพัั‚ะธ"
    entry  $frm.ent_session_fault_tolerance_level -textvariable session_fault_tolerance_level
    label $frm.lbl_load_balancing_mode -text "ะ ะตะถะธะผ ั€ะฐัะฟั€ะตะดะตะปะตะฝะธั ะฝะฐะณั€ัƒะทะบะธ"
    ttk::combobox $frm.cb_load_balancing_mode -textvariable load_balancing_mode 
    -values $default(load_balancing_mode)
    label $frm.lbl_errors_count_threshold -text "ะ”ะพะฟัƒัั‚ะธะผะพะต ะพั‚ะบะปะพะฝะตะฝะธะต ะบะพะปะธั‡ะตัั‚ะฒะฐ ะพัˆะธะฑะพะบ ัะตั€ะฒะตั€ะฐ, %"
    entry  $frm.ent_errors_count_threshold -textvariable errors_count_threshold
    label $frm.lbl_processes -text "ะ ะฐะฑะพั‡ะธะต ะฟั€ะพั†ะตััั‹:"
    label $frm.lbl_lifetime_limit -text "ะŸะตั€ะธะพะด ะฟะตั€ะตะทะฐะฟัƒัะบะฐ, ัะตะบ."
    entry  $frm.ent_lifetime_limit -textvariable lifetime_limit
    label $frm.lbl_max_memory_size -text "ะ”ะพะฟัƒัั‚ะธะผั‹ะน ะพะฑัŠั‘ะผ ะฟะฐะผัั‚ะธ, ะšะ‘"
    entry  $frm.ent_max_memory_size -textvariable max_memory_size
    label $frm.lbl_max_memory_time_limit -text "ะ˜ะฝั‚ะตั€ะฒะฐะป ะฟั€ะตะฒั‹ัˆะตะฝะธั ะดะพะฟัƒัั‚ะธะผะพะณะพ ะพะฑัŠั‘ะผะฐ ะฟะฐะผัั‚ะธ, ัะตะบ."
    entry  $frm.ent_max_memory_time_limit -textvariable max_memory_time_limit
    label $frm.lbl_kill_problem_processes -justify left -anchor nw -text "ะŸั€ะธะฝัƒะดะธั‚ะตะปัŒะฝะพ ะทะฐะฒะตั€ัˆะฐั‚ัŒ ะฟั€ะพะฑะปะตะผะฝั‹ะต ะฟั€ะพั†ะตััั‹"
    checkbutton $frm.check_kill_problem_processes -variable kill_problem_processes -onvalue yes -offvalue no    
    
    grid $frm.lbl_host -row 0 -column 0 -sticky nw -padx 5 -pady 5
    grid $frm.ent_host -row 0 -column 1 -sticky nsew -padx 5 -pady 5
    grid $frm.lbl_port -row 1 -column 0 -sticky nw -padx 5 -pady 5
    grid $frm.ent_port -row 1 -column 1 -sticky nsew -padx 5 -pady 5
    grid $frm.lbl_name -row 2 -column 0 -sticky nw -padx 5 -pady 5
    grid $frm.ent_name -row 2 -column 1 -sticky nsew -padx 5 -pady 5
    grid $frm.lbl_secure_connect -row 3 -column 0 -sticky nw -padx 5 -pady 5
    grid $frm.cb_security_level -row 3 -column 1 -sticky nsew -padx 5 -pady 5
    grid $frm.lbl_expiration_timeout -row 4 -column 0 -sticky nw -padx 5 -pady 5
    grid $frm.ent_expiration_timeout -row 4 -column 1 -sticky nsew -padx 5 -pady 5
    grid $frm.lbl_session_fault_tolerance_level -row 5 -column 0 -sticky nw -padx 5 -pady 5
    grid $frm.ent_session_fault_tolerance_level -row 5 -column 1 -sticky nsew -padx 5 -pady 5
    grid $frm.lbl_load_balancing_mode -row 6 -column 0 -sticky nw -padx 5 -pady 5
    grid $frm.cb_load_balancing_mode -row 6 -column 1 -sticky nsew -padx 5 -pady 5
    grid $frm.lbl_errors_count_threshold -row 7 -column 0 -sticky nw -padx 5 -pady 5
    grid $frm.ent_errors_count_threshold -row 7 -column 1 -sticky nsew -padx 5 -pady 5
    grid $frm.lbl_processes -row 8 -column 0 -sticky nw -padx 5 -pady 5
    grid $frm.lbl_lifetime_limit -row 9 -column 0 -sticky nw -padx 5 -pady 5
    grid $frm.ent_lifetime_limit -row 9 -column 1 -sticky nsew -padx 5 -pady 5
    grid $frm.lbl_max_memory_size -row 10 -column 0 -sticky nw -padx 5 -pady 5
    grid $frm.ent_max_memory_size -row 10 -column 1 -sticky nsew -padx 5 -pady 5
    grid $frm.lbl_max_memory_time_limit -row 11 -column 0 -sticky nw -padx 5 -pady 5
    grid $frm.ent_max_memory_time_limit -row 11 -column 1 -sticky nsew -padx 5 -pady 5
    grid $frm.lbl_kill_problem_processes -row 12 -column 0 -sticky nw -padx 5 -pady 5
    grid $frm.check_kill_problem_processes -row 12 -column 1 -sticky nw -padx 5 -pady 5
    # ะฟะตั€ะตะพะฟั€ะตะดะตะปัะตะผ ะพะฑั€ะฐะฑะพั‚ั‡ะธะบ
    .add.frm_btn.btn_ok configure -command {
        RunCommand "" "cluster insert 
        --host=[.add.frm.ent_host get] 
        --port=[.add.frm.ent_port get] 
        --name=[.add.frm.ent_name get] 
        --expiration-timeout=$expiration_timeout 
        --lifetime-limit=$lifetime_limit 
        --max-memory-size=$max_memory_size 
        --max-memory-time-limit=$max_memory_time_limit 
        --security-level=$security_level 
        --session-fault-tolerance-level=$session_fault_tolerance_level 
        --load-balancing-mode=$load_balancing_mode 
        --errors-count-threshold=$errors_count_threshold 
        --kill-problem-processes=$kill_problem_processes 
        $auth_agent $host"
        Run::server $tree $host ""
        destroy .add
    }
    return $frm
}

เช† เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“เชจเชพ เช•เซ‹เชกเชจเซ€ เชธเชฐเช–เชพเชฎเชฃเซ€ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡, เชคเชซเชพเชตเชค เชจเชฐเซ€ เช†เช‚เช–เซ‡ เชฆเซ‡เช–เชพเชฏ เช›เซ‡; เชนเซเช‚ "เช“เช•เซ‡" เชฌเชŸเชจ เชนเซ‡เชจเซเชกเชฒเชฐ เชชเชฐ เชงเซเชฏเชพเชจ เช•เซ‡เชจเซเชฆเซเชฐเชฟเชค เช•เชฐเซ€เชถ. Tk เชฎเชพเช‚, เชตเชฟเช•เชฒเซเชชเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจ เชฆเชฐเชฎเชฟเชฏเชพเชจ เช—เซเชฐเชพเชซเชฟเช• เชคเชคเซเชตเซ‹เชจเชพ เช—เซเชฃเชงเชฐเซเชฎเซ‹เชจเซ‡ เช“เชตเชฐเชฐเชพเช‡เชก เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชฟเชค เช•เชฐเซ‹. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชฌเชŸเชจ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เช†เชฆเซ‡เชถ:

ttk::button $frm_btn.btn_ok -image ok_grey_24 -command { }

เชชเชฐเช‚เชคเซ เช…เชฎเชพเชฐเชพ เชธเซเชตเชฐเซ‚เชชเซ‹เชฎเชพเช‚, เช†เชฆเซ‡เชถ เชœเชฐเซ‚เชฐเซ€ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เชชเชฐ เช†เชงเชพเชฐ เชฐเชพเช–เซ‡ เช›เซ‡:

  .add.frm_btn.btn_ok configure -command {
        RunCommand "" "cluster insert 
        --host=[.add.frm.ent_host get] 
        --port=[.add.frm.ent_port get] 
        --name=[.add.frm.ent_name get] 
        --expiration-timeout=$expiration_timeout 
        --lifetime-limit=$lifetime_limit 
        --max-memory-size=$max_memory_size 
        --max-memory-time-limit=$max_memory_time_limit 
        --security-level=$security_level 
        --session-fault-tolerance-level=$session_fault_tolerance_level 
        --load-balancing-mode=$load_balancing_mode 
        --errors-count-threshold=$errors_count_threshold 
        --kill-problem-processes=$kill_problem_processes 
        $auth_agent $host"
        Run::server $tree $host ""
        destroy .add
    }

เช‰เชชเชฐเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚, "เชญเชฐเชพเชฏเซ‡เชฒเชพ" เชฌเชŸเชจ เช•เซเชฒเชธเซเชŸเชฐ เช‰เชฎเซ‡เชฐเชตเชพเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชถเชฐเซ‚ เช•เชฐเซ‡ เช›เซ‡.

เช…เชนเซ€เช‚ เชคเซ‡ Tk เชฎเชพเช‚ เช—เซเชฐเชพเชซเชฟเช• เช˜เชŸเช•เซ‹ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชคเชฐเชซ เชเช• เชตเชฟเชทเชฏเชพเช‚เชคเชฐ เช•เชฐเชตเชพ เชฏเซ‹เช—เซเชฏ เช›เซ‡ - เชตเชฟเชตเชฟเชง เชกเซ‡เชŸเชพ เช‡เชจเชชเซเชŸ เชคเชคเซเชตเซ‹ (เชเชจเซเชŸเซเชฐเซ€, เช•เซ‹เชฎเซเชฌเซ‹เชฌเซ‹เช•เซเชธ, เชšเซ‡เช•เชฌเชŸเชจ, เชตเช—เซ‡เชฐเซ‡) เชฎเชพเชŸเซ‡ เชเช• เชชเซ‡เชฐเชพเชฎเซ€เชŸเชฐ เชŸเซ‡เช•เซเชธเซเชŸ เชตเซ‡เชฐเซ€เชเชฌเชฒ เชคเชฐเซ€เช•เซ‡ เชฐเชœเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡:

entry  $frm.ent_lifetime_limit -textvariable lifetime_limit

เช† เชšเชฒ เชตเซˆเชถเซเชตเชฟเช• เชจเซ‡เชฎเชธเซเชชเซ‡เชธเชฎเชพเช‚ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เชฅเชฏเซ‡เชฒ เช›เซ‡ เช…เชจเซ‡ เชนเชพเชฒเชฎเชพเช‚ เชฆเชพเช–เชฒ เช•เชฐเซ‡เชฒ เชฎเซ‚เชฒเซเชฏ เชงเชฐเชพเชตเซ‡ เช›เซ‡. เชคเซ‡. เชซเซ€เชฒเซเชกเชฎเชพเช‚เชฅเซ€ เชฆเชพเช–เชฒ เช•เชฐเซ‡เชฒ เชŸเซ‡เช•เซเชธเซเชŸ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชซเช•เซเชค เชšเชฒเชจเซ‡ เช…เชจเซเชฐเซ‚เชช เชฎเซ‚เชฒเซเชฏ เชตเชพเช‚เชšเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ (เช…เชฒเชฌเชคเซเชค, เชœเซ‹ เชคเซ‡ เช˜เชŸเช• เชฌเชจเชพเชตเชคเซ€ เชตเช–เชคเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡).

เชฆเชพเช–เชฒ เช•เชฐเซ‡เชฒ เชŸเซ‡เช•เซเชธเซเชŸเชจเซ‡ เชชเซเชจเชƒเชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพเชจเซ€ เชฌเซ€เชœเซ€ เชชเชฆเซเชงเชคเชฟ (เชเชจเซเชŸเซเชฐเซ€ เชชเซเชฐเช•เชพเชฐเชจเชพ เชคเชคเซเชตเซ‹ เชฎเชพเชŸเซ‡) เช get เช†เชฆเซ‡เชถเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เช›เซ‡:

.add.frm.ent_name get

เช† เชฌเช‚เชจเซ‡ เชชเชฆเซเชงเชคเชฟเช“ เช‰เชชเชฐเซ‹เช•เซเชค เช•เซ‹เชกเชฎเชพเช‚ เชœเซ‹เชˆ เชถเช•เชพเชฏ เช›เซ‡.

เช† เชฌเชŸเชจเชจเซ‡ เช•เซเชฒเชฟเช• เช•เชฐเชตเชพเชฅเซ€, เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชฐเซ‡เช•เชจเชพ เชธเช‚เชฆเชฐเซเชญเชฎเชพเช‚ เช•เซเชฒเชธเซเชŸเชฐ เช‰เชฎเซ‡เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡เชฒเซ€ เช•เชฎเชพเชจเซเชก เชฒเชพเช‡เชจ เชธเชพเชฅเซ‡ RunCommand เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡:

/opt/1C/v8.3/x86_64/rac cluster insert  --host=localhost  --port=1540  --name=dsdsds  --expiration-timeout=0  --lifetime-limit=0  --max-memory-size=0  --max-memory-time-limit=0  --security-level=0  --session-fault-tolerance-level=0  --load-balancing-mode=performance  --errors-count-threshold=0  --kill-problem-processes=no   localhost:1545

เชนเชตเซ‡ เช†เชชเชฃเซ‡ เชฎเซเช–เซเชฏ เช†เชฆเซ‡เชถ เชชเชฐ เช†เชตเซ€เช เช›เซ€เช, เชœเซ‡ เช†เชชเชฃเชจเซ‡ เชœเซ‹เชˆเชคเชพ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชธเชพเชฅเซ‡ เชฐเซ‡เช•เชจเชพ เชฒเซ‹เชจเซเชšเชจเซ‡ เชจเชฟเชฏเช‚เชคเซเชฐเชฟเชค เช•เชฐเซ‡ เช›เซ‡, เชœเซ‹ เชœเชฐเซ‚เชฐเซ€ เชนเซ‹เชฏ เชคเซ‹, เช†เชฆเซ‡เชถเซ‹เชจเชพ เช†เช‰เชŸเชชเซเชŸเชจเซ‡ เชฏเชพเชฆเซ€เช“ เช…เชจเซ‡ เชตเชณเชคเชฐเซ‹เชฎเชพเช‚ เชชเชฃ เชชเชพเชฐเซเชธ เช•เชฐเซ‡ เช›เซ‡:

เชฐเชจเช•เชฎเชพเชจเซเชก

proc RunCommand {root par} {
    global dir rac_cmd cluster work_list_row_count agent_user agent_pwd cluster_user cluster_pwd
    puts "$rac_cmd $par"
    set work_list_row_count 0
    # ะพั‚ะบั€ั‹ะฒะฐะตะผ ะบะฐะฝะฐะป ะฒ ะฝะตะฑะปะพะบะธั€ัƒัŽั‰ะตะผ ั€ะตะถะธะผะต
    # $rac - ะบะพะผะฐะฝะดะฐ ั ะฟะพะปะฝั‹ะผ ะฟัƒั‚ั‘ะผ
    # $par - ัั„ะพั€ะผะธั€ะพะฒะฐะฝะฝั‹ะต ะบะปัŽั‡ะธ ะทะฐะฟัƒัะบะฐ ะธ ะพะฟั†ะธะธ    
    set pipe [open "|$rac_cmd $par" "r"]
    try {
        set lst ""
        set l ""
        # ะฒั‹ะฒะพะด ะบะพะผะฐะฝะดั‹ ะดะพะฑะฐะฒะปัะตะผ ะฒ ัะฟะธัะพะบ ัะฟะธัะบะพะฒ
        while {[gets $pipe line]>=0} {
            #puts $line
            if {$line eq ""} {
                lappend l $lst
                set lst ""
            } else {
                lappend lst [string trim $line]
            }
        }
        close $pipe
        return $l
    } on error {result options} {
        # ะ—ะฐะฟัƒัะบ ะพะฑั€ะฐะฑะพั‚ั‡ะธะบะฐ ะพัˆะธะฑะพะบ
        ErrorParcing $result $options
        return ""
    }
}

เชฎเซเช–เซเชฏ เชธเชฐเซเชตเชฐ เชกเซ‡เชŸเชพ เชฆเชพเช–เชฒ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชคเซ‡ เชตเซƒเช•เซเชทเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡, เช† เชฎเชพเชŸเซ‡, เช‰เชชเชฐเชจเซ€ Add:server เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚, เชจเซ€เชšเซ‡เชจเซ‹ เช•เซ‹เชก เชœเชตเชพเชฌเชฆเชพเชฐ เช›เซ‡:

.frm_tree.tree insert {} end -id "server::$host" -text "$host" -values "$host"

เชนเชตเซ‡, เชตเซƒเช•เซเชทเชฎเชพเช‚ เชธเชฐเซเชตเชฐเชจเชพ เชจเชพเชฎ เชชเชฐ เช•เซเชฒเชฟเช• เช•เชฐเชตเชพเชฅเซ€, เช…เชฎเชจเซ‡ เชคเซ‡ เชธเชฐเซเชตเชฐ เชฆเซเชตเชพเชฐเชพ เชธเช‚เชšเชพเชฒเชฟเชค เช•เซเชฒเชธเซเชŸเชฐเซ‹เชจเซ€ เชธเซ‚เชšเชฟ เชฎเชณเซ‡ เช›เซ‡, เช…เชจเซ‡ เช•เซเชฒเชธเซเชŸเชฐ เชชเชฐ เช•เซเชฒเชฟเช• เช•เชฐเชตเชพเชฅเซ€, เช…เชฎเชจเซ‡ เช•เซเชฒเชธเซเชŸเชฐ เชคเชคเซเชตเซ‹ (เชธเชฐเซเชตเชฐ, เช‡เชจเซเชซเซ‹เชฌเซ‡เชธเซ‡เชธ, เชตเช—เซ‡เชฐเซ‡) เชจเซ€ เชธเซ‚เชšเชฟ เชฎเชณเซ‡ เช›เซ‡. เช† TreePress เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚ เชฒเชพเช—เซ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ (file lib/function.tcl):

proc TreePress {tree} {
   global host server active_cluster infobase
   # ะพะฟั€ะตะดะตะปัะตะผ ะฒั‹ะดะตะปะตะฝะฝั‹ะน ัะปะตะผะตะฝั‚
    set id  [$tree selection]
   # ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ะฝัƒะถะฝั‹ะต ะณะปะพะฑะฐะปัŒะฝั‹ะต ะฟะตั€ะตะผะตะฝะฝั‹ะต
    SetGlobalVarFromTreeItems $tree $id
   # ะžะฟั€ะตะดะตะปัะตะผ ะบะปัŽั‡ ะธ ะทะฝะฐั‡ะตะฝะธะต, ั‚.ะต. ะธะผะตะฝะฝะพ ั‚ะธะฟ ะฒั‹ะฑั€ะฐะฝะฝะพะณะพ ัะปะตะผะตะฝั‚ะฐ
    set values [$tree item $id -values]
    set key [lindex [split $id "::"] 0]
   # ะธ ะฒ ะทะฐะฒะธัะธะผะพัั‚ะธ ะพั‚ ั‚ะพะณะพ ั‡ั‚ะพ ะฒั‹ะฑั€ะฐะปะธ ะฑัƒะดะตั‚ ะทะฐะฟัƒั‰ะตะฝะฐ ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒัŽั‰ะฐั ะฟั€ะพั†ะตะดัƒั€ะฐ 
   # ะฒ ะฟั€ะพัั‚ั€ะฐะฝัั‚ะฒะต ะธะผั‘ะฝ Run
    Run::$key $tree $host $values
}

เชคเชฆเชจเซเชธเชพเชฐ, เชฎเซเช–เซเชฏ เชธเชฐเซเชตเชฐ เชฎเชพเชŸเซ‡ Run::server เชฒเซ‹เชจเซเชš เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ (เช•เซเชฒเชธเซเชŸเชฐ เชฎเชพเชŸเซ‡ - Run::cluster, เช•เชพเชฎ เช•เชฐเชคเชพ เชธเชฐเซเชตเชฐ เชฎเชพเชŸเซ‡ - Run::work_server, เชตเช—เซ‡เชฐเซ‡). เชคเซ‡. $key เชตเซ‡เชฐเซ€เชเชฌเชฒเชจเซเช‚ เชฎเซ‚เชฒเซเชฏ เช เชตเชฟเช•เชฒเซเชช เชฆเซเชตเชพเชฐเชพ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชตเซƒเช•เซเชท เชคเชคเซเชตเชจเชพ เชจเชพเชฎเชจเซ‹ เชเช• เชญเชพเช— เช›เซ‡ -เช†เชˆ.

เชšเชพเชฒเซ‹ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชชเชฐ เชงเซเชฏเชพเชจ เช†เชชเซ€เช

เชšเชฒเชพเชตเซ‹::เชธเชฐเซเชตเชฐ

proc Run::server {tree host values} {
    # ะฟะพะปัƒั‡ะฐะตะผ ัะฟะธัะพะบ ะบะปะฐัั‚ะตั€ะพะฒ ั‚ั€ะตะฑัƒะตะผะพะณะพ ัะตั€ะฒะตั€ะฐ
    set lst [RunCommand server::$host "cluster list $host"]
    if {$lst eq ""} {return}
    set l [lindex $lst 0]
    #puts $lst
    # ัƒะดะฐะปัะตะผ ะปะธัˆะฝะตะต ะธะท ัะฟะธัะบะฐ
    .frm_work.tree_work delete  [ .frm_work.tree_work children {}]
    # ั‡ะธั‚ะฐะตะผ ัะฟะธัะพะบ
    foreach cluster_list $lst {
        # ะ—ะฐะฟะพะปะฝัะตะผ ัะฟะธัะพะบ ะฟะพะปัƒั‡ะตะฝะฝั‹ะผะธ ะทะฝะฐั‡ะตะฝะธัะผะธ
        InsertItemsWorkList $cluster_list
        # ะพะฑั€ะฐะฑะฐั‚ั‹ะฒะฐะตะผ ะฒั‹ะฒะพะด (ัะฟะธัะพะบ) ะดะปั ะดะพะฑะฐะฒะปะตะฝะธั ะดะฐะฝะฝั‹ั… ะฒ ะดะตั€ะตะฒะพ
        foreach i $cluster_list {
            #puts $i
            set cluster_list [split $i ":"]
            if  {[string trim [lindex $cluster_list 0]] eq "cluster"} {
                set cluster_id [string trim [lindex $cluster_list 1]]
                lappend cluster($cluster_id) $cluster_id
            }
            if  {[string trim [lindex $cluster_list 0]] eq "name"} {
                lappend  cluster($cluster_id) [string trim [lindex $cluster_list 1]]
            }
        }
    }
    # ะดะพะฑะฐะฒะปัะตะผ ะบะปะฐัั‚ะตั€ั‹ ะฒ ะดะตั€ะตะฒะพ
    foreach x [array names cluster] {
        set id [lindex $cluster($x) 0]
        if { [$tree exists "cluster::$id"] == 0 } {
            $tree insert "server::$host" end -id "cluster::$id" -text "[lindex $cluster($x) 1]" -values "$id"
            # ะดะพะฑะฐะฒะปัะตะผ ัะปะตะผะตะฝั‚ั‹ ะฒ ะบะปะฐัั‚ะตั€
            InsertClusterItems $tree $id
        }
    }
    if { [$tree exists "agent_admins::$id"] == 0 } {
        $tree insert "server::$host" end -id "agent_admins::$id" -text "ะะดะผะธะฝะธัั‚ั€ะฐั‚ะพั€ั‹" -values "$id"
        #InsertClusterItems $tree $id
    }
}

เช† เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ RunCommand เช•เชฎเชพเชจเซเชก เชฆเซเชตเชพเชฐเชพ เชธเชฐเซเชตเชฐเชฎเชพเช‚เชฅเซ€ เชœเซ‡ เชชเซเชฐเชพเชชเซเชค เชฅเชฏเซเช‚ เชนเชคเซเช‚ เชคเซ‡เชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชตเซƒเช•เซเชทเชฎเชพเช‚ เชคเชฎเชพเชฎ เชชเซเชฐเช•เชพเชฐเชจเซ€ เชตเชธเซเชคเซเช“ เช‰เชฎเซ‡เชฐเซ‡ เช›เซ‡ - เช•เซเชฒเชธเซเชŸเชฐเซ‹, เชตเชฟเชตเชฟเชง เชฎเซ‚เชณ เชคเชคเซเชตเซ‹ (เชฌเซ‡เช, เชตเชฐเซเช•เชฟเช‚เช— เชธเชฐเซเชตเชฐเซเชธ, เชธเชคเซเชฐเซ‹ เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชตเชงเซ). เชœเซ‹ เชคเชฎเซ‡ เชจเชœเซ€เช•เชฅเซ€ เชœเซ‹เชถเซ‹, เชคเซ‹ เชคเชฎเซ‡ เช…เช‚เชฆเชฐ InsertItemsWorkList เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชฎเชพเชŸเซ‡ เช•เซ‰เชฒ เชœเซ‹เชถเซ‹. เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฐเซ‡เช• เช•เชจเซเชธเซ‹เชฒ เชฏเซเชŸเชฟเชฒเชฟเชŸเซ€เชจเชพ เช†เช‰เชŸเชชเซเชŸ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ€เชจเซ‡ เช—เซเชฐเชพเชซเชฟเช•เชฒ เชธเซ‚เชšเชฟเชฎเชพเช‚ เช˜เชŸเช•เซ‹ เช‰เชฎเซ‡เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡, เชœเซ‡ เช…เช—เชพเช‰ $lst เชšเชฒเชจเซ€ เชธเซ‚เชšเชฟ เชคเชฐเซ€เช•เซ‡ เชชเชฐเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€. เช† เชฏเชพเชฆเซ€เช“เชจเซ€ เชฏเชพเชฆเซ€ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เช•เซ‹เชฒเซ‹เชจ เชฆเซเชตเชพเชฐเชพ เชตเชฟเชญเชพเชœเชฟเชค เชคเชคเซเชตเซ‹เชจเซ€ เชœเซ‹เชกเซ€ เช›เซ‡.

เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช•เซเชฒเชธเซเชŸเชฐ เช•เชจเซ‡เช•เซเชถเชจเซเชธเชจเซ€ เชธเซ‚เชšเชฟ:

svk@svk ~]$ /opt/1C/v8.3/x86_64/rac connection list --cluster=783d2170-56c3-11e8-c586-fc75165efbb2 localhost:1545
connection     : dcf5991c-7d24-11e8-1690-fc75165efbb2
conn-id        : 0
host           : svk.home
process        : 79de2e16-56c3-11e8-c586-fc75165efbb2
infobase       : 00000000-0000-0000-0000-000000000000
application    : "JobScheduler"
connected-at   : 2018-07-01T14:49:51
session-number : 0
blocked-by-ls  : 0

connection     : b993293a-7d24-11e8-1690-fc75165efbb2
conn-id        : 0
host           : svk.home
process        : 79de2e16-56c3-11e8-c586-fc75165efbb2
infobase       : 00000000-0000-0000-0000-000000000000
application    : "JobScheduler"
connected-at   : 2018-07-01T14:48:52
session-number : 0
blocked-by-ls  : 0

เช—เซเชฐเชพเชซเชฟเช•เชฒ เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚ เชคเซ‡ เช•เช‚เชˆเช• เช†เชจเชพ เชœเซ‡เชตเซเช‚ เชฆเซ‡เช–เชพเชถเซ‡:

1C RAC เชฎเชพเชŸเซ‡ GUI เชฒเช–เชตเซเช‚, เช…เชฅเชตเชพ เชซเชฐเซ€เชฅเซ€ Tcl/Tk เชตเชฟเชถเซ‡

เช‰เชชเชฐเซ‹เช•เซเชค เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เซ‹เชทเซเชŸเช• เชญเชฐเชตเชพ เชฎเชพเชŸเซ‡ เชนเซ‡เชกเชฐ เช…เชจเซ‡ เชกเซ‡เชŸเชพ เชฎเชพเชŸเซ‡ เช˜เชŸเช•เซ‹เชจเชพ เชจเชพเชฎ เชชเชธเช‚เชฆ เช•เชฐเซ‡ เช›เซ‡:

InsertItemsWorklist

proc InsertItemsWorkList {lst} {
    global work_list_row_count
    # ัƒัั‚ะฐะฝะพะฒะบะฐ ั‡ะตั€ะตะดะพะฒะฐะฝะธั ั†ะฒะตั‚ะฐ ะดะปั ัั‚ั€ะพะบะธ
    if [expr $work_list_row_count % 2] {
        set tag dark
    } else {
        set tag light
    }
    # ั€ะฐะทะฑะพั€ ัั‚ั€ะพะบ ะฝะฐ ะฟะฐั€ั‹ ะบะปัŽั‡ - ะทะฝะฐั‡ะตะฝะธะต
    foreach i $lst {
        if [regexp -nocase -all -- {(D+)(s*?|)(:)(s*?|)(.*)} $i match param v2 v3 v4 value] {
            lappend column_list [string trim $param]
            lappend value_list [string trim $value]
        }
    }
     # ะทะฐะฟะพะปะฝะตะฝะธะต ั‚ะฐะฑะปะธั†ั‹
    .frm_work.tree_work configure -columns $column_list -displaycolumns $column_list
    .frm_work.tree_work insert {} end  -values $value_list -tags $tag
    .frm_work.tree_work column #0 -stretch
    # ัƒัั‚ะฐะฝะพะฒะบะฐ ะทะฐะณะพะปะพะฒะบะพะฒ
    foreach j $column_list {
        .frm_work.tree_work heading $j -text $j
    }
    incr work_list_row_count
}

เช…เชนเซ€เช‚, เชธเชฐเชณ เช†เชฆเซ‡เชถ [split $str ":"]เชจเซ‡ เชฌเชฆเชฒเซ‡, เชœเซ‡ เชธเซเชŸเซเชฐเชฟเช‚เช—เชจเซ‡ ":" เชตเชกเซ‡ เชตเชฟเชญเชพเชœเชฟเชค เช˜เชŸเช•เซ‹เชฎเชพเช‚ เชตเชฟเชญเชพเชœเชฟเชค เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชธเซ‚เชšเชฟ เช†เชชเซ‡ เช›เซ‡, เชจเชฟเชฏเชฎเชฟเชค เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฅเชพเชฏ เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เช•เซ‡เชŸเชฒเชพเช• เช˜เชŸเช•เซ‹เชฎเชพเช‚ เช•เซ‹เชฒเซ‹เชจ เชชเชฃ เชนเซ‹เชฏ เช›เซ‡.

InsertClusterItems เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ (เช˜เชฃเชพ เชธเชฎเชพเชจเชฎเชพเช‚เชฅเซ€ เชเช•) เชœเชฐเซ‚เชฐเซ€ เช•เซเชฒเชธเซเชŸเชฐ เชเชฒเชฟเชฎเซ‡เชจเซเชŸเชจเชพ เชตเซƒเช•เซเชทเชฎเชพเช‚ เช…เชจเซเชฐเซ‚เชช เช“เชณเช–เช•เชฐเซเชคเชพเช“ เชธเชพเชฅเซ‡ เชฌเชพเชณ เช˜เชŸเช•เซ‹เชจเซ€ เชธเซ‚เชšเชฟ เช‰เชฎเซ‡เชฐเซ‡ เช›เซ‡.
InsertClusterItems

proc InsertClusterItems {tree id} {
    set parent "cluster::$id"
    $tree insert $parent end -id "infobases::$id" -text "ะ˜ะฝั„ะพั€ะผะฐั†ะธะพะฝะฝั‹ะต ะฑะฐะทั‹" -values "$id"
    $tree insert $parent end -id "servers::$id" -text "ะ ะฐะฑะพั‡ะธะต ัะตั€ะฒะตั€ั‹" -values "$id"
    $tree insert $parent end -id "admins::$id" -text "ะะดะผะธะฝะธัั‚ั€ะฐั‚ะพั€ั‹" -values "$id"
    $tree insert $parent end -id "managers::$id" -text "ะœะตะฝะตะดะถะตั€ั‹ ะบะปะฐัั‚ะตั€ะฐ" -values $id
    $tree insert $parent end -id "processes::$id" -text "ะ ะฐะฑะพั‡ะธะต ะฟั€ะพั†ะตััั‹" -values "workprocess-all"
    $tree insert $parent end -id "sessions::$id" -text "ะกะตะฐะฝัั‹" -values "sessions-all"
    $tree insert $parent end -id "locks::$id" -text "ะ‘ะปะพะบะธั€ะพะฒะบะธ" -values "blocks-all"
    $tree insert $parent end -id "connections::$id" -text "ะกะพะตะดะธะฝะตะฝะธั" -values "connections-all"
    $tree insert $parent end -id "profiles::$id" -text "ะŸั€ะพั„ะธะปะธ ะฑะตะทะพะฟะฐัะฝะพัั‚ะธ" -values $id
}

เชคเชฎเซ‡ เชธเชฎเชพเชจ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพ เชฎเชพเชŸเซ‡ เชตเชงเซ เชฌเซ‡ เชตเชฟเช•เชฒเซเชชเซ‹ เชชเชฐ เชตเชฟเชšเชพเชฐ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เชœเซเชฏเชพเช‚ เชคเซ‡ เชธเซเชชเชทเซเชŸเชชเชฃเซ‡ เชฆเซ‡เช–เชพเชถเซ‡ เช•เซ‡ เชคเชฎเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชจเซ‡ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เช†เชฆเซ‡เชถเซ‹เชฅเซ€ เช›เซเชŸเช•เชพเชฐเซ‹ เชฎเซ‡เชณเชตเซ€ เชถเช•เซ‹ เช›เซ‹:

เช† เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚, เช‰เชฎเซ‡เชฐเชตเชพเชจเซเช‚ เช…เชจเซ‡ เชคเชชเชพเชธเชตเซเช‚ เช เชนเซ‡เชก-เช“เชจ เช‰เช•เซ‡เชฒเชพเชฏ เช›เซ‡:

InsertBaseItems

proc InsertBaseItems {tree id} {
    set parent "infobase::$id"
    if { [$tree exists "sessions::$id"] == 0 } {
        $tree insert $parent end -id "sessions::$id" -text "ะกะตะฐะฝัั‹" -values "$id"
    }
    if { [$tree exists "locks::$id"] == 0 } {
        $tree insert $parent end -id "locks::$id" -text "ะ‘ะปะพะบะธั€ะพะฒะบะธ" -values "$id"
    }
    if { [$tree exists "connections::$id"] == 0 } {
        $tree insert $parent end -id "connections::$id" -text "ะกะพะตะดะธะฝะตะฝะธั" -values "$id"
    }
}

เช…เชนเซ€เช‚ เชตเชงเซ เชธเชพเชšเซ‹ เช…เชญเชฟเช—เชฎ เช›เซ‡:

InsertProfileItems

proc InsertProfileItems {tree id} {
    set parent "profile::$id"
    set lst {
        {dir "ะ’ะธั€ั‚ัƒะฐะปัŒะฝั‹ะต ะบะฐั‚ะฐะปะพะณะธ"}
        {com "ะ ะฐะทั€ะตัˆั‘ะฝะฝั‹ะต COM-ะบะปะฐััั‹"}
        {addin "ะ’ะฝะตัˆะฝะธะต ะบะพะผะฟะพะฝะตะฝั‚ั‹"}
        {module "ะ’ะฝะตัˆะฝะธะต ะพั‚ั‡ั‘ั‚ั‹ ะธ ะพะฑั€ะฐะฑะพั‚ะบะธ"}
        {app "ะ ะฐะทั€ะตัˆั‘ะฝะฝั‹ะต ะฟั€ะธะปะพะถะตะฝะธั"}
        {inet "ะ ะตััƒั€ัั‹ ะธะฝั‚ะตั€ะฝะตั‚"}
    }
    foreach i $lst {
        append item [lindex $i 0] "::$id"
        if { [$tree exists $item] == 0 } {
            $tree insert $parent end -id $item -text [lindex $i 1] -values "$id"
        }
        unset item 
    }
}

เชคเซ‡เชฎเชจเซ€ เชตเชšเซเชšเซ‡เชจเซ‹ เชคเชซเชพเชตเชค เช เชฒเซ‚เชชเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช›เซ‡, เชœเซ‡เชฎเชพเช‚ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เช†เชฆเซ‡เชถ(เช“) เชšเชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช•เชฏเชพ เช…เชญเชฟเช—เชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เชคเซ‡ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเชจเชพ เชตเชฟเชตเซ‡เช•เชฌเซเชฆเซเชงเชฟ เชชเชฐ เช›เซ‡.

เช…เชฎเซ‡ เชคเชคเซเชตเซ‹ เช‰เชฎเซ‡เชฐเชตเชพ เช…เชจเซ‡ เชกเซ‡เชŸเชพ เชชเซเชจเชƒเชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพเชจเซเช‚ เช†เชตเชฐเซ€ เชฒเซ€เชงเซเช‚ เช›เซ‡, เชนเชตเซ‡ เชธเช‚เชชเชพเชฆเชจ เชชเชฐ เชงเซเชฏเชพเชจ เช•เซ‡เชจเซเชฆเซเชฐเชฟเชค เช•เชฐเชตเชพเชจเซ‹ เชธเชฎเชฏ เช›เซ‡. เช•เชพเชฐเชฃ เช•เซ‡, เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡, เชธเชฎเชพเชจ เชชเชฐเชฟเชฎเชพเชฃเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชธเช‚เชชเชพเชฆเชจ เช…เชจเซ‡ เช‰เชฎเซ‡เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡ (เชฎเชพเชนเชฟเชคเซ€ เช†เชงเชพเชฐเชจเชพ เช…เชชเชตเชพเชฆ เชธเชพเชฅเซ‡), เชธเชฎเชพเชจ เชธเช‚เชตเชพเชฆ เชธเซเชตเชฐเซ‚เชชเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฅเชพเชฏ เช›เซ‡. เช‰เชฎเซ‡เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“เชจเซ‡ เช•เซ‰เชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ เช†เชจเชพ เชœเซ‡เชตเซเช‚ เชฆเซ‡เช–เชพเชฏ เช›เซ‡:

เช‰เชฎเซ‡เชฐเซ‹::$key->AddToplevel

เช…เชจเซ‡ เช†เชจเชพ เชœเซ‡เชตเชพ เชธเช‚เชชเชพเชฆเชจ เชฎเชพเชŸเซ‡:

เชธเช‚เชชเชพเชฆเชฟเชค เช•เชฐเซ‹::$key->Add::$key->AddTopLevel

เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชšเชพเชฒเซ‹ เช•เซเชฒเชธเซเชŸเชฐเชจเซเช‚ เชธเช‚เชชเชพเชฆเชจ เช•เชฐเซ€เช, เชเชŸเชฒเซ‡ เช•เซ‡. เชเชพเชกเชฎเชพเช‚ เช•เซเชฒเชธเซเชŸเชฐเชจเชพ เชจเชพเชฎ เชชเชฐ เช•เซเชฒเชฟเช• เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชŸเซ‚เชฒเชฌเชพเชฐ (เชชเซ‡เชจเซเชธเชฟเชฒ) เชฎเชพเช‚ เชธเช‚เชชเชพเชฆเชฟเชค เช•เชฐเซ‹ เชฌเชŸเชจ เชฆเชฌเชพเชตเซ‹ เช…เชจเซ‡ เช…เชจเซเชฐเซ‚เชช เชซเซ‹เชฐเซเชฎ เชธเซเช•เซเชฐเซ€เชจ เชชเชฐ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เชฅเชถเซ‡:

1C RAC เชฎเชพเชŸเซ‡ GUI เชฒเช–เชตเซเช‚, เช…เชฅเชตเชพ เชซเชฐเซ€เชฅเซ€ Tcl/Tk เชตเชฟเชถเซ‡
เชธเช‚เชชเชพเชฆเชฟเชค เช•เชฐเซ‹::เช•เซเชฒเชธเซเชŸเชฐ

proc Edit::cluster {tree host values} {
    global default lifetime_limit expiration_timeout session_fault_tolerance_level
    global max_memory_size max_memory_time_limit errors_count_threshold security_level
    global load_balancing_mode kill_problem_processes active_cluster 
    agent_user agent_pwd cluster_user cluster_pwd auth
    if {$cluster_user ne "" && $cluster_pwd ne ""} {
        set auth "--cluster-user=$cluster_user --cluster-pwd=$cluster_pwd"
    } else {
        set auth ""
    }
    # ั€ะธััƒะตะผ ั„ะพั€ะผัƒ ะดะปั ะบะปะฐัั‚ะตั€ะฐ
    set frm [Add::cluster $tree $host $values]
    # ะผะตะฝัะตะผ ั‚ะตะบัั‚ ะฝะฐ ะผะตั‚ะบะต
    $frm configure -text "ะ ะตะดะฐะบั‚ะธั€ะพะฒะฐะฝะธะต ะบะปะฐัั‚ะตั€ะฐ"
    
    set active_cluster $values
    # ะฟะพะปัƒั‡ะฐะตะผ ะดะฐะฝะฝั‹ะต ะฟะพ ะฒั‹ะดะตะปะตะฝะฝะพะผัƒ ะบะปะฐัั‚ะตั€ัƒ
    set lst [RunCommand cluster::$values "cluster info --cluster=$active_cluster $host"]
    # ะทะฐะฟะพะปะฝัะตะผ ะฟะพะปั
    FormFieldsDataInsert $frm $lst
    # ะฒั‹ะบะปัŽั‡ะฐะตะผ ะฟะพะปั, ั€ะตะดะฐะบั‚ะธั€ะพะฒะฐะฝะธะต ะบะพั‚ะพั€ั‹ั… ะทะฐะฟั€ะตั‰ะตะฝะพ
    $frm.ent_host configure -state disable
    $frm.ent_port configure -state disable
    # ะฟะตั€ะตะฝะฐะทะฝะฐั‡ะฐะตะผ ะพะฑั€ะฐะฑะพั‚ั‡ะธะบ
    .add.frm_btn.btn_ok configure -command {
        RunCommand "" "cluster update 
        --cluster=$active_cluster $auth 
        --name=[.add.frm.ent_name get] 
        --expiration-timeout=$expiration_timeout 
        --lifetime-limit=$lifetime_limit 
        --max-memory-size=$max_memory_size 
        --max-memory-time-limit=$max_memory_time_limit 
        --security-level=$security_level 
        --session-fault-tolerance-level=$session_fault_tolerance_level 
        --load-balancing-mode=$load_balancing_mode 
        --errors-count-threshold=$errors_count_threshold 
        --kill-problem-processes=$kill_problem_processes 
        $auth $host"
        $tree delete "cluster::$active_cluster"
        Run::server $tree $host ""
        destroy .add
    }
}

เช•เซ‹เชกเชฎเชพเช‚เชจเซ€ เชŸเชฟเชชเซเชชเชฃเซ€เช“เชจเชพ เช†เชงเชพเชฐเซ‡, เชธเซˆเชฆเซเชงเชพเช‚เชคเชฟเช• เชฐเซ€เชคเซ‡, เชฌเชงเซเช‚ เชธเซเชชเชทเซเชŸ เช›เซ‡, เชธเชฟเชตเชพเชฏ เช•เซ‡ เชฌเชŸเชจ เชนเซ‡เชจเซเชกเชฒเชฐ เช•เซ‹เชก เช“เชตเชฐเชฐเชพเช‡เชก เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชคเซเชฏเชพเช‚ เชเช• FormFieldsDataInsert เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช›เซ‡ เชœเซ‡ เชกเซ‡เชŸเชพ เชธเชพเชฅเซ‡ เชซเซ€เชฒเซเชกเซเชธ เชญเชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชšเชฒเซ‹เชจเซ‡ เชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเซ‡ เช›เซ‡:

FormFieldsDataInsert

proc FormFieldsDataInsert {frm lst} {
    foreach i [lindex $lst 0] {
        # ะฟะพะปัƒั‡ะฐะตะผ ัะฟะธัะพะบ ะฟะฐั€ะฐะผะตั‚ั€ะพะฒ ะธ ะทะฝะฐั‡ะตะฝะธะน
        if [regexp -nocase -all -- {(D+)(s*?|)(:)(s*?|)(.*)} $i match param v2 v3 v4 value] {
            # ะผะตะฝัะตะผ ัะธะผะฒะพะปั‹
            regsub -all -- "-" [string trim $param] "_" entry_name
            # ะทะฐะฟะพะปะฝัะตะผ ะดะฐะฝะฝั‹ะผะธ
            if [winfo exists $frm.ent_$entry_name] {
                $frm.ent_$entry_name delete 0 end
                $frm.ent_$entry_name insert end [string trim $value """]
            }
            if [winfo exists $frm.cb_$entry_name] {
                global $entry_name
                set $entry_name [string trim $value """]
            }
            # ะดะปั ั‡ะตะบะฑะพะบัะพะฒ ะผะตะฝัะตะผ ะทะฝะฐั‡ะตะฝะธั
            if [winfo exists $frm.check_$entry_name] {
                global $entry_name
                if {$value eq "0"} {
                    set $entry_name no
                } elseif {$value eq "1"} {
                    set $entry_name yes
                } else {
                    set $entry_name $value
                }
            }
        }
    }
}

เช† เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚, tcl เชจเซ‹ เชฌเซ€เชœเซ‹ เชซเชพเชฏเชฆเซ‹ เชธเชชเชพเชŸเซ€ เชชเชฐ เช†เชตเซเชฏเซ‹ - เช…เชจเซเชฏ เชšเชฒเซ‹เชจเซ€ เช•เชฟเช‚เชฎเชคเซ‹ เชšเชฒ เชจเชพเชฎเซ‹ เชคเชฐเซ€เช•เซ‡ เช…เชตเซ‡เชœเซ€ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชคเซ‡. เชซเซ‹เชฐเซเชฎ เชญเชฐเชตเชพ เช…เชจเซ‡ เชšเชฒเซ‹เชจเชพ เช†เชฐเช‚เชญเชจเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช•เซเชทเซ‡เชคเซเชฐเซ‹ เช…เชจเซ‡ เชšเชฒเซ‹เชจเชพ เชจเชพเชฎ rac เชฏเซเชŸเชฟเชฒเชฟเชŸเซ€เชจเชพ เช•เชฎเชพเชจเซเชก เชฒเชพเช‡เชจ เชธเซเชตเซ€เชšเซ‹ เช…เชจเซ‡ เช•เซ‡เชŸเชฒเชพเช• เช…เชชเชตเชพเชฆ เชธเชพเชฅเซ‡ เช•เชฎเชพเชจเซเชก เช†เช‰เชŸเชชเซเชŸ เชชเชฐเชฟเชฎเชพเชฃเซ‹เชจเชพ เชจเชพเชฎเซ‹เชจเซ‡ เช…เชจเซเชฐเซ‚เชช เช›เซ‡ - เชกเซ‡เชถเชจเซ‡ เช…เช‚เชกเชฐเชธเซเช•เซ‹เชฐ เชฆเซเชตเชพเชฐเชพ เชฌเชฆเชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชฆเชพ.เชค เชธเซเชจเชฟเชถเซเชšเชฟเชค-เชœเซ‹เชฌเซเชธ-เชจเช•เชพเชฐ เช•เซเชทเซ‡เชคเซเชฐ เชธเชพเชฅเซ‡ เชฎเซ‡เชณ เช–เชพเชฏ เช›เซ‡ ent_scheduled_jobs_deny เช…เชจเซ‡ เชšเชฒ เชธเซเชจเชฟเชถเซเชšเชฟเชค_เชœเซ‹เชฌเซเชธ_เชจเช•เชพเชฐ.

เช‰เชฎเซ‡เชฐเชตเชพ เช…เชจเซ‡ เชธเช‚เชชเชพเชฆเชจ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเชพ เชซเซ‹เชฐเซเชฎ เช•เซเชทเซ‡เชคเซเชฐเซ‹เชจเซ€ เชฐเชšเชจเชพเชฎเชพเช‚ เช…เชฒเช— เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชฎเชพเชนเชฟเชคเซ€ เช†เชงเชพเชฐ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเซเช‚:

เชฎเชพเชนเชฟเชคเซ€ เชธเซเชฐเช•เซเชทเชพ เช‰เชฎเซ‡เชฐเชตเชพเชจเซเช‚

1C RAC เชฎเชพเชŸเซ‡ GUI เชฒเช–เชตเซเช‚, เช…เชฅเชตเชพ เชซเชฐเซ€เชฅเซ€ Tcl/Tk เชตเชฟเชถเซ‡

เชฎเชพเชนเชฟเชคเซ€ เชธเซเชฐเช•เซเชทเชพ เชธเช‚เชชเชพเชฆเชจ

1C RAC เชฎเชพเชŸเซ‡ GUI เชฒเช–เชตเซเช‚, เช…เชฅเชตเชพ เชซเชฐเซ€เชฅเซ€ Tcl/Tk เชตเชฟเชถเซ‡

เชธเช‚เชชเชพเชฆเชจ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚ Edit::infobase, เชซเซ‹เชฐเซเชฎเชฎเชพเช‚ เชœเชฐเซ‚เชฐเซ€ เชซเซ€เชฒเซเชก เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡; เช•เซ‹เชก เชตเชฟเชถเชพเชณ เช›เซ‡, เชคเซ‡เชฅเซ€ เชนเซเช‚ เชคเซ‡เชจเซ‡ เช…เชนเซ€เช‚ เชฐเชœเซ‚ เช•เชฐเชคเซ‹ เชจเชฅเซ€.

เชธเชพเชฆเซเชฐเชถเซเชฏ เชฆเซเชตเชพเชฐเชพ, เช…เชจเซเชฏ เช˜เชŸเช•เซ‹ เชฎเชพเชŸเซ‡ เช‰เชฎเซ‡เชฐเชตเชพ, เชธเช‚เชชเชพเชฆเชฟเชค เช•เชฐเชตเชพ, เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“ เชฒเชพเช—เซ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เชฏเซเชŸเชฟเชฒเชฟเชŸเซ€เชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เช…เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชธเช‚เช–เซเชฏเชพเชฎเชพเช‚ เชธเชฐเซเชตเชฐเซเชธ, เช•เซเชฒเชธเซเชŸเชฐเซ‹, เชฎเชพเชนเชฟเชคเซ€ เชชเชพเชฏเชพ, เชตเช—เซ‡เชฐเซ‡ เชธเซ‚เชšเชตเซ‡ เช›เซ‡, เชคเซ‡ เชจเช•เซเช•เซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‡ เช•เชฏเซเช‚ เช•เซเชฒเชธเซเชŸเชฐ เช•เชฏเชพ เชธเชฐเซเชตเชฐ เช…เชฅเชตเชพ เชฎเชพเชนเชฟเชคเซ€ เชธเซเชฐเช•เซเชทเชพ เชธเชฟเชธเซเชŸเชฎเชจเซเช‚ เช›เซ‡, เช˜เชฃเชพ เชตเซˆเชถเซเชตเชฟเช• เชšเชฒเซ‹ เชฐเชœเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เช›เซ‡, เชœเซ‡เชจเชพเช‚ เชฆเชฐเซ‡เช• เชฎเซ‚เชฒเซเชฏเซ‹ เชธเซ‡เชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เช›เซ‡. เชœเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ เชตเซƒเช•เซเชทเชจเชพ เชคเชคเซเชตเซ‹ เชชเชฐ เช•เซเชฒเชฟเช• เช•เชฐเซ‹ เช›เซ‹. เชคเซ‡. เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชฐเซ€เชคเซ‡ เชคเชฎเชพเชฎ เชชเชฟเชคเซƒ เชคเชคเซเชตเซ‹ เชฆเซเชตเชพเชฐเชพ เชšเชพเชฒเซ‡ เช›เซ‡ เช…เชจเซ‡ เชšเชฒเซ‹ เชธเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡:

SetGlobalVarFromTreeItems

proc SetGlobalVarFromTreeItems {tree id} {
    global host server active_cluster infobase
    set parent [$tree parent $id]
    set values [$tree item $id -values]
    set key [lindex [split $id "::"] 0]
    switch -- $key {
        server {set host $values}
        work_server {set server $values}
        cluster {set active_cluster $values}
        infobase {set infobase $values}
    }
    if {$parent eq ""} {
        return
    } else {
        SetGlobalVarFromTreeItems $tree $parent
    }
}

1C เช•เซเชฒเชธเซเชŸเชฐ เชคเชฎเชจเซ‡ เช…เชงเชฟเช•เซƒเชคเชคเชพ เชธเชพเชฅเซ‡ เช…เชฅเชตเชพ เชตเช—เชฐ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. เชคเซเชฏเชพเช‚ เชฌเซ‡ เชชเซเชฐเช•เชพเชฐเชจเชพ เชเชกเชฎเชฟเชจเชฟเชธเซเชŸเซเชฐเซ‡เชŸเชฐเซเชธ เช›เซ‡ - เช•เซเชฒเชธเซเชŸเชฐ เชเชœเชจเซเชŸ เชเชกเชฎเชฟเชจเชฟเชธเซเชŸเซเชฐเซ‡เชŸเชฐ เช…เชจเซ‡ เช•เซเชฒเชธเซเชŸเชฐ เชเชกเชฎเชฟเชจเชฟเชธเซเชŸเซเชฐเซ‡เชŸเชฐ. เชคเชฆเชจเซเชธเชพเชฐ, เชฏเซ‹เช—เซเชฏ เช•เชพเชฎเช—เซ€เชฐเซ€ เชฎเชพเชŸเซ‡, เชเชกเชฎเชฟเชจเชฟเชธเซเชŸเซเชฐเซ‡เชŸเชฐ เชฒเซ‹เช—เชฟเชจ เช…เชจเซ‡ เชชเชพเชธเชตเชฐเซเชก เชงเชฐเชพเชตเชคเชพเช‚ เชตเชงเซ 4 เชตเซˆเชถเซเชตเชฟเช• เชšเชฒ เชฐเชœเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชนเชคเชพ. เชคเซ‡. เชœเซ‹ เช•เซเชฒเชธเซเชŸเชฐเชฎเชพเช‚ เชเชกเชฎเชฟเชจเชฟเชธเซเชŸเซเชฐเซ‡เชŸเชฐ เชเช•เชพเช‰เชจเซเชŸ เชนเชถเซ‡, เชคเซ‹ เชคเชฎเชพเชฐเซเช‚ เชฒเซ‹เช—เชฟเชจ เช…เชจเซ‡ เชชเชพเชธเชตเชฐเซเชก เชฆเชพเช–เชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เชธเช‚เชตเชพเชฆ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เชฅเชถเซ‡, เชกเซ‡เชŸเชพ เชฎเซ‡เชฎเชฐเซ€เชฎเชพเช‚ เชธเชพเชšเชตเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เช…เชจเซ‡ เชธเช‚เชฌเช‚เชงเชฟเชค เช•เซเชฒเชธเซเชŸเชฐ เชฎเชพเชŸเซ‡ เชฆเชฐเซ‡เช• เช†เชฆเซ‡เชถเชฎเชพเช‚ เชฆเชพเช–เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

เช† เชญเซ‚เชฒ เชธเช‚เชญเชพเชณเชตเชพเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ€ เชœเชตเชพเชฌเชฆเชพเชฐเซ€ เช›เซ‡.

เชเชฐเชฐเชชเชพเชฐเซเชธเชฟเช‚เช—

proc ErrorParcing {err opt} {
    global cluster_user cluster_pwd agent_user agent_pwd
        switch -regexp -- $err {
        "Cluster administrator is not authenticated" {
            AuthorisationDialog "ะะดะผะธะฝะธัั‚ั€ะฐั‚ะพั€ ะบะปะฐัั‚ะตั€ะฐ"
            .auth_win.frm_btn.btn_ok configure -command {
                set cluster_user [.auth_win.frm.ent_name get]
                set cluster_pwd [.auth_win.frm.ent_pwd get]
                destroy .auth_win
            }
            #RunCommand $root $par
        }
        "Central server administrator is not authenticated" {
            AuthorisationDialog "ะะดะผะธะฝะธัั‚ั€ะฐั‚ะพั€ ะฐะณะตะฝั‚ะฐ ะบะปะฐัั‚ะตั€ะฐ"
            .auth_win.frm_btn.btn_ok configure -command {
                set agent_user [.auth_win.frm.ent_name get]
                set agent_pwd [.auth_win.frm.ent_pwd get]
                destroy .auth_win
            }
        }
        "ะะดะผะธะฝะธัั‚ั€ะฐั‚ะพั€ ะบะปะฐัั‚ะตั€ะฐ ะฝะต ะฐัƒั‚ะตะฝั‚ะธั„ะธั†ะธั€ะพะฒะฐะฝ" {
            AuthorisationDialog "ะะดะผะธะฝะธัั‚ั€ะฐั‚ะพั€ ะบะปะฐัั‚ะตั€ะฐ"
            .auth_win.frm_btn.btn_ok configure -command {
                set cluster_user [.auth_win.frm.ent_name get]
                set cluster_pwd [.auth_win.frm.ent_pwd get]
                destroy .auth_win
            }
            #RunCommand $root $par
        }
        "ะะดะผะธะฝะธัั‚ั€ะฐั‚ะพั€ ั†ะตะฝั‚ั€ะฐะปัŒะฝะพะณะพ ัะตั€ะฒะตั€ะฐ ะฝะต ะฐัƒั‚ะตะฝั‚ะธั„ะธั†ะธั€ะพะฒะฐะฝ" {
            AuthorisationDialog "ะะดะผะธะฝะธัั‚ั€ะฐั‚ะพั€ ะฐะณะตะฝั‚ะฐ ะบะปะฐัั‚ะตั€ะฐ"
            .auth_win.frm_btn.btn_ok configure -command {
                set agent_user [.auth_win.frm.ent_name get]
                set agent_pwd [.auth_win.frm.ent_pwd get]
                destroy .auth_win
            }
        }
        (.+) {
            tk_messageBox -type ok -icon error -message "$err"
        }
    }
}

เชคเซ‡. เช†เชฆเซ‡เชถ เชถเซเช‚ เช†เชชเซ‡ เช›เซ‡ เชคเซ‡เชจเชพ เช†เชงเชพเชฐเซ‡, เชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชคเซ‡ เชฎเซเชœเชฌ เชนเชถเซ‡.

เช† เช•เซเชทเชฃเซ‡, เชฒเช—เชญเช— 95 เชŸเช•เชพ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เชฒเชพเช—เซ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡, เชœเซ‡ เชฌเชพเช•เซ€ เช›เซ‡ เชคเซ‡ เชธเซเชฐเช•เซเชทเชพ เชชเซเชฐเซ‹เชซเชพเช‡เชฒเซเชธ เชธเชพเชฅเซ‡ เช•เชพเชฐเซเชฏเชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพเชจเซเช‚ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเซเช‚ =). เชฌเชธ เชเชŸเชฒเซเช‚ เชœ. เช•เชšเชกเชพเชฏเซ‡เชฒเซ€ เชตเชพเชฐเซเชคเชพ เชฎเชพเชŸเซ‡ เชนเซเช‚ เชฎเชพเชซเซ€ เชฎเชพเช‚เช—เซ เช›เซเช‚.

เช•เซ‹เชก เชชเชฐเช‚เชชเชฐเชพเช—เชค เชฐเซ€เชคเซ‡ เช‰เชชเชฒเชฌเซเชง เช›เซ‡ เช…เชนเซ€เช‚.

เช…เชชเชกเซ‡เชŸ: เชฎเซ‡เช‚ เชธเซเชฐเช•เซเชทเชพ เชชเซเชฐเซ‹เชซเชพเช‡เชฒเซเชธ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซเช‚ เชธเชฎเชพเชชเซเชค เช•เชฐเซเชฏเซเช‚. เชนเชตเซ‡ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ 100% เช…เชฎเชฒเชฎเชพเช‚ เช›เซ‡.

เช…เชชเชกเซ‡เชŸ 2: เช…เช‚เช—เซเชฐเซ‡เชœเซ€ เช…เชจเซ‡ เชฐเชถเชฟเชฏเชจเชฎเชพเช‚ เชธเซเชฅเชพเชจเชฟเช•เซ€เช•เชฐเชฃ เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡, win7 เชฎเชพเช‚ เช•เชพเชฎเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡
1C RAC เชฎเชพเชŸเซ‡ GUI เชฒเช–เชตเซเช‚, เช…เชฅเชตเชพ เชซเชฐเซ€เชฅเซ€ Tcl/Tk เชตเชฟเชถเซ‡

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹