﻿$engine JScript
$uname extfiles
$dname Внешние файлы
$addin global
$addin stdcommands
$addin stdlib


/* Скрипт для открытия внешних файлов для Снегопата
 * Автор        : Пушин Владимир <vladnet@gmail.com>
                  Александр Кунташов <kuntashov@gmail.com>, http://compaud.ru/blog
                  Сосна Евгений <shenja@sosna.zp.ua>
 * Дата создания: 24.08.2011
 * Описание     : Добавляет окно из которого можно открывать внешние файлы
 */
var мВерсияСкрипта = 1.40

////////////////////////////////////////////////////////////////////////////////////////
////{ Макросы
////

// Макрос для вызова окна
function macrosОткрытьОкноВнешнихФайлов() {

    var pathToForm = SelfScript.fullPath.replace(/js$/, 'ssf')
    if(!мФормаСкрипта){
        мФормаСкрипта = loadScriptForm(pathToForm, SelfScript.self) // Обработку событий формы привяжем к самому скрипту
        мФормаСкрипта.КлючСохраненияПоложенияОкна = SelfScript.uniqueName;
        мФормаСкрипта.Заголовок="Внешние файлы" //+мВерсияСкрипта        
        КэшКартинокТиповФайлов = ПолучитьКэшКартинокТиповФайлов(мФормаСкрипта);
        loadDiffBackends()
        loadDvcsBackends();
        мФормаСкрипта.ЭлементыФормы.КпШапка.Кнопки.ПоискВыводитСписком.Пометка = мПоказыватьРезультатПоискаСписком;
    }
    мФормаСкрипта.Открыть()
}

function macrosСвернутьДеревоВнешнихФайлов() {

    if(мАктивноДеревоВнешнихФайлов()==false) return false
    
    if(мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.Развернут(мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущаяСтрока)==false)
    {
        if(мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущаяСтрока.Родитель != undefined)
            мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущаяСтрока=мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущаяСтрока.Родитель
    }
    else
        мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.Свернуть(мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущаяСтрока)
}

function macrosРазвернутьДеревоВнешнихФайлов() {

    if(мАктивноДеревоВнешнихФайлов()==false) return false
    мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.Развернуть(мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущаяСтрока)
}

////} Макросы

////////////////////////////////////////////////////////////////////////////////////////
////{ ФормаСкрипта - обработчики событий.
////

function КпШапкаОбновить(Элемент) {
    мОбновитьФайлы()
}

function КпШапкаОбновитьТекущуюВетку(Элемент) {
    мОбновитьФайлыТекущейВетки()
}

function ФильтрПриИзменении(Элемент) {
    мОбновитьФайлы()
}

function ПриОткрытии() {
    УстановитьВидимость()
    мОбновитьФайлы()
}

function КпШапкаЗакрыть(Элемент) {
    мФормаСкрипта.Закрыть()
}

function мАктивноДеревоВнешнихФайлов() {
    if(мФормаСкрипта==null) return false
    if(мФормаСкрипта.ВводДоступен()!=true) return false
    return мФормаСкрипта.ТекущийЭлемент==мФормаСкрипта.ЭлементыФормы.ДеревоФайлов
}

function КпШапкаРазвернуть(Элемент) {
    macrosРазвернутьДеревоВнешнихФайлов();
}

function КпШапкаСправка(Кнопка) {
    RunApp('http://snegopat.ru/scripts/wiki?name=extfiles.js');
}

function КпШапкаСвернуть(Элемент) {
    macrosСвернутьДеревоВнешнихФайлов()
}

function ДеревоФайловПередНачаломИзменения(пЭлемент, пОтказ) {

    пОтказ.val = true
    лТекСтрока=пЭлемент.val.ТекущаяСтрока
    if(лТекСтрока.ЭтоКаталог) return
    
    if (МожноОткрытьФайлВКонфигураторе(лТекСтрока.ИмяФайла))
        stdlib.openFileIn1C(лТекСтрока.ИмяФайла)
    else 
        ЗапуститьПриложение(лТекСтрока.ИмяФайла);
}

function ДеревоФайловПриВыводеСтроки(пЭлемент, пОформлениеСтроки, пДанныеСтроки) {

    лЯчейкаИмя=пОформлениеСтроки.val.Ячейки.Имя
    лЯчейкаИмя.ОтображатьКартинку=true
    if(ValueIsFilled(пДанныеСтроки.val.Родитель)==false)
    {
        лЯчейкаИмя.Картинка = мФормаСкрипта.ЭлементыФормы.КартинкаПапка.Картинка;
    }
    else if(пДанныеСтроки.val.ЭтоКаталог==true)
    {
        лЯчейкаИмя.Картинка = мФормаСкрипта.ЭлементыФормы.КартинкаПапка.Картинка;
    }
    else
    {
        var КартинкаПоРасширению = ПолучитьКартинкуПоРасширению(пДанныеСтроки.val.Тип);
        лЯчейкаИмя.Картинка = КартинкаПоРасширению ? КартинкаПоРасширению : БиблиотекаКартинок.Форма;
    }
    
    // Версионный контроль. 
    if (мИспользоватьВерсионирование) {
        var мЦвет = СоответсвиеЦветовИСтатусов[пДанныеСтроки.val.Статус]
        if (мЦвет!=undefined){ 
            пОформлениеСтроки.val.Ячейки.Имя.ЦветФона = мЦвет;
        } else {
            if (пДанныеСтроки.val.Статус.length > 0) {
                пОформлениеСтроки.val.Ячейки.Имя.Текст = пОформлениеСтроки.val.Ячейки.Имя.Текст + "(" + пДанныеСтроки.val.Статус+")";
            }
        }
    }
}

