Sau GUI rau 1C RAC, lossis ntxiv txog Tcl/Tk

Raws li peb delved rau hauv lub ntsiab lus ntawm yuav ua li cas 1C cov khoom ua hauj lwm nyob rau hauv lub Linux ib puag ncig, ib tug drawback twb nrhiav tau - tsis muaj ib tug yooj yim graphical multi-platform cuab tam rau kev tswj ib pawg ntawm 1C servers. Thiab nws tau txiav txim siab los kho qhov teeb meem no los ntawm kev sau GUI rau cov khoom siv hluav taws xob sib tw. Tcl / tk tau raug xaiv los ua cov lus tsim kho raws li, hauv kuv lub tswv yim, qhov tsim nyog tshaj plaws rau txoj haujlwm no. Thiab yog li, kuv xav nthuav qhia qee qhov nthuav dav ntawm kev daws teeb meem hauv cov khoom siv no.

Txhawm rau ua haujlwm koj yuav xav tau tcl / tk thiab 1C kev faib khoom. Thiab txij li thaum kuv txiav txim siab ua kom muaj peev xwm tshaj plaws ntawm kev xa khoom yooj yim tcl / tk yam tsis tau siv cov pob khoom thib peb, kuv yuav xav tau version 8.6.7, uas suav nrog ttk - ib pob nrog cov duab nraaj ntxiv, uas peb xav tau ttk. ::TreeView, nws tso cai rau tso saib cov ntaub ntawv ob qho tib si nyob rau hauv daim ntawv ntawm tsob ntoo qauv thiab nyob rau hauv daim ntawv ntawm ib lub rooj (cov npe). Tsis tas li ntawd, nyob rau hauv lub tshiab version, kev ua hauj lwm nrog kev zam tau reworked (sim hais kom ua, uas yog siv nyob rau hauv qhov project thaum khiav lwm commands).

Qhov project muaj ntau yam ntaub ntawv (txawm hais tias tsis muaj dab tsi tiv thaiv koj los ntawm kev ua txhua yam hauv ib qho):

rac_gui.cfg - default config
rac_gui.tcl - lub ntsiab tso tawm tsab ntawv
Lub lib directory muaj cov ntaub ntawv uas tau txais kev thauj khoom thaum pib:
function.tcl - cov ntaub ntawv nrog cov txheej txheem
gui.tcl - lub ntsiab graphical interface
images.tcl - base64 duab qiv

Cov ntaub ntawv rac_gui.tcl, qhov tseeb, pib tus neeg txhais lus, pib qhov sib txawv, thauj cov modules, configs, thiab lwm yam. Cov ntsiab lus ntawm cov ntaub ntawv nrog cov lus pom:

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"
    }    
}

Tom qab rub tawm txhua yam uas yuav tsum tau ua thiab kuaj xyuas qhov muaj cov khoom siv hluav taws xob sib tw, lub qhov rais graphical yuav raug tso tawm. Lub program interface muaj peb yam:

Toolbar, tsob ntoo thiab cov npe

Kuv ua cov ntsiab lus ntawm "ntoo" zoo ib yam li qhov ua tau rau cov khoom siv Windows txheem los ntawm 1C.

Sau GUI rau 1C RAC, lossis ntxiv txog Tcl/Tk

Lub ntsiab cai uas tsim lub qhov rais no yog muaj nyob rau hauv cov ntaub ntawv
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

Lub algorithm rau kev ua hauj lwm nrog qhov kev pab cuam yog raws li nram no:

1. Ua ntej, koj yuav tsum tau ntxiv lub ntsiab pawg neeg rau zaub mov (piv txwv li, pawg tswj hwm pawg neeg rau zaub mov (hauv Linux, kev tswj hwm tau pib nrog cov lus txib “/opt/1C/v8.3/x86_64/ras pawg —daemon”)).

Txhawm rau ua qhov no, nyem rau ntawm "+" khawm thiab hauv qhov rai uas qhib, nkag mus rau qhov chaw nyob thiab chaw nres nkoj server:

Sau GUI rau 1C RAC, lossis ntxiv txog Tcl/Tk

Tom qab ntawd, peb cov neeg rau zaub mov yuav tshwm sim hauv tsob ntoo los ntawm txhaj rau nws, cov npe ntawm pawg yuav qhib lossis qhov kev sib txuas yuam kev yuav tshwm sim.

2. Nyem rau ntawm lub npe pawg yuav qhib cov npe ntawm cov haujlwm muaj rau nws.

3. …

Thiab lwm yam, i.e. Txhawm rau ntxiv ib pawg tshiab, xaiv ib qho twg muaj nyob hauv daim ntawv teev npe thiab nias lub pob "+" hauv lub toolbar thiab ntxiv cov dialog tshiab yuav tshwm sim:

