Kikọ GUI kan fun 1C RAC, tabi lẹẹkansi nipa Tcl/Tk

Bi a ṣe n lọ sinu koko-ọrọ ti bii awọn ọja 1C ṣe n ṣiṣẹ ni agbegbe Linux, a ṣe awari apadabọ kan - aini ti ohun elo alaworan ti o rọrun pupọ fun ṣiṣakoso iṣupọ ti awọn olupin 1C. Ati pe o pinnu lati ṣe atunṣe aapọn yii nipa kikọ GUI kan fun ohun elo console rac. Tcl/tk ni a yan gẹgẹbi ede idagbasoke bi, ni ero mi, o dara julọ fun iṣẹ yii. Ati nitorinaa, Emi yoo fẹ lati ṣafihan diẹ ninu awọn abala ti o nifẹ si ti ojutu ninu ohun elo yii.

Lati ṣiṣẹ iwọ yoo nilo tcl/tk ati awọn pinpin 1C. Ati pe niwọn igba ti Mo pinnu lati ṣe pupọ julọ awọn agbara ti ifijiṣẹ tcl/tk ipilẹ laisi lilo awọn idii ẹnikẹta, Emi yoo nilo ẹya 8.6.7, eyiti o pẹlu ttk - package pẹlu awọn eroja ayaworan afikun, eyiti a nilo ni pataki ttk :: TreeView, o ngbanilaaye data ifihan mejeeji ni irisi eto igi ati ni irisi tabili (akojọ). Paapaa, ninu ẹya tuntun, iṣẹ pẹlu awọn imukuro ti tun ṣiṣẹ (aṣẹ igbiyanju, eyiti o lo ninu iṣẹ akanṣe nigbati o nṣiṣẹ awọn aṣẹ ita).

Ise agbese na ni ọpọlọpọ awọn faili (botilẹjẹpe ko si ohun ti o ṣe idiwọ fun ọ lati ṣe ohun gbogbo ni ọkan):

rac_gui.cfg - aiyipada konfigi
rac_gui.tcl - akọkọ ifilole akosile
Ilana lib ni awọn faili ti o ti kojọpọ laifọwọyi ni ibẹrẹ:
function.tcl - faili pẹlu awọn ilana
gui.tcl - akọkọ ayaworan ni wiwo
images.tcl - base64 image ìkàwé

Faili rac_gui.tcl, ni otitọ, bẹrẹ onitumọ, bẹrẹ awọn oniyipada, awọn modulu fifuye, awọn atunto, ati bẹbẹ lọ. Awọn akoonu ti faili pẹlu awọn asọye:

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

Lẹhin igbasilẹ ohun gbogbo ti o nilo ati ṣayẹwo fun wiwa ti ohun elo rac, window ti ayaworan yoo ṣe ifilọlẹ. Ni wiwo eto ni awọn eroja mẹta:

Opa irinṣẹ, igi ati akojọ

Mo ṣe awọn akoonu ti “igi” bi o ti ṣee ṣe si ohun elo Windows boṣewa lati 1C.

Kikọ GUI kan fun 1C RAC, tabi lẹẹkansi nipa Tcl/Tk

Koodu akọkọ ti o ṣe fọọmu window yii wa ninu faili naa
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

Algoridimu fun ṣiṣẹ pẹlu eto jẹ bi atẹle:

1. Ni akọkọ, o nilo lati ṣafikun olupin iṣupọ akọkọ (ie, olupin iṣakoso iṣupọ (ni Linux, iṣakoso ti ṣe ifilọlẹ pẹlu aṣẹ “/opt/1C/v8.3/x86_64/ ras cluster —daemon”)).

Lati ṣe eyi, tẹ bọtini “+” ati ni window ti o ṣii, tẹ adirẹsi olupin ati ibudo sii:

Kikọ GUI kan fun 1C RAC, tabi lẹẹkansi nipa Tcl/Tk

Lẹhinna, olupin wa yoo han ninu igi nipa tite lori rẹ, atokọ ti awọn iṣupọ yoo ṣii tabi aṣiṣe asopọ yoo han.

2. Titẹ lori orukọ iṣupọ yoo ṣii akojọ awọn iṣẹ ti o wa fun rẹ.

3…

Ati bẹbẹ lọ, i.e. Lati ṣafikun iṣupọ tuntun, yan eyikeyi ọkan ti o wa ninu atokọ naa ki o tẹ bọtini “+” ninu ọpa irinṣẹ ati fikun ọrọ sisọ tuntun yoo han:

Kikọ GUI kan fun 1C RAC, tabi lẹẹkansi nipa Tcl/Tk

