'https://www.rastrwin.ru/rastr/macro/gui.php 
Dim html_PI , ExitDo , pi_IE, IE_ON , setTrans , TDB , TRANS

'Указать полный путь к файлу Панель инструментов HTML.html
html_path = "path_html"

const GREY   = 8421504   ' серый
const GREEN  = 32768     ' зеленый
const BLUE   = 16744448  ' голубой
const VIOLET = 16711808  ' фиолетовый
set TDB = Rastr.Tables("ATtrans_DB")
set TRANS = Rastr.Tables("ATtrans")

IE_ON = 1' 1 задание через IE, 0  - тут

if IE_ON = 1 then
    ' добавить ПС
    setTrans = ""
    For i=0 to TDB.Count-1 
        if TDB.cols("U_mid").Z(i) > 0 then
            if TDB.cols("Type").Z(i) = 5 then '"АТ однофазн."
                setTrans = setTrans + "<a id = "+ cstr(i) +" Onclick = vibor_list(" + cstr(i) +")> "  +  TDB.cols("Brand").ZS(i) + " [" + cstr(TDB.cols("Snom").Z(i)*3) +"/"+ cstr(fuhom (sqr(3)*TDB.cols("U_high").Z(i))) +"/"+ cstr(fuhom (sqr(3)*TDB.cols("U_mid").Z(i)))+"/"+  cstr(fuhom (TDB.cols("U_low").Z(i))) +  "] </a>"
            else
                setTrans = setTrans + "<a id = "+ cstr(i) +" Onclick = vibor_list(" + cstr(i) +")> "  +  TDB.cols("Brand").ZS(i) + " [" + TDB.cols("Snom").ZS(i) +"/"+ cstr(fuhom (TDB.cols("U_high").Z(i))) +"/"+ cstr(fuhom (TDB.cols("U_mid").Z(i)))+"/"+  cstr(fuhom (TDB.cols("U_low").Z(i))) +  "] </a>"
            end if 
        else
            setTrans = setTrans + "<a id = "+ cstr(i) +" Onclick = vibor_list(" + cstr(i) +")> "  +  TDB.cols("Brand").ZS(i) + " [" + TDB.cols("Snom").ZS(i) +"/"+ cstr(fuhom (TDB.cols("U_high").Z(i))) +"/"+  cstr(fuhom (TDB.cols("U_low").Z(i))) +  "] </a>"
        end if
    Next

    html_PI = Conv_str_html (html_path)
    SET pi_IE = CreateObjectEx("InternetExplorer.Application","g_IE_")
    r=setlocale("en-us")
    ExitDo = FALSE
    'Настройки
    pi_IE.TheaterMode = FALSE
    pi_IE.Left      = 5   'коррдината верхнего левого угла окна IEx
    pi_IE.Top       = 150   'координата верха окна IE
    pi_IE.Height    = 350   'высота окна IE
    pi_IE.Width     = 500   'ширина окна IE
    pi_IE.MenuBar   = FALSE 'без меню IE    FALSE
    pi_IE.ToolBar   = FALSE 'без тулбара IE
    pi_IE.StatusBar = FALSE 'без строки состояния IE
    pi_IE.Navigate  "about:blank"	'пустая страница
    DO WHILE ( pi_IE.Busy )    'выжидаем пока IE не освободится
        SLEEP 100
    LOOP
    pi_IE.Document.write ( html_PI )	'загрузка динамич. страницы
    pi_IE.document.body.onunload = GetRef("Html_OnUnload")	' присвоить body.onunload  событие Html_OnUnload
    pi_IE.document.form_GL.sel00.onclick = GetRef("SEL0")
    pi_IE.document.form_txt_izm.run_txt_izm.onclick = GetRef("zamena_txt_zad")
    pi_IE.document.form_sel00_vibor.run_sel00_vibor.onclick = GetRef("SEL0_vibor")
    pi_IE.document.form_del.run_del_node.onclick = GetRef("sel_del_run")
    pi_IE.document.form_gr_cor.run_gr_cor.onclick = GetRef("grup_cor_html")
    pi_IE.document.form_add_node.run_add_node.onclick = GetRef("add_node2_run")
    pi_IE.document.form_nga.run_nga.onclick = GetRef("nga_run")
    
    pi_IE.document.form_add_ps.run_add_ps.onclick = GetRef("PC_add")
    
    pi_IE.document.form_GL.vkl_okna.onclick = GetRef("vkl_okna")
    pi_IE.document.form_GL.lep.onclick = GetRef("main_LEP")
    pi_IE.document.form_GL.add_node_in_vetv.onclick = GetRef("add_node_in_vetv_run")
    pi_IE.document.form_graf.run_graf.onclick = GetRef("grafik_setting_run")


    pi_IE.Document.Script.setTrans2 = setTrans
    pi_IE.Document.Script.trans_add()
    pi_IE.Visible = True	'показать IE и выполнить действия на форме
    pi_IE.document.parentWindow.focus()
    'завершаем работу с IE
    Do ' ожидание закрытия окна IE
        Sleep 1000
    Loop Until ExitDo
    SET pi_IE=NOTHING
else
    call PC_add ()
end if
Sub CloseHtml
    pi_IE.Quit()
    ExitDo = True
End Sub
Sub Html_OnUnload
    ExitDo = True
End Sub
SUB g_IE_Quit(a) ' без этого окно IE  не закрывается, не понятно кто ее вызывает
	ExitDo = True
END SUB

function Conv_str_html ( html_path )'возвращает html как строку
    dim file_html , Str2Convert
	SET fso = CreateObject("Scripting.FileSystemObject")
	SET file_html  = fso.OpenTextFile( html_path,     1, False )
	DO WHILE file_html.AtEndOfStream <> TRUE
		Str2Convert    = file_html.ReadLine()
        Conv_str_html = Conv_str_html + Str2Convert+ vbCrLf
	LOOP
	file_html.Close
END function
'////////////////////////////////////SEL0 /////////////////////////////////////////////////////////////////////////
    Sub SEL0 ()           ' снять выделение узлов и ветвей  и генераторов
        set  tVetv1 = rastr.tables("vetv")
        set  tNode1 = rastr.tables("node")
        set  tGen1 = rastr.tables("Generator")
        call tNode1.SetSel ("")
        call tNode1.Cols("sel").Calc("0")
        call tVetv1.SetSel ("")
        call tVetv1.Cols("sel").Calc("0")
        call tGen1.SetSel ("")
        call tGen1.Cols("sel").Calc("0")
    End Sub

    Sub SEL0_vibor ()           ' снять выделение узлов и ветвей  и генераторов
        set  tVetv1 = rastr.tables("vetv")
        set  tNode1 = rastr.tables("node")
        set  tGen1 = rastr.tables("Generator")

        if pi_IE.Document.form_sel00_vibor.CB_sel_node.checked then call tNode1.Cols("sel").Calc("0")
        if pi_IE.Document.form_sel00_vibor.CB_sel_vetv.checked then call tVetv1.Cols("sel").Calc("0")
        if pi_IE.Document.form_sel00_vibor.CB_sel_gen.checked then call tGen1.Cols("sel").Calc("0")

        if pi_IE.Document.form_sel00_vibor.CB_Kontrol_node.checked and tNode1.cols.find ("Kontrol")> 0 then call tNode1.Cols("Kontrol").Calc("0")
        if pi_IE.Document.form_sel00_vibor.CB_otkl1_node.checked   and tNode1.cols.find ("otkl1")  > 0 then call tNode1.Cols("otkl1").Calc("0")
        if pi_IE.Document.form_sel00_vibor.CB_otkl2_node.checked   and tNode1.cols.find ("otkl2")  > 0 then call tNode1.Cols("otkl2").Calc("0")
        if pi_IE.Document.form_sel00_vibor.CB_otkl3_node.checked   and tNode1.cols.find ("otkl3")  > 0 then call tNode1.Cols("otkl3").Calc("0")

        if pi_IE.Document.form_sel00_vibor.CB_Kontrol_vetv.checked and tVetv1.cols.find ("Kontrol")> 0 then call tVetv1.Cols("Kontrol").Calc("0")
        if pi_IE.Document.form_sel00_vibor.CB_otkl1_vetv.checked   and tVetv1.cols.find ("otkl1")  > 0 then call tVetv1.Cols("otkl1").Calc("0")
        if pi_IE.Document.form_sel00_vibor.CB_otkl2_vetv.checked   and tVetv1.cols.find ("otkl2")  > 0 then call tVetv1.Cols("otkl2").Calc("0")
        if pi_IE.Document.form_sel00_vibor.CB_otkl3_vetv.checked   and tVetv1.cols.find ("otkl3")  > 0 then call tVetv1.Cols("otkl3").Calc("0")
    End Sub
'////////////////////////////////////групп корр /////////////////////////////////////////////////////////////////////////
    Sub grup_cor_html () ' (tabl,param,viborka,formula)' групповая коррекция (таблица, параметр корр, выборка, формула для расчета параметра)
        if rastr.tables.find(pi_IE.Document.form_gr_cor.tabl.value) < 0 then r_print( "!!!!!!!!!!!ВНИМАНИЕ ОШИБКА! в rastr не загружена таблица " &  pi_IE.Document.form_gr_cor.tabl.value & " !!!!!!!!!!!") : exit sub

        Set ptabl = Rastr.Tables(pi_IE.Document.form_gr_cor.tabl.value)
        if ptabl.cols.find(pi_IE.Document.form_gr_cor.par.value) < 0 then r_print( "!!!!!!!!!!!ВНИМАНИЕ ОШИБКА! в таблице " &  pi_IE.Document.form_gr_cor.tabl.value & " нет параметра " & pi_IE.Document.form_gr_cor.par.value  & "!!!!!!!!!!!") : exit sub
        Set pparam = ptabl.cols(pi_IE.Document.form_gr_cor.par.value)
        call ptabl.SetSel(pi_IE.Document.form_gr_cor.vibor.value)
        call pparam.Calc(pi_IE.Document.form_gr_cor.val.value)
    end Sub
