αž€αžΆαžšαžŸαžšαžŸαŸαžš GUI αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ 1C RAC αž¬αž˜αŸ’αžαž„αž‘αŸ€αžαž’αŸ†αž–αžΈ Tcl/Tk

αžŠαžΌαž…αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž–αžΈαž”αŸ’αžšαž’αžΆαž“αž”αž‘αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž•αž›αž·αžαž•αž› 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 αŸ”

αž€αžΆαžšαžŸαžšαžŸαŸαžš GUI αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ 1C RAC αž¬αž˜αŸ’αžαž„αž‘αŸ€αžαž’αŸ†αž–αžΈ 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. αž‡αžΆαžŠαŸ†αž”αžΌαž„ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž“αŸ’αžαŸ‚αž˜αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž…αž„αŸ’αž€αŸ„αž˜αž˜αŸ (ឧ. αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž…αž„αŸ’αž€αŸ„αž˜ (αž“αŸ…αž€αŸ’αž“αž»αž„αž›αžΈαž“αž»αž… αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ β€œ/opt/1C/v8.3/x86_64/ras cluster β€”daemon”))αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αž…αž»αž…αž›αžΎαž”αŸŠαžΌαžαž»αž„ "+" αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž„αŸ’αž’αž½αž…αžŠαŸ‚αž›αž”αžΎαž€αžŸαžΌαž˜αž”αž‰αŸ’αž…αžΌαž›αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž“αž·αž„αž…αŸ’αžšαž€:

αž€αžΆαžšαžŸαžšαžŸαŸαžš GUI αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ 1C RAC αž¬αž˜αŸ’αžαž„αž‘αŸ€αžαž’αŸ†αž–αžΈ Tcl/Tk

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžšαž”αžŸαŸ‹αž™αžΎαž„αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αŸ‚αž€αž’αžΆαž„αžŠαŸ„αž™αž…αž»αž…αž›αžΎαžœαžΆ αž”αž‰αŸ’αž‡αžΈαž“αŸƒαž…αž„αŸ’αž€αŸ„αž˜αž“αžΉαž„αž”αžΎαž€ αž¬αž€αŸ†αž αž»αžŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αŸ”

2. αž€αžΆαžšαž…αž»αž…αž›αžΎαžˆαŸ’αž˜αŸ„αŸ‡αž…αž„αŸ’αž€αŸ„αž˜αž“αžΉαž„αž”αžΎαž€αž”αž‰αŸ’αž‡αžΈαž˜αž»αžαž„αžΆαžšαžŠαŸ‚αž›αž˜αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαžΆαŸ”

3. …

αž αžΎαž™αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αŸ…αž›αžΎ, i.e. αžŠαžΎαž˜αŸ’αž”αžΈαž”αž“αŸ’αžαŸ‚αž˜αž…αž„αŸ’αž€αŸ„αž˜αžαŸ’αž˜αžΈ αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαžŽαžΆαž˜αž½αž™αžŠαŸ‚αž›αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž‡αžΈ αž αžΎαž™αž…αž»αž…αž”αŸŠαžΌαžαž»αž„ β€œ+” αž“αŸ…αž€αŸ’αž“αž»αž„αžšαž”αžΆαžšαž§αž”αž€αžšαžŽαŸ αž αžΎαž™αž”αŸ’αžšαž’αž”αŸ‹αž”αž“αŸ’αžαŸ‚αž˜αžαŸ’αž˜αžΈαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αŸ–

αž€αžΆαžšαžŸαžšαžŸαŸαžš GUI αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ 1C RAC αž¬αž˜αŸ’αžαž„αž‘αŸ€αžαž’αŸ†αž–αžΈ 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
}

αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž‚αž»αžŽαžŸαž˜αŸ’αž”αžαŸ’αžαž·αž˜αž½αž™αž“αŸƒ tickleαŸ– αž’αŸ’αž“αž€αž’αžΆαž…αž αž»αž…αžαž˜αŸ’αž›αŸƒαž“αŸƒαž’αžαŸαžšαž‡αžΆαžˆαŸ’αž˜αŸ„αŸ‡αž“αžΈαžαž·αžœαž·αž’αžΈαŸ–

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

