1

Тема: JS: по 1С скрипт 2014 года: Локальный кэш 1С 8.2 показать.js

Не знаю, как сейчас, но когда лет десять назад я некоторое время работал с 1С:Предприятием 8.2, очистка локального кэша при проблемах с базой была иногда актуальна. Конечно, был, вроде, ключик командной строки, но не всегда он срабатывал как надо, насколько помню. Поэтому пользовался тогда старыми своим скриптом (который привожу здесь), чтобы "почистить" локальный кэш в некоторых случаях. Скрипт привожу для иллюстрации некоторых приёмов работы на JScript (WSH). По 1С не работаю давно уже, поэтому не знаю, насколько он может быть работоспособен и актуален теперь.

//  Скрипт для всех баз 1С:Предприятия 8.2, имеющихся в окне запуска, строит дерево ссылок на локальный кэш.
var FSO = new ActiveXObject("Scripting.FileSystemObject");
var ForReading = 1, ForWriting = 2, ForAppending = 8;
var Shell = new ActiveXObject("Shell.Application");
var WshShell = new ActiveXObject("WScript.Shell");
var localAppdata = getTree(FSO.BuildPath(Shell.Namespace("shell:Local AppData").Self.Path, "1C"));
var configurations = [], appdata = getTree(FSO.BuildPath(Shell.Namespace("shell:AppData").Self.Path, "1C"));
var userName = new ActiveXObject("WScript.Network").userName;

if(!WScript.Arguments.Named.Exists("explicitly")){
    // Сначала добавим общие информационные базы
    var s, cfg = findEntries(appdata, /\\1CEStart\.cfg$/i);
    for (var i=0; i<cfg.length; i++) {
        if(FSO.FileExists(cfg[i]))
            with(FSO.OpenTextFile(cfg[i], ForReading, false, -1))
                while(!AtEndOfStream)
                    if(/^CommonInfoBases=(.*)$/i.test(s=ReadLine()))
                        if(FSO.FileExists(s=RegExp.$1))configurations = configurations.concat(readBases(s));
    }
    // Теперь базы текущего пользователя
    var ibases = findEntries(appdata, /\\ibases\.v8i$/i);
    for (var i=0; i<ibases.length; i++)configurations = configurations.concat(readBases(ibases[i]));
}
// Теперь обработаем безымянные параметры командной строки
Args = WScript.Arguments.Unnamed
for (var i=0; i<Args.length; i++) {
    Arg = Args.Item(i)
    if(FSO.GetExtensionName(Arg) == "v8i" && FSO.FileExists(Arg))
        configurations = configurations.concat(readBases(Arg));
}

configurations = configurations.sort(function(a, b){return a.folder==b.folder?0:a.folder<b.folder?-1:1})

var trees = [makeTree(localAppdata), makeTree(appdata)]

for (var i=0; i<trees.length; i++) {
    WshShell.Run("explorer " + trees[i]);
}

WScript.Sleep(2000);
WshShell.Popup("Построение дерева завершено.", 2, WScript.ScriptName, 64);

function readBases(filename){
    with(new ActiveXObject("ADODB.Stream")){Type=2;Mode=3;Open();Charset="UTF-8";LoadFromFile(filename);
        Position=3;var lines=ReadText().split("\r\n");Close();
    }
    for (var i=0, data=[]; i<lines.length; i++) {
        if(/^\[([^]]+)\]$/.test(line=lines[i])){
            var element = new String(RegExp.$1);
            element.folder = "/";
            element.id = "";
            data.push(element);
        }
        else if(/^ID=(.*)$/i.test(line))element.id = RegExp.$1;
        else if(/^Folder=(.*)$/i.test(line))element.folder = RegExp.$1;
    }
    return data
}

function findEntries(data, regexp){var entry, found=[];
    for (var i=0; i<data.length; i++) {
        if(regexp.test(entry=data[i]))found.push(entry);
    }
    return found;
}