'////////////////////////////////////добавить 2 узел /////////////////////////////////////////////////////////////////////////
    SUB add_node2_run ()
        if IE_ON = 0 then 
            ny_star = Rastr.SendCommandMain (8,"Введите номер узла (0-sel):","0",0) 
            ny_new = Rastr.SendCommandMain (8,"Номер нового узла будет следующий свободный после (указать номер, или -1 - после текущего ,-2 после максимального):","-1",0) 
            call add_node_zad (ny_star , ny_new , false , true , "2,4,6,8"  , true , false , false, false )
        else  
            call add_node_zad (pi_IE.Document.form_add_node.vibor_node1.value _ 
                             , pi_IE.Document.form_add_node.vibor_node2.value _ 
                             , pi_IE.Document.form_add_node.CB_name.Checked _ 
                             , pi_IE.Document.form_add_node.CB_vet.Checked _ 
                             , pi_IE.Document.form_add_node.vibor_np.value _ 
                             , pi_IE.Document.form_add_node.CB_kopy.Checked _ 
                             , pi_IE.Document.form_add_node.CB_ku.Checked _ 
                             , pi_IE.Document.form_add_node.CB_gen.Checked _
                             , pi_IE.Document.form_add_node.CB_x0.Checked  )
        end if  
    end Sub

    sub add_node_zad ( ny_star , ny_new , add_name , vetv_new , vetv_new_n  , add_na , perenos_skrm , perenos_gen , r0x0y) ' к отмеченным узлам присоединить новый узел через выключатель и перенести верви с np=2,4,6
        dim tN , tV , tG , ndx_tN , tip ,  uhom , name , vetv_new_nm

        set tV = rastr.tables("vetv") 
        set tN = rastr.tables("node")
        set tG = rastr.tables("Generator")
        Rastr.LockEvent = True

        if isnumeric (ny_star) then
            if cdbl (ny_star) = 0 then
                tN.setsel ("sel")
                ndx_tN = tN.FindNextSel(-1)

                if tN.count <> 1 then msgbox "Количество отмеченных узлов: " & cstr(tN.count) & ", должно быть 1" :Rastr.LockEvent = False: exit sub
                ny_star =  tN.cols("ny").z (ndx_tN)
                'tN.cols("sel").z (ndx_tN) = 0
            else
                ny_star =  cdbl(ny_star)
                ndx_tN =  fNDX("node",ny_star)
                if ndx_tN = -1 then msgbox "номер исходного узла не найден - " & cstr(ny_star)  :Rastr.LockEvent = False: exit sub
            end if
        else
            msgbox "номер исходного узла: нужно вводить число!" :Rastr.LockEvent = False: exit sub
        end if

        if not isnumeric (ny_new) then msgbox "Введите номер нового узла: нужно вводить число!" :Rastr.LockEvent = False: exit sub else ny_new = cdbl(ny_new)
        if ny_new = -1 then ny_new = cdbl(ny_star) ' после текущего
        if ny_new = -2 then ny_new = Rastr.Calc("max","node","ny","ny>0" )' после максимального
        
        'Rastr.LogEnable = 1 ' 0 откл
        Rastr.RenumWP=True
        uhom = tN.Cols("uhom").z (ndx_tN)
        if add_name then name = "2сш " & uhom & " кВ " & tN.Cols("name").z (ndx_tN)  else name = ""
        if add_name then tN.Cols("name").z (ndx_tN) = "1сш " & uhom & " кВ " & tN.Cols("name").z (ndx_tN) 

        if add_na then 
            ny_new = fNode_add (name , tN.Cols("na").z (ndx_tN) , tN.Cols("npa").z (ndx_tN) , tN.Cols("nga").z (ndx_tN), uhom, ny_new-1)
        else
            ny_new = fNode_add (name , 0 , 0 , 0, uhom, ny_new-1)
        end if

        ndx_vetv = fVetv_add_ndx ( "", ny_star, ny_new , 0 , 0, 0 , 0) '(dname , ip , iq , np ) ' добавить ветвь и вернуть ndx "ШСВ " & uhom & " кВ " & tN.Cols("name").z (ndx_tN)

        if r0x0y then
            tV.cols("ktr").z(ndx_vetv) = 1
            if rastr.tables("vetv").cols.find("x0")>-1 then tV.cols("x0").z(ndx_vetv) = 130
            if rastr.tables("vetv").cols.find("r0")>-1 then tV.cols("r0").z(ndx_vetv) = 3
            if rastr.tables("node").cols.find("tip0")>-1 then tN.cols("tip0").z(fNDX("node",ny_new)) = 0
        end if

        if vetv_new then
            vetv_new_nm = "np=" & Replace(vetv_new_n , ",", "|np=") 
            tV.Setsel ("(ip=" & cstr(ny_star) & "|iq=" & cstr(ny_star) & ")&(" & vetv_new_nm & ")")               'ВЕТВИ
            ndx_tV = tV.FindNextSel(-1) 
            while ndx_tV >= 0 '
                'Rastr.LockEvent = True
                if ny_star = tV.Cols("ip").z (ndx_tV) then kor  f_kkluch ("vetv", ndx_tV) , "ip=" &  cstr(ny_new)
                if ny_star = tV.Cols("iq").z (ndx_tV) then kor  f_kkluch ("vetv", ndx_tV) , "iq=" &  cstr(ny_new)
                ndx_tV = tV.FindNextSel(ndx_tV)
                'Rastr.SendChangeData HINTR_CHANGE_ALL,"","",0  ' обновить содержимое открытых окон  
                'Rastr.LockEvent = False
            wend
        end if

        if perenos_skrm then 
            tN.Cols("bsh").z (fNDX("node",ny_new)) = tN.Cols("bsh").z (ndx_tN)  : tN.Cols("bsh").z (ndx_tN) = 0
            tN.Cols("vzd").z (fNDX("node",ny_new)) = tN.Cols("vzd").z (ndx_tN)  : tN.Cols("vzd").z (ndx_tN) = 0
            tN.Cols("qmax").z (fNDX("node",ny_new)) = tN.Cols("qmax").z (ndx_tN)  : tN.Cols("qmax").z (ndx_tN) = 0
            tN.Cols("qmin").z (fNDX("node",ny_new)) = tN.Cols("qmin").z (ndx_tN)  : tN.Cols("qmin").z (ndx_tN) = 0
        end if

        if perenos_gen then 
            call tG.setsel ("Node=" & cstr (ny_star))
            call tG.cols ("Node").calc (ny_new)
            tN.Cols("pg").z (fNDX("node",ny_star)) = 0
            tN.Cols("qg").z (fNDX("node",ny_star)) = 0
            tN.Cols("qmax").z (fNDX("node",ny_star)) = 0
            tN.Cols("qmin").z (fNDX("node",ny_star)) = 0
        end if        
  
        Rastr.SendChangeData HINTR_CHANGE_ALL,"","",0  ' обновить содержимое открытых окон  
        Rastr.RenumWP=false
        Rastr.LockEvent = False
        'Rastr.LogEnable = 0
    end Sub

    function fNode_add (name , na , npa , nga , uhom , ny ) ' добавить узел и вернуть номер (следующий свободный после заданного ny)
        
        set tN_fNode_add = rastr.tables("node")
        Rastr.LockEvent = True
        tN_fNode_add.AddRow
        Rastr.SendChangeData HINTR_CHANGE_ALL,"","",0  ' обновить содержимое открытых окон  
        Rastr.LockEvent = false
        'fNode_add = fTabParamMax ("node"  , "ny" ) + 1
        fNode_add = fNy_next ( ny )
        tN_fNode_add.cols("ny").z ( tN_fNode_add.size - 1) = fNode_add
        tN_fNode_add.cols("name").z ( tN_fNode_add.size - 1) = name
        tN_fNode_add.cols("na").z ( tN_fNode_add.size - 1) = na
        tN_fNode_add.cols("npa").z ( tN_fNode_add.size - 1) = npa
        tN_fNode_add.cols("nga").z ( tN_fNode_add.size - 1) = nga
        tN_fNode_add.cols("uhom").z ( tN_fNode_add.size - 1) = uhom
        
    end function

    function fVetv_add_ndx (dname , ip , iq , np , r , x , b) ' добавить ветвь и вернуть ndx

        set tV_fVetv_add = rastr.tables("vetv")
        Rastr.LockEvent = True
        tV_fVetv_add.AddRow
        Rastr.SendChangeData HINTR_CHANGE_ALL,"","",0  ' обновить содержимое открытых окон  
        Rastr.LockEvent = false
        fVetv_add_ndx = tV_fVetv_add.size - 1
        
        tV_fVetv_add.cols("dname").z ( fVetv_add_ndx) = dname
        tV_fVetv_add.cols("ip").z ( fVetv_add_ndx) = ip
        tV_fVetv_add.cols("iq").z ( fVetv_add_ndx) = iq
        tV_fVetv_add.cols("np").z ( fVetv_add_ndx) = np
        tV_fVetv_add.cols("r").z ( fVetv_add_ndx) = r
        tV_fVetv_add.cols("x").z ( fVetv_add_ndx) = x
        tV_fVetv_add.cols("b").z ( fVetv_add_ndx) = b
            
    end function

    function f_kkluch (tabl,fndx)'возвращает краткий ключ  (таблица, номер строки)

        Set tTabl	 = Rastr.Tables(tabl)
        if tabl = "node" then f_kkluch = tTabl.cols("ny").zs(fndx)
        if tabl = "vetv" then f_kkluch = tTabl.cols("ip").zs(fndx) & "," & tTabl.cols("iq").zs(fndx) & "," & tTabl.cols("np").zs(fndx)

    end function

    Sub kor  (kkluch , zadanie )' коррекция узла , например kor "125" , "pn=10" для узла, "g,125" , "Pmax=10" для ген

        dim zadanie_m, z , kkluch_m ' _m массив

        kkluch_m = split (kkluch , ",")
        zadanie_m = split (zadanie  , "=")

        if ubound (kkluch_m) = 0 then ' УЗЕЛ
            if IsNumeric (zadanie_m(1)) then grup_cor_Sub "node",zadanie_m(0),"ny=" & cstr (kkluch), cstr (zadanie_m(1)) ' (таблица, параметр корр, выборка, формула для расчета параметра)
            if not IsNumeric (zadanie_m(1)) then kor_sub "node",zadanie_m(0),"ny=" & cstr (kkluch), cstr (zadanie_m(1)) ' (таблица, параметр корр, выборка, формула для расчета параметра)
        elseif ubound (kkluch_m) = 2 then ' Ветвь
            if IsNumeric (zadanie_m(1)) then grup_cor_Sub "vetv",zadanie_m(0),"ip=" & kkluch_m(0) & "&iq="& kkluch_m(1) & "&np="& kkluch_m(2) ,cstr (zadanie_m(1)) 
            if not IsNumeric (zadanie_m(1)) then kor_sub "vetv",zadanie_m(0),"ip=" & kkluch_m(0) & "&iq="& kkluch_m(1) & "&np="& kkluch_m(2) ,cstr (zadanie_m(1)) 
        elseif ubound (kkluch_m) = 1 then ' генератор или что то еще
            if z_test (0) = "g" then ' генератор
                if IsNumeric (zadanie_m(1)) then grup_cor_Sub "Generator" , zadanie_m(0) , "Num=" & cstr (kkluch_m(1)), cstr (zadanie_m(1)) 
                if not IsNumeric (zadanie_m(1)) then kor_sub "Generator" , zadanie_m(0) , "Num=" & cstr (kkluch_m(1)), cstr (zadanie_m(1)) 
            end if
        end if

    end Sub

    Sub grup_cor_Sub  (tabl,param,viborka,formula)' групповая коррекция (таблица, параметр корр, выборка, формула для расчета параметра)

        Set ptabl = Rastr.Tables(tabl)
        Set pparam = ptabl.cols(param)
        ptabl.SetSel(viborka)
        pparam.Calc(formula)

    end Sub

    Sub kor_sub  (tabl,param,viborka,formula)' коррекция одного уникальнгого занчения(таблица, параметр корр, выборка, формула для расчета параметра)

        Set ptabl = Rastr.Tables(tabl)
        Set pparam = ptabl.cols(param)
        ptabl.SetSel(viborka)
        ndx = ptabl.FindNextSel(-1)
        pparam.z (ndx) = formula

    end Sub

    function fNy_next ( ny )  ' возвращает следующий следующий свободный после заданного ny
        Set Dict_ny = CreateObject("Scripting.Dictionary")' колекция транзитов ny
        Dict_unik_value_sub "node" , "ny" , "" , Dict_ny
        fNy_next = ny + 1
        while Dict_ny.Exists ( fNy_next )' пока истина 
            fNy_next = fNy_next + 1
        wend  
    end function

    sub Dict_unik_value_sub (tabl , param , vibor , Dict_unik_value )' (нр "vetv","tranzit","sel",dict) наполняет Dictionary  уникальными значениями столбца таблицы
        On Error Resume Next
        Dict_unik_value.RemoveAll
        Set tTabl = Rastr.Tables( tabl )
        Set tParam = tTabl.Cols( param )
        
        tTabl.SetSel vibor
        ndx_tTabl = tTabl.FindNextSel(-1)
        while ndx_tTabl >= 0 ' 
            Dict_kluch = tParam.z (ndx_tTabl)
            'if not Dict_unik_value.Exists ( Dict_kluch ) and Dict_kluch > 0 then    ' Exists проверяет наличие ключа
            if not Dict_unik_value.Exists ( Dict_kluch ) then    ' Exists проверяет наличие ключа
                Dict_unik_value.Add Dict_kluch , tabl & " / " & param
            end if
            ndx_tTabl = tTabl.FindNextSel(ndx_tTabl)
        wend  
    end sub
        
    function fNDX(tabl,kkluch)'возвращает номер строки (таблица, краткий ключ)
        On Error Resume Next
        Set tTabl	 = Rastr.Tables(tabl)
        if tabl = "node" then
            tTabl.Setsel ("ny=" &  kkluch)
        elseif tabl = "vetv" then
            kkluchM = split(kkluch, ",")
            tTabl.Setsel ("ip=" &  kkluchM (0)  & "&iq=" &  kkluchM (1) & "&np=" &  kkluchM (2))
        elseif tabl = "area" then
            tTabl.Setsel ("na=" &  kkluch)
        elseif tabl = "ngroup" then
            tTabl.Setsel ("nga=" &  kkluch)
        elseif tabl = "Generator" then
            tTabl.Setsel ("Num=" &  kkluch)
        end if
        
        fNDX = tTabl.FindNextSel(-1)
        if fNDX = -1 then r_print "fNDX в таблице " & tabl &  " не найдено "  + kkluch
    end function
'////////////////////////////////////добавить nga /////////////////////////////////////////////////////////////////////////
      sub nga_run ()
        if IE_ON = 0 then 
            call nga_add ("sel" , "", "")
        else  
            call nga_add (pi_IE.Document.form_nga.In_vibor_node.value _
                        , pi_IE.Document.form_nga.name_nga.value _
                        , pi_IE.Document.form_nga.num_nga.value )
        end if            
    end sub

    sub nga_add (vibor , name_nga, n_nga) ' добавить новую нагрузочную группу для отмеченных узлов("выборка", 0 нет 1 выкл добавить)
        'Rastr.LockEvent = True
        'Rastr.LogEnable = 1 ' 0 откл
        dim tN ,  ndx_tN
        set tN = rastr.tables("node")
        if name_nga = "" then
            tN.Setsel (vibor)  
            ndx_tN =  tN.FindNextSel(-1) 
            while ndx_tN >= 0 '
                name_nga = tN.Cols("name").zs (ndx_tN) & ", "&  name_nga 
                ndx_tN = tN.FindNextSel(ndx_tN)
            wend
        end if

        if n_nga = "" or (not isnumeric(n_nga) ) then 
            n_nga = fNGA_ADD ( name_nga , 0)   
        else 
            n_nga = fNGA_ADD ( name_nga , cdbl (n_nga)) 
        end if

        tN.Setsel (vibor)   
        ndx_tN =  tN.FindNextSel(-1) 
        while ndx_tN >= 0 '
            tN.Cols("nga").z (ndx_tN) = n_nga
            tN.Cols("sel").z (ndx_tN) = 0
            ndx_tN = tN.FindNextSel(ndx_tN)
        wend

        Rastr.rgm("")
        ' Rastr.RenumWP=false
        'Rastr.LockEvent = False
        'Rastr.LogEnable = 0
    end Sub

    function fNGA_ADD (name_nga , n_nga)' добавить нагрузочную группу и вернуть ее номер (имя  , номер или 0 - выбрать максимальный + 1) если номер группы уже сущ то не добавлять
        dim add_nga
        fNGA_ADD = n_nga
        Set tNGA	 = Rastr.Tables("ngroup")
        add_nga = 0 ' если 1 то добавить строку
        if n_nga = 0 then ' если 
            add_nga = 1
            fNGA_ADD = fTabParamMax ("ngroup"  , "nga" ) + 1
        else
            tNGA.setsel "nga=" & cstr(n_nga)
            if tNGA.count = 0 then   add_nga = 1 : fNGA_ADD = n_nga
        end if

        if add_nga = 1 then 
            tNGA.AddRow 
            tNGA.cols("nga").z ( tNGA.size - 1) = fNGA_ADD
            tNGA.cols("name").z ( tNGA.size - 1) = name_nga
        end if
    end function