function ДеревоФайловПриАктивизацииСтроки(пЭлемент) {
    if (мИспользоватьВерсионирование) { 
        var ТекущаяСтрока = мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущиеДанные;
        if (ТекущаяСтрока) 
        {
            Кнопки=мФормаСкрипта.ЭлементыФормы.КонтекстноеМеню.Кнопки.DVCS.Кнопки;
            
            Кнопки.КнDvcsОтменитьИзменения.Доступность = false;
            Кнопки.КнDvcsПоказатьРазличия.Доступность = false;
            Кнопки.КнDvcsДобавить.Доступность = true;
            Кнопки.КнDvcsПоказатьЖурнал.Доступность = true;
            Кнопки.КнDvcsУдалить.Доступность = false;
            Кнопки.КнDvcsCommit.Доступность = true;
            Кнопки.КнDvcsЗапустить.Доступность = true;
            Кнопки.КнDvcsSwitchBranch.Доступность = true;
            
            if (!ТекущаяСтрока.ЭтоКаталог) {
                switch (ТекущаяСтрока.Статус) 
                {
                    case "EDITED":
                        Кнопки.КнDvcsПоказатьРазличия.Доступность = true;
                        Кнопки.КнDvcsОтменитьИзменения.Доступность = true;
                        Кнопки.КнDvcsCommit.Доступность = true;
                        Кнопки.КнDvcsДобавить.Доступность = false;
                        break;
                    case "ADDED":
                        Кнопки.КнDvcsCommit.Доступность = true;
                        break
                    case "DELETED":
                        Кнопки.КнDvcsCommit.Доступность = true;
                        Кнопки.КнDvcsОтменитьИзменения.Доступность = true;
                        Кнопки.КнDvcsУдалить.Доступность = true;
                        Кнопки.КнDvcsДобавить.Доступность = false;
                        break
                    case "NOTVERSIONED":
                        Кнопки.КнDvcsДобавить.Доступность = true;
                        break
                }
            } 
        }
    }
}

function КонтекстноеМенюОткрытьПроводник (Кнопка) {
    var ТекущаяСтрока = мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущиеДанные;
    if (ТекущаяСтрока) 
    {
        var СтрокаЗапуска = 'explorer.exe "' + ПолучитьКаталогСтрокиДерева(ТекущаяСтрока) + '"';
        ЗапуститьПриложение(СтрокаЗапуска);
    }
}

function КонтекстноеМенюОткрытьКонсоль (Кнопка) {
    var ТекущаяСтрока = мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущиеДанные;
    if (ТекущаяСтрока) 
    {
        var Каталог = ПолучитьКаталогСтрокиДерева(ТекущаяСтрока);
        var СтрокаЗапуска = ПолучитьКомандуЗапускаКонсоли(Каталог);
        ЗапуститьПриложение(СтрокаЗапуска, Каталог);
    }
}

function КнШапкаПоискСписком(Элемент) {
    мФормаСкрипта.ЭлементыФормы.КпШапка.Кнопки.ПоискВыводитСписком.Пометка = !мФормаСкрипта.ЭлементыФормы.КпШапка.Кнопки.ПоискВыводитСписком.Пометка;
    мПоказыватьРезультатПоискаСписком = мФормаСкрипта.ЭлементыФормы.КпШапка.Кнопки.ПоискВыводитСписком.Пометка;
    profileRoot.setValue(pflExtViewSearchInList, мПоказыватьРезультатПоискаСписком); // И здесь прийдеться сохраняем значение, не будем же ради этой настройки открывать форму настройки и закрывать ее?
} //КнШапкаПоискСписком

function КонтекстноеМенюДобавитьКСравнению (Кнопка) {
    var ТекущаяСтрока = мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущиеДанные;
    if ((ТекущаяСтрока) && (!ТекущаяСтрока.ЭтоКаталог)) 
    {
        var i = МассивФайловДляСравнения.length;
        if (i > 2) {
            //Не должно так быть, удалим весь массив и грязно поругаемся. 
            МассивФайловДляСравнения = [];
            Message("Исключительная ситуация при добавлении файлов в список сравнения, пока больше 2х не поддерживается 1С");
            return;
        }
        i = i>0? 1:0; //номер индекса в массиве.
        МассивФайловДляСравнения[i] = ТекущаяСтрока.ИмяФайла;
        if (i>0) {
            //вызовем сравнение файлов... 
            СравнитьФайлы(МассивФайловДляСравнения[0], МассивФайловДляСравнения[1])
            МассивФайловДляСравнения = [];
        }
    }
} //КонтекстноеМенюДобавитьКСравнению

function КонтекстноеМенюДополнительноСоздатьКопию(Кнопка) {
    var ТекущаяСтрока = мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущиеДанные;
    if ((ТекущаяСтрока) && (!ТекущаяСтрока.ЭтоКаталог)) 
    {
        var лФайл = v8New("File", ТекущаяСтрока.ИмяФайла);
        var лИмяФайла = лФайл.ИмяБезРасширения + "-"+snegopat.parseTemplateString("<?\"\", ДатаВремя,\"ДФ=yyyyMMdd-HHmmss\">")+лФайл.Расширение;
        try {
        FileCopy(ТекущаяСтрока.ИмяФайла, лФайл.Путь+"\\"+лИмяФайла);
        } catch (e) {
        }
        мОбновитьФайлыТекущейВетки();
    }
} //КонтекстноеМенюДополнительноСоздатьКопию

function КонтекстноеМенюКнDvcsПоказатьРазличия(Кнопка) {
    var ТекущаяСтрока = мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущиеДанные;
    if (ТекущаяСтрока) {
        caller = getDvcsBackendForPath(ТекущаяСтрока.ИмяФайла);
        if (caller!=null) {
        var pathsToFiles = v8New("Structure");
        if (!caller("SHOWDIFF", ТекущаяСтрока.ИмяФайла, pathsToFiles)) {return};
            СравнитьФайлы(pathsToFiles["path1"], pathsToFiles["path2"])
        }
    }
} //КонтекстноеМенюКнDvcsПоказатьРазличия

function КонтекстноеМенюКнDvcsПоказатьЖурнал(Кнопка) {
    var ТекущаяСтрока = мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущиеДанные;
    if (ТекущаяСтрока) {
        caller = getDvcsBackendForPath(ТекущаяСтрока.ИмяФайла);
        if (caller!=null){
            var pathToLog = mainFolder + "\\scripts\\dvcs\\logview.js";
            var f = v8New("File", pathToLog);
            if (!f.Exist()) return
            
            logViewAddin = stdlib.require(f.FullName);
            if (logViewAddin) {
                var logView = logViewAddin.CreateLogViewForm();
                logView.open(caller, ТекущаяСтрока.ИмяФайла);
            }
        }
    }
} //КонтекстноеМенюКнDvcsПоказатьЖурнал

function КонтекстноеМенюКнDvcsДобавить(Кнопка) {
    var ТекущаяСтрока = мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущиеДанные;
    if (ТекущаяСтрока) {
        caller = getDvcsBackendForPath(ТекущаяСтрока.ИмяФайла);
        if (caller!=null) caller("ADD", ТекущаяСтрока.ИмяФайла, "");
        мОбновитьФайлыТекущейВетки()
    }
} //КонтекстноеМенюКнDvcsДобавить