Awọn bọtini ti o wa ninu ọpa irinṣẹ ṣe awọn iṣẹ ti o da lori ọrọ-ọrọ, i.e. Ti o da lori iru ipin ti igi tabi atokọ ti yan, ọkan tabi ilana miiran yoo ṣee ṣe.

Jẹ ki a wo apẹẹrẹ ti bọtini afikun (“+”):

Koodu iran bọtini:

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

Nibi a rii pe nigbati o ba tẹ bọtini naa, ilana “Fikun-un” yoo ṣiṣẹ, koodu rẹ:

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
}

Eyi ni ọkan ninu awọn anfani ti tickle: o le kọja iye oniyipada bi orukọ ilana:

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

Iyẹn ni, fun apẹẹrẹ, ti a ba tọka si olupin akọkọ ati tẹ “+” lẹhinna ilana Fikun-un :: olupin yoo ṣe ifilọlẹ, ti o ba wa ni iṣupọ - Fikun :: iṣupọ ati bẹbẹ lọ (Emi yoo kọ nipa ibiti “awọn bọtini” pataki wa lati diẹ ni isalẹ), awọn ilana ti a ṣe akojọ fa awọn eroja ayaworan ti o yẹ si ọrọ-ọrọ.

Bi o ti le ṣe akiyesi tẹlẹ, awọn fọọmu jẹ iru ni ara - eyi kii ṣe iyalẹnu, nitori pe wọn han nipasẹ ilana kan, diẹ sii ni deede fireemu akọkọ ti fọọmu naa (window, awọn bọtini, aworan, aami), orukọ ilana naa 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
}

Awọn paramita ipe: akọle, orukọ aworan fun aami lati ile-ikawe (lib/images.tcl) ati paramita orukọ window yiyan (aiyipada .fi). Nitorinaa, ti a ba mu awọn apẹẹrẹ loke fun fifi olupin akọkọ ati iṣupọ kun, ipe yoo jẹ ni ibamu:

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

tabi

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

O dara, tẹsiwaju pẹlu awọn apẹẹrẹ wọnyi, Emi yoo ṣafihan awọn ilana ti o ṣafihan ṣafikun awọn ibaraẹnisọrọ fun olupin tabi iṣupọ.

Fikun :: olupin

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
}

Fikun :: iṣupọ

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
}

Nigbati o ba ṣe afiwe koodu ti awọn ilana wọnyi, iyatọ han si oju ihoho; Ni Tk, awọn ohun-ini ti awọn eroja ayaworan le jẹ agbekọja lakoko ipaniyan eto nipa lilo aṣayan tunto. Fun apẹẹrẹ, aṣẹ akọkọ lati ṣafihan bọtini naa:

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

Ṣugbọn ninu awọn fọọmu wa, aṣẹ naa da lori iṣẹ ṣiṣe ti o nilo:

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

Ninu apẹẹrẹ ti o wa loke, bọtini “clogged” bẹrẹ ilana fun fifi iṣupọ kan kun.

Nibi o tọ lati ṣe digression si ọna ṣiṣẹ pẹlu awọn eroja ayaworan ni Tk - fun ọpọlọpọ awọn eroja igbewọle data (titẹsi, apoti konbo, bọtini ayẹwo, ati bẹbẹ lọ) paramita kan ti ṣe afihan bi oniyipada ọrọ:

entry  $frm.ent_lifetime_limit -textvariable lifetime_limit

Oniyipada yii jẹ asọye ni aaye orukọ agbaye ati pe o ni iye ti a tẹ lọwọlọwọ ninu. Awon. Lati le gba ọrọ ti a tẹ lati aaye, o kan nilo lati ka iye ti o baamu si oniyipada (dajudaju, pese pe o ti ṣalaye nigbati o ṣẹda nkan naa).

Ọna keji fun mimu-pada sipo ọrọ ti a tẹ (fun awọn eroja ti iru titẹsi) ni lati lo aṣẹ gbigba:

.add.frm.ent_name get

Mejeji ti awọn wọnyi ọna le wa ni ti ri ninu awọn loke koodu.

Tite bọtini yii, ninu ọran yii, ṣe ifilọlẹ ilana RunCommand pẹlu laini aṣẹ ti ipilẹṣẹ fun fifi iṣupọ kan kun ni awọn ofin ti rac:

/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

Ni bayi a wa si aṣẹ akọkọ, eyiti o ṣakoso ifilọlẹ ti rac pẹlu awọn aye ti a nilo, tun ṣe atunto abajade ti awọn aṣẹ sinu awọn atokọ ati awọn ipadabọ, ti o ba nilo:

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