Sau GUI rau 1C RAC, lossis ntxiv txog Tcl/Tk

Cov nyees khawm hauv toolbar ua haujlwm nyob ntawm cov ntsiab lus, piv txwv li. Nyob ntawm seb lub caij twg ntawm tsob ntoo lossis cov npe raug xaiv, ib lossis lwm txoj kev yuav raug ua.

Cia peb saib qhov piv txwv ntawm lub pob ntxiv ("+"):

Khawm tiam code:

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

Ntawm no peb pom tias thaum lub pob nyem, cov txheej txheem "Ntxiv" yuav raug tua, nws cov cai:

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
}

Nov yog ib qho ntawm qhov zoo ntawm tickle: koj tuaj yeem hla tus nqi ntawm qhov sib txawv raws li tus txheej txheem npe:

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

Ntawd yog, piv txwv li, yog tias peb taw tes rau ntawm lub server tseem ceeb thiab nias "+", tom qab ntawd qhov Add:: tus txheej txheem server yuav raug tso tawm, yog nyob ntawm pawg - Ntxiv:: pawg thiab lwm yam (Kuv mam li sau txog qhov twg qhov tsim nyog "cov yuam sij" los ntawm me ntsis hauv qab no), cov txheej txheem teev tseg kos duab cov ntsiab lus tsim nyog rau cov ntsiab lus.

Raws li koj tau pom lawm, cov ntaub ntawv zoo sib xws hauv cov style - qhov no tsis yog qhov xav tsis thoob, vim tias lawv tau tshwm sim los ntawm ib txheej txheem, ntau qhov tseeb ntawm lub ntsiab ntawm daim ntawv (qhov rai, nyees khawm, duab, daim ntawv lo), lub npe ntawm cov txheej txheem. AddTopLevel

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
}

Hu tsis tau: lub npe, duab lub npe rau lub cim ntawm lub tsev qiv ntawv (lib/images.tcl) thiab ib qho kev xaiv lub qhov rais lub npe parameter (default .add). Yog li, yog tias peb coj cov piv txwv saum toj no rau kev ntxiv cov server loj thiab pawg, kev hu yuav raug raws li:

AddToplevel "Добавление основного сервера" server_grey_64

los yog

AddToplevel "Добавление кластера" cluster_grey_64

Zoo, txuas ntxiv nrog cov piv txwv no, kuv yuav qhia cov txheej txheem uas tso saib ntxiv dialogs rau lub server lossis pawg.

Ntxiv:: server

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
}

Ntxiv:: pawg

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
}

Thaum muab piv cov cai ntawm cov txheej txheem no, qhov sib txawv yog pom ntawm qhov muag liab qab; Kuv yuav tsom mus rau "Ok" khawm handler. Hauv Tk, cov khoom ntawm cov duab nraaj tuaj yeem hla dhau thaum lub sijhawm ua tiav cov haujlwm siv qhov kev xaiv configure. Piv txwv li, thawj zaug hais kom ua kom pom lub pob:

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

Tab sis hauv peb cov ntaub ntawv, cov lus txib nyob ntawm qhov yuav tsum tau ua haujlwm:

  .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
    }

Hauv qhov piv txwv saum toj no, lub pob "clogged" pib txheej txheem ntxiv rau pawg.

Ntawm no nws tsim nyog ua qhov kev txiav txim siab ntawm kev ua haujlwm nrog cov duab nraaj hauv Tk - rau ntau yam ntaub ntawv tawm tswv yim (nkag mus, combobox, checkbutton, thiab lwm yam) parameter tau qhia ua cov ntawv hloov pauv:

entry  $frm.ent_lifetime_limit -textvariable lifetime_limit

Qhov kev hloov pauv no tau txhais nyob rau hauv lub ntiaj teb namespace thiab muaj cov nqi nkag tam sim no. Cov. txhawm rau kom tau txais cov ntawv nkag los ntawm daim teb, koj tsuas yog yuav tsum tau nyeem cov nqi sib xws rau qhov sib txawv (ntawm chav kawm, muab nws txhais tau tias thaum tsim lub caij).

Qhov thib ob txoj kev los muab cov ntawv sau nkag (rau cov ntsiab lus ntawm hom nkag) yog siv tau cov lus txib:

.add.frm.ent_name get

Ob txoj kev no tuaj yeem pom hauv cov cai saum toj no.

Nyem qhov khawm no, nyob rau hauv cov ntaub ntawv no, launches tus txheej txheem RunCommand nrog cov generated hais kom ua kab rau ntxiv ib pawg nyob rau hauv cov nqe lus ntawm haiv neeg:

/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

Tam sim no peb tuaj rau cov lus txib tseem ceeb, uas tswj kev tshaj tawm ntawm kev sib tw nrog cov kev txwv peb xav tau, kuj txheeb xyuas cov txiaj ntsig ntawm cov lus txib rau hauv cov npe thiab xa rov qab, yog tias xav tau:

RunCommand

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 ""
    }
}

Tom qab nkag mus rau lub ntsiab server cov ntaub ntawv, nws yuav muab ntxiv rau tsob ntoo, rau qhov no, nyob rau saum toj no Ntxiv: tus txheej txheem server, cov cai hauv qab no yog lub luag haujlwm:

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

Tam sim no, los ntawm txhaj rau lub npe neeg rau zaub mov hauv tsob ntoo, peb tau txais ib daim ntawv teev cov pawg tswj hwm los ntawm tus neeg rau zaub mov ntawd, thiab los ntawm kev nyem rau ntawm pawg, peb tau txais cov npe ntawm pawg pawg (servers, infobases, thiab lwm yam). Qhov no yog siv nyob rau hauv tus txheej txheem 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
}

Raws li, Run:: server yuav raug tso tawm rau lub server tseem ceeb (rau pawg - Khiav:: pawg, rau cov neeg ua haujlwm ua haujlwm - Khiav:: work_server, thiab lwm yam). Cov. tus nqi ntawm $ tseem ceeb hloov pauv yog ib feem ntawm lub npe ntawm tsob ntoo lub caij teev los ntawm kev xaiv -id ib.

Cia peb mloog cov txheej txheem

Khiav:: 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
    }
}

Cov txheej txheem no ua cov txheej txheem uas tau txais los ntawm cov neeg rau zaub mov los ntawm RunCommand cov lus txib thiab ntxiv txhua yam khoom rau tsob ntoo - pawg, ntau yam hauv paus ntsiab lus (piv txwv, ua haujlwm servers, ntu, thiab lwm yam). Yog tias koj saib ze, koj yuav pom ib qho hu rau InsertItemsWorkList txheej txheem sab hauv. Nws yog siv los ntxiv cov ntsiab lus rau ib daim ntawv teev npe los ntawm kev ua cov khoom tso tawm ntawm cov khoom siv hluav taws xob rac console, uas yav tas los tau rov qab los ua ib daim ntawv teev npe rau $ lst sib txawv. Qhov no yog ib daim ntawv teev cov npe uas muaj khub ntawm cov khoom sib cais los ntawm txoj hnyuv.

Piv txwv li, ib daim ntawv teev cov kev sib txuas ua ke:

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

Hauv graphical daim ntawv nws yuav zoo li no:

Sau GUI rau 1C RAC, lossis ntxiv txog Tcl/Tk

Cov txheej txheem saum toj no xaiv cov npe ntawm cov ntsiab lus rau header thiab cov ntaub ntawv los sau cov lus:

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
}

Ntawm no, es tsis txhob siv cov lus txib yooj yim [split $str ":"], uas faib cov hlua rau hauv cov khoom sib cais los ntawm ":" thiab xa rov qab cov npe, cov lus qhia tsis tu ncua yog siv, vim qee cov ntsiab lus tseem muaj cov nyuv.

Cov txheej txheem InsertClusterItems (ib qho ntawm ob peb qhov zoo sib xws) tsuas yog ntxiv cov npe ntawm cov menyuam yaus nrog cov cim sib raug rau tsob ntoo ntawm cov khoom tsim nyog
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
}

Koj tuaj yeem xav txog ob qho kev xaiv ntxiv rau kev siv cov txheej txheem zoo sib xws, qhov twg nws yuav pom meej tias koj tuaj yeem ua kom zoo dua thiab tshem tawm cov lus txib rov qab:

Nyob rau hauv cov txheej txheem no, ntxiv thiab xyuas yog daws head-on:

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"
    }
}

Nov yog txoj hauv kev kom raug ntau dua:

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 
    }
}

Qhov sib txawv ntawm lawv yog kev siv lub voj, uas cov lus txib rov ua dua. Txoj kev siv dab tsi yog nyob ntawm kev txiav txim siab ntawm tus tsim tawm.

Peb tau npog ntxiv cov ntsiab lus thiab khaws cov ntaub ntawv, tam sim no nws yog lub sijhawm los tsom rau kev kho. Txij li thaum, qhov tseem ceeb, tib qhov tsis yog siv rau kev kho thiab ntxiv (nrog rau kev zam ntawm cov ntaub ntawv hauv paus), tib daim ntawv sib tham tau siv. Lub algorithm rau hu cov txheej txheem rau ntxiv zoo li no:

Ntxiv::$key->AddToplevel

Thiab rau editing zoo li no:

Kho kom raug::$key->Add::$key->AddTopLevel

Piv txwv li, cia peb kho ib pawg, i.e. Thaum nyem rau ntawm lub npe ntawm pawg hauv tsob ntoo, nias lub pob hloov kho hauv lub toolbar (xiav) thiab daim ntawv sib txuas yuav tshwm sim ntawm qhov screen:

Sau GUI rau 1C RAC, lossis ntxiv txog Tcl/Tk
Kho kom raug:: pawg

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
    }
}

Raws li cov lus pom hauv cov cai, hauv paus ntsiab lus, txhua yam yog qhov tseeb, tshwj tsis yog tias lub khawm tuav txoj cai yog overridden thiab muaj cov txheej txheem FormFieldsDataInsert uas sau cov teb nrog cov ntaub ntawv thiab pib qhov sib txawv:

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
                }
            }
        }
    }
}

Hauv cov txheej txheem no, lwm qhov kom zoo dua ntawm tcl ntog - qhov tseem ceeb ntawm lwm qhov sib txawv tau hloov pauv raws li cov npe sib txawv. Cov. kom automate lub sau cov ntaub ntawv thiab pib ntawm qhov sib txawv, cov npe ntawm cov teb thiab cov hloov pauv sib haum mus rau cov kab lus hais kom hloov pauv ntawm cov khoom siv hluav taws xob thiab cov npe ntawm cov lus txib tso tawm tsis muaj qee qhov tshwj xeeb - khiav ceev yog hloov los ntawm tus lej hauv qab. Piv txwv teem-ua hauj lwm-tsis kam phim lub teb ent_scheduled_jobs_deny thiab sib txawv teem_job_deny.

Cov ntaub ntawv ntxiv thiab kho yuav txawv ntawm cov teb, piv txwv li, ua haujlwm nrog cov ntaub ntawv hauv paus:

Ntxiv cov ntaub ntawv kev ruaj ntseg

Sau GUI rau 1C RAC, lossis ntxiv txog Tcl/Tk

Kho cov ntaub ntawv kev ruaj ntseg

Sau GUI rau 1C RAC, lossis ntxiv txog Tcl/Tk

Nyob rau hauv cov txheej txheem kho Kho kom raug:: infobase, cov teb yuav tsum tau ntxiv rau hauv daim ntawv; cov cai yog voluminous, yog li kuv tsis qhia nws ntawm no.

Los ntawm kev sib piv, cov txheej txheem ntxiv, kho, tshem tawm yog siv rau lwm yam.

Txij li thaum lub lag luam ntawm cov nqi hluav taws xob implies ib tug unlimited tus naj npawb ntawm servers, pawg, cov ntaub ntawv hauv paus, thiab lwm yam, los txiav txim seb pawg twg yog cov neeg rau zaub mov lossis cov ntaub ntawv kev ruaj ntseg, ntau lub ntiaj teb hloov pauv tau qhia, cov txiaj ntsig ntawm txhua qhov. lub sijhawm koj nyem rau ntawm cov ntoo. Cov. tus txheej txheem recursively khiav los ntawm tag nrho cov niam txiv cov ntsiab lus thiab teev cov variables:

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 pawg tso cai rau koj ua haujlwm nrog lossis tsis muaj kev tso cai. Muaj ob hom kev tswj hwm-cluster tus neeg saib xyuas thiab pawg thawj tswj hwm. Raws li, rau kev ua haujlwm kom raug, 4 qhov hloov pauv thoob ntiaj teb tau nthuav tawm uas muaj tus thawj coj nkag mus thiab tus password. Cov. Yog tias muaj tus thawj tswj hwm tus account hauv pawg, ib qho kev sib tham yuav tshwm sim kom nkag mus rau koj tus ID nkag mus thiab lo lus zais, cov ntaub ntawv yuav raug khaws cia hauv lub cim xeeb thiab muab tso rau hauv txhua qhov lus txib rau pawg sib thooj.

Qhov no yog lub luag haujlwm ntawm tus txheej txheem kev ua yuam kev.

ErrorParcing

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"
        }
    }
}

Cov. nyob ntawm seb cov lus txib rov qab li cas, cov tshuaj tiv thaiv yuav ua raws li.

Lub sijhawm tam sim no, kwv yees li 95 feem pua ​​​​ntawm cov haujlwm tau ua tiav, txhua yam uas tseem tshuav yog siv ua haujlwm nrog kev ruaj ntseg profiles thiab sim nws =). Yog tag nrho. kuv thov txim rau zaj dab neeg no.

Cov cai yog ib txwm muaj S, SѓS,.

Hloov tshiab: Kuv ua tiav nrog kev ruaj ntseg profiles. Tam sim no lub functionality yog 100% siv.

Hloov tshiab 2: localization ua lus Askiv thiab Lavxias teb sab tau ntxiv, ua haujlwm hauv win7 tau sim
Sau GUI rau 1C RAC, lossis ntxiv txog Tcl/Tk

Tau qhov twg los: www.hab.com

Ntxiv ib saib