αž“αŸ„αŸ‡αž‚αžΊαž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž…αž„αŸ’αž’αž»αž›αž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ αž αžΎαž™αž…αž»αž… β€œ+” αž“αŸ„αŸ‡αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš Add:: server αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž“αŸ… cluster - Add::cluster αž αžΎαž™αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αŸ…αž›αžΎ (αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αžŸαžšαžŸαŸαžšαž’αŸ†αž–αžΈαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž› "αž‚αŸ’αžšαžΆαž”αŸ‹αž…αž»αž…" αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž˜αž€αž–αžΈαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž”αž“αŸ’αžαž·αž…) αž“αžΈαžαž·αžœαž·αž’αžΈαžŠαŸ‚αž›αž”αžΆαž“αžšαžΆαž™αž”αž‰αŸ’αž‡αžΈαž‚αžΌαžšαž’αžΆαžαž»αž€αŸ’αžšαžΆαž αŸ’αžœαž·αž€αžŠαŸ‚αž›αžŸαž˜αžŸαŸ’αžšαž”αž‘αŸ…αž“αžΉαž„αž”αžšαž·αž”αž‘αŸ”

αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž”αžΆαž“αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžšαž½αž…αž αžΎαž™ αž‘αž˜αŸ’αžšαž„αŸ‹αž‚αžΊαžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžšαž…αž“αžΆαž”αŸαž‘αŸ’αž˜ - αž“αŸαŸ‡αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαžšαžΏαž„αž‚αž½αžšαž±αŸ’αž™αž—αŸ’αž‰αžΆαž€αŸ‹αž•αŸ’αž’αžΎαž›αž“αŸ„αŸ‡αž‘αŸαž–αŸ’αžšαŸ„αŸ‡αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžŠαŸ„αž™αž“αžΈαžαž·αžœαž·αž’αžΈαž˜αž½αž™ αž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αž”αžΆαžŸαŸ‹αž‡αžΆαž„αž“αŸαŸ‡αž‘αŸ…αž‘αŸ€αž αžŸαŸŠαž»αž˜αžŸαŸ†αžαžΆαž“αŸ‹αž“αŸƒαž‘αž˜αŸ’αžšαž„αŸ‹ (αž”αž„αŸ’αž’αž½αž… αž”αŸŠαžΌαžαž»αž„ αžšαžΌαž”αž—αžΆαž– αžŸαŸ’αž›αžΆαž€) αžˆαŸ’αž˜αŸ„αŸ‡αž“αŸƒαž“αžΈαžαž·αžœαž·αž’αžΈ αž”αž“αŸ’αžαŸ‚αž˜αž€αž˜αŸ’αžšαž·αžαž€αŸ†αž–αžΌαž›

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) αž“αž·αž„αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžˆαŸ’αž˜αŸ„αŸ‡αž”αž„αŸ’αž’αž½αž…αžŸαŸ’αžšαŸαž…αž…αž·αžαŸ’αž (αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ .αž”αž“αŸ’αžαŸ‚αž˜)αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž™αž€αž§αž‘αžΆαž αžšαžŽαŸαžαžΆαž„αž›αžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ αž“αž·αž„αž…αž„αŸ’αž€αŸ„αž˜ αž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘αž“αžΉαž„αž’αŸ’αžœαžΎαž‘αžΎαž„αžαžΆαž˜αŸ–

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 (αž―αž€αžŸαžΆαžš 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 αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ server main (αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ cluster - Run::cluster, for a work server - Run::work_server, etc.)αŸ” αž‘αžΆαŸ†αž„αž“αŸ„αŸ‡αŸ” αžαž˜αŸ’αž›αŸƒαž“αŸƒαž’αžαŸαžš $key αž‚αžΊαž‡αžΆαž•αŸ’αž“αŸ‚αž€αž˜αž½αž™αž“αŸƒαžˆαŸ’αž˜αŸ„αŸ‡αžšαž”αžŸαŸ‹αž’αžΆαžαž»αž˜αŸ‚αž€αž’αžΆαž„αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžŠαŸ„αž™αž‡αž˜αŸ’αžšαžΎαžŸ - αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹.

αž…αžΌαžšαž™αžΎαž„αž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž›αžΎαž“αžΈαžαž·αžœαž·αž’αžΈ

αžšαžαŸ‹ :: server

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 αž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„αŸ” αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž”αž“αŸ’αžαŸ‚αž˜αž’αžΆαžαž»αž‘αŸ…αž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž‡αžΈαž€αŸ’αžšαžΆαž αŸ’αžœαž·αž€αžŠαŸ„αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αž‘αŸ’αž’αž•αž›αž“αŸƒαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αž»αž„αžŸαžΌαž› rac αžŠαŸ‚αž›αž–αžΈαž˜αž»αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžαŸ’αžšαž‘αž”αŸ‹αž‡αžΆαž”αž‰αŸ’αž‡αžΈαž‘αŸ…αž’αžαŸαžš $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

αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž€αŸ’αžšαžΆαž αŸ’αžœαž·αž€ αžœαžΆαž“αžΉαž„αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

αž€αžΆαžšαžŸαžšαžŸαŸαžš GUI αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ 1C RAC αž¬αž˜αŸ’αžαž„αž‘αŸ€αžαž’αŸ†αž–αžΈ Tcl/Tk

αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαžΆαž„αž›αžΎαž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαžˆαŸ’αž˜αŸ„αŸ‡αž’αžΆαžαž»αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž‹αž˜αž€αžαžΆ αž“αž·αž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ†αž–αŸαž‰αžαžΆαžšαžΆαž„αŸ–

αž”αž‰αŸ’αž…αžΌαž›αž”αž‰αŸ’αž‡αžΈαž€αžΆαžšαž„αžΆαžš

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 (αž˜αž½αž™αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αžœαžαŸ’αžαž»αžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆαž‡αžΆαž…αŸ’αžšαžΎαž“) αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž”αž“αŸ’αžαŸ‚αž˜αž”αž‰αŸ’αž‡αžΈαž“αŸƒαž’αžΆαžαž»αž€αžΌαž“αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž§αž”αž€αžšαžŽαŸαž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž‘αŸ…αž“αžΉαž„αž˜αŸ‚αž€αž’αžΆαž„αž“αŸƒαž’αžΆαžαž»αž…αž„αŸ’αž€αŸ„αž˜αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαŸ”
αž”αž‰αŸ’αž…αžΌαž›β€‹αž’αžΆαžαž»β€‹αž…αž„αŸ’αž€αŸ„αž˜

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
}