'////////////////////////////////////добавить ПС ////////////////////////////////////////////////////////////////////////
    dim BDO_marka , BDO_S  , BDO_metka, BDO_UB   , BDO_UC  , BDO_UN  , trans_str
    dim BDO_Rv , BDO_Xv , BDO_Rc , BDO_Xc , BDO_Rn , BDO_Xn , BDO_Iv , BDO_Ic , BDO_In , BDO_Ioo , BDO_g  , BDO_b
    dim gr_nod1 , x_base , y_base
    'PC_add'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    ' сохранить файл трансформаторы при необходимости
    ' в таблицу graphikIT добавляются зависимости с номерами 2000-2003(перезаписываются если уже есть)
    '   для трансформаторов старше 30 лет ддтн Nzav, адтн - Nzav+2, меньше 30 лет ддтн Nzav+1, адтн Nzav+3 
    sub PC_add () ' к отмеченному узлу присоединить ПС 
        dim tN , tV , ndx_node_zad ,  status_calc_tr , ny_zad, ny_new_zad , add_vikl
        Rastr.LockEvent = True
        status_calc_tr =  Rastr.Tables("com_regim").Cols("calc_tr").Z(0)
        if not status_calc_tr = 1 then Rastr.Tables("com_regim").Cols("calc_tr").Z(0) = 1    ' если настройка пересчет АТ выключена то она была отключится на время выполнения макроса

        set tV = rastr.tables("vetv") 
        set tN = rastr.tables("node")
      
        if  IE_ON = 1  then ' ЗАДАНИЕ ie
            trans_str= pi_IE.Document.Script.nBD_trans_list
            ny_zad = pi_IE.document.form_add_ps.ny_nachala.value
            ny_new_zad = pi_IE.document.form_add_ps.vibor_new_node.value
            add_vikl = pi_IE.document.form_add_ps.CB_vikl_add.Checked
            add_IT = pi_IE.document.form_add_ps.CB_IT.checked
            IT_nach = pi_IE.document.form_add_ps.IT_nachala.value
            if add_IT then call graphikIT_trans (IT_nach)
            GR_add = pi_IE.document.form_add_ps.CB_GR.Checked ' добавить трансформаторы на графику
        else
            trans_str = "75*1"'     '  "75*1,76*2" номер тр в БД * кол
            ny_zad =  2569
            ny_new_zad = -2 ' если номер занят то выберается следующий свободный после указанного (-1 - исходного ,-2 максимального)
            add_vikl = true
            add_IT = false ' добавить зависимость ДТН, начиная с
            IT_nach = 2000
            GR_add = false ' добавить трансформаторы на графику
        end if
        rastr.Printp trans_str


        if ny_zad = 0 then
            tN.setsel ("sel")
            ndx_node_zad = tN.FindNextSel(-1)
            if tN.count <> 1 then msgbox "количество отмеченных узлов: " + cstr(tN.count) + ", должно быть 1" :Rastr.LockEvent = False: exit sub
            ny_zad =  tN.cols("ny").z (ndx_node_zad)    
            tN.cols("sel").z (ndx_node_zad) = 0
        else
            ndx_node_zad =  fNDX("node", cdbl ( ny_zad ))
            if ndx_node_zad = -1 then msgbox "узел не найден: " + cstr(ny_zad)  :Rastr.LockEvent = False: exit sub
        end if

        'msgbox "Незабудьте загрыть графику"
        set arPS      = new PS ' СОЗДАТЬ НОВЫЙ ЭЛЕМЕНТ КЛАССА ПОДСТАНЦИИ
        arPS.name     = tN.cols("name").zs(ndx_node_zad)
        arPS.na       = tN.cols("na").z(ndx_node_zad)
        arPS.npa      = tN.cols("npa").z(ndx_node_zad)
        arPS.nga      = tN.cols("nga").z(ndx_node_zad)
        arPS.ny_baze  = ny_zad
        if isempty(trans_str) or isempty(ny_zad) then Rastr.LockEvent = false : exit sub

        trans_str_m =  split (trans_str , "," )
        'матрица трансформатора (узлы ветви) 
        ' трехобмоточных        ny     Unom_seti   Unom_tr
        '1 ny B                  zzzzzzzzzzzzzzzzzzzzzzzzzz
        '2 ny C средняя точка
        '3 ny N1                 zzzzzzzzzzzzzzzzzzzzzzzzzz
        '4 ny N2                 zzzzzzzzzzzzzzzzzzzzzzzzzz
        'двухобмоточных 
        '1 ny B                  zzzzzzzzzzzzzzzzzzzzzzzzzz
        '2 ny N
        np_gl = 1 ' np-номер паралельности
        groupid_gl = fTabParamMax ("vetv"  , "groupid") + 1   ' groupid
        if ny_new_zad = -2 then  ny_zad =  fTabParamMax ("node"  , "ny")   'если номер занят то выберается следующий свободный после указанного (-1 - исходного ,-2 максимального)
        if ny_new_zad >= 0 then  ny_zad =  ny_new_zad 
        for i = 0 to ubound (trans_str_m) ' цикл по трансформаторам - задать параметры 
            if not trans_str_m(i) = "" then
                count_trans = 1
                if instr(trans_str_m(i), "@")> 0 then 
                    trans_str_m(i) = replace (trans_str_m(i) ,"@" ,"")
                    trans_star =true  ' true - значить старый, больше 30 лет
                else
                    trans_star = false ' true - значить старый, больше 30 лет
                end if                
                if instr(trans_str_m(i), "*")> 0 then 
                    count_trans = cdbl( mid(trans_str_m(i),instr(trans_str_m(i),"*")+1) ) ' количество трансфорсвторов
                    ndx_BDO = cdbl( mid(trans_str_m(i),1, instr(trans_str_m(i),"*")-1)  )
                end if
                
                rastr.Printp count_trans
                rastr.Printp ndx_BDO
                
                for nnn = 1 to count_trans
                    set TR_tek = new TR  
                    with TR_tek
                        .N_row_BDO = ndx_BDO
                        .Id_BDO = TDB.cols("Id").ZS(ndx_BDO)
                        .star = trans_star
                        .Type1 = TDB.cols("Type").Z(ndx_BDO)
                        if .Type1 = 5 then .f1 = true  ' "АТ однофазн."

                        if TDB.cols("U_mid").Z(ndx_BDO) > 0 or .Type1 = 3 then '"2х-обм-расщ"
                            .count_O   = 3 ' кол обмоток
                            .node_count = 4' кол узлов
                        else
                            .count_O   = 2 
                            .node_count = 2
                        end if
                        .groupid = groupid_gl
                        .np      = np_gl        
                        .vid_tr = "Т"            
                        if  .Type1 = 0 or .Type1 = 4 then .vid_tr = "АТ"  
                        if  .Type1 = 5 then  .vid_tr = "АТГ"  
                        .dname_tr = cstr (np_gl) &.vid_tr &"-" &  TDB.cols("Snom").ZS(ndx_BDO)  ' 1АТ-25
                        if  .Type1 = 5 then  .dname_tr = cstr (np_gl) &.vid_tr &"-" &  cstr(TDB.cols("Snom").ZS(ndx_BDO)*3)  ' 1АТ-25
                        .tip     = TDB.cols("Brand").ZS(ndx_BDO)                   ' тип нр трдн
                    end with
                    np_gl = np_gl + 1
                    groupid_gl = groupid_gl + 1
                    
                    for n = 1 to TR_tek.node_count ' цикл по узлам, создаем класс узлы для каждого узла
                        set TR_node_tek = new TR_node
                        TR_node_tek.n = n
                        ' задать номера узлов но не создать их
                        if n = 1 and i = 0 and nnn = 1 then            
                            TR_node_tek.ny = arPS.ny_baze
                        else
                            'если номер занят то выберается следующий свободный после указанного (-1 - исходного ,-2 максимального)
                            ny_zad = fNy_next ( ny_zad )
                            TR_node_tek.ny = ny_zad
                        end if
                        TR_tek.Add_TR_vetv TR_node_tek ' 
                    next
                    ' создать транс в таблице трансформаторы ATtrans
                    TRANS.AddRow
                    TRANS.cols("Id").z (TRANS.size - 1) = fTabParamMax ("ATtrans"  , "Id")+1
                    TRANS.cols("Name").z (TRANS.size - 1) = TR_tek.dname_tr
                    TRANS.cols("Brand").z (TRANS.size - 1) = TR_tek.Id_BDO
                    TRANS.cols("n_par").z (TRANS.size - 1) = TR_tek.np     
                    TR_tek.N_row_ATtrans = TRANS.size - 1

                    'Dict_TR_node - key  это порядковый номер узла 1,2,3,,,
                    if TR_tek.f1 then  k1f = Sqr(3) else k1f = 1
                    TR_tek.Dict_TR_node.Item(1).Unom_seti = cdbl(fuhom (k1f * TDB.cols("U_high").Z(TR_tek.N_row_BDO )))  'Unom_seti 
                    TR_tek.Dict_TR_node.Item(1).Unom_tr   = k1f * TDB.cols("U_high").Z(TR_tek.N_row_BDO)                'Unom_tr
                    if TR_tek.count_O = 3 then
                        TR_tek.Dict_TR_node.Item(2).Unom_seti = cdbl(fuhom (k1f * TDB.cols("U_high").Z(TR_tek.N_row_BDO))) 'Unom_seti 
                        TRANS.cols("n_high").z (TRANS.size - 1) = TR_tek.Dict_TR_node.Item(1).ny
                        TRANS.cols("n_zero").z (TRANS.size - 1) = TR_tek.Dict_TR_node.Item(2).ny

                        if TR_tek.Type1 = 3 then '"2х-обм-расщ"
                            TR_tek.Dict_TR_node.Item(3).Unom_seti = cdbl(fuhom (TDB.cols("U_low").Z(TR_tek.N_row_BDO))) 'Unom_seti 
                            TR_tek.Dict_TR_node.Item(4).Unom_seti = cdbl(fuhom (TDB.cols("U_low").Z(TR_tek.N_row_BDO))) 'Unom_seti 
                            TR_tek.Dict_TR_node.Item(3).Unom_tr   =  TDB.cols("U_low").Z(TR_tek.N_row_BDO)  'Unom_tr
                            TR_tek.Dict_TR_node.Item(4).Unom_tr   =  TDB.cols("U_low").Z(TR_tek.N_row_BDO)  'Unom_tr

                            TRANS.cols("n_low").z (TRANS.size - 1) =  TR_tek.Dict_TR_node.Item(3).ny
                            TRANS.cols("n_low2").z (TRANS.size - 1) =  TR_tek.Dict_TR_node.Item(4).ny                           
                        else
                            TR_tek.Dict_TR_node.Item(3).Unom_seti = cdbl(fuhom (k1f * TDB.cols("U_mid").Z(TR_tek.N_row_BDO))) 'Unom_seti 
                            TR_tek.Dict_TR_node.Item(4).Unom_seti = cdbl(fuhom (TDB.cols("U_low").Z(TR_tek.N_row_BDO))) 'Unom_seti 
                            TR_tek.Dict_TR_node.Item(3).Unom_tr   = k1f * TDB.cols("U_mid").Z(TR_tek.N_row_BDO)  'Unom_tr
                            TR_tek.Dict_TR_node.Item(4).Unom_tr   = TDB.cols("U_low").Z(TR_tek.N_row_BDO)  'Unom_tr

                            TRANS.cols("n_mid").z (TRANS.size - 1) =  TR_tek.Dict_TR_node.Item(3).ny
                            TRANS.cols("n_low").z (TRANS.size - 1) =  TR_tek.Dict_TR_node.Item(4).ny
                        end if
                    elseif TR_tek.count_O = 2 then 
                        TR_tek.Dict_TR_node.Item(2).Unom_seti = cdbl(fuhom ( TDB.cols("U_low").Z(TR_tek.N_row_BDO))) 'Unom_seti 
                        TR_tek.Dict_TR_node.Item(2).Unom_tr   = TDB.cols("U_low").Z(TR_tek.N_row_BDO)  'Unom_tr
                        TRANS.cols("n_high").z (TRANS.size - 1) = TR_tek.Dict_TR_node.Item(1).ny
                        TRANS.cols("n_low").z (TRANS.size - 1) =  TR_tek.Dict_TR_node.Item(2).ny
                    end if

                    arPS.Add_TR TR_tek
                next
            end if
        next

        for each TR_teki in arPS.Dict_TR.Items ' цикл по трансформаторам - задать параметры в растр УЗЛЫ
            for each TR_node_teki in TR_teki.Dict_TR_node.Items ' цикл по узлам
                if not TR_node_teki.ny = arPS.ny_baze then 
                    name = cstr (TR_teki.np) & "сш " & cstr(TR_node_teki.Unom_seti) & " кВ " &  arPS.name ' имя узла
                    if  TR_teki.count_O = 3 and TR_node_teki.n = 2 then name = TR_teki.dname_tr            ' если средняя точка тр
                    Node_add_sub TR_node_teki.ny,  name , "" , arPS.na , arPS.npa , TR_node_teki.Unom_seti , arPS.nga ' ny,  name, dname, na , npa , uhom , nga
                end if
                if not (TR_teki.count_O = 3 and TR_node_teki.n = 2) then arPS.Add_Dict_unom_ny  TR_node_teki.Unom_seti , TR_node_teki.ny  ' (Dict ,unom , ny)
            next
        next
        call arPS.sUhom_PS( ) ' найти макс напряжение ПС

        if add_vikl then call ps_vikl_add_sub (arPS.Dict_unom_ps)
        call Rastr.rgm ("")

        for each TR_teki in arPS.Dict_TR.Items ' цикл по трансформаторам  - задать параметры в растр ВЕТВИ
            with TR_teki.Dict_TR_node
                ip  =      .Item(1).ny
                iq  =      .Item(2).ny
                np  =      TR_teki.np
        
                call tV.setsel ("ip=" + cstr(ip) + "&iq=" +  cstr(iq) + "&np=" +  cstr(np) )
                if tV.count = 0 then
                    call Vetv_add_sub ("" , ip , iq , np , 0 , 0 , 0 , 0, 0 , 0, 0 , 0) 
                end If
                call tV.setsel ("ip=" + cstr(ip) + "&iq=" +  cstr(iq) + "&np=" +  cstr(np) )
                
                if tV.count = 1 then
                    tVi = tV.findnextsel (-1)

                    if fTipFile ()(0) = "Файл ""RST""" then 
                        tV.cols("r0").z   ( tVi) = tV.cols("r").z   ( tVi)
                        tV.cols("x0").z   ( tVi) = tV.cols("x").z   ( tVi)
                        tV.cols("sta0").z ( tVi) = tV.cols("sta").z ( tVi)
                    else
                        tV.cols("i_dop_av").z   ( tVi) = tV.cols("i_dop").z   ( tVi)
                        if IE_ON = 1 then
                            if  add_IT then
                                if TR_teki.star then  tV.cols("n_it").z   ( tVi) = IT_nach   else tV.cols("n_it").z   ( tVi) = IT_nach + 1
                                if TR_teki.star then  tV.cols("n_it_av").z( tVi) = IT_nach+2 else tV.cols("n_it_av").z( tVi) = IT_nach + 3
                            end if
                        end if
                    end if
                    if TR_teki.count_O = 2 then obmotka = "" else  obmotka = "(ВН)"
                   
                    dname = cstr(np) & TR_teki.vid_tr &  " ПС " &  arPS.Uhom_PS & " кВ " & arPS.name 
                    tV.cols("dname").z   ( tVi) = dname & obmotka
                    tV.cols("groupid").z ( tVi) = TR_teki.groupid 

                    if TR_teki.count_O = 3 then
                        ip  =      .Item(2).ny
                        iq  =      .Item(3).ny                        
                        call tV.setsel ("ip=" + cstr(ip) + "&iq=" +  cstr(iq) + "&np=" +  cstr(np) )
                        if tV.count = 1 then
                            tVi = tV.findnextsel (-1)
            
                            if fTipFile ()(0) = "Файл ""RST""" then 
                                tV.cols("r0").z   ( tVi) = tV.cols("r").z   ( tVi)
                                tV.cols("x0").z   ( tVi) = tV.cols("x").z   ( tVi)
                                tV.cols("sta0").z ( tVi) = tV.cols("sta").z ( tVi)
                            else
                                tV.cols("i_dop_av").z   ( tVi) = tV.cols("i_dop").z   ( tVi)
                                if IE_ON = 1 then
                                    if  add_IT then
                                        if TR_teki.star then  tV.cols("n_it").z   ( tVi) = IT_nach   else tV.cols("n_it").z   ( tVi) = IT_nach+1
                                        if TR_teki.star then  tV.cols("n_it_av").z( tVi) = IT_nach+2 else tV.cols("n_it_av").z( tVi) = IT_nach+3
                                    end if
                                end if
                            end if

                            if TDB.cols("U_mid").z(TR_teki.N_row_BDO)> 0 then obmotka = "(СН)" else  obmotka = "(НН)"
                            tV.cols("dname").z   ( tVi) = dname & obmotka
                            tV.cols("groupid").z ( tVi) = TR_teki.groupid 
                        end if
                        ip  =      .Item(2).ny
                        iq  =      .Item(4).ny                        
                        call tV.setsel ("ip=" + cstr(ip) + "&iq=" +  cstr(iq) + "&np=" +  cstr(np) )
                        if tV.count = 1 then
                            tVi = tV.findnextsel (-1)
            
                            if fTipFile ()(0) = "Файл ""RST""" then
                                tV.cols("r0").z   ( tVi) = tV.cols("r").z   ( tVi)
                                tV.cols("x0").z   ( tVi) = tV.cols("x").z   ( tVi)
                                tV.cols("sta0").z ( tVi) = tV.cols("sta").z ( tVi)
                            else
                                tV.cols("i_dop_av").z   ( tVi) = tV.cols("i_dop").z   ( tVi)
                                if IE_ON = 1 then
                                    if  add_IT then
                                        if TR_teki.star then  tV.cols("n_it").z   ( tVi) = IT_nach   else tV.cols("n_it").z   ( tVi) = IT_nach + 1
                                        if TR_teki.star then  tV.cols("n_it_av").z( tVi) = IT_nach+2 else tV.cols("n_it_av").z( tVi) = IT_nach + 3
                                    end if
                                end if
                            end if 
                            obmotka = "(НН)"
                            tV.cols("dname").z   ( tVi) = dname & obmotka
                            tV.cols("groupid").z ( tVi) = TR_teki.groupid   
                        end if
                    end if
                end if
            'добавить выключатели
            end with
        next

        'print_dic (arPS.Dict_unom_ps)       
        Rastr.Tables("com_regim").Cols("calc_tr").Z(0) = status_calc_tr

        for each TR_teki in arPS.Dict_TR.Items ' цикл по трансформаторам - задать параметры в растр УЗЛЫ
            TRANS.cols("sta").z(TR_teki.N_row_ATtrans )= 1
        next

        'добавить на графике
        if GR_add then
            
            set gr_nod1 = rastr.tables("graph_node")
            call gr_nod1.setsel("ny=" & cstr (arPS.ny_baze))
            ndx = gr_nod1.findnextsel (-1)
            x_base = gr_nod1.cols("k_x").z(ndx)
            y_base = gr_nod1.cols("k_y").z(ndx)
            sdvig = 0
            for each TR_teki in arPS.Dict_TR.Items ' цикл по трансформаторам - задать параметры в растр УЗЛЫ
                if TR_teki.Dict_TR_node.Item(1).ny = arPS.ny_baze then ny1 = -1  else ny1 = TR_teki.Dict_TR_node.Item(1).ny

                if TR_teki.count_O  = 2 then
                        call graf_T (ny1,TR_teki.Dict_TR_node.Item(2).ny, x_base + sdvig ,  y_base)
                else
                    if TR_tek.Type1 = 3 then '"2х-обм-расщ"
                        call graf_TR (ny1,TR_teki.Dict_TR_node.Item(2).ny,TR_teki.Dict_TR_node.Item(3).ny, TR_teki.Dict_TR_node.Item(4).ny , x_base + sdvig ,  y_base)
                    else
                        call graf_AT (ny1,TR_teki.Dict_TR_node.Item(2).ny,TR_teki.Dict_TR_node.Item(3).ny, TR_teki.Dict_TR_node.Item(4).ny , x_base + sdvig ,  y_base)
                    end if
                end if
                sdvig = sdvig + 15
            next
        end if
        Rastr.SendChangeData HINTR_CHANGE_ALL,"","",0  ' обновить содержимое открытых окон  
        Rastr.LockEvent = False
        Rastr.SendChangeData HINTR_CHANGE_ALL,"","",0  ' обновить содержимое открытых окон  
    end Sub

    Class PS ' (tN.cols("name").zs(ndx_node_zad),tN.cols("na").z(ndx_node_zad),tN.cols("npa").z(ndx_node_zad),tN.cols("nga").z(ndx_node_zad)) 'класс подстанции (name,na,npa,nga)
        public name , na, npa, nga , Uhom_PS, ny_baze
        public Dict_TR ' колекция трансформаторов, в нее запишем объекты класса TR2 и TR3
        public Dict_unom_ps ' колекция трансформаторов, в нее запишем объекты класса TR2 и TR3

        public sub Add_TR( TR )
            IF( IsObject( Dict_TR ) = FALSE ) THEN
                SET Dict_TR = CreateObject("Scripting.Dictionary")
            END IF
            IF( Dict_TR.Exists( TR.np ) = FALSE ) THEN
                Dict_TR.Add TR.np, TR   ' ключ , значение
            ELSE
                
            END IF
        END sub 

        PUBLIC FUNCTION GetTR( N_TR )
            SET GetTR = Dict_TR.Item( N_TR )
        END FUNCTION
        
        public sub Add_Dict_unom_ny ( unom_kluch , ny )
            IF ( IsObject( Dict_unom_ps ) = FALSE ) THEN SET Dict_unom_ps = CreateObject("Scripting.Dictionary")

            IF ( Dict_unom_ps.Exists( unom_kluch ) = FALSE ) THEN
                Dict_unom_ps.Add unom_kluch , ny   ' ключ , значение
            ELSE
                Dict_unom_ps.Item (unom_kluch) = Dict_unom_ps.Item (unom_kluch) & "," & ny
            END IF
        END sub 

        PUBLIC sub sUhom_PS( )
            Uhom_PS = 0
            For Each varKey In Dict_unom_ps.Keys ' организуем цикл по элементам  масива Keys
                if Uhom_PS < cdbl(varKey) then Uhom_PS = cdbl(varKey)
            Next
        END sub
    end Class

    Class TR ' класс для двухобмоточного трансформатора
        'public nomer                'порядковый номер трансформатора
        public node_count           'количесво узлов
        public star           'истина если транс старый - больше 30 лет
        public count_O       'количесво обмоток
        public N_row_BDO            'номер строки BDO
        public Id_BDO            'уникальный номер
        public N_row_ATtrans          'номер строки таблицы ATtrans
        public Id_ATtrans          'уникальный номер
        public np                   'номер паралельности
        public groupid
        public dname_tr              '1т-25
        public vid_tr              'Т АТ АТГ
        public Type1              '2х-обм , 3x-обм ,АТ,АТ однофазн.,2х-обм-расщ,АТ-расщ,,
        public tip                  ' тип трдн
        public f1                  ' истина если однофазный
        public Dict_TR_node         ' Dictionary для хранения узлов

        public sub Add_TR_vetv( TR_node ) ' vetv
            IF( IsObject( Dict_TR_node ) = FALSE ) THEN
                SET Dict_TR_node = CreateObject("Scripting.Dictionary")
            END IF
            IF( Dict_TR_node.Exists( TR_node.n ) = FALSE ) THEN
                Dict_TR_node.Add TR_node.n, TR_node   ' ключ , значение
            ELSE
                
            END IF
        END sub 

        PUBLIC FUNCTION GetTR_vetv( NTR_vetv )
            SET GetTR_vetv = Dict_TR_node.Item( TR_node )
        END FUNCTION

    end Class

    Class TR_node ' класс для параметров узлов трансформаторов
        public n ' порядковый номер узла
        public dname ' 
        public ny
        public Unom_seti
        public Unom_tr
        ' public r
        ' public x
        ' public b
        ' public g
        ' public ktr
        ' public Idop
        ' public IdopOO
    end Class

    sub graf_AT (ny_add1,ny_add2,ny_add3, ny_add4 , poz_x1 ,  poz_y1) ' АТ или Т с 3 обмотками
        if ny_add1 > -1 then call add_node_graph (ny_add1 , poz_x1   ,  poz_y1      , 2 )
        call add_node_graph (ny_add2 , poz_x1+1 ,  poz_y1+7    , 0 )
        call add_node_graph (ny_add3 , poz_x1   ,  poz_y1 +14  , 2 )
        call add_node_graph (ny_add4 , poz_x1-5 ,  poz_y1 +7   , 0 )
    end sub

    sub graf_TR (ny_add1,ny_add2,ny_add3, ny_add4 , poz_x1 ,  poz_y1)' Т с 2 обмотками с ращеплением
        if ny_add1 > -1 then call add_node_graph (ny_add1 , poz_x1   ,  poz_y1      , 2 )
        call add_node_graph (ny_add2 , poz_x1+1 ,  poz_y1+7    , 0 )
        call add_node_graph (ny_add3 , poz_x1-3 ,  poz_y1 +14  , 2 )
        call add_node_graph (ny_add4 , poz_x1+3 ,  poz_y1 +14   , 2 )
    end sub

    sub graf_T (ny_add1,ny_add2 , poz_x1 ,  poz_y1)' Т с 2 обмотками
        if ny_add1 > -1 then call add_node_graph (ny_add1 , poz_x1   ,  poz_y1      , 2 )
        call add_node_graph (ny_add2 , poz_x1+1 ,  poz_y1+7    , 0 )
    end sub

    sub add_node_graph (ny_add , poz_x ,  poz_y , npri) 'npri - шина 0 точка
        set graph_node = rastr.tables("graph_node")
        set graph_text = rastr.tables("graph_text")
        set graph_figur = rastr.tables("graph_figur")

        call graph_node.setsel ("ny=" + cstr(ny_add) )
        'iii = graph_node.findnextsel(-1)


        if graph_node.count=0 then 
            call graph_node.DupRow(graph_node.size-1) 
            graph_node.cols("ny").z(graph_node.size-1) = ny_add
            graph_node.cols("k_x").z(graph_node.size-1) = poz_x
            graph_node.cols("k_y").z(graph_node.size-1) = poz_y
            graph_node.cols("npri").z(graph_node.size-1) = npri
            ' таблица фигур
            graph_node.cols("ind_fig").z(graph_node.size-1) = graph_figur.size

            graph_figur.addrow : graph_figur.cols("zapret").z(graph_figur.size - 1) =   1  : graph_figur.cols("npr").z(graph_figur.size - 1) = 0 : graph_figur.cols("size").z(graph_figur.size - 1) = 50 'нагрузки   : graph_figur.cols("multifigs").z(graph_figur.size - 1) = 0
            graph_figur.addrow : graph_figur.cols("zapret").z(graph_figur.size - 1) =   1  : graph_figur.cols("npr").z(graph_figur.size - 1) = 0 : graph_figur.cols("size").z(graph_figur.size - 1) = 50 'генератора : graph_figur.cols("multifigs").z(graph_figur.size - 1) = 0
            graph_figur.addrow : graph_figur.cols("zapret").z(graph_figur.size - 1) =   1  : graph_figur.cols("npr").z(graph_figur.size - 1) = 0 : graph_figur.cols("size").z(graph_figur.size - 1) = 50 'шунта      : graph_figur.cols("multifigs").z(graph_figur.size - 1) = 0

            ' таблица текст,  узел  7 записей

            'call graph_node.setsel ("ny=" & cstr(ny_copy))

            gtext_size_start = graph_text.size
            graph_node.cols("ind_text").z(graph_node.size-1) = graph_text.size/5

            for i = gtext_size_start-1 to 1 step -gtext_size_start/5
                graph_text.DupRow(i) : graph_text.cols("ugol").z(i + 1) = 0 : graph_text.cols("viz").z(i + 1) = 1  : graph_text.cols("size_y").z(i + 1) = 50  : graph_text.cols("size_x").z(i + 1) = 50  : graph_text.cols("w_y").z(i + 1) = 50 : graph_text.cols("w_x").z(i + 1) = 50
                graph_text.DupRow(i) : graph_text.cols("ugol").z(i + 1) = 0 : graph_text.cols("viz").z(i + 1) = 1  : graph_text.cols("size_y").z(i + 1) = 50  : graph_text.cols("size_x").z(i + 1) = 50  : graph_text.cols("w_y").z(i + 1) = 50 : graph_text.cols("w_x").z(i + 1) = 50
                graph_text.DupRow(i) : graph_text.cols("ugol").z(i + 1) = 0 : graph_text.cols("viz").z(i + 1) = 1  : graph_text.cols("size_y").z(i + 1) = 50  : graph_text.cols("size_x").z(i + 1) = 50  : graph_text.cols("w_y").z(i + 1) = 50 : graph_text.cols("w_x").z(i + 1) = 50
                graph_text.DupRow(i) : graph_text.cols("ugol").z(i + 1) = 0 : graph_text.cols("viz").z(i + 1) = 1  : graph_text.cols("size_y").z(i + 1) = 50  : graph_text.cols("size_x").z(i + 1) = 50  : graph_text.cols("w_y").z(i + 1) = 50 : graph_text.cols("w_x").z(i + 1) = 50
                graph_text.DupRow(i) : graph_text.cols("ugol").z(i + 1) = 0 : graph_text.cols("viz").z(i + 1) = 1  : graph_text.cols("size_y").z(i + 1) = 50  : graph_text.cols("size_x").z(i + 1) = 50  : graph_text.cols("w_y").z(i + 1) = 50 : graph_text.cols("w_x").z(i + 1) = 50
                graph_text.DupRow(i) : graph_text.cols("ugol").z(i + 1) = 0 : graph_text.cols("viz").z(i + 1) = 1  : graph_text.cols("size_y").z(i + 1) = 50  : graph_text.cols("size_x").z(i + 1) = 50  : graph_text.cols("w_y").z(i + 1) = 50 : graph_text.cols("w_x").z(i + 1) = 50
                graph_text.DupRow(i) : graph_text.cols("ugol").z(i + 1) = 0 : graph_text.cols("viz").z(i + 1) = 1  : graph_text.cols("size_y").z(i + 1) = 50  : graph_text.cols("size_x").z(i + 1) = 50  : graph_text.cols("w_y").z(i + 1) = 50 : graph_text.cols("w_x").z(i + 1) = 50
            next
        end if
        'Rastr.SendChangeData  0,"",0,0	
        'Rastr.SendChangeData  0,"",0,0	
    end sub

    Sub Node_add_sub (ny,  name, dname, na , npa , uhom , nga ) ' добавить узел и вернуть номер (следующий свободный после заданного ny)

        set tN_Node_add = rastr.tables("node")
        'Rastr.LockEvent = false 
        tN_Node_add.AddRow
        tN_Node_add.cols("ny").z ( tN_Node_add.size - 1)   = ny
        'Rastr.LockEvent = True
        tN_Node_add.cols("name").z ( tN_Node_add.size - 1) = name
        tN_Node_add.cols("dname").z ( tN_Node_add.size - 1) = dname
        tN_Node_add.cols("na").z ( tN_Node_add.size - 1)   = na
        tN_Node_add.cols("npa").z ( tN_Node_add.size - 1)  = npa
        tN_Node_add.cols("uhom").z ( tN_Node_add.size - 1) = uhom
        tN_Node_add.cols("nga").z ( tN_Node_add.size - 1) = nga
    end Sub

    Sub graphikIT_trans (Nzav) ' для трансформаторов старше 30 лет ддтн Nzav, адтн - Nzav+2, меньше 30 лет ддтн Nzav+1, адтн Nzav+3 
        set gIT  = rastr.tables("graphikIT")
        for i = gIT.size-1 to 0 step -1
            if gIT.cols("Num").z(i)>Nzav-1 and gIT.cols("Num").z(i)< Nzav+4 then gIT.delRow(i)
        next
        ' больше 30 лет ддтн
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav    : gIT.cols("Tc").z(gIT.size - 1) =  -25   : gIT.cols("Idop").z(gIT.size - 1) = 1.2  
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav    : gIT.cols("Tc").z(gIT.size - 1) =  -20   : gIT.cols("Idop").z(gIT.size - 1) = 1.2  
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav    : gIT.cols("Tc").z(gIT.size - 1) =  -10   : gIT.cols("Idop").z(gIT.size - 1) = 1.2  
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav    : gIT.cols("Tc").z(gIT.size - 1) =  0     : gIT.cols("Idop").z(gIT.size - 1) = 1.15  
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav    : gIT.cols("Tc").z(gIT.size - 1) =  10    : gIT.cols("Idop").z(gIT.size - 1) = 1.08  
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav    : gIT.cols("Tc").z(gIT.size - 1) =  20    : gIT.cols("Idop").z(gIT.size - 1) = 1  
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav    : gIT.cols("Tc").z(gIT.size - 1) =  25    : gIT.cols("Idop").z(gIT.size - 1) = 0.955  
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav    : gIT.cols("Tc").z(gIT.size - 1) =  30    : gIT.cols("Idop").z(gIT.size - 1) = 0.91  
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav    : gIT.cols("Tc").z(gIT.size - 1) =  35    : gIT.cols("Idop").z(gIT.size - 1) = 0.865  
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav    : gIT.cols("Tc").z(gIT.size - 1) =  40    : gIT.cols("Idop").z(gIT.size - 1) = 0.82  
        ' менее 30 лет ддтн
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+1    : gIT.cols("Tc").z(gIT.size - 1) =  -25   : gIT.cols("Idop").z(gIT.size - 1) = 1.25
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+1    : gIT.cols("Tc").z(gIT.size - 1) =  -20   : gIT.cols("Idop").z(gIT.size - 1) = 1.25
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+1    : gIT.cols("Tc").z(gIT.size - 1) =  -10   : gIT.cols("Idop").z(gIT.size - 1) = 1.25
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+1    : gIT.cols("Tc").z(gIT.size - 1) =  0     : gIT.cols("Idop").z(gIT.size - 1) = 1.25
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+1    : gIT.cols("Tc").z(gIT.size - 1) =  10    : gIT.cols("Idop").z(gIT.size - 1) = 1.25
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+1    : gIT.cols("Tc").z(gIT.size - 1) =  20    : gIT.cols("Idop").z(gIT.size - 1) = 1.2
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+1    : gIT.cols("Tc").z(gIT.size - 1) =  25    : gIT.cols("Idop").z(gIT.size - 1) = 1.175
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+1    : gIT.cols("Tc").z(gIT.size - 1) =  30    : gIT.cols("Idop").z(gIT.size - 1) = 1.15
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+1    : gIT.cols("Tc").z(gIT.size - 1) =  35    : gIT.cols("Idop").z(gIT.size - 1) = 1.115
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+1    : gIT.cols("Tc").z(gIT.size - 1) =  40    : gIT.cols("Idop").z(gIT.size - 1) = 1.08
        ' больше 30 лет адтн
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+2    : gIT.cols("Tc").z(gIT.size - 1) =  -25   : gIT.cols("Idop").z(gIT.size - 1) = 1.4
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+2    : gIT.cols("Tc").z(gIT.size - 1) =  -20   : gIT.cols("Idop").z(gIT.size - 1) = 1.4
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+2    : gIT.cols("Tc").z(gIT.size - 1) =  -10   : gIT.cols("Idop").z(gIT.size - 1) = 1.3
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+2    : gIT.cols("Tc").z(gIT.size - 1) =  0     : gIT.cols("Idop").z(gIT.size - 1) = 1.3
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+2    : gIT.cols("Tc").z(gIT.size - 1) =  10    : gIT.cols("Idop").z(gIT.size - 1) = 1.3
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+2    : gIT.cols("Tc").z(gIT.size - 1) =  20    : gIT.cols("Idop").z(gIT.size - 1) = 1.2
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+2    : gIT.cols("Tc").z(gIT.size - 1) =  25    : gIT.cols("Idop").z(gIT.size - 1) = 1.2
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+2    : gIT.cols("Tc").z(gIT.size - 1) =  30    : gIT.cols("Idop").z(gIT.size - 1) = 1.2
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+2    : gIT.cols("Tc").z(gIT.size - 1) =  35    : gIT.cols("Idop").z(gIT.size - 1) = 1.1
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+2    : gIT.cols("Tc").z(gIT.size - 1) =  40    : gIT.cols("Idop").z(gIT.size - 1) = 1.1
        ' менее 30 лет адтн
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+3    : gIT.cols("Tc").z(gIT.size - 1) =  -25   : gIT.cols("Idop").z(gIT.size - 1) = 1.6
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+3    : gIT.cols("Tc").z(gIT.size - 1) =  -20   : gIT.cols("Idop").z(gIT.size - 1) = 1.6
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+3    : gIT.cols("Tc").z(gIT.size - 1) =  -15   : gIT.cols("Idop").z(gIT.size - 1) = 1.55
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+3    : gIT.cols("Tc").z(gIT.size - 1) =  -10   : gIT.cols("Idop").z(gIT.size - 1) = 1.5
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+3    : gIT.cols("Tc").z(gIT.size - 1) =  10    : gIT.cols("Idop").z(gIT.size - 1) = 1.5
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+3    : gIT.cols("Tc").z(gIT.size - 1) =  15    : gIT.cols("Idop").z(gIT.size - 1) = 1.45
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+3    : gIT.cols("Tc").z(gIT.size - 1) =  20    : gIT.cols("Idop").z(gIT.size - 1) = 1.4
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+3    : gIT.cols("Tc").z(gIT.size - 1) =  25    : gIT.cols("Idop").z(gIT.size - 1) = 1.375
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+3    : gIT.cols("Tc").z(gIT.size - 1) =  30    : gIT.cols("Idop").z(gIT.size - 1) = 1.35
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+3    : gIT.cols("Tc").z(gIT.size - 1) =  35    : gIT.cols("Idop").z(gIT.size - 1) = 1.325
        gIT.addrow : gIT.cols("Num").z(gIT.size - 1) = Nzav+3    : gIT.cols("Tc").z(gIT.size - 1) =  40    : gIT.cols("Idop").z(gIT.size - 1) = 1.3
    end Sub
    

    Sub Vetv_add_sub (dname , ip , iq , np , groupid , r , x , b, g , ktr, i_dop , sta) ' добавить ветвь 

            set tV_Vetv_add = rastr.tables("vetv")
            'Rastr.LockEvent = false
            tV_Vetv_add.AddRow

            Vetv_add_ndx = tV_Vetv_add.size - 1
            
            tV_Vetv_add.cols("dname").z ( Vetv_add_ndx) = dname
            tV_Vetv_add.cols("ip").z ( Vetv_add_ndx) = ip
            tV_Vetv_add.cols("iq").z ( Vetv_add_ndx) = iq
            tV_Vetv_add.cols("np").z ( Vetv_add_ndx) = np
            'Rastr.LockEvent = True
            tV_Vetv_add.cols("groupid").z ( Vetv_add_ndx) = groupid
            tV_Vetv_add.cols("r").z ( Vetv_add_ndx) = r
            tV_Vetv_add.cols("x").z ( Vetv_add_ndx) = x
            if fTipFile ()(0) = "Файл ""RST"""     then tV_Vetv_add.cols("r0").z ( Vetv_add_ndx) = r
            if fTipFile ()(0) = "Файл ""RST"""     then tV_Vetv_add.cols("x0").z ( Vetv_add_ndx) = x
            if fTipFile ()(0) = "Файл режима rg2"  then tV_Vetv_add.cols("b").z ( Vetv_add_ndx) = b/1000000
            if fTipFile ()(0) = "Файл режима rg2"  then tV_Vetv_add.cols("g").z ( Vetv_add_ndx) = g/1000000
            tV_Vetv_add.cols("ktr").z ( Vetv_add_ndx) = ktr
            if fTipFile ()(0) = "Файл режима rg2"  then tV_Vetv_add.cols("i_dop").z ( Vetv_add_ndx) = i_dop
            tV_Vetv_add.cols("sta").z ( Vetv_add_ndx) = sta
            if fTipFile ()(0) = "Файл ""RST"""     then tV_Vetv_add.cols("sta0").z ( Vetv_add_ndx) = sta
    end Sub

    'function fVetv_add_ndx (dname , ip , iq , np , r , x , b) ' добавить ветвь и вернуть ndx

        'set tV_fVetv_add = rastr.tables("vetv")
        'tV_fVetv_add.AddRow
        'fVetv_add_ndx = tV_fVetv_add.size - 1
        
        'tV_fVetv_add.cols("dname").z ( fVetv_add_ndx) = dname
        'tV_fVetv_add.cols("ip").z ( fVetv_add_ndx) = ip
        'tV_fVetv_add.cols("iq").z ( fVetv_add_ndx) = iq
        'tV_fVetv_add.cols("np").z ( fVetv_add_ndx) = np
        'tV_fVetv_add.cols("r").z ( fVetv_add_ndx) = r
        'tV_fVetv_add.cols("x").z ( fVetv_add_ndx) = x
        'tV_fVetv_add.cols("b").z ( fVetv_add_ndx) = b
            
    'end function

    function f_kkluch (tabl,fndx)'возвращает краткий ключ  (таблица, номер строки)

        Set tTabl	 = Rastr.Tables(tabl)
        if tabl = "node" then f_kkluch = tTabl.cols("ny").zs(fndx)
        if tabl = "vetv" then f_kkluch = tTabl.cols("ip").zs(fndx) & "," & tTabl.cols("iq").zs(fndx) & "," & tTabl.cols("np").zs(fndx)

    end function

    function fTabParamMax (tab  , par )
        Set tTabl	 = Rastr.Tables( tab )
        Set tPar	 = tTabl.Cols(par)
        max_pram = 0
        tTabl.Setsel (par & ">0") '
        ndx_tTabl = tTabl.FindNextSel(-1)
        while ndx_tTabl >= 0 '
            if tPar.Z (ndx_tTabl) > max_pram then  max_pram = tPar.Z (ndx_tTabl)
            
            ndx_tTabl = tTabl.FindNextSel(ndx_tTabl)
        wend

        fTabParamMax = max_pram
    end function

    Sub kor  (kkluch , zadanie )' коррекция узла , например kor "125" , "pn=10" для узла, "g,125" , "Pmax=10" для ген

        dim zadanie_m, z , kkluch_m ' _m массив

        kkluch_m = split (kkluch , ",")
        zadanie_m = split (zadanie  , "=")

        if ubound (kkluch_m) = 0 then ' УЗЕЛ
            if IsNumeric (zadanie_m(1)) then grup_cor_Sub "node",zadanie_m(0),"ny=" & cstr (kkluch), cstr (zadanie_m(1)) ' (таблица, параметр корр, выборка, формула для расчета параметра)
            if not IsNumeric (zadanie_m(1)) then kor_sub "node",zadanie_m(0),"ny=" & cstr (kkluch), cstr (zadanie_m(1)) ' (таблица, параметр корр, выборка, формула для расчета параметра)
        elseif ubound (kkluch_m) = 2 then ' Ветвь
            if IsNumeric (zadanie_m(1)) then grup_cor_Sub "vetv",zadanie_m(0),"ip=" & kkluch_m(0) & "&iq="& kkluch_m(1) & "&np="& kkluch_m(2) ,cstr (zadanie_m(1)) 
            if not IsNumeric (zadanie_m(1)) then kor_sub "vetv",zadanie_m(0),"ip=" & kkluch_m(0) & "&iq="& kkluch_m(1) & "&np="& kkluch_m(2) ,cstr (zadanie_m(1)) 
        elseif ubound (kkluch_m) = 1 then ' генератор или что то еще
            if z_test (0) = "g" then ' генератор
                if IsNumeric (zadanie_m(1)) then grup_cor_Sub "Generator" , zadanie_m(0) , "Num=" & cstr (kkluch_m(1)), cstr (zadanie_m(1)) 
                if not IsNumeric (zadanie_m(1)) then kor_sub "Generator" , zadanie_m(0) , "Num=" & cstr (kkluch_m(1)), cstr (zadanie_m(1)) 
            end if
        end if
    end Sub

    Sub grup_cor_Sub  (tabl,param,viborka,formula)' групповая коррекция (таблица, параметр корр, выборка, формула для расчета параметра)
        Set ptabl = Rastr.Tables(tabl)
        Set pparam = ptabl.cols(param)
        ptabl.SetSel(viborka)
        pparam.Calc(formula)
    end Sub

    Sub kor_sub  (tabl,param,viborka,formula)' коррекция одного уникальнгого занчения(таблица, параметр корр, выборка, формула для расчета параметра)
        Set ptabl = Rastr.Tables(tabl)
        Set pparam = ptabl.cols(param)
        ptabl.SetSel(viborka)
        ndx = ptabl.FindNextSel(-1)
        pparam.z (ndx) = formula
    end Sub

    sub ps_vikl_add_sub (Dict)
        For Each varKey In Dict.Keys ' организуем цикл по элементам  масива Keys
            uzly = split ( Dict.Item(varKey), ",")
            if ubound (uzly)>0 then
                for p = 0 to ubound (uzly)
                    
                    if p  < ubound (uzly) then
                        if cdbl(varKey) > 50 then 
                            dname = "ШСВ " & cstr (varKey) & " кВ" 
                            sta = 0
                        else  
                            dname = "СВ " & cstr (varKey) & " кВ"
                            sta = 1
                        end if
                        Vetv_add_sub dname , cdbl( uzly(p)) ,cdbl( uzly(p+1)) , 0 , 0 , 0 , 0 , 0, 0 , 0, 0 ,  sta' добавить ветвь 
                    end if
                next
            end if
        Next
    end Sub

    function fNy_next ( ny )  ' возвращает следующий следующий свободный после заданного ny
        Set Dict_ny = CreateObject("Scripting.Dictionary")' колекция транзитов ny
        Dict_unik_value_sub "node" , "ny" , "" , Dict_ny
        fNy_next = ny + 1
        while Dict_ny.Exists ( fNy_next )' пока истина 
            fNy_next = fNy_next + 1
        wend  
    end function

    sub Dict_unik_value_sub (tabl , param , vibor , Dict_unik_value )' (нр "vetv","tranzit","sel",dict) наполняет Dictionary  уникальными значениями столбца таблицы
        On Error Resume Next
        Dict_unik_value.RemoveAll
        Set tTabl = Rastr.Tables( tabl )
        Set tParam = tTabl.Cols( param )
        
        tTabl.SetSel vibor
        ndx_tTabl = tTabl.FindNextSel(-1)
        while ndx_tTabl >= 0 ' 
            Dict_kluch = tParam.z (ndx_tTabl)
            'if not Dict_unik_value.Exists ( Dict_kluch ) and Dict_kluch > 0 then    ' Exists проверяет наличие ключа
            if not Dict_unik_value.Exists ( Dict_kluch ) then    ' Exists проверяет наличие ключа
                Dict_unik_value.Add Dict_kluch , tabl & " / " & param
            end if
            ndx_tTabl = tTabl.FindNextSel(ndx_tTabl)
        wend  
    end sub

    Sub print_dic (Dic)   ' 
        Dim stroka ,  varKey
        For Each varKey In Dic.Keys ' 
            rastr.Printp "Key:" & varKey & ", Item:" & Dic.Item(varKey)
        Next
    End Sub
        

    function fTipFile () ' возвращает тип загруженного файла по полному имени и полное имя
        On Error Resume Next
        dim TipFile
        redim TipFile (1)
        TipFile (0) = "empty"
        TipFile (1) = "empty"
        if not isEmpty (Rastr.SendCommandMain (6 , "динамика.rst", "" , 0)) then TipFile (0) = "Файл ""RST""" : TipFile (1) = Rastr.SendCommandMain (6 , "динамика.rst", "" , 0)' 
        if not isEmpty (Rastr.SendCommandMain (6 , "режим.rg2", "" , 0)) then 
            TipFile (0) = "Файл режима rg2"  
            TipFile (1) = Rastr.SendCommandMain (6 , "режим.rg2", "" , 0)  
            if not isEmpty (Rastr.SendCommandMain (6 , "динамика.rst", "" , 0)) then TipFile (0) = "empty" : TipFile (1) = "empty" : r_print "загружен файл и режима и динамики" ' 
        end if' 
        fTipFile = TipFile
    end function

    function fuhom (u_zad)
        dim uh , umin , umax , k
        uh =   array (6,10,35,110,150,220,330,500,750) ' номинальные напряжения
        umin = array (5,9 ,32,96 ,140,190,299,480,730) ' минимальные напряжения
        umax = array (7,12,41,126,166,252,364,530,775) ' максимальные напряжения
        if isnumeric(u_zad) then 
            u_zad = cdbl(u_zad)
            fuhom = 0
            if u_zad > 0 then
                for k = 0 to Ubound(uh) 'цикл по массиву ном напряжений
                    if u_zad > umin(k) and u_zad < umax(k) then ' если внутри диапозона
                        fuhom = uh(k)
                        exit for
                    end if
                next
            end if
            if fuhom = 0 then if u_zad> 0 then fuhom  = cstr(round (u_zad, 1)) else fuhom = ""
        end if
    end function
