﻿$engine JScript
$uname pflview
$dname Просмотр профайла 1С

// Александр Орефков
// Этот скрипт выводит в дерево значений содержимое профайла - хранилища настроек.
// Профайл представляет из себя набор папок, подпапок и значений, наподобие реестра Windows
// Несмотря на то, что весь профайл представляется единым деревом, он представляет
// собой объединение нескольких физических хранилищ - файлов pfl. Хранилища задают,
// на каком уровне разделяются хранящиеся значения - на уровне компьютера,
// базы данных, пользователя, сеанса, и их сочетаний. (см. метод createValue объекта Profile)
// Корневая папка доступна через свойство объекта Designer - profileRoot
// Для каждого значения задается хранилище, в котором оно должно храниться.
// То есть если например, для значения задано хранилище "Компьютер", оно будет единым
// для всех пользователей всех баз на этом компьютере. Если хранилище - "база данных", то
// оно единое для всех пользователей этой базы данных, в другой базе данных оно может быть
// другим, и тд и тп. Есть хранилище - сеанс. Значения в нем сохраняются только в памяти
// на время работы, и после сеанса не сохраняются.
// Узнать, к какому хранилищу относиться значение - пока невозможно.
// 1С сохраняет в файл только те значения, которые были изменены во время работы.
// Например, для цветов раскраски языка расширений нет пользовательских настроек,
// поэтому в файлах pfl они не видны, тк никогда не изменялись во время работы.
// Однако при работе 1С они есть в профайле и содержат свои дефолтные значения.
// Создать свое значение можно методом createValue объекта Profile,
// установить значение - методом setValue.
// К значениям, хранящимся в подпапках, можно сразу обратиться из вышестоящей папке,
// указав полный путь от этой папке через слэш:
// profileRoot.getValue("App/Name")
// profileRoot.createValue("Snegopat/MySettings/MyValue", 0, pflSnegopat)
// profileRoot.setValue("Snegopat/MySettings/MyValue", 10)
// Снегопат добавляет еще одно хранилище - файл snegopat.pfl в своей папке.

addins.byUniqueName("global").object.connectGlobals(SelfScript)

var form

function walkProfile(pflFolder, parentRow)
{
    //form.ЭлементыФормы.ProfileTree.НачальноеОтображениеДерева = v8New("ПеречислениеНачальноеОтображениеДерева").РаскрыватьВсеУровни
    
    var myRow = parentRow.Строки.Добавить()
    myRow.Key = pflFolder.name
    for(var i = 0, c= pflFolder.foldersCount; i < c; i++)
        walkProfile(pflFolder.getFolderAt(i), myRow)
    for(var i = 0, c = pflFolder.valuesCount; i < c; i++)
    {
        var row = myRow.Строки.Добавить()
        row.Key = pflFolder.valueName(i)
        var val = pflFolder.getValueAt(i)
        row.Value = val
        row.ValueInternal = ЗначениеВСтрокуВнутр(val)
    }
}

function macrosПоказатьПрофайл()
{
    refreshAll()
        // if(!form)
        // {
            // form = loadScriptForm(SelfScript.fullPath.replace(/js$/i, 'ssf'), SelfScript.self)
            // walkProfile(profileRoot, form.ProfileTree)
        // }
    form.Открыть()
}

function refreshAll()
{
    if(!form)
    {
        form = loadScriptForm(SelfScript.fullPath.replace(/js$/i, 'ssf'), SelfScript.self)
            //walkProfile(profileRoot, form.ProfileTree)
    }
    walkProfile(profileRoot, form.ProfileTree)
}

/* Возвращает название макроса по умолчанию - вызывается, когда пользователь 
дважды щелкает мышью по названию скрипта в окне Снегопата. */
function getDefaultMacros() {
    return 'ПоказатьПрофайл';
}

function КоманднаяПанельРазвернутьВсеГруппы(Кнопка)
{
    for(var rowsArray = new Enumerator(form.ProfileTree.Строки);
        !rowsArray.atEnd(); rowsArray.moveNext())
    {
        var row = rowsArray.item();
        form.ЭлементыФормы.ProfileTree.Развернуть(row, true)
    }
}

function КоманднаяПанельСвернутьВсеГруппы(Кнопка)
{
    // первый уровень всегда оставляем открытым
    row0 = form.ProfileTree.Строки.Получить(0)
    for(var rowsArray = new Enumerator(row0.Строки);
        !rowsArray.atEnd(); rowsArray.moveNext())
    {
        var row = rowsArray.item();
        form.ЭлементыФормы.ProfileTree.Свернуть(row)
    }
}

function КоманднаяПанельОбновить(Кнопка)
{
    if(form)
        form.ProfileTree.Строки.Очистить()
    refreshAll()
    // if(form)
        // form.Обновить()
}