αž’αŸ’αž“αž€αž’αžΆαž…αž–αž·αž…αžΆαžšαžŽαžΆαž‡αž˜αŸ’αžšαžΎαžŸαž–αžΈαžšαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž“αžΈαžαž·αžœαž·αž’αžΈαžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆ αžŠαŸ‚αž›αžœαžΆαž“αžΉαž„αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αž™αŸ‰αžΆαž„αž…αŸ’αž”αžΆαžŸαŸ‹αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž– αž“αž·αž„αž€αž˜αŸ’αž…αžΆαžαŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαžŠαŸ‚αž›αŸ—αŸ–

αž€αŸ’αž“αž»αž„β€‹αž“αžΈαžαž·αžœαž·αž’αžΈβ€‹αž“αŸαŸ‡ αž€αžΆαžšβ€‹αž”αž“αŸ’αžαŸ‚αž˜β€‹αž“αž·αž„β€‹αž€αžΆαžšβ€‹αž–αž·αž“αž·αžαŸ’αž™β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™β€‹αžŠαŸ„αž™β€‹αž•αŸ’αž‘αžΆαž›αŸ‹αŸ–

αž”αž‰αŸ’αž…αžΌαž›BaseItems

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->αž”αž“αŸ’αžαŸ‚αž˜::$key->AddTopLevel

αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αž…αžΌαžšαž™αžΎαž„αž’αŸ’αžœαžΎαž€αžΆαžšαž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž…αž„αŸ’αž€αŸ„αž˜αž˜αž½αž™ ឧ. αžŠαŸ„αž™αž…αž»αž…αž›αžΎαžˆαŸ’αž˜αŸ„αŸ‡αžšαž”αžŸαŸ‹αž…αž„αŸ’αž€αŸ„αž˜αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αŸ‚αž€αž’αžΆαž„ αž…αž»αž…αž”αŸŠαžΌαžαž»αž„αž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αžšαž”αžΆαžšαž§αž”αž€αžšαžŽαŸ (αžαŸ’αž˜αŸ…αžŠαŸƒ) αž αžΎαž™αž‘αž˜αŸ’αžšαž„αŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž“αŸ…αž›αžΎαž’αŸαž€αŸ’αžšαž„αŸ‹αŸ–