'//////////////////////////////////// дел сел /////////////////////////////////////////////////////////////////////////   
    sub sel_del_run ()
        if IE_ON = 0 then 
            tip = Rastr.SendCommandMain(8, "точно удалить выделенные 1-узлы 2-ветви 3-генераторы (если не вводить то удаляется все)"  , 0 , 0)
            if tip = "0" then call sel_del (true , true , "sel" , true , "sel" , true, "sel")
            if tip = "1" then call sel_del (true , true , "sel" , false , "sel" , false, "sel")
            if tip = "2" then call sel_del (false , false , "sel" , true , "sel" , false, "sel")
            if tip = "3" then call sel_del (false , false , "sel" , false , "sel" , true, "sel")
        else  
            call sel_del  (pi_IE.Document.form_del.CB_del_node.Checked _ 
                        ,  pi_IE.Document.form_del.CB_del_node_vet.Checked _ 
                        ,  pi_IE.Document.form_del.In_vibor_node.Value _
                        ,  pi_IE.Document.form_del.CB_del_vet.Checked _  
                        ,  pi_IE.Document.form_del.In_vibor_vet.Value _ 
                        ,  pi_IE.Document.form_del.CB_del_gen.Checked  _ 
                        ,  pi_IE.Document.form_del.In_vibor_gen.Value)
        end if            
    end sub

    sub sel_del (dNod , dNodV , vNod , dVet , vVet , dGen, vGen)
        dim tnode, tvetv, tgen
        Rastr.LockEvent = True
        set tnode=Rastr.Tables("node")
        set tvetv=Rastr.Tables("vetv")
        if dNod then
            tnode.SetSel(vNod)
            tnode.DelRows
        end if

        if dNodV and dNod then
            tvetv.SetSel("ip.ny=0|iq.ny=0")
            tvetv.DelRows
        end if

        if dVet then
            tvetv.SetSel(vVet)
            tvetv.DelRows
        end if

        if dGen then
            Set tgen=Rastr.Tables("Generator")
            tgen.SetSel (vGen)
            tgen.DelRows
        end if

        Rastr.SendChangeData HINTR_CHANGE_ALL,"","",0  ' обновить содержимое открытых окон   
        Rastr.LockEvent = false
    end sub
