﻿$engine JScript
$uname InternalFormExplorer
$dname Исследование форм 1С
$addin stdlib

// Александр Орефков
// Скрипт предназначен для вывода информации о составе контролов, свойствах и событиях
// внутренних форм 1С
stdlib.require("SelectValueDialog.js", SelfScript);

var lastModalForm

function onDoModal(dlgInfo)
{
    if(openModalWnd == dlgInfo.stage && dlgInfo.form)
        lastModalForm = dlgInfo.form
}

events.connect(windows, "onDoModal", SelfScript.self)

function getForm()
{
    if(windows.modalMode == msNone)
    {
        var av = windows.getActiveView()
        return av ? av.getInternalForm() : null
    }
    return lastModalForm
}

function exploreActiveForm(withProps)
{
    var form = getForm()
    if(!form)
        return
    // -1 - это сама форма
    for(var i = -1, k = form.controlsCount; i < k; i++)
    {
        var ctr = form.getControl(i)
        Message("Control #" + i + " name=" + ctr.name + " id=" + ctr.id, mInfo)
        if(withProps)
        {
            var props = ctr.props
            for(var idx = 0, cnt = props.count; idx < cnt; idx++)
            {
                var v = toV8Value(props.getValue(idx))
                Message("\t" + props.propName(idx) + " = " + v.presentation() + "  Тип=" + v.typeName(1) + " " + v.toStringInternal());
            }
        }
    }
}

function enableTrace(enable)
{
    var form = getForm()
    if(form)
        form.trapDialogEvents = enable
}

function macrosПоказатьКонтролыАктивнойФормы()              { exploreActiveForm(false) }
function macrosПоказатьКонтролыАктивнойФормыCоСВойствами()  { exploreActiveForm(true) }
function macrosНачатьОтслеживаниеСобытийАктивнойФормы()     { enableTrace(true) }
function macrosЗавершитьОтслеживаниеСобытийАктивнойФормы()  { enableTrace(false) }
function macrosПоказатьСвойстваКонтрола()
{
    var form = getForm()
    if(!form)
    {
        MessageBox("Нет активной формы")
        return
    }
    var vl = v8New("СписокЗначений")
    vl.Add(-1 + 2, "Форма")
    for(var i = 0, k = form.controlsCount; i < k; i++)
    {
        var name = form.getControl(i).name
        if(!name.length)
            name = "" + i
        vl.Add(i + 2, name)  // SelectValueDialog не дает выбрать значение 0, поэтому сдвинем все на 2
    }
    var dlg = new SelectValueDialog("Укажите контрол", vl);
    if(dlg.selectValue())
        form.getControl(dlg.selectedValue - 2).props.activateProperty("Имя")
}