Lẹhin titẹ data olupin akọkọ, yoo ṣe afikun si igi, fun eyi, ninu Fikun-un: ilana olupin loke, koodu atẹle jẹ iduro:

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

Bayi, nipa tite lori orukọ olupin ti o wa ninu igi naa, a gba atokọ ti awọn iṣupọ ti a ṣakoso nipasẹ olupin yẹn, ati nipa tite lori iṣupọ kan, a gba atokọ ti awọn eroja iṣupọ (awọn olupin, infobases, ati bẹbẹ lọ). Eyi ni imuse ninu ilana TreePress (faili 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
}

Nitorinaa, Run :: olupin yoo ṣe ifilọlẹ fun olupin akọkọ (fun iṣupọ kan - Run :: iṣupọ, fun olupin ti n ṣiṣẹ - Run :: work_server, bbl). Awon. iye $ bọtini oniyipada jẹ ara awọn orukọ ti awọn igi ano pàtó kan nipa aṣayan -ninu.

Jẹ ki a san ifojusi si ilana naa

Ṣiṣe :: olupin

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

Ilana yii ṣe ilana ohun ti o gba lati ọdọ olupin nipasẹ aṣẹ RunCommand ati ṣafikun gbogbo iru awọn nkan si igi - awọn iṣupọ, ọpọlọpọ awọn eroja gbongbo (awọn ipilẹ, awọn olupin ṣiṣẹ, awọn akoko, ati bẹbẹ lọ). Ti o ba wo ni pẹkipẹki, iwọ yoo ṣe akiyesi ipe si ilana InsertItemsWorkList inu. O jẹ lilo lati ṣafikun awọn eroja si atokọ ayaworan kan nipa sisẹ iṣelọpọ ti ohun elo console rac, eyiti a ti pada tẹlẹ bi atokọ kan si oniyipada $lst. Eyi ni atokọ ti awọn atokọ ti o ni awọn orisii awọn eroja ti o yapa nipasẹ oluṣafihan.

Fun apẹẹrẹ, atokọ ti awọn asopọ iṣupọ:

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

Ni fọọmu ayaworan yoo dabi nkan bi eleyi:

Kikọ GUI kan fun 1C RAC, tabi lẹẹkansi nipa Tcl/Tk

Ilana ti o wa loke yan awọn orukọ ti awọn eroja fun akọsori ati data lati kun tabili naa:

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
}

Nibi, dipo pipaṣẹ ti o rọrun [pipin $str ":"], ti o pin okun naa si awọn eroja ti a ya sọtọ nipasẹ ":" ti o si da akojọ kan pada, a lo ikosile deede, niwon diẹ ninu awọn eroja tun ni awọn oluṣafihan.

Ilana InsertClusterItems (ọkan ninu ọpọlọpọ awọn iru bẹ) n ṣafikun atokọ ti awọn eroja ọmọde pẹlu awọn idamọ ti o baamu si igi ti eroja iṣupọ ti o nilo
Fi Awọn nkan siiCluster

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
}

O le ronu awọn aṣayan meji diẹ sii fun imuse ilana ti o jọra, nibiti yoo ti han gbangba bi o ṣe le mu ki o mu awọn aṣẹ atunwi kuro:

Ninu ilana yii, fifi kun ati ṣayẹwo ni a yanju ni ori-lori:

Fi siiBaseItems

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

Eyi ni ọna ti o pe diẹ sii:

Fi Awọn nkan Profaili sii

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

Iyatọ laarin wọn ni lilo lupu kan, ninu eyiti a ti ṣe pipaṣẹ (s) ti o tun ṣe. Iru ọna wo lati lo wa ni lakaye ti olupilẹṣẹ.

A ti bo fifi awọn eroja kun ati gbigba data pada, ni bayi o to akoko lati dojukọ ṣiṣatunṣe. Niwọn igba ti, ni ipilẹ, awọn paramita kanna ni a lo fun ṣiṣatunṣe ati ṣafikun (ayafi ti ipilẹ alaye), awọn fọọmu ibanisọrọ kanna ni a lo. Algoridimu fun awọn ilana pipe fun fifi kun dabi eyi:

Fikun :: bọtini-> FikunToplevel

Ati fun atunṣe bii eyi:

Ṣatunkọ: $ bọtini-> Fikun :: $ bọtini-> AddTopLevel

Fun apẹẹrẹ, jẹ ki a mu ṣiṣatunṣe iṣupọ kan, i.e. Lẹhin ti tẹ orukọ iṣupọ ninu igi, tẹ bọtini satunkọ ninu ọpa irinṣẹ (ikọwe) ati pe fọọmu ti o baamu yoo han loju iboju:

Kikọ GUI kan fun 1C RAC, tabi lẹẹkansi nipa Tcl/Tk
Ṣatunkọ:: iṣupọ

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

Da lori awọn asọye ninu koodu naa, ni ipilẹ, ohun gbogbo jẹ kedere, ayafi pe koodu oluṣakoso bọtini ti bori ati pe ilana FormFieldsDataInsert wa ti o kun awọn aaye pẹlu data ati bẹrẹ awọn oniyipada:

Fi sii FormFieldsData

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

Ninu ilana yii, anfani miiran ti tcl dada - awọn iye ti awọn oniyipada miiran ti rọpo bi awọn orukọ oniyipada. Awon. lati ṣe adaṣe awọn kikun ti awọn fọọmu ati ibẹrẹ ti awọn oniyipada, awọn orukọ ti awọn aaye ati awọn oniyipada ni ibamu si awọn iyipada laini aṣẹ ti ohun elo rac ati awọn orukọ ti awọn aye igbejade pipaṣẹ pẹlu iyatọ diẹ - daaṣi naa rọpo nipasẹ isunmọ. Fun apẹẹrẹ eto-ise-ki ibaamu aaye ent_scheduled_jobs_de ati oniyipada siseto_jobs_de.

Awọn fọọmu fun fifi kun ati ṣiṣatunṣe le yatọ ni akojọpọ awọn aaye, fun apẹẹrẹ, ṣiṣẹ pẹlu ipilẹ alaye:

Fifi aabo alaye

Kikọ GUI kan fun 1C RAC, tabi lẹẹkansi nipa Tcl/Tk

Aabo alaye ṣiṣatunkọ

Kikọ GUI kan fun 1C RAC, tabi lẹẹkansi nipa Tcl/Tk

Ninu ilana atunṣe Ṣatunkọ :: infobase, awọn aaye ti a beere ni a fi kun si fọọmu naa;

Nipa afiwe, awọn ilana fun fifi kun, ṣiṣatunṣe, piparẹ ati fun awọn eroja miiran ti wa ni imuse.

Niwọn igba ti iṣiṣẹ ti IwUlO tumọ si nọmba ailopin ti awọn olupin, awọn iṣupọ, awọn ipilẹ alaye, ati bẹbẹ lọ, lati pinnu iru iṣupọ ti o jẹ ti olupin tabi eto aabo alaye, ọpọlọpọ awọn oniyipada agbaye ti ṣafihan, awọn idiyele eyiti a ṣeto ọkọọkan. akoko ti o tẹ lori awọn eroja ti awọn igi. Awon. Ilana naa n ṣiṣẹ leralera nipasẹ gbogbo awọn eroja obi ati ṣeto awọn oniyipada:

ṢetoGlobalVarFromTreeItems

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

Iṣupọ 1C gba ọ laaye lati ṣiṣẹ pẹlu tabi laisi aṣẹ. Oriṣiriṣi awọn alabojuto meji lo wa—oluṣakoso aṣoju iṣupọ ati alabojuto iṣupọ. Nitorinaa, fun iṣẹ ṣiṣe ti o pe, awọn oniyipada agbaye 4 diẹ sii ni a ṣafihan ti o ni iwọle alabojuto ati ọrọ igbaniwọle. Awon. ti akọọlẹ alakoso ba wa ninu iṣupọ, ọrọ sisọ kan yoo han lati tẹ iwọle ati ọrọ igbaniwọle rẹ sii, data naa yoo wa ni fipamọ ni iranti ati fi sii sinu aṣẹ kọọkan fun iṣupọ ti o baamu.

Eyi jẹ ojuṣe ti ilana mimu aṣiṣe.

AṣiṣeParcing

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

Awon. da lori ohun ti aṣẹ naa yoo pada, iṣesi yoo jẹ ni ibamu.

Ni akoko yii, nipa 95 ida ọgọrun ti iṣẹ ṣiṣe, gbogbo ohun ti o ku ni lati ṣe iṣẹ pẹlu awọn profaili aabo ati idanwo rẹ =). Gbogbo ẹ niyẹn. Mo gafara fun awọn crumpled itan.

Awọn koodu ti wa ni asa wa nibi.

Imudojuiwọn: Mo pari ṣiṣẹ pẹlu awọn profaili aabo. Bayi iṣẹ-ṣiṣe ti wa ni imuse 100%.

Imudojuiwọn 2: isọdi si Gẹẹsi ati Russian ti ṣafikun, iṣẹ ni win7 ti ni idanwo
Kikọ GUI kan fun 1C RAC, tabi lẹẹkansi nipa Tcl/Tk

orisun: www.habr.com

Fi ọrọìwòye kun