'////////////////////////////////////вкл /////////////////////////////////////////////////////////////////////////
    sub vkl_okna ()
        Rastr.LockEvent = False
        Rastr.LogEnable = 1
        Rastr.SendChangeData HINTR_CHANGE_ALL,"","",0  ' обновить содержимое открытых окон 
    end sub
'////////////////////////////////////ЛЭП /////////////////////////////////////////////////////////////////////////
    sub main_LEP ()
        '  Пересчет параметров R,X,G,B,i_dop,i_dop_av,n_it,n_it_av отмеченных ветвей по справочнику проводов из шаблона трансформаторы.trn
        ' R,X,G,B меняются в соответствии с заданными значениями в полях Brand,l,Brand2,l2, Brand3,l3.ДТН меняется только если они не заданы в модели (i_dop_av=1,2*i_dop n_it=n_it_av=1). 
        '===============================================================================
        dim tip_file '1 режим; 2 динамика
        tip_file = 0
        if not isempty ( Rastr.SendCommandMain (6 , "режим.rg2", "" , 0) ) then tip_file = tip_file + 1
        if not isempty (  Rastr.SendCommandMain (6 , "динамика.rst", "" , 0)) then tip_file = tip_file + 2

        if tip_file = 0 then msgbox " не загружен файл режима и динамики" :Rastr.LockEvent = false : Rastr.LogEnable = 1: exit sub
        if tip_file = 3 then 
            tip_file = Rastr.SendCommandMain(8, "1-режим 2-динамика"  , 1 , 0)
            if tip_file = 0 or isempty (tip_file ) then msgbox "выход" : exit sub
        end if
        
        set tWiresDB = Rastr.Tables("wires_DB")
        set tVetv = Rastr.Tables("vetv")
        tVetv.setsel "sel"
        if tVetv.count < 1 then  msgbox "нет отмеченых ветвей" : exit sub
        Dim dictWDB   
        dim WDB1             
        dim WDB
        dim WDB2

        if tip_file = 1 then
            Vetv_parametr = "ip,iq,np,Brand,l,Brand2,l2,Brand3,l3,r,x,g,b,i_dop,i_dop_av,n_it,n_it_av"
            wires_DB_parametr = "Id,Brand,r0,x0,g0,b0"
            test_i_dop = 0
            if rastr.tables("wires_DB").cols.find("i_dop") > -1 then wires_DB_parametr  = wires_DB_parametr + ",i_dop" : test_i_dop = 1

            saWiresDB = tWiresDB.writesafearray(wires_DB_parametr,"000")
            saVetv = tVetv.writesafearray(Vetv_parametr,"000")


            Set dictWDB = CreateObject("Scripting.Dictionary")

            for i = 0 to UBound(saWiresDB)

                set WDB = new CWDB
                WDB.Id = saWiresDB(i,0)
                WDB.Brand = saWiresDB(i,1)
                WDB.R0 = saWiresDB(i,2)
                WDB.X0 = saWiresDB(i,3)
                WDB.G0 = saWiresDB(i,4)
                WDB.B0 = saWiresDB(i,5)
                if rastr.tables("wires_DB").cols.find("i_dop") > -1 then WDB.i_dop = saWiresDB(i,6)
                dictWDB.Add WDB.Id,WDB
            next 

            for i = 0 to UBound(saVetv)
                Brand = saVetv(i,3)
                L = saVetv(i,4)
                Brand2 = saVetv(i,5)
                L2 = saVetv(i,6)
                Brand3 = saVetv(i,7)
                L3 = saVetv(i,8)

                dim i_dop0
                if saVetv(i,13) = 0 then i_dop0 = 0 else i_dop0 = 1

                if (dictWDB.Exists(Brand) and L>0) or (dictWDB.Exists(Brand2) and L2>0) or (dictWDB.Exists(Brand3) and L3>0)  then
                    saVetv(i,9)  = 0
                    saVetv(i,10) = 0
                    saVetv(i,11) = 0
                    saVetv(i,12) = 0

                    if dictWDB.Exists(Brand) then
                        set WDB1 = dictWDB(Brand)
                        saVetv(i,9) = L * WDB1.R0
                        saVetv(i,10) = L * WDB1.X0
                        saVetv(i,11) = L * WDB1.G0
                        saVetv(i,12) = L * WDB1.B0

                        if saVetv(i,13) = 0 and WDB1.i_dop > 0 and test_i_dop = 1 then
                            saVetv(i,13) = WDB1.i_dop
                            saVetv(i,14) = WDB1.i_dop*1.2
                            saVetv(i,15) = 1
                            saVetv(i,16) = 1
                        end if                    
                    end if

                    if dictWDB.Exists(Brand2) then
                        set WDB2 = dictWDB(Brand2)
                        saVetv(i,9) = saVetv(i,9) + L2 * WDB2.R0
                        saVetv(i,10) = saVetv(i,10) + L2 * WDB2.X0
                        saVetv(i,11) = saVetv(i,11) + L2 * WDB2.G0
                        saVetv(i,12) = saVetv(i,12) + L2 * WDB2.B0

                        if i_dop0 = 0 and WDB2.i_dop > 0 then
                            if saVetv(i,13) = 0 or saVetv(i,13) > WDB2.i_dop and test_i_dop = 1 then
                                saVetv(i,13) = WDB2.i_dop
                                saVetv(i,14) = WDB2.i_dop*1.2
                                saVetv(i,15) = 1
                                saVetv(i,16) = 1
                            end if 
                        end if     
                    end if
                    if dictWDB.Exists(Brand3) then
                        set WDB3 = dictWDB(Brand3)
                        saVetv(i,9) = saVetv(i,9) + L3 * WDB3.R0
                        saVetv(i,10) = saVetv(i,10) + L3 * WDB3.X0
                        saVetv(i,11) = saVetv(i,11) + L3 * WDB3.G0
                        saVetv(i,12) = saVetv(i,12)+ L3 * WDB3.B0

                        if i_dop0 = 0 and WDB3.i_dop > 0 then
                            if saVetv(i,13) = 0 or saVetv(i,13) > WDB3.i_dop and test_i_dop = 1 then
                                saVetv(i,13) = WDB3.i_dop
                                saVetv(i,14) = WDB3.i_dop*1.2
                                saVetv(i,15) = 1
                                saVetv(i,16) = 1
                            end if 
                        end if   
                    end if
                end if
            next 
            tVetv.readsafearray 2,Vetv_parametr,saVetv ' CSV_KOD: 0 - добавить, 1 - заменить 2 ообновить

            ' ДИНАМИКА
            '  если ВЛ двухцепная то в поле r0  или x0 перед запуском вписываем  значение 2 
        elseif tip_file = 2 then
                            ' 0, 1, 2,    3,4,     5, 6,    7, 8, 9,10,g-11,b-12,r0-13,x0-14 
            Vetv_parametr = "ip,iq,np,Brand,l,Brand2,l2,Brand3,l3,r,x,g,b,r0,x0"
            wires_DB_parametr = "Id,Brand,r0,x0,g0,b0"

            saWiresDB = tWiresDB.writesafearray(wires_DB_parametr,"000")
            saVetv = tVetv.writesafearray(Vetv_parametr,"000")


            Set dictWDB = CreateObject("Scripting.Dictionary")

            for i = 0 to UBound(saWiresDB)

                set WDB = new CWDB
                WDB.Id = saWiresDB(i,0)
                WDB.Brand = saWiresDB(i,1)
                WDB.R0 = saWiresDB(i,2)
                WDB.X0 = saWiresDB(i,3)
                WDB.G0 = saWiresDB(i,4)
                WDB.B0 = saWiresDB(i,5)

                dictWDB.Add WDB.Id,WDB
            next 
            dim chain_count
            for i = 0 to UBound(saVetv)

                Brand = saVetv(i,3)
                L = saVetv(i,4)
                Brand2 = saVetv(i,5)
                L2 = saVetv(i,6)
                Brand3 = saVetv(i,7)
                L3 = saVetv(i,8)
                chain_count = 1 'цепность 1 или 2 
                if saVetv(i,13) = 2 or saVetv(i,14) = 2 then chain_count = 2

                if (dictWDB.Exists(Brand) and L>0) or (dictWDB.Exists(Brand2) and L2>0) or (dictWDB.Exists(Brand3) and L3>0) then
                    saVetv(i,9)  = 0
                    saVetv(i,10) = 0
                    saVetv(i,11) = 0
                    saVetv(i,12) = 0
                    saVetv(i,13) = 0
                    saVetv(i,14) = 0

                    if dictWDB.Exists(Brand) then
                        set WDB1 = dictWDB(Brand)
                        saVetv(i,9) = L * WDB1.R0
                        saVetv(i,10) = L * WDB1.X0
                        saVetv(i,11) = L * WDB1.G0
                        saVetv(i,12) = -L * WDB1.B0

                        saVetv(i,13) = WDB1.R0 * L +  L * 0.15
                        if chain_count = 2 then saVetv(i,14) =  L * WDB1.X0  * 4.7
                        if chain_count = 1 then saVetv(i,14) =  L * WDB1.X0  *  3
                    end if

                    if dictWDB.Exists(Brand2) then
                        set WDB2 = dictWDB(Brand2)
                        saVetv(i,9) = saVetv(i,9) + L2 * WDB2.R0
                        saVetv(i,10) = saVetv(i,10) + L2 * WDB2.X0
                        saVetv(i,11) = saVetv(i,11) + L2 * WDB2.G0
                        saVetv(i,12) = -saVetv(i,12) - L2 * WDB2.B0

                        saVetv(i,13) = saVetv(i,13) + WDB2.R0 * L2 +  L2 * 0.15
                        if chain_count = 2 then saVetv(i,14) = saVetv(i,14) + L2 * WDB2.X0  * 3
                        if chain_count = 1 then saVetv(i,14) = saVetv(i,14) + L2 * WDB2.X0  * 4.7 
                    end if
                    if dictWDB.Exists(Brand3) then
                        set WDB3 = dictWDB(Brand3)
                        saVetv(i,9) = saVetv(i,9) + L3 * WDB3.R0
                        saVetv(i,10) = saVetv(i,10) + L3 * WDB3.X0
                        saVetv(i,11) = saVetv(i,11) + L3 * WDB3.G0
                        saVetv(i,12) = -saVetv(i,12)- L3 * WDB3.B0

                        saVetv(i,13) = saVetv(i,13) + WDB3.R0 * L3 +  L3 * 0.15
                        if chain_count = 2 then saVetv(i,14) = saVetv(i,14) + L3 * WDB3.X0  * 3
                        if chain_count = 1 then saVetv(i,14) = saVetv(i,14) + L3 * WDB3.X0  * 4.7 
                    end if
                end if
            next 
            tVetv.readsafearray 2,Vetv_parametr,saVetv ' CSV_KEY
        end if
    END SUB

    Class CWDB
        public Id
        public Brand
        public Brand_uhom
        public R0
        public X0
        public G0
        public B0
        public uhom
        public i_dop
    end Class