function КонтекстноеМенюКнDvcsОтменитьИзменения(Кнопка) {
    var ТекущаяСтрока = мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущиеДанные;
    if (ТекущаяСтрока) {
        caller = getDvcsBackendForPath(ТекущаяСтрока.ИмяФайла);
        if (caller!=null) caller("REVERT", ТекущаяСтрока.ИмяФайла, "");
    }
    мОбновитьФайлыТекущейВетки();
} //КонтекстноеМенюКнDvcsОтменитьИзменения

function КонтекстноеМенюКнDvcsУдалить(Кнопка) {
    var ТекущаяСтрока = мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущиеДанные;
    if (ТекущаяСтрока) {
        if (ТекущаяСтрока.Родитель!=undefined)  {
            caller = getDvcsBackendForPath(ТекущаяСтрока.Родитель.ИмяФайла);
            if (caller!=null) caller("DELETE", ТекущаяСтрока.Имя, "");
            мОбновитьФайлыТекущейВетки();
        }
    }
} //КонтекстноеМенюКнDvcsУдалить

function КонтекстноеМенюКнDvcsSwitchBranch() {

    var ТекущаяСтрока = мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущиеДанные;
    if (ТекущаяСтрока) {
        caller = getDvcsBackendForPath(ТекущаяСтрока.ИмяФайла);
        if (caller!=null){
            result = caller("GETLISTBRANCH", ТекущаяСтрока.ИмяФайла, "");
            if (result==false) return;
            if ((result["valuelist"].Count() > 0) && (result["index"] !=-1)) {
                choice = result["valuelist"].ChooseItem("Выберете ветку ", result["valuelist"].Get(result["index"]));
                if (choice!=undefined) {
                    caller("SWITHBRANCH", ТекущаяСтрока.ИмяФайла, choice.value);
                    
                }
            }
        }
        мОбновитьФайлыТекущейВетки();
    }
}

function КонтекстноеМенюКнDvcsCommit(Кнопка) {
    var ТекущаяСтрока = мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущиеДанные;
    if (ТекущаяСтрока) {
        caller = getDvcsBackendForPath(ТекущаяСтрока.ИмяФайла);
        var vbs = addins.byUniqueName("vbs").object
        vbs.var0 = ""; vbs.var1 = "Введите комментарий"; vbs.var2 = 0, vbs.var3 = true;
        if (vbs.DoEval("InputString(var0, var1, var2, var3)")) {
            var message  = vbs.var0;
            if (message.length!=0) {
                    if (caller!=null) {caller("COMMIT", ТекущаяСтрока.ИмяФайла, message);}
            }
        }
    }
    мОбновитьФайлыТекущейВетки();
} //КонтекстноеМенюКнDvcsCommit

function КонтекстноеМенюКнDVCSЗапустить(Кнопка) {
    var ТекущаяСтрока = мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущиеДанные;
    if (ТекущаяСтрока) {
        caller = getDvcsBackendForPath(ТекущаяСтрока.ИмяФайла);
        if (caller!=null) caller("RUN", ТекущаяСтрока.ИмяФайла, "");
    }
} //КонтекстноеМенюКнDVCSЗапустить

function УстановитьВидимость() {
    if (!мИспользоватьВерсионирование) { 
        Кнопки=мФормаСкрипта.ЭлементыФормы.КонтекстноеМеню.Кнопки.DVCS.Кнопки;
        Кнопки.КнDvcsОтменитьИзменения.Доступность = false;
        Кнопки.КнDvcsПоказатьРазличия.Доступность = false;
        Кнопки.КнDvcsДобавить.Доступность = false;
        Кнопки.КнDvcsПоказатьЖурнал.Доступность = false;
        Кнопки.КнDvcsУдалить.Доступность = false;
        Кнопки.КнDvcsCommit.Доступность = false;
        Кнопки.КнDvcsЗапустить.Доступность = false;
        Кнопки.КнDvcsSwitchBranch.Доступность = false;
    } else {
        Кнопки=мФормаСкрипта.ЭлементыФормы.КонтекстноеМеню.Кнопки.DVCS.Кнопки;
        Кнопки.КнDvcsОтменитьИзменения.Доступность = false;
        Кнопки.КнDvcsПоказатьРазличия.Доступность = false;
        Кнопки.КнDvcsДобавить.Доступность = true;
        Кнопки.КнDvcsПоказатьЖурнал.Доступность = true;
        Кнопки.КнDvcsУдалить.Доступность = false;
        Кнопки.КнDvcsCommit.Доступность = true;
        Кнопки.КнDvcsЗапустить.Доступность = true;
        Кнопки.КнDvcsSwitchBranch.Доступность = true;
        
    }
} //УстановитьВидимость

////
////} ФормаСкрипта - обработчики событий.
////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////
////{ Вспомогательные процедуры и функции.
////

function ТзКаталоговИнициализировать(пТзКаталоги) {

    try{
        пТзКаталоги = ValueFromStringInternal(пТзКаталоги)
    }
    catch(e){
        пТзКаталоги = v8New("ТаблицаЗначений")
    }
    try{ /*тут проверяем не старые ли настройки, раньше хранились в массиве, конвертируем, в будущем удалить*/
        var лТест=пТзКаталоги.ВГраница()
        лТзКаталоги = v8New("ТаблицаЗначений")
        лТзКаталоги.Колонки.Добавить("ИмяКаталога");
        лТзКаталоги.Колонки.Добавить("Развернуть");
        
        for (var лИнд=0; лИнд<пТзКаталоги.Количество(); лИнд++)
        {
            лСтрокаТз=лТзКаталоги.Добавить()
            лСтрокаТз.ИмяКаталога=пТзКаталоги.Получить(лИнд)
            лСтрокаТз.Развернуть=true
        }
        return лТзКаталоги
    }
    catch(e){
    }
    return пТзКаталоги
}

function getAbsolutePath(path) {

    // Путь относительный?
    if (path.match(/^\.{1,2}[\/\\]/))
    {
        // Относительные пути должны задаваться относительно главного каталога Снегопата.
        return mainFolder + path;
    }
    
    return path;
}

function ExpandTreeForFile(лТекСтрока, лРазворачивать) {
    
    while(лТекСтрока.Родитель != undefined) { //Проверим до первого родителя, в теории самый первый раз должен до начала дойти.
        лТекСтрока=лТекСтрока.Родитель;
        if (лТекСтрока.Развернут != лРазворачивать) {
            лТекСтрока.Развернуть = лРазворачивать;
        } else {
            break;
        }
    }
}