αž€αžΆαžšαžŸαžšαžŸαŸαžš GUI αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ 1C RAC αž¬αž˜αŸ’αžαž„αž‘αŸ€αžαž’αŸ†αž–αžΈ 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 αžŠαŸ‚αž›αž”αŸ†αž–αŸαž‰αžœαžΆαž›αž‡αžΆαž˜αž½αž™αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž“αž·αž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž’αžαŸαžšαŸ–

αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž‘αž·αž“αŸ’αž“αž“αŸαž™ FormFields

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_αž”αžŠαž·αžŸαŸαž’ αž“αž·αž„αž’αžαŸαžš scheduled_jobs_deny.

αž‘αž˜αŸ’αžšαž„αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜ αž“αž·αž„αž€αžΆαžšαž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž’αžΆαž…αž˜αžΆαž“αž—αžΆαž–αžαž»αžŸαž”αŸ’αž›αŸ‚αž€αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαž˜αžΆαžŸαž—αžΆαž–αž“αŸƒαžœαžΆαž› αž§αž‘αžΆαž αžšαžŽαŸ αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž–αŸαžαŸŒαž˜αžΆαž“αŸ–

αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž–αŸαžαŸŒαž˜αžΆαž“

αž€αžΆαžšαžŸαžšαžŸαŸαžš GUI αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ 1C RAC αž¬αž˜αŸ’αžαž„αž‘αŸ€αžαž’αŸ†αž–αžΈ Tcl/Tk

αž€αžΆαžšαž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž–αŸαžαŸŒαž˜αžΆαž“

αž€αžΆαžšαžŸαžšαžŸαŸαžš GUI αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ 1C RAC αž¬αž˜αŸ’αžαž„αž‘αŸ€αžαž’αŸ†αž–αžΈ Tcl/Tk

αž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ‚αžŸαž˜αŸ’αžšαž½αž› Edit::infobase αžœαžΆαž›αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ…αž‘αž˜αŸ’αžšαž„αŸ‹αž€αžΌαžŠαž‚αžΊ voluminous αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž”αž„αŸ’αž αžΆαž‰αžœαžΆαž“αŸ…αž‘αžΈαž“αŸαŸ‡αž‘αŸαŸ”

αžŠαŸ„αž™αž—αžΆαž–αžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆ αž“αžΈαžαž·αžœαž·αž’αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜ αž€αžΆαžšαž€αŸ‚αžŸαž˜αŸ’αžšαž½αž› αž€αžΆαžšαž›αž»αž” αž“αž·αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αžΆαžαž»αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαŸ”

αžŠαŸ„αž™αžŸαžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžšαž”αžŸαŸ‹αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αž„αŸ’αž€αž”αŸ‹αž“αŸαž™αž…αŸ†αž“αž½αž“αž˜αž·αž“αž€αŸ†αžŽαžαŸ‹αž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ αž…αž„αŸ’αž€αŸ„αž˜ αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž–αŸαžαŸŒαž˜αžΆαž“αŸ”αž›αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αžαžΆαžαžΎαž…αž„αŸ’αž€αŸ„αž˜αžŽαžΆαž˜αž½αž™αž‡αžΆαžšαž”αžŸαŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ αž¬αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž–αŸαžαŸŒαž˜αžΆαž“αž“αŸ„αŸ‡ αž’αžαŸαžšαžŸαž€αž›αž‡αžΆαž…αŸ’αžšαžΎαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŽαŸ‚αž“αžΆαŸ† αžαž˜αŸ’αž›αŸƒαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž“αžΈαž˜αž½αž™αŸ—αŸ” αž–αŸαž›αžŠαŸ‚αž›αž’αŸ’αž“αž€αž…αž»αž…αž›αžΎαž’αžΆαžαž»αž“αŸƒαžŠαžΎαž˜αžˆαžΎαŸ” αž‘αžΆαŸ†αž„αž“αŸ„αŸ‡αŸ” αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αžΎαž„αžœαž·αž‰αžαžΆαž˜αžšαž™αŸˆαž’αžΆαžαž»αž˜αŸαž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αž αžΎαž™αž€αŸ†αžŽαžαŸ‹αž’αžαŸαžšαŸ–

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 αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžΆαž€αž›αŸ’αž”αž„
αž€αžΆαžšαžŸαžšαžŸαŸαžš GUI αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ 1C RAC αž¬αž˜αŸ’αžαž„αž‘αŸ€αžαž’αŸ†αž–αžΈ Tcl/Tk

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