'////////////////////////////////////настроить графику /////////////////////////////////////////////////////////////////////////
    SUB grafik_setting_run ()
        if IE_ON = 0 then 
            rg2_on = Rastr.SendCommandMain (8,"0 режим, 1 ткз","0",0) 
            if rg2_on = 0 then call grafik_setting (true, true , true , true , true, true , true)
            if rg2_on = 1 then call grafik_setting (false, true , true, true , true, true , true )
        else  
            call grafik_setting (pi_IE.Document.getElementById("ID_1").Checked _ 
                               , pi_IE.Document.form_graf.CB_del_grad.Checked _ 
                               , pi_IE.Document.form_graf.CB_grad.Checked _ 
                               , pi_IE.Document.form_graf.CB_text.Checked _ 
                               , pi_IE.Document.form_graf.CB_color.Checked _ 
                               , pi_IE.Document.form_graf.CB_na.Checked _ 
                               , pi_IE.Document.form_graf.CB_sett.Checked )
        end if
    end Sub

    SUB grafik_setting (rg2_on , del_grad , add_grad, kor_text , kor_color ,  kor_na ,  kor_sett) ' rg2_on истина режим ложь ткз,
        'ТКЗ    слой 1-ткз , слой 2-Z    ,слой 3 - ,слой 4 - ,слой 5 - ,
        ' РЕЖИМ слой 1 режим,слой 2 Z,слой 3 дтн,слой 4 dmane,слой 5 -,

        'закомментированная ниже строчка сохраняет текущие настройки Текста в графики в ЦСВ файл 
        'Rastr.Tables("graph_settext").WriteCSV CSV_REPLNAMES, "D:\csv.csv", "tip,sx,sy,color,wid,zapret,napr", ";"
        '?? графика для районов - цвета

        'ГРАДИЕНТЫ

        if del_grad then 
            SET t_graph_grad = Rastr.Tables( "graph_grad" )
            t_graph_grad.size = 0
        end if

        if add_grad then 
            if rg2_on then 
                call Gradients_IU ()            
                call Gradients_kontrol ()'
                call Gradients_nga_npa ()
            else
                call GradTKZ () 'градиент ТКЗ
            end if
        end if
        'техт
        if kor_text then 
            if rg2_on then 
                call Text_rg2 ()'графика РЕЖИМА
            else
                call Text_tkz  () 'графика ТОКИ КЗ 'графика СОПРОТИВЛЕНИЯ ТКЗ
            end if
        end if

        if kor_color then  call graf_unom  ()
        if kor_na then   call graf_area_color ()
        if kor_sett then
            'узлы и ветви - черным, отмеченные узлы и ветви - зеленым, выделенные узлы и ветви - фиолетовым, выделять напряжения толщиной и цветом
            Rastr.Tables("graph_com").Cols("col_n_col").Z(0) = vbBLACK ' цвет по умалчанию
            Rastr.Tables("graph_com").Cols("col_v_col").Z(0) = vbBLACK  
            Rastr.Tables("graph_com").Cols("col_n_emb").Z(0) = 16711935 ' выделенные
            Rastr.Tables("graph_com").Cols("col_v_emb").Z(0) = 16711935    
            Rastr.Tables("graph_com").Cols("col_n_otm").Z(0) = 65280 ' отмеченные
            Rastr.Tables("graph_com").Cols("col_v_otm").Z(0) = 65280  
            ',col_scr
            Rastr.Tables("graph_com").Cols("uh_wid").Z(0) = 0
            Rastr.Tables("graph_com").Cols("uh_col").Z(0) = 0
            Rastr.Tables("graph_com").Cols("ar_col").Z(0) = 1
            ',nu_pol
            ',antial
            ',gradwidth
            ',intersections
            ',buf_mash
            ',bOutComplexTranses
            ',printWidthMultiplier
            ',hatchValue
            ',bMultiGensMode
            ',col_subst
        end if
    END SUB

    SUB GradTKZ  
        SET Table_graph_grad = Rastr.Tables( "graph_grad" )
        'ЗАЗЕМЛЕНИЕ
        if rastr.tables("node").cols.find("graf_tip0")> -1 then
            indx = Table_graph_grad.size
            Table_graph_grad.AddRow
                    'ndx/  поле/по отклонениям/Центр. знач/заливка(cделать в окне градиент и скопировать)/по ветвям/1 узлы- 0 ветви/название
                    'indx, field,  differ, diffvals, therest, vetvgrad, isnode, name 			  
            graph_grad indx, "graf_tip0", 0, "", "255n0.000n0.000;13041606n1.000n1.000;", 1, 1, "Заземление - выделить красным"
        end if
        if rastr.tables("node").cols.find("bsh0")> -1 then
            'Заземление b0 в узле
            indx = Table_graph_grad.size
            Table_graph_grad.AddRow
            graph_grad indx, "bsh0", 0, "", "16711935n0.000n-10000000000000000.000;16711935n0.410n-1.000;16777215n0.703n0.000;32768n1.000n1.000;", 1, 1, "Заземление: b0 в узле"
        end if        
        if rastr.tables("node").cols.find("tkz_3f")> -1 then
            'значения ТКЗ по узлам
            indx = Table_graph_grad.size
            Table_graph_grad.AddRow
            graph_grad indx, "tkz_3f", 0, "", "-1n0.000n0.000;16777215n0.125n9.000;6225838n0.141n10.000;255n0.356n30.000;4194432n0.559n40.000;0n1.000n100.000;", 1, 1, "Уровень тока 3ф КЗ"
        end if
        if rastr.tables("node").cols.find("tkz_3f_d")> -1 then
            'отклонение ТКЗ 3ф
            indx = Table_graph_grad.size
            Table_graph_grad.AddRow
            graph_grad indx, "tkz_3f_d", 0, "", "0n0.000n-4.000;16357224n0.300n-1.000;16439943n0.358n-0.300;65280n0.421n-0.100;16777215n0.499n0.000;65280n0.566n0.100;12040191n0.633n0.300;6447871n0.725n1.000;176n1.000n4.000;", 1, 1, "отклонение tkz_3f от  tkz_3f_id"
        end if
        if rastr.tables("node").cols.find("tkz_1f_d")> -1 then
            'отклонение ТКЗ 1ф
            indx = Table_graph_grad.size
            Table_graph_grad.AddRow
            graph_grad indx, "tkz_1f_d", 0, "", "0n0.000n-4.000;16357224n0.300n-1.000;16439943n0.358n-0.300;65280n0.421n-0.100;16777215n0.499n0.000;65280n0.566n0.100;12040191n0.633n0.300;6447871n0.725n1.000;176n1.000n4.000;", 1, 1, "отклонение tkz_1f от  tkz_1f_id"
        end if

        call Gradients_na_npa_sel ()

        '!!!ВЕТВИ!!!

        if rastr.tables("vetv").cols.find("x0_x")> -1 then
            'отношение x0/x
            indx = Table_graph_grad.size
            Table_graph_grad.AddRow
            graph_grad indx, "x0_x", 0, "", "-1n0.000n0.000;0n0.127n0.500;16777215n0.328n1.000;8454016n0.584n3.000;255n0.785n4.500;16711680n1.000n100000.000;", 0, 0, "отношение x0/x"
        else
            msgbox "не найдено поле  x0_x в таблице vetv"
        end if

        if rastr.tables("vetv").cols.find("MiGr")> -1 then
            'отношение x0/x
            indx = Table_graph_grad.size
            Table_graph_grad.AddRow
            graph_grad indx, "MiGr", 0, "", "-1n0.000n0.000;16711935n0.123n1.000;16711935n1.000n10000000000000.000;", 0, 0, "наличие магнитной связи"
        else
            msgbox "не найдено поле  MiGr в таблице vetv"
        end if
    END SUB

    SUB Gradients_na_npa_sel ()
        SET Table_graph_grad = Rastr.Tables( "graph_grad" )
        if rastr.tables("node").cols.find("npa")> -1 then
            indx = Table_graph_grad.size
            Table_graph_grad.AddRow
            graph_grad indx, "npa", 0, "", "16777215n0.000n0.999;8421440n1.000n1.000;16777215n1.001n1000.000;", 1, 1, "выделение npa=1"
        end if
        if rastr.tables("node").cols.find("na")> -1 then
            
            indx = Table_graph_grad.size
            Table_graph_grad.AddRow
            graph_grad indx, "na", 0, "", "-1n0.000n0.500;255n0.297n1.000;16711680n0.562n2.000;16777215n1.000n2.500;", 1, 1, "выделение na=1| na=2"
        end if
    END SUB

    SUB Gradients_kontrol  
        SET Table_graph_grad = Rastr.Tables( "graph_grad" )
        if rastr.tables("vetv").cols.find("gD")> -1 then
            indx = Table_graph_grad.size
            Table_graph_grad.AddRow
                        'ndx,  поле,  по отклонениям  Центр. знач.   заливка(cделать в окне градиент и скопировать    по ветвям   1 узлы- 0 ветви   название
            graph_grad     indx, "gD",    0,             "",            "-1n0.000n0.000;61680n1.000n1.000;",        			     1,           0,          "vetv disable"
        end if
        if rastr.tables("vetv").cols.find("gD")> -1 then
            indx = Table_graph_grad.size
            Table_graph_grad.AddRow
                        'ndx,  поле,  по отклонениям  Центр. знач.   заливка(cделать в окне градиент и скопировать    по ветвям   1 узлы- 0 ветви   название
            graph_grad     indx, "gC",    0,             "",            "-1n0.000n0.000;61680n1.000n1.000;",        			     1,           0,          "vetv control"
        end if
        if rastr.tables("node").cols.find("gC")> -1 then
            indx = Table_graph_grad.size
            Table_graph_grad.AddRow
            graph_grad indx  , "gC",    0,             "",            "-1n0.000n0.000;8421440n1.000n1.000;",           				   1,           1,          "node control"
        end if
        if rastr.tables("node").cols.find("gD")> -1 then
            indx = Table_graph_grad.size
            Table_graph_grad.AddRow
            graph_grad indx  , "gD",    0,             "",            "-1n0.000n0.000;12566429n0.251n1.000;8421440n1.000n12.000;", 	1,           1,          "node disable"  
        end if  
        if rastr.tables("vetv").cols.find("transit")> -1 then
            indx = Table_graph_grad.size
            Table_graph_grad.AddRow
            graph_grad indx  , "transit",    0,             "",            "-1n0.000n0.000;8421440n1.000n1.000;"                      , 1,           0,          "vetv transit"  
        end if
        if rastr.tables("node").cols.find("transit")> -1 then
            indx = Table_graph_grad.size
            Table_graph_grad.AddRow
            graph_grad indx  , "transit",    0,             "",            "65535n0.000n-1.000;16777215n0.325n0.000;8421440n1.000n1.000;" , 0,           1,          "node transit"  
        end if

    END SUB

    SUB Gradients_nga_npa  ()
        SET Table_graph_grad = Rastr.Tables( "graph_grad" )
        if rastr.tables("node").cols.find("nga")> -1 then
            indx = Table_graph_grad.size
            Table_graph_grad.AddRow
                        'ndx,  поле,  по отклонениям  Центр. знач.   заливка(cделать в окне градиент и скопировать    по ветвям   1 узлы- 0 ветви   название
            graph_grad     indx, "nga",    0,             "",            "16777215n0.000n0.000;8454016n0.047n1.000;33023n0.084n2.000;16776960n0.114n3.000;4227072n0.151n4.000;16711808n0.179n5.000;32896n0.211n6.000;16453026n0.237n7.000;16744448n0.280n8.000;8454143n0.326n9.000;8421631n0.373n10.000;4194432n0.429n11.000;11974326n0.479n12.000;16711935n0.534n13.000;16744448n0.590n14.000;8235685n0.655n15.000;10485760n0.722n16.000;12615808n0.769n17.000;4194432n0.830n18.000;33023n0.894n19.000;4194432n0.938n20.000;8404992n0.968n999.000;0n1.000n1000.000;",        			     1,           1,          "nga"
        end if

        if rastr.tables("node").cols.find("npa")> -1 then
            indx = Table_graph_grad.size
            Table_graph_grad.AddRow
                        'ndx,  поле,  по отклонениям  Центр. знач.   заливка(cделать в окне градиент и скопировать    по ветвям   1 узлы- 0 ветви   название
            graph_grad     indx, "npa",    0,             "",            "0n0.000n0.000;8454016n0.047n1.000;33023n0.084n2.000;16776960n0.114n3.000;4227072n0.151n4.000;16711808n0.179n5.000;32896n0.211n6.000;16453026n0.237n7.000;16744448n0.280n8.000;8454143n0.326n9.000;8421631n0.373n10.000;4194432n0.429n11.000;11974326n0.479n12.000;16711935n0.534n13.000;16744448n0.590n14.000;8235685n0.655n15.000;10485760n0.722n16.000;12615808n0.769n17.000;4194432n0.830n18.000;33023n0.894n19.000;4194432n0.938n20.000;8404992n0.968n999.000;16777215n1.000n1000.000;",        			     1,           1,          "npa"
        end if
    END SUB

    SUB Gradients_IU 
        dim Table_graph_grad
        SET Table_graph_grad = Rastr.Tables( "graph_grad" )

        if rastr.tables("vetv").cols.find("i_zag")> -1 then
            indx = Table_graph_grad.size
            Table_graph_grad.AddRow
                        'ndx,  поле,  по отклонениям  Центр. знач.   заливка(cделать в окне градиент и скопировать    по ветвям   1 узлы- 0 ветви   название
            graph_grad     indx, "i_zag",    0,             "",            "-1n0.000n0.000;16777215n0.615n70.000;32768n0.754n99.000;9606394n0.770n100.000;255n1.000n130.000;",  1,      0,  "I"
        end if
        if rastr.tables("vetv").cols.find("i_zag_av")> -1 then
            indx = Table_graph_grad.size
            Table_graph_grad.AddRow
            graph_grad indx, "i_zag_av",    0,             "",            "-1n0.000n0.000;16777215n0.615n70.000;32768n0.754n99.000;9606394n0.770n100.000;255n1.000n130.000;",  1,      0,  "I_av"
        end if
        if rastr.tables("node").cols.find("otv")> -1 then
            indx = Table_graph_grad.size
            Table_graph_grad.AddRow
            graph_grad indx  , "otv",    0,             "",            "128n0.000n-30.000;255n0.199n-20.000;16777215n0.304n-5.000;16777215n0.566n12.000;65280n0.839n15.000;16384n1.000n30.000;", 1,  1,   "U" 
        end if            
    END SUB
    'основная рабочая подпрограмма внесения градиента по отклонению напряжения прямой п-сти от номинального напряжения
    SUB graph_grad ( indx, field, differ, diffvals, therest, vetvgrad, isnode, name )
        SET Table_graph_grad = Rastr.Tables( "graph_grad" )
            SET graph_grad_Col_field    = Table_graph_grad.Cols("field")
            SET graph_grad_Col_differ   = Table_graph_grad.Cols("differ")
            SET graph_grad_Col_diffvals = Table_graph_grad.Cols("diffvals")
            SET graph_grad_Col_therest  = Table_graph_grad.Cols("therest")
            SET graph_grad_Col_vetvgrad = Table_graph_grad.Cols("vetvgrad")
            SET graph_grad_Col_isnode   = Table_graph_grad.Cols("isnode")
            SET graph_grad_Col_name     = Table_graph_grad.Cols("name")
        graph_grad_Col_field.Z(    indx) = field
        graph_grad_Col_differ.Z(   indx) = differ
        graph_grad_Col_diffvals.Z( indx) = diffvals
        graph_grad_Col_therest.Z(  indx) = therest
        graph_grad_Col_vetvgrad.Z( indx) = vetvgrad
        graph_grad_Col_isnode.Z(   indx) = isnode
        graph_grad_Col_name.Z(     indx) = name
    END SUB

    SUB Text_tkz 'внесения настроек в Графика-Текст ТОКИ КЗ
        ' узлы - "node"
        ' Коррекция таблицы graph_settext. Для rst: 1 слой - расчетные значения, 2 - параметры схемы, 3 - tkz_3f_d
        dim OFFSET
        OFFSET = 14*0 ' слой 1
        '                          тип       X     Y  цвет шрифт видимость(0 да,1 нет)  направление расположение_текста
        graf_txt_kor OFFSET + 0,  "ny",        34, 37, VIOLET, 1, 1, 0, 2
        graf_txt_kor OFFSET + 1,  "dname",      50, 50, vbBLACK,  1, 0, 0, 1
        graf_txt_kor OFFSET + 2,  "vras",      24, 27, vbBLACK,  1, 1, 0, 3
        graf_txt_kor OFFSET + 3,  "tkz_3i1f",  45, 50, vbRED,    1, 0, 0, 5
        graf_txt_kor OFFSET + 4,  "1fkz"     , 34, 37, BLUE,   1, 1, 0, 6
        graf_txt_kor OFFSET + 5,  "uhom_kV",   40, 40, vbBLACK,  1, 0, 0, 7
        graf_txt_kor OFFSET + 6,  "grfi012",   13, 17, vbBLACK,  1, 1, 0, 4
        ' ветви - "vetv"
        graf_txt_kor OFFSET + 7,  "tkz_3i1f_ip", 35, 40, vbRED,  1, 0, 0, 8
        graf_txt_kor OFFSET + 8,  "tkz_3i1f_iq", 35, 40, vbRED,  1, 0, 0, 9
        
        graf_txt_kor OFFSET + 10, "1fkz_ip", 20, 27,  VIOLET,  1, 1, 0, 9
        graf_txt_kor OFFSET + 9, "1fkz_iq", 20, 27,   VIOLET,  1, 1, 0, 10
        graf_txt_kor OFFSET + 11, "1fkz_ip", 20, 27,  VIOLET,  1, 1, 0, 11

        ' внесения настроек в Графика-Текст СОПРОТИВЛЕНИЯ
        OFFSET = 14*1 ' слой 2
        '                 тип       X     Y  цвет шрифт видимость(0 да,1 нет)  направление расположение_текста
        '                 тип          X   Y   цвет    ш  в  н р
        graf_txt_kor OFFSET + 0,  "ny",        30, 40, vbBLACK, 1, 0, 0, 2
        graf_txt_kor OFFSET + 1,  "name",      30, 50, vbBLACK,  1, 0, 0, 1
        graf_txt_kor OFFSET + 2,  "vras",      24, 27, vbBLACK,  1, 1, 0, 3
        graf_txt_kor OFFSET + 3,  "tkz_3i1f",  45, 50, vbRED,    1, 1, 0, 5
        graf_txt_kor OFFSET + 4,  "1fkz"     , 34, 37, BLUE,   1, 1, 0, 6
        graf_txt_kor OFFSET + 5,  "uhom_kV",   40, 40, vbBLACK,  1, 1, 0, 7
        graf_txt_kor OFFSET + 6,  "grfi012",   13, 17, vbBLACK,  1, 1, 0, 4
        ' ветви - "vetv"
        graf_txt_kor OFFSET + 7,  "z", 20, 40, vbRED,  1, 0, 0, 8
        graf_txt_kor OFFSET + 8,  "z0", 20, 40, BLUE,  1, 0, 0, 10
        
        graf_txt_kor OFFSET + 10, "ktr", 20, 40,  green,  1, 0, 0, 11
        graf_txt_kor OFFSET + 9, "1fkz_iq", 20, 27,   VIOLET,  1, 1, 0, 10
        graf_txt_kor OFFSET + 11, "1fkz_ip", 20, 27,  VIOLET,  1, 1, 0, 11

        OFFSET = 14*2 ' слой 3
        '                          тип       X     Y  цвет шрифт видимость(0 да,1 нет)  направление расположение_текста
        graf_txt_kor OFFSET + 0,  "ny",        34, 37, VIOLET, 1, 1, 0, 2
        graf_txt_kor OFFSET + 1,  "name",      50, 50, vbBLACK,  1, 0, 0, 1
        graf_txt_kor OFFSET + 2,  "vras",      24, 27, vbBLACK,  1, 1, 0, 3
        graf_txt_kor OFFSET + 3,  "tkz_3f_d",  45, 50, vbRED,    1, 0, 0, 5
        graf_txt_kor OFFSET + 4,  "1fkz"     , 34, 37, green,   1, 1, 0, 6
        graf_txt_kor OFFSET + 5,  "uhom_kV",   40, 40, vbBLACK,  1, 0, 0, 7
        graf_txt_kor OFFSET + 6,  "grfi012",   13, 17, vbBLACK,  1, 1, 0, 4
        ' ветви - "vetv"
        graf_txt_kor OFFSET + 7,  "tkz_3i1f_ip", 35, 40, vbRED,  1, 0, 0, 8
        graf_txt_kor OFFSET + 8,  "tkz_3i1f_iq", 35, 40, vbRED,  1, 0, 0, 9
        
        graf_txt_kor OFFSET + 10, "1fkz_ip", 20, 27,  VIOLET,  1, 1, 0, 9
        graf_txt_kor OFFSET + 9, "1fkz_iq", 20, 27,   VIOLET,  1, 1, 0, 10
        graf_txt_kor OFFSET + 11, "1fkz_ip", 20, 27,  VIOLET,  1, 1, 0, 11
    END SUB

    SUB Text_rg2 'внесения настроек в Графика-Текст РЕЖИМ
        'коррекция таблицы graph_settext. Для rg2 1 слой - расчетные значения, 2 - параметры схемы, 3 - ДТН, 4 - Дисп наименование
        dim OFFSET
        OFFSET = 14*0 ' слой 1 РЕЗУЛЬТАТЫ РАСЧЕТА
        '                 тип       X     Y  цвет шрифт видимость(0 да,1 нет)  направление расположение_текста
        graf_txt_kor OFFSET + 0,  "ny",        34, 37, VIOLET, 1, 1, 0, 2 ' node 1 лев низ| 2 лев верх|3 прав низ|4 прав верх| 5 Нагр| 6 Ген| 7 Шунт
        ' узлы - "node"
        graf_txt_kor OFFSET + 1,  "name",      50, 50, vbBLACK,  1, 0, 0, 1
        graf_txt_kor OFFSET + 2,  "vras",      34, 37, BLUE,   1, 0, 0, 3
        graf_txt_kor OFFSET + 3,  "sn",        34, 37, vbBLACK,  1, 0, 0, 5
        graf_txt_kor OFFSET + 4,  "sg"     ,   34, 37, VIOLET, 1, 0, 0, 6
        graf_txt_kor OFFSET + 5,  "ssh",       34, 37, vbBLACK,  1, 0, 0, 7
        graf_txt_kor OFFSET + 6,  "delta",     34, 37, vbBLACK,  1, 1, 0, 4
        ' ветви - "vetv"
        if rastr.tables("vetv").cols.find("S_max")> -1 then graf_txt_kor OFFSET + 7,  "S_max",     34, 37, vbBLACK,  1, 0, 1, 8 ' vetv 8 лев верх| 9 прав верх|10 лев низ|11 прав низ|
        if rastr.tables("vetv").cols.find("S_max")<  0 then graf_txt_kor OFFSET + 7,  "slb",       34, 37, vbBLACK,  1, 0, 1, 8 ' vetv 8 лев верх| 9 прав верх|10 лев низ|11 прав низ|

        if rastr.tables("vetv").cols.find("i_max")> -1 then graf_txt_kor OFFSET + 8,  "i_max",     34, 37, vbRED,    1, 0, 0, 9 '
        if rastr.tables("vetv").cols.find("i_max")<  0 then graf_txt_kor OFFSET + 8,  "ib",        34, 37, vbRED,    1, 0, 0, 9 '

        graf_txt_kor OFFSET + 10, "sle",       34, 37, VIOLET,  1, 1, 0, 9 '
        graf_txt_kor OFFSET + 9, "sle",        34, 37, VIOLET,  1, 1, 0, 10
        graf_txt_kor OFFSET + 11, "sle",   34, 37, VIOLET,  1, 1, 0, 11

        OFFSET = 14*1 ' слой 2 ПАРАМЕТРЫ СХЕМЫ
        graf_txt_kor OFFSET + 0,  "ny",        20, 50, vbBLACK,  1, 0, 0, 2
        graf_txt_kor OFFSET + 1,  "name",      20, 50, vbBLACK,  1, 0, 0, 1
        graf_txt_kor OFFSET + 2,  "vras",      34, 37, BLUE,   1, 1, 0, 3
        graf_txt_kor OFFSET + 3,  "sn",        34, 37, vbBLACK,  1, 1, 0, 5
        graf_txt_kor OFFSET + 4,  "sg"     ,   34, 37, VIOLET, 1, 1, 0, 6
        graf_txt_kor OFFSET + 5,  "bsh",       34, 37, vbBLACK,  1, 0, 0, 7
        graf_txt_kor OFFSET + 6,  "delta",     34, 37, vbBLACK,  1, 1, 0, 4
        ' ветви - "vetv"
        graf_txt_kor OFFSET + 7,  "np",        30, 40, vbBLACK,   1, 0, 0, 9
        graf_txt_kor OFFSET + 8,  "groupid",   30, 40, vbRED,     1, 0, 0, 11
        graf_txt_kor OFFSET + 10, "z",         20, 37, VIOLET,  1, 0, 0, 8
        graf_txt_kor OFFSET + 9, "b",          20, 37, VIOLET,  1, 0, 0, 10
        graf_txt_kor OFFSET + 11, "sle",       34, 37, VIOLET,  1, 1, 0, 11

        OFFSET = 14*2 ' слой 3 ДТН
        graf_txt_kor OFFSET + 0,  "ny",        30, 50, VIOLET, 1, 1, 0, 2
        graf_txt_kor OFFSET + 1,  "name",      30, 30, vbBLACK,  1, 0, 0, 1
        graf_txt_kor OFFSET + 2,  "vras",      34, 37, BLUE,   1, 1, 0, 3
        graf_txt_kor OFFSET + 3,  "sn",        34, 37, vbBLACK,  1, 1, 0, 5
        graf_txt_kor OFFSET + 4,  "sg"     ,   34, 37, VIOLET, 1, 1, 0, 6
        graf_txt_kor OFFSET + 5,  "bsh",       34, 37, vbBLACK,  1, 1, 0, 7
        graf_txt_kor OFFSET + 6,  "delta",     34, 37, vbBLACK,  1, 1, 0, 4
        ' ветви - "vetv"
        graf_txt_kor OFFSET + 7,  "txt_ddtn",     20, 30, vbBLACK,   1, 0, 0, 9
        graf_txt_kor OFFSET + 8,  "txt_adtn",     20, 30, vbRED,     1, 0, 0, 11
        graf_txt_kor OFFSET + 10, "txt_ddtn_zag", 20, 30, vbBLACK,   1, 0, 0, 8
        graf_txt_kor OFFSET + 9,  "txt_adtn_zag", 20, 30, vbRED,     1, 0, 0, 10
        graf_txt_kor OFFSET + 11, "sle",          34, 37, VIOLET,  1, 1, 0, 11

        OFFSET = 14*3 ' слой 4 Дисп наименование 
        '                 тип       X     Y  цвет шрифт видимость(0 да,1 нет)   направление расположение_текста
        graf_txt_kor OFFSET + 0,  "ny",        30, 50, VIOLET, 1, 1, 0, 2
        graf_txt_kor OFFSET + 1,  "dname",     50, 50, vbBLACK,  1, 0, 0, 1
        graf_txt_kor OFFSET + 2,  "vras",      34, 37, BLUE,   1, 1, 0, 3
        graf_txt_kor OFFSET + 3,  "sn",        34, 37, vbBLACK,  1, 1, 0, 5
        graf_txt_kor OFFSET + 4,  "sg"     ,   34, 37, VIOLET, 1, 1, 0, 6
        graf_txt_kor OFFSET + 5,  "bsh",       34, 37, vbBLACK,  1, 1, 0, 7
        graf_txt_kor OFFSET + 6,  "delta",     34, 37, vbBLACK,  1, 1, 0, 4
        ' ветви - "vetv"
        graf_txt_kor OFFSET + 7,  "np",        40, 40, vbBLACK,   1, 1, 0, 9
        graf_txt_kor OFFSET + 8,  "groupid",   40, 40, vbRED,     1, 1, 1, 11
        graf_txt_kor OFFSET + 10, "dname",     15, 35, VIOLET,  1, 0, 0, 8
        graf_txt_kor OFFSET + 9, "b",          34, 37, VIOLET,  1, 1, 0, 10
        graf_txt_kor OFFSET + 11, "sle",       34, 37, VIOLET,  1, 1, 0, 11
        OFFSET = 14*4 ' слой 4 автоматика
        '                 тип       X     Y  цвет шрифт видимость(0 да,1 нет)   направление расположение_текста
        graf_txt_kor OFFSET + 0,  "ny",        30, 50, vbCyan, 1, 0, 0, 2
        graf_txt_kor OFFSET + 1,  "name",      34, 37, vbCyan ,  1, 0, 0, 1
        graf_txt_kor OFFSET + 2,  "vras",      34, 37, BLUE,   1, 1, 0, 3
        graf_txt_kor OFFSET + 3,  "AutoBsh",   50, 50, vbRED,  1, 0, 0, 5
        graf_txt_kor OFFSET + 4,  "sg"     ,   34, 37, VIOLET, 1, 1, 0, 6
        graf_txt_kor OFFSET + 5,  "bsh",       34, 37, vbBLACK,  1, 1, 0, 7
        graf_txt_kor OFFSET + 6,  "delta",     34, 37, vbBLACK,  1, 1, 0, 4
        ' ветви - "vetv"
        graf_txt_kor OFFSET + 7,  "automatika",        50, 50, vbBLACK,   1, 0, 0, 9
        graf_txt_kor OFFSET + 8,  "otkl_add",          50, 50, vbRED,     1, 0, 0, 11
        graf_txt_kor OFFSET + 10, "remont_add",        50, 50, VIOLET,  1, 0, 0, 8
        graf_txt_kor OFFSET + 9, "b",                  34, 37, VIOLET,  1, 1, 0, 10
        graf_txt_kor OFFSET + 11, "sle",               34, 37, VIOLET,  1, 1, 0, 11
    END SUB

    sub graf_unom
        dim tgraf_unom
        set  tgraf_unom = Rastr.Tables( "graph_unom" )
        tgraf_unom.setsel ("")
        tgraf_unom.delrows
        'СЕТЬ
        addrow_graf_unom (array(0.4,1,  rgb(127,127,127),0  ))'  
        addrow_graf_unom (array(3,  1,  rgb(0,102,0),0  ))
        addrow_graf_unom (array(6,  1,  rgb(0,102,0),0  ))
        addrow_graf_unom (array(10, 1,  rgb(102,0,204),0  ))
        addrow_graf_unom (array(15, 1,  rgb(160,32,240),0  ))
        addrow_graf_unom (array(20, 1,  rgb(160,32,240),0  ))

        addrow_graf_unom (array(35, 1,  rgb(102,51,0), 0  ))
        addrow_graf_unom (array(110,1,  rgb(0,153,255),0  ))
        addrow_graf_unom (array(150,1,  rgb(170,150,0),0  ))
        addrow_graf_unom (array(220,2,  rgb(181,181,0),   0  ))
        addrow_graf_unom (array(330,2,  rgb(0,170,0),   0  ))
        addrow_graf_unom (array(400,3,  rgb(255,100,30),   0  ))
        addrow_graf_unom (array(500,3,  rgb(213,0,0),     0  ))
        addrow_graf_unom (array(750,4,  rgb(0,0,168),     0  ))
        addrow_graf_unom (array(800,4,  rgb(0,0,168),     0  ))
        addrow_graf_unom (array(1150,4, rgb(205,138,255),     0  ))
        ' ГЕН
        addrow_graf_unom (array(27, 1,   rgb(102,51,0), 0  ))
        addrow_graf_unom (array(24, 1,   rgb(102,51,0), 0  ))
        addrow_graf_unom (array(21, 1,   rgb(255,100,30), 0  ))
        addrow_graf_unom (array(18, 1,   rgb(255,100,30), 0  ))
        addrow_graf_unom (array(15.75, 1,rgb(255,51,204), 0  ))
        addrow_graf_unom (array(13.8, 1 ,rgb(255,51,204), 0  ))
        addrow_graf_unom (array(10.5, 1, rgb(102,0,204), 0  ))
        addrow_graf_unom (array(6.3, 1,  rgb(0,102,0), 0  ))
        addrow_graf_unom (array(3.15, 1, rgb(0,102,0), 0  ))

    end sub

    sub addrow_graf_unom (arr) 'Arr=array(unom,wid(толщина),color,viz(вид))
        set  tgraf_unom = Rastr.Tables( "graph_unom" )
        tgraf_unom.addrow
        tgraf_unom.cols ("unom").z (tgraf_unom.count - 1)  = arr (0) 
        tgraf_unom.cols ("wid").z (tgraf_unom.count - 1)   = arr (1) 
        tgraf_unom.cols ("color").z (tgraf_unom.count - 1) = arr (2) 
        tgraf_unom.cols ("viz").z (tgraf_unom.count - 1)   = arr (3) 
    end sub

    SUB graf_txt_kor( indx, tip, sx, sy, color, wid, zapret, napr , ntip )
        'indx   - индекс с 0 в талице "Графика - Параметры - Текст"
        'tip    - поле в соответсвующей таблице растра для отображения
        'sx     - размер шрифта по ширине
        'sy     - размер шрифта по высоте
        'color  - цвет
        'wid    - индекс шрифта с 0 в колонке шрифт
        'zapret - видимость параметра (0 - видно, 1-нет) 
        'napr   - направление параметра (0 - не видно, 1-есть ) 
        'ntip   -  узел   1 лево низ, 2 лево верх, 3 право низ, 4 право верх
        '          ветвь 10           8            11           9           
        '         5 нагрузка ,6 ген, 7 шунт, 
        SET Table_graph_settext = Rastr.Tables("graph_settext")
            SET graph_settext_Col_tip    = Table_graph_settext.Cols("tip")
            SET graph_settext_Col_sx     = Table_graph_settext.Cols("sx")
            SET graph_settext_Col_sy     = Table_graph_settext.Cols("sy")
            SET graph_settext_Col_color  = Table_graph_settext.Cols("color")
            SET graph_settext_Col_wid    = Table_graph_settext.Cols("wid")
            SET graph_settext_Col_zapret = Table_graph_settext.Cols("zapret")
            SET graph_settext_Col_napr   = Table_graph_settext.Cols("napr")
            SET graph_settext_Col_ntip   = Table_graph_settext.Cols("ntip")
        graph_settext_Col_tip.Z(    indx ) = tip
        graph_settext_Col_sx.Z(     indx ) = sx
        graph_settext_Col_sy.Z(     indx ) = sy
        graph_settext_Col_color.Z(  indx ) = color
        graph_settext_Col_wid.Z(    indx ) = wid
        graph_settext_Col_zapret.Z( indx ) = zapret
        graph_settext_Col_napr.Z(   indx ) = napr
        graph_settext_Col_ntip.Z(   indx ) = ntip
    END SUB

    SUB graf_area_color ()
        dim Table_graf_area , nna
        SET Table_graf_area = Rastr.Tables("graph_area")
        Table_graf_area.size = 0

        array_rgb =  array ( rgb(127,127,127) _
                    ,   rgb(0,102,0)          _
                    ,   rgb(102,0,204)        _
                    ,   rgb(160,32,240)       _
                    ,   rgb(102,51,0)         _
                    ,   rgb(0,153,255)        _
                    ,   rgb(170,150,0)        _
                    ,   rgb(181,181,0)        _
                    ,   rgb(0,170,0)          _
                    ,   rgb(255,100,30)       _
                    ,   rgb(213,0,0)          _
                    ,   rgb(0,0,168)          _
                    ,   rgb(205,138,255)      _
                    ,   rgb(255,51,204)       _
                    ,   rgb(255,0,0)          _
                    ,   rgb(139,0,0)          _
                    ,   rgb(205,92,92)        _
                    ,   rgb(199,21,133)       _
                    ,   rgb(255,140,0)        _
                    ,   rgb(255,0,255)        _
                    ,   rgb(186,85,211)       _
                    ,   rgb(75,0,130)         _
                    ,   rgb(72,61,139)        _
                    ,   rgb(139,69,19)        _
                    ,   rgb(0,0,0)            _
                    ,   rgb(0,128,0)          _
                    ,   rgb(0,0,128)          _
                    ,   rgb(47,79,79)         _
                    ,   rgb(32,178,170)       _
                    ,   rgb(0,100,0)          _
                    ,   rgb(154,205,50)       _
                    ,   rgb(0,250,154)  )

        SET Tab_area = Rastr.Tables("area")
        n_rgb = 0
        for i = 0 to Tab_area.size-1
             call addrow_graf_area (array( Tab_area.cols("na").z(i) ,   array_rgb(n_rgb) ,0  ))
            n_rgb = n_rgb+1
            if n_rgb > ubound (array_rgb) then n_rgb = 0
        next
    END SUB

    sub addrow_graf_area (arr) 'Arr=array(unom,wid(толщина),color,viz(вид))
        set  tgraf_area = Rastr.Tables( "graph_area" )
        tgraf_area.addrow
        tgraf_area.cols ("na").z (tgraf_area.count - 1)    = arr (0) 
        tgraf_area.cols ("color").z (tgraf_area.count - 1) = arr (1) 
        tgraf_area.cols ("viz").z (tgraf_area.count - 1)   = arr (2) 
    end sub