function getTree(path, data){var newPath, currentFolder, folders, files;
    if(typeof(data)=="undefined")data = [];
    path = FSO.GetAbsolutePathName(path);
    try {
        currentFolder = FSO.GetFolder(path);
    } catch(e) {
        if ((e.number & 0xFFFF) == 76) return data; // Папка не найдена
        else throw e;
    }
    folders = new Enumerator(currentFolder.SubFolders);
    for(;!folders.atEnd();folders.moveNext()){data.push(newPath = FSO.BuildPath(path, folders.item().Name));
        getTree(newPath, data);
    }
    files = new Enumerator(currentFolder.Files);
    for(;!files.atEnd();files.moveNext()){data.push(FSO.BuildPath(path, files.item().Name))}
    return data
}

function makeTree(startPath){
    var destName = "Локальный кэш 1С (" + userName + ") ";
    if(!/Local/.test(startPath)){
        destName += "Roaming"
        var cacheNames = "ExtCompT|tmplts|";
    }else{
        destName += "Local"
        var cacheNames = "dumps|logs|";
    }
    var cacheParent, cacheParents = "", cacheName;
    // Очистим ранее созданное дерево
    var treeRoot = FSO.BuildPath(FSO.GetFile(WScript.ScriptFullName).ParentFolder, destName);
    var tree = getTree(treeRoot);
    for (var i=tree.length-1; i>=0; i--) {
        if(FSO.FileExists(path=tree[i]))FSO.DeleteFile(path);
        else if(FSO.FolderExists(path))FSO.DeleteFolder(path);
    }
    // Построим новое дерево
    if(!FSO.FolderExists(treeRoot))FSO.CreateFolder(treeRoot);
    for (var i=0; i<configurations.length; i++) {
        var configuration = configurations[i];
        var folderName = FSO.BuildPath(treeRoot , configuration.folder.replace(/\//g, "\\"));
        if(!FSO.FolderExists(folderName))FSO.CreateFolder(folderName);
        if(configuration.id){var caches = findEntries(startPath, new RegExp("\\\\" + configuration.id + "$"));
            cacheName = configuration.id + "|";
            if(caches && cacheNames.indexOf(cacheName) == -1)cacheNames += cacheName;
            for (var j=0; j<caches.length; j++) {
                var cache = caches[j], in_=" в " + (cacheParent = (cacheFolder = FSO.GetFolder(cache)).ParentFolder).Name;
                cacheParent = cacheParent.Path.replace(/\\/g, "\\\\").replace(/\./g, "\\.") + "|";
                if(cacheParents.indexOf(cacheParent) == -1)cacheParents += cacheParent;
                var shortcutName = FSO.BuildPath(folderName, configuration + in_ + ".lnk");
                if(FSO.FileExists(shortcutName))FSO.DeleteFile(shortcutName);
                with(WshShell.CreateShortcut(shortcutName)){
                    TargetPath = cache;
                    Save();
                }
            }
        }
        
    }
    // Добавим найденные кэши, не описанные в списках баз
    var cachesFound = findEntries(startPath, new RegExp("^(?:" + cacheParents.slice(0, -1) + ")\\\\(?!" +
        cacheNames.slice(0, -1) + ")[^\\\\]+$"));
    for (var i=0; i<cachesFound.length; i++) {
        if(FSO.FolderExists(cache = cachesFound[i])){cacheFolder = FSO.GetFolder(cache);
            var shortcutName = FSO.BuildPath(treeRoot, "!Неизвестный кэш " + cacheFolder.Name + " в " +
                cacheFolder.ParentFolder.Name + ".lnk");
            if(FSO.FileExists(shortcutName))FSO.DeleteFile(shortcutName);
            with(WshShell.CreateShortcut(shortcutName)){
                TargetPath = cache;
                Save();
            }
        }
    }
    return destName;
}