function dvcsGetCatalogStatus(лКаталог) { // Проверим находиться ли каталого под версионным контролем. 
    
    if (мИспользоватьВерсионирование) {
            for (var key in DvcsBackends) {
                if (DvcsBackends[key]("TEST", лКаталог, "")) {
                    СоответствиеКаталоговИDvcs[лКаталог] = DvcsBackends[key];
                    //СоответствиеКаталоговИDvcs[лКаталог] = stdlib.require(DvcsBackends[key]).GetBackend();
                    var result = СоответствиеКаталоговИDvcs[лКаталог]("CATALOGSTATUS", лКаталог, "")
                    break;
                }
            }

    }
} //dvcsGetCatalogStatus

function dvcsGetMissingFiles (лКаталог, лСтрокаДереваФайлов) {
    if (мИспользоватьВерсионирование) { // получим отсутствующие файлы. Писать будем Имя = путь, т.к. каталога уже может и не существовать. 
            if (СоответствиеКаталоговИDvcs[лКаталог] != undefined){
                var result = СоответствиеКаталоговИDvcs[лКаталог]("GETFILESDELETED", лКаталог, "");
                if (typeof(result)!='boolean') {
                    //простой массив.
                    for (var i = 0 ; i<result.length; i++) {
                        НоваяСтрока = лСтрокаДереваФайлов.Строки.Добавить();
                        НоваяСтрока.Имя = result[i];
                        НоваяСтрока.Статус = "DELETED";
                        НоваяСтрока.ИмяФайла = ""; //Оставим пустым, т.е. файл удалили теперь 
                    }
                }
            }
        }
} //dvcsGetMissingFiles

function dvcsGetFileStatus(pathToFile) {
    var result = "";
    for (var key in СоответствиеКаталоговИDvcs) {
        if (pathToFile.indexOf(key) >=0) {
            var result = СоответствиеКаталоговИDvcs[key]("FILESTATUS", key, pathToFile);
            break
        }
    }
    return result;
}

function мДобавитьФайлы(пПуть, пУзел) { 

    var лФайлы=FindFiles(пПуть, '*.*', false)
    for (var лИнд=0; лИнд<лФайлы.Количество(); лИнд++)
    {
        лФайл=лФайлы.Получить(лИнд)
        var лНадоРазвернутьДерево = false;
        if((лФайл.ЭтоКаталог() == false) && (мФормаСкрипта.Фильтр != ''))
            if(лФайл.ИмяБезРасширения.toLowerCase().search(мФормаСкрипта.Фильтр.toLowerCase()) == -1) {
                continue
            } else {
                лНадоРазвернутьДерево = true
            }
        if ((мФормаСкрипта.Фильтр != '')){  //Тут сделаем свое добавление, а старый вариант оставим.
            if (лФайл.ЭтоКаталог() == true){
                мДобавитьФайлы(лФайл.ПолноеИмя, пУзел)
                continue;
            }
            if (лФайл.ЭтоКаталог() == false) {
                лСтрокаДереваФайлов=пУзел.Строки.Добавить()
                лСтрокаДереваФайлов.ЭтоКаталог=лФайл.ЭтоКаталог()
                лСтрокаДереваФайлов.ИмяФайла=лФайл.ПолноеИмя
                лСтрокаДереваФайлов.ДатаИзменения=лФайл.ПолучитьВремяИзменения()
                лСтрокаДереваФайлов.Тип=лФайл.Расширение.substr(1)
                var СодержитСлеш = (лСтрокаДереваФайлов.Родитель.Имя.substr(лСтрокаДереваФайлов.Родитель.Имя.length-1)=='\\')?0:1
                if(мОтображатьРасширениеФайлаВПредставлении == true){ //в теории у нас родитель только один с корневым каталогом, вот этот корневой каталог и вырежем из путей.
                    лСтрокаДереваФайлов.Имя=лФайл.ПолноеИмя.substr(лСтрокаДереваФайлов.Родитель.Имя.length+СодержитСлеш)
                } else {
                    var ДлинаРасширения = лФайл.Расширение.length;
                    var ИмяФайлаСРасширением = лФайл.ПолноеИмя.substr(лСтрокаДереваФайлов.Родитель.Имя.length+СодержитСлеш);
                    лСтрокаДереваФайлов.Имя=ИмяФайлаСРасширением.substr(0, ИмяФайлаСРасширением.length - ДлинаРасширения);
                }
                if (лНадоРазвернутьДерево) ExpandTreeForFile(лСтрокаДереваФайлов, true)
            }
        }  else {
            лСтрокаДереваФайлов=пУзел.Строки.Добавить()
            лСтрокаДереваФайлов.ЭтоКаталог=лФайл.ЭтоКаталог()
            лСтрокаДереваФайлов.ИмяФайла=лФайл.ПолноеИмя
            лСтрокаДереваФайлов.ДатаИзменения=лФайл.ПолучитьВремяИзменения()
            
            if(мОтображатьРасширениеФайлаВПредставлении == true)
                лСтрокаДереваФайлов.Имя=лФайл.Имя
            else
                лСтрокаДереваФайлов.Имя=лФайл.ИмяБезРасширения
            
            if(лФайл.ЭтоКаталог() == true)
            {
                if(ValueIsFilled(лФайл.Расширение)) лСтрокаДереваФайлов.Имя+=лФайл.Расширение
                мДобавитьФайлы(лФайл.ПолноеИмя, лСтрокаДереваФайлов)
            }
            else{
                if (мИспользоватьВерсионирование) {
                    лСтрокаДереваФайлов.Статус = dvcsGetFileStatus(лСтрокаДереваФайлов.ИмяФайла);
                }
                лСтрокаДереваФайлов.Тип=лФайл.Расширение.substr(1)
                if (лНадоРазвернутьДерево) ExpandTreeForFile(лСтрокаДереваФайлов, true)
            }
        } 
    }
}

function ДобавитьКаталоги(пТзКаталоги) {

    for (var лИнд=0; лИнд<пТзКаталоги.Количество(); лИнд++)
    {
        var лКаталог=пТзКаталоги.Получить(лИнд).ИмяКаталога;
        //Добавим возможность формирования пути каталога, относительно Снегопата. 
        // путь начинаться должен с ".." или ".", по просбе 
        
        if (лКаталог == ".git"){
            continue;
        }
        var млКаталог = getAbsolutePath(лКаталог)
        //Сделаем проверку существования каталога от 1С.
        var f = v8New("File", млКаталог); 
        if (f.Exist()) {
            лКаталог = млКаталог;
        } else {
            Message("Каталог отностельно Снегопата не существует, пропускаем " + млКаталог);
            continue; //
        }
        лСтрокаДереваФайлов=мФормаСкрипта.ДеревоФайлов.Строки.Добавить()
        лСтрокаДереваФайлов.Имя=лКаталог
        лСтрокаДереваФайлов.ИмяФайла=лКаталог
        лСтрокаДереваФайлов.Развернуть=пТзКаталоги.Получить(лИнд).Развернуть
        
        if (мИспользоватьВерсионирование){
            dvcsGetCatalogStatus(лКаталог);
            dvcsGetMissingFiles(лКаталог, лСтрокаДереваФайлов);
            лСтрокаДереваФайлов.Статус = dvcsGetFileStatus(лСтрокаДереваФайлов.ИмяФайла);
        }
        
        мДобавитьФайлы(лКаталог, лСтрокаДереваФайлов)
        if (лСтрокаДереваФайлов.Родитель!=undefined){
            if ((мФормаСкрипта.Фильтр != '') && (!мПоказыватьРезультатПоискаСписком) && (лСтрокаДереваФайлов.Родитель.Строки.Количество() > 0)){
                var МассивКУдалению = v8New("Array");
                лСтрокаДереваФайловСтарая = лСтрокаДереваФайлов.Родитель;
                лСтрокаДереваФайлов = мФормаСкрипта.ДеревоФайлов.Строки.Добавить();
                лСтрокаДереваФайлов.Имя=лКаталог
                лСтрокаДереваФайлов.ИмяФайла=лКаталог
                лСтрокаДереваФайлов.Развернуть=пТзКаталоги.Получить(лИнд).Развернуть
                for (var i = 0; i<лСтрокаДереваФайловСтарая.Строки.Количество(); i++) { 
                    лТекСтрока = лСтрокаДереваФайловСтарая.Строки.Получить(i);
                    var МассивФайлов = лТекСтрока.Имя.split('\\');
                    лТекСтрока = лСтрокаДереваФайлов;
                    var x = 0;
                    while( x<МассивФайлов.length) {
                        var СтруктураПоиска = v8New("Structure");
                        var ПутьДляПоиска = МассивФайлов[x];
                        СтруктураПоиска.insert("Имя", ПутьДляПоиска);
                        var НайденныеСтроки = лТекСтрока.Строки.НайтиСтроки(СтруктураПоиска);
                        if (НайденныеСтроки.Количество() == 0) {
                            try {
                                var лФайл = v8New("File", лТекСтрока.ИмяФайла +"\\"+МассивФайлов[x]);
                            
                                if (!лФайл.Существует()){
                                    continue;
                                } else {

                                    НоваяСтрока = лТекСтрока.Строки.Добавить();
                                    НоваяСтрока.ЭтоКаталог=лФайл.ЭтоКаталог()
                                    НоваяСтрока.ИмяФайла=лФайл.ПолноеИмя
                                    НоваяСтрока.ДатаИзменения=лФайл.ПолучитьВремяИзменения()
                                    
                                    if (мОтображатьРасширениеФайлаВПредставлении == true)
                                        НоваяСтрока.Имя=лФайл.Имя
                                    else
                                        НоваяСтрока.Имя=лФайл.ИмяБезРасширения
                                    
                                    if(лФайл.ЭтоКаталог() != true)
                                    {
                                        НоваяСтрока.Тип=лФайл.Расширение.substr(1)
                                        ExpandTreeForFile(НоваяСтрока, true)
                                    }
                                    НайденныеСтроки.add(НоваяСтрока);

                                }
                            } catch (e){
                                Message("Ошибка при определении пути файлов "+e.description);
                            }
                            
                        }
                        лТекСтрока = НайденныеСтроки.Get(0);
                        x++;
                    }
                }
                мФормаСкрипта.ДеревоФайлов.Строки.Удалить(лСтрокаДереваФайловСтарая);
            }
        }
        лСтрокаДереваФайлов.Строки.Сортировать("ЭтоКаталог Убыв, Имя", true)
    }
    мФормаСкрипта.ДеревоФайлов.Строки.Сортировать("ЭтоКаталог Убыв, Имя", true)
}

function мОбновитьФайлы() {
    лТекСтрока=мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущаяСтрока
    
    // Запомним текущую строку
    лИмяФайлаТекСтроки=""
    if(лТекСтрока!=undefined) лИмяФайлаТекСтроки=лТекСтрока.ИмяФайла
    
    мФормаСкрипта.ДеревоФайлов.Строки.Очистить()
    
    ДобавитьКаталоги(мТзКаталогиОбщие)
    ДобавитьКаталоги(мТзКаталогиБазы)
    for (var лИнд=0; лИнд<мФормаСкрипта.ДеревоФайлов.Строки.Количество(); лИнд++)
    {
        if(мФормаСкрипта.ДеревоФайлов.Строки.Получить(лИнд).Развернуть == false) continue
        var Str1=мФормаСкрипта.ДеревоФайлов.Строки.Получить(лИнд)
        мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.Развернуть(Str1, мФормаСкрипта.Фильтр != '');
    }
    
    // Восстановим текущую строку
    if(лИмяФайлаТекСтроки != ""){
        лСтрокаНайденная=мФормаСкрипта.ДеревоФайлов.Строки.Найти(лИмяФайлаТекСтроки, "ИмяФайла", true)
        if(лСтрокаНайденная != undefined)
            мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущаяСтрока=лСтрокаНайденная
    }
}

function мОбновитьФайлыТекущейВетки() {

    лТекСтрока=мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущаяСтрока
    if(лТекСтрока==undefined) return
    
    // Запомним текущую строку
    лИмяФайлаТекСтроки=лТекСтрока.ИмяФайла
    
    while(лТекСтрока.Родитель != undefined) лТекСтрока=лТекСтрока.Родитель
    лТекСтрока.Строки.Очистить()
    if (мИспользоватьВерсионирование){ 
        dvcsGetCatalogStatus(лТекСтрока.Имя);
        dvcsGetMissingFiles(лТекСтрока.Имя, лТекСтрока);
        лТекСтрока.Статус = dvcsGetFileStatus(лТекСтрока.ИмяФайла);
    }
    мДобавитьФайлы(лТекСтрока.Имя, лТекСтрока)
    
    лТекСтрока.Строки.Сортировать("ЭтоКаталог Убыв, Имя", true)
    
    // Восстановим текущую строку
    лСтрокаНайденная=мФормаСкрипта.ДеревоФайлов.Строки.Найти(лИмяФайлаТекСтроки, "ИмяФайла", true)
    if(лСтрокаНайденная != undefined)
        мФормаСкрипта.ЭлементыФормы.ДеревоФайлов.ТекущаяСтрока=лСтрокаНайденная
}

function ПолучитьКаталогСтрокиДерева(СтрокаДерева) {
    var Файл = v8New('Файл', СтрокаДерева.ИмяФайла);
    return Файл.ЭтоФайл() ? Файл.Путь : Файл.ПолноеИмя;
}

function ПолучитьКомандуЗапускаКонсоли(Каталог) {
    return мКомандаЗапускаКонсоли.replace(/%1/, Каталог);
}

function СформироватьТзРасширенияФайловПоУмолчанию() {

    var ТЗ = v8New("ТаблицаЗначений");
    ТЗ.Колонки.Добавить("Расширение");

    function Расш(расширение) { ТЗ.Добавить().Расширение = расширение; }
    
    // Стандартные файлы 1С:Предприятия 8.
    Расш("txt"); Расш("bmp"); Расш("dib"); Расш("png"); Расш("rle"); 
    Расш("jpg"); Расш("jpeg"); Расш("tif"); Расш("ico"); Расш("mxl"); 
    Расш("epf"); Расш("erf"); Расш("htm"); Расш("html"); Расш("grs"); 
    Расш("geo"); Расш("st"); Расш("lgf"); Расш("elf"); Расш("cf"); Расш("pff");

    // Файлы Снегопата.
    Расш("ssf"); Расш("js"); Расш("vbs");
    
    return ТЗ;
}

function МожноОткрытьФайлВКонфигураторе(ИмяФайла)  {
    if (!RE_EXTENSIONS) 
    {
        var ext = new Array();
        for (var i=0; i<мТзРасширенияФайлов.Количество(); i++)
            ext.push(мТзРасширенияФайлов.Get(i).Расширение);
            
        RE_EXTENSIONS = new RegExp('\.(?:' + ext.join('|') + ')$', 'i');
    }
    
    return RE_EXTENSIONS.test(ИмяФайла);
}

function ПолучитьКэшКартинокТиповФайлов(ФормаСкрипта) {
    var ЭФ = ФормаСкрипта.ЭлементыФормы;  
    var cache = {};
  
    function add(estr, pic) {
        var exts = estr.split('|');
        for (var i=0; i<exts.length; i++)
            cache[exts[i].toLowerCase()] = pic; 
    }
  
    add('doc|docx|dot|odf', ЭФ.КартинкаТипФайлаDoc.Картинка);
    add('xls|xlsx|csv', ЭФ.КартинкаТипФайлаXls.Картинка);
    
    add('pps|ppsx', ЭФ.КартинкаТипФайлаPps.Картинка);
    add('pdf|ps', ЭФ.КартинкаТипФайлаPdf.Картинка);
        
    add('png|jpg|jpeg|bmp|tif|dib|ico', ЭФ.КартинкаТипФайлаPng.Картинка);

    add('xml', ЭФ.КартинкаТипФайлаXml.Картинка);
    add('zip', ЭФ.КартинкаТипФайлаZip.Картинка);
    add('rar', ЭФ.КартинкаТипФайлаRar.Картинка);
    
    add('exe|cmd|bat', ЭФ.КартинкаТипФайлаExe.Картинка);

    add('txt', ЭФ.КартинкаТипФайлаTxt.Картинка);    
    add('geo', ЭФ.КартинкаТипФайлаGeo.Картинка);
    add('grs', ЭФ.КартинкаТипФайлаGrs.Картинка);
    add('erf', ЭФ.КартинкаТипФайлаErf.Картинка);
    add('epf', ЭФ.КартинкаТипФайлаEpf.Картинка);
    add('mxl', ЭФ.КартинкаТипФайлаMxl.Картинка);
    
    add('ssf', ЭФ.КартинкаТипФайлаSsf.Картинка);
    add('js', ЭФ.КартинкаТипФайлаTxt.Картинка);
    add('vbs', ЭФ.КартинкаТипФайлаTxt.Картинка);
    
    add('unknown', ЭФ.КартинкаТипФайлаUnknown.Картинка);

    return cache;

}

function ПолучитьКартинкуПоРасширению(Расширение) {

    if (КэшКартинокТиповФайлов) {
        var pic = КэшКартинокТиповФайлов[Расширение.toLowerCase()];
        return pic ? pic : КэшКартинокТиповФайлов['unknown'];
    }    
    return null;
}

function hookCompareFiles(dlgInfo){

    if (Path1 == null) return
    if (Path2 == null) return
    if(dlgInfo.stage == openModalWnd && dlgInfo.caption == "Сравнить файлы")
    {
        events.disconnect(windows, "onDoModal", SelfScript.self, "hookCompareFiles")
        dlgInfo.form.getControl("FirstFile").value = Path1
        dlgInfo.form.getControl("SecondFile").value = Path2
        var wsh = new ActiveXObject("WScript.Shell")
        wsh.SendKeys('^~')
    }
} //hookCompareFiles

function СравнитьФайлы (ПутьКФайлу1, ПутьКФайлу2) {

    if (ПутьКФайлу1 == null || ПутьКФайлу2 == null) return
    Path1 = ПутьКФайлу1; Path2 = ПутьКФайлу2;
    var ext = v8New("File", ПутьКФайлу1).Extension;
    ext = ext.substr(1).toLowerCase(); //Уберем первый символ, там точка.
    var caller = DiffBackends[ext.toLowerCase()]
    if (caller) {
        caller(Path1, Path2)
    } else {
        //для обработок 
        try { //сделаем возможность работы в демо режиме снегопата. 
            events.connect(windows, "onDoModal", SelfScript.self, "hookCompareFiles")
            stdcommands.Frame.CompareFiles.send()
        } catch (e) {
            Message("Возможно демо режим снегопата... все возможности извините не получиться использовать. ")
        }
        
    }
    Path1 = null; Path2 = null;
} //СравнитьФайлы

function getDvcsBackendForPath(path) {
    var лФайл = v8New("File", path);
    var result = null
    if (лФайл.Существует()) {
        for (var key in СоответствиеКаталоговИDvcs) {
            if (path.indexOf(key) >=0) {
                result = СоответствиеКаталоговИDvcs[key]
                break
            }
        }
    }
    return result
}

function registerDiffBackend(description, caller) {
    // тут расширение файла будет использоваться для определения инструмента сравнения. 
    
    DiffBackends[description.toLowerCase()] = caller;
}

function registerDvcsBackend(description, caller) {
    // кто последний, того и тапки. 
    DvcsBackends[description.toLowerCase()] = caller;
}

function loadDiffBackends() {
    //TODO: добавить на форму, таблицу значений с настройками. Что бы можно было выбрать какие diff и для каких файлов можно использовать, а какие нет. 
    DiffBackends = {}
        
    var МассивФайлов = НайтиФайлы(mainFolder + "\\scripts\\dvcs\\", "diff*.js");
    for (var i =0; i<МассивФайлов.Количество(); i++) {
        var лФайл = МассивФайлов.Get(i);
        function add(estr, caller) {
            var exts = estr.split('|');
            for (var i=0; i<exts.length; i++)
                registerDiffBackend(exts[i].toLowerCase(), caller); 
        }
        var КэшРасширений = stdlib.require(лФайл.ПолноеИмя).GetExtension()
        add(КэшРасширений, stdlib.require(лФайл.ПолноеИмя).GetBackend())
    }
} //loadDiffBackends

function loadDvcsBackends() {
    DvcsBackends = {}
    if (!мИспользоватьВерсионирование) return 
    var МассивФайлов = НайтиФайлы(mainFolder + "\\scripts\\dvcs\\", "dvcs*.js");
    for (var i =0; i<МассивФайлов.Количество(); i++) {
        var лФайл = МассивФайлов.Get(i);
        try { 
            registerDvcsBackend(лФайл.ИмяБезРасширения, stdlib.require(лФайл.ПолноеИмя).GetBackend());
        } catch (e) {
            //FIXME: вывести сообщение об ошибке. 
            try { //наверное неправильно это...  может не выгружать, а вдруг ошиблись и это очень полезный плагин?
            addins.unloadAddin(backend)
            } catch (e){}
        }
    }
} //loadDvcsBackends

////
////} Вспомогательные процедуры и функции.
////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////
////{ ФормаНастройки - обработчики событий.
////

function КпШапкаНастройки(Элемент) {
    var pathToForm=SelfScript.fullPath.replace(/.js$/, 'param.ssf')
    мФормаНастройки=loadScriptForm(pathToForm, SelfScript.self) // Обработку событий формы привяжем к самому скрипту
    мФормаНастройки.ЭлементыФормы.НадписьВерсия.Заголовок="Версия скрипта:"+мВерсияСкрипта
    мФормаНастройки.ОткрытьМодально()
}

function мЗаписатьНастройки() {

    мТзКаталогиОбщие=мФормаНастройки.КаталогиОбщие
    мТзКаталогиБазы=мФормаНастройки.КаталогиБазы
    мОткрыватьПриСтарте=мФормаНастройки.ОткрыватьФормуПриЗагрузке
    мТзРасширенияФайлов = мФормаНастройки.РасширенияФайлов.Скопировать();
    мКомандаЗапускаКонсоли = мФормаНастройки.КомандаЗапускаКонсоли;
    мОтображатьРасширениеФайлаВПредставлении = мФормаНастройки.ОтображатьРасширениеФайлаВПредставлении;
    мИспользоватьВерсионирование = мФормаНастройки.ИспользоватьВерсионирование;
    мЦветФонаИзмененные        = мФормаНастройки.ЦветФонаИзмененные
    мЦветФонаУдаленный        = мФормаНастройки.ЦветФонаУдаленный
    мЦветФонаНеВерсионный    = мФормаНастройки.ЦветФонаНеВерсионный

    RE_EXTENSIONS = null; // Регулярку надо переформировать.
    
    profileRoot.setValue(pflExtFilesOpenOnStart, мОткрыватьПриСтарте)
    profileRoot.setValue(pflExtShowExtInName, мОтображатьРасширениеФайлаВПредставлении)
    profileRoot.setValue(pflExtFilesPath, ValueToStringInternal(мТзКаталогиОбщие))
    profileRoot.setValue(pflExtFilesPathBase, ValueToStringInternal(мТзКаталогиБазы))
    profileRoot.setValue(pflExtOpen1CExtensions, мТзРасширенияФайлов)
    profileRoot.setValue(pflExtRunConsoleCommand, мКомандаЗапускаКонсоли)
    profileRoot.setValue(pflExtViewSearchInList, мПоказыватьРезультатПоискаСписком)
    
    profileRoot.setValue(pflVersionControl, мИспользоватьВерсионирование)
    profileRoot.setValue(pfColorModiefed, мЦветФонаИзмененные)
    profileRoot.setValue(pfColorDeleted, мЦветФонаУдаленный)
    profileRoot.setValue(pfColorNotVersioned, мЦветФонаНеВерсионный)
    
    loadDvcsBackends()
    мОбновитьФайлы()
    УстановитьВидимость()
}

function мЗагрузитьНастройку(пТзКаталоги, пТаблицаКаталогов) {

    for (var лИнд=0; лИнд<пТзКаталоги.Количество(); лИнд++)
    {
        лСтрокаТз=пТаблицаКаталогов.Добавить()
        лСтрокаТз.ИмяКаталога=пТзКаталоги.Получить(лИнд).ИмяКаталога
        лСтрокаТз.Развернуть=пТзКаталоги.Получить(лИнд).Развернуть
    }
}

function НастройкиПриОткрытии() {
    мФормаНастройки.ОткрыватьФормуПриЗагрузке=мОткрыватьПриСтарте
    мФормаНастройки.ОтображатьРасширениеФайлаВПредставлении=мОтображатьРасширениеФайлаВПредставлении
    мЗагрузитьНастройку(мТзКаталогиОбщие, мФормаНастройки.КаталогиОбщие);
    мЗагрузитьНастройку(мТзКаталогиБазы, мФормаНастройки.КаталогиБазы);
    мФормаНастройки.РасширенияФайлов = мТзРасширенияФайлов;
    мФормаНастройки.КомандаЗапускаКонсоли = мКомандаЗапускаКонсоли;
    мФормаНастройки.ИспользоватьВерсионирование = мИспользоватьВерсионирование;
    мФормаНастройки.ЦветФонаИзмененные = мЦветФонаИзмененные;
    мФормаНастройки.ЦветФонаНеВерсионный = мЦветФонаНеВерсионный;
    мФормаНастройки.ЦветФонаУдаленный = мЦветФонаУдаленный;
    мФормаНастройки.ЭлементыФормы.ПанельНастроекВерсионныйКонтроль.Видимость = мИспользоватьВерсионирование;
}

function КпШапкаЗаписатьИЗакрыть(Кнопка) {
    мЗаписатьНастройки()
    мФормаНастройки.Закрыть()
}

function КпШапкаЗаписать(Кнопка) {
    мЗаписатьНастройки()
}

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

function мВыбратьКаталог() {
    ДиалогОткрытияФайла=v8New("ДиалогВыбораФайла", РежимДиалогаВыбораФайла.ВыборКаталога)
    ДиалогОткрытияФайла.ПолноеИмяФайла = ""
    ДиалогОткрытияФайла.Заголовок = "Выберите каталог"
    if(ДиалогОткрытияФайла.Выбрать()==false) return ""
    return ДиалогОткрытияФайла.Каталог
}

function КаталогиОбщиеИмяКаталогаНачалоВыбора(Элемент, СтандартнаяОбработка) {
    лКаталог=мВыбратьКаталог()
    if(лКаталог=="") return
    Элемент.val.Значение=лКаталог
}

function КаталогиБазыИмяКаталогаНачалоВыбора(Элемент, СтандартнаяОбработка) {
    лКаталог=мВыбратьКаталог()
    if(лКаталог=="") return
    Элемент.val.Значение=лКаталог
}

function НадписьCmdExeНажатие (Элемент) {
    мФормаНастройки.КомандаЗапускаКонсоли = Элемент.val.Заголовок;
}

function НадписьFarExeНажатие (Элемент) {
    мФормаНастройки.КомандаЗапускаКонсоли = Элемент.val.Заголовок;
}

function ИспользоватьВерсионированиеПриИзменении(Элемент) {
    мФормаНастройки.ЭлементыФормы.ПанельНастроекВерсионныйКонтроль.Видимость = мФормаНастройки.ИспользоватьВерсионирование;
}

////
////} ФормаНастройки - обработчики событий.
////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////
////{ Инициализация скрипта
////

// Зададим путь в профайле
var pflExtFilesOpenOnStart  = "ExtFiles/OpenOnStart"
var pflExtShowExtInName     = "ExtFiles/ShowExtInName"
var pflExtFilesPath         = "ExtFiles/Path"
var pflExtFilesPathBase     = "ExtFiles/PathBase"
var pflExtOpen1CExtensions  = "ExtFiles/Open1CExtensions"
var pflExtRunConsoleCommand = "ExtFiles/RunConsoleCommand"
var pflExtViewSearchInList  = "ExtFiles/ViewSearchInList"
var pflVersionControl       = "ExtFiles/VersionControl"
var pfColorModiefed         = "ExtFiles/ColorModiefed"
var pfColorDeleted          = "ExtFiles/ColorDeleted"
var pfColorNotVersioned     = "ExtFiles/ColorNotVersioned"


// Восстановим настройки
profileRoot.createValue(pflExtFilesOpenOnStart, false, pflSnegopat)
profileRoot.createValue(pflExtShowExtInName, true, pflSnegopat)
profileRoot.createValue(pflExtFilesPath, false, pflSnegopat)
profileRoot.createValue(pflExtFilesPathBase, false, pflBase)
profileRoot.createValue(pflExtOpen1CExtensions, СформироватьТзРасширенияФайловПоУмолчанию(), pflSnegopat)
profileRoot.createValue(pflExtRunConsoleCommand, 'cmd.exe /K cd /D "%1"', pflSnegopat)
profileRoot.createValue(pflExtViewSearchInList, false, pflSnegopat)
profileRoot.createValue(pflVersionControl, false, pflSnegopat)
profileRoot.createValue(pfColorModiefed, false, pflSnegopat)
profileRoot.createValue(pfColorDeleted, false, pflSnegopat)
profileRoot.createValue(pfColorNotVersioned, false, pflSnegopat)



var мОткрыватьПриСтарте = profileRoot.getValue(pflExtFilesOpenOnStart)
var мОтображатьРасширениеФайлаВПредставлении = profileRoot.getValue(pflExtShowExtInName)
var мТзКаталогиОбщие = profileRoot.getValue(pflExtFilesPath)
var мТзКаталогиБазы = profileRoot.getValue(pflExtFilesPathBase)
var мТзРасширенияФайлов = profileRoot.getValue(pflExtOpen1CExtensions);
var мКомандаЗапускаКонсоли = profileRoot.getValue(pflExtRunConsoleCommand);
var мПоказыватьРезультатПоискаСписком = profileRoot.getValue(pflExtViewSearchInList)
var мИспользоватьВерсионирование = profileRoot.getValue(pflVersionControl)
var мЦветФонаИзмененные = profileRoot.getValue(pfColorModiefed)
var мЦветФонаНеВерсионный = profileRoot.getValue(pfColorNotVersioned)
var мЦветФонаУдаленный = profileRoot.getValue(pfColorDeleted)

var RE_EXTENSIONS = null;

var КэшКартинокТиповФайлов = {};

var DvcsBackends = {};
var DiffBackends = {}; 
var СоответствиеКаталоговИDvcs = {};

var МассивФайловДляСравнения = [];

var Path1 = null
var Path2 = null

var mainFolder = stdlib.getSnegopatMainFolder();

global.connectGlobals(SelfScript)

if (!мЦветФонаИзмененные)  мЦветФонаИзмененные = v8New("Цвет", 255, 255, 0);
if (!мЦветФонаУдаленный)  мЦветФонаУдаленный = v8New("Цвет", 255, 0, 0);
if (!мЦветФонаНеВерсионный)  мЦветФонаНеВерсионный = v8New("Цвет", 192, 192, 192);

var СоответсвиеЦветовИСтатусов = {"DELETED":мЦветФонаУдаленный, "NOTVERSIONED":мЦветФонаНеВерсионный, "EDITED":мЦветФонаИзмененные}

мТзКаталогиОбщие = ТзКаталоговИнициализировать(мТзКаталогиОбщие)
мТзКаталогиБазы = ТзКаталоговИнициализировать(мТзКаталогиБазы)

мФормаСкрипта=null
мФормаНастройки=null

if(мОткрыватьПриСтарте==true)
    macrosОткрытьОкноВнешнихФайлов()

////} Инициализация скрипта