'////////////////////////////////////изм тхт////////////////////////////////////////////////////////
    sub zamena_txt_zad ()
        call zamena_txt (pi_IE.document.form_txt_izm.name_tab.value _
                     , pi_IE.document.form_txt_izm.name_col.value  _
                     , pi_IE.document.form_txt_izm.txt_iz.value _ 
                     , pi_IE.document.form_txt_izm.txt_na.value   _ 
                     , pi_IE.document.form_txt_izm.CB_dell.checked)
    end sub

    sub zamena_txt (tabl , col  , txt_iz, txt_na , dell)
        set tab = rastr.tables (tabl)
        set ct = tab.cols(col)
        for i = 0 to tab.size-1
        
            if instr(ct.zs(i),txt_iz)> 0 then 
            
                if dell then 
                    ct.zs(i) = "" 
                else 
                    ct.zs(i) = replace (ct.zs(i) ,txt_iz ,txt_na )
                end if
            end if
        next
    end sub
'////////////////////////////////////деление ветви////////////////////////////////////////////////////////
    sub add_node_in_vetv_run ()

        call add_node_in_vetv  (cdbl(pi_IE.Document.form_GL.Kef_del.value ))
    end sub

    sub add_node_in_vetv (Kef_del) ' добавить промежуточный узел в ветви и поделить  сопротивления пропорционально Kef_del(нр x_ip * Kef_del,  x_iq * (1-Kef_del))
        if Kef_del> 1 then call msgbox ("Kef = " + cstr( Kef) + " , а должна быть меньше 1") : exit sub
        if Kef_del< 0 then call msgbox ("Kef = " + cstr( Kef) + " , а должна быть больше 0") : exit sub
        dim t_node , t_vetv
        set t_vetv = rastr.tables("vetv")
        call t_vetv.setsel ("sel")
        if not t_vetv.count = 1 then call msgbox ("отмечено ветвей: " + cstr( t_vetv.count) + " , а должна быть отмечена только одна") : exit sub
        iv = t_vetv.findnextsel (-1)
        iv2=iv+1
        ip_i = t_vetv.cols("ip").z(iv)
        ' iq_i = t_vetv.cols("iq").z(iv)
        ' np_i = t_vetv.cols("np").z(iv)

        t_vetv.DupRow(iv)

        set t_node = rastr.tables("node")
        call t_node.setsel ("ny="& cstr(ip_i))
        i_n = t_node.findnextsel (-1)

        ny_new = fNode_add ("" , t_node.cols("na").z(i_n) , t_node.cols("npa").z(i_n) , 0, t_node.cols("uhom").z(i_n), ip_i-1) ' name , na , npa , nga , uhom , ny 

        t_vetv.cols("iq").z(iv) = ny_new
        t_vetv.cols("ip").z(iv2) = ny_new

        t_vetv.cols("r").z(iv) = t_vetv.cols("r").z(iv) * Kef_del
        t_vetv.cols("x").z(iv) = t_vetv.cols("x").z(iv) * Kef_del
        t_vetv.cols("b").z(iv) = t_vetv.cols("b").z(iv) * Kef_del
        t_vetv.cols("g").z(iv) = t_vetv.cols("g").z(iv) * Kef_del

        if t_vetv.Cols.find("r0") > 0 then t_vetv.cols("r0").z(iv) = t_vetv.cols("r0").z(iv) * Kef_del
        if t_vetv.Cols.find("x0") > 0 then t_vetv.cols("x0").z(iv) = t_vetv.cols("x0").z(iv) * Kef_del
        if t_vetv.Cols.find("b0") > 0 then t_vetv.cols("b0").z(iv) = t_vetv.cols("b0").z(iv) * Kef_del
        if t_vetv.Cols.find("g0") > 0 then t_vetv.cols("g0").z(iv) = t_vetv.cols("g0").z(iv) * Kef_del

        t_vetv.cols("r").z(iv2) = t_vetv.cols("r").z(iv2) * (1-Kef_del)
        t_vetv.cols("x").z(iv2) = t_vetv.cols("x").z(iv2) * (1-Kef_del)
        t_vetv.cols("b").z(iv2) = t_vetv.cols("b").z(iv2) * (1-Kef_del)
        t_vetv.cols("g").z(iv2) = t_vetv.cols("g").z(iv2) * (1-Kef_del)

        if t_vetv.Cols.find("r0") > 0 then t_vetv.cols("r0").z(iv2) = t_vetv.cols("r0").z(iv2) * (1-Kef_del)
        if t_vetv.Cols.find("x0") > 0 then t_vetv.cols("x0").z(iv2) = t_vetv.cols("x0").z(iv2) * (1-Kef_del)
        if t_vetv.Cols.find("b0") > 0 then t_vetv.cols("b0").z(iv2) = t_vetv.cols("b0").z(iv2) * (1-Kef_del)
        if t_vetv.Cols.find("g0") > 0 then t_vetv.cols("g0").z(iv2) = t_vetv.cols("g0").z(iv2) * (1-Kef_del)
    end sub