четверг, 20 апреля 2017 г.

Как очистить кэш 1С 8

Бывают случаи, когда на данном компьютере пользователя в рабочей базе была старая конфигурация, хотя на любом другом ПК и на сервере она обновилась. Так же может возникать ошибка потока данных. В этих и некоторых других случаях поможет очистка кеша.
В связи с тем, что 1С может быть установлена на различных операционных системах, папка, где хранится кэш, может быть различной.
Для Win XP:
%userprofile%\Local Settings\Application Data\1C\1Cv82
%userprofile%\Application Data\1C\1Cv82

Для Win 7:
%userprofile%\AppData\Roaming\1C\1Cv82
%userprofile%\AppData\Local\1C\1Cv82

Серверные оси Windows 2008
C:\Users\<username>\AppData\Local\1C 
C:\Users\<username>\AppData\Roaming\1C

А самый простой способ найти папки – это использовать поиск по системе(win + F) по ключевым словам «1сv81» и/или «1cv82». Нужные нам папки находятся в каталоге пользователя.
Напимер:
C:\Documents and Settings\%userprofile%\Local Settings\Application Data\1C\1Cv81
C:\Documents and Settings\%userprofile% \Local Settings\Application Data\1C\1Cv82
C:\Documents and Settings\%userprofile% \Application Data\1C\1Cv81\
C:\Documents and Settings\%userprofile% \Application Data\1C\1Cv82\


Важно:
1) Кэш хранится в двух папках. Чаще всего эти папки называются «LocalSettings» и «ApplicationData». Обе папки находятся в каталоге пользователя.
2) Формат кэш-файлов выглядит вот так: «0df525c2-1c3e-44be-b852-c7059f17c5aa» или «0f2c4d8f-cc84-4033-8744-1acfa6204474». Удалять необходимо только те папки, у которых такой же формат в названии.
3.) Не удаляйте файл ibases.v8i — он содержит список баз





Можно ли изменить путь кэша метаданных?
Можно. С помощью групповых политик (gpedit.msc) можно переопределить путь профиля пользователя целиком (не только кэш метаданных).


ВАРИАНТЫ АВТОМАТИЗАЦИИ:
1. Доп. ключик командной строки /ClearCache — очистка кэша клиент-серверных вызовов (используется для тонкого и толстого клиентов в режиме 1С:Предприятия).
title

2. bat / cmd файл: 
Код VBS
 @FOR /D %%i in ("C:\Users\*") do ( 
@FOR /D %%j in ("%%i\Local settings\Application data\1C\1Cv82\????????-????-????-????-????????????") do rd /s /q "%%j" 
@FOR /D %%j in ("%%i\AppData\Roaming\1C\1Cv82\????????-????-????-????-????????????") do rd /s /q "%%j" 
)   

и текст батника с проверкой на ХР или 7: 
Код VBS
 If Exist %USERPROFILE%\AppData\Roaming\1C\1Cv82 ( 
rem Удаляем все файлы в 7 
Del /F /Q %USERPROFILE%\AppData\Roaming\1C\1Cv82\*.* 
Del /F /Q %USERPROFILE%\AppData\Local\1C\1Cv82\*.* 

rem Удаляем все каталоги в 7 
for /d %%i in ("%USERPROFILE%\AppData\Roaming\1C\1Cv82\*") do rmdir /s /q "%%i" 
for /d %%i in ("%USERPROFILE%\AppData\Local\1C\1Cv82\*") do rmdir /s /q "%%i" 
) 

If Exist %USERPROFILE%\Local Settings\Application Data\1C\1Cv82 ( 
rem Удаляем все файлы в XP 
Del /F /Q %USERPROFILE%\Local Settings\Application Data\1C\1Cv82\*.* 
Del /F /Q %USERPROFILE%\Application Data\1C\1Cv82\*.* 

rem Удаляем все файлы в XP 
for /d %%i in ("%USERPROFILE%\Local Settings\Application Data\1C\1Cv82\*") do rmdir /s /q "%%i" 
for /d %%i in ("%USERPROFILE%\Application Data\1C\1Cv82\*") do rmdir /s /q "%%i" 
)   

3. Процедуру ОчиститьКэшИПерезапуститьПрограмму() создаем в глобальном модуле и вызываем ее когда нужно почистить кэш 1С:
Код 1C v 8.х
 // Процедура создает и запускает vbs файл, который производит очистку кэша.
// 1С и презапускает программу
//
Процедура ОчиститьКэшИПерезапуститьПрограмму() Экспорт

     СкриптФайл = Новый ТекстовыйДокумент;

     СтрокаСоединенияСБД = СтрокаСоединенияИнформационнойБазы();
     СтрокаЗапускаПрограммы = КаталогПрограммы();

     ПутьКФайлуСкрипта = КаталогВременныхФайлов() + "CacheCleaning.vbs";
     ПутьКФайлу1С = СтрокаЗапускаПрограммы + "1cv8.exe";

     ИмяСервера = "";
     ИмяБазы = "";
     Путь = "";
     КомандаЗапуска = "";
     Один = """";
     Два = """""";
     Три = """""""";  
    Если (Найти(СтрокаСоединенияСБД, "File=") <> 0) Тогда
          Путь = СтрЗаменить(СтрокаСоединенияСБД, "File=", "");
          Путь = Лев(Путь, СтрДлина(Путь)-1);
          КомандаЗапуска = "WshShell.Run " + Три + ПутьКФайлу1С + Два + " ENTERPRISE /F" + Путь + Один + ", 1, true";
     Иначе
          МассивПараметровСоединения = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтрокаСоединенияИнформационнойБазы(), ";");
          МассивПараметровСервера = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(МассивПараметровСоединения[0], """");
          ИмяСервера = СокрЛП(МассивПараметровСервера[1]);
          МассивПараметровБазы = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(МассивПараметровСоединения[1], """");
          ИмяБазы = СокрЛП(МассивПараметровБазы[1]);
          КомандаЗапуска = "WshShell.Run " + Три + ПутьКФайлу1С + Два + " ENTERPRISE /S" + ИмяСервера + "\" + ИмяБазы + Один + ", 1, true";
     КонецЕсли;
     // Если пользователь не хочет перезапускать сеанс 1С, то после выполнения скрипта ничего не делаем. 
     Если Не глЗначениеПеременной("глПерезапускатьСеансРаботыСПрограммой")  Тогда
          КомандаЗапуска = ""; 
     КонецЕсли; 

     СкриптФайл.УстановитьТекст("WScript.Sleep(5000)
     |
     |Dim FSO 
     |Set FSO = WScript.CreateObject(""Scripting.FileSystemObject"")
     |Set WshShell = WScript.CreateObject(""WScript.Shell"")
     |Set colEnvVars = WshShell.Environment(""Process"")
     |
     |strComputer = ""."" 
     |Set objWMIService = GetObject(""winmgmts:"" _ 
     |& ""{impersonationLevel=impersonate}!\\"" _ 
     |& strComputer & ""\root\cimv2"") 
     |
     |Set colProcesses = objWMIService.ExecQuery( _ 
     |""S_elect * From Win32_Process "" _ 
     |& ""Where Name = '1cv8.exe'"") 
     |
     |For Each objProcess In colProcesses 
     | objProcess.Terminate 
     |Next
     | 
     |WScript.Sleep(1000)
     | 
     |FolderName1 = ""\Local Settings\Application Data\1C\1Cv82""
     |FolderName2 = ""\Local Settings\Application Data\1C\1Cv81""
     |FolderName3 = ""\appdata\Local\1C\1Cv82""
     |FolderName4 = ""\appdata\Local\1C\1Cv81""
     | 
     |If FSO.FolderExists(colEnvVars(""userprofile"") & FolderName1) Then
     | GoSubFolders colEnvVars(""userprofile"") & FolderName1
     |End If
     |If FSO.FolderExists(colEnvVars(""userprofile"") & FolderName2) Then
     |GoSubFolders colEnvVars(""userprofile"") & FolderName2
     | End If
     |If FSO.FolderExists(colEnvVars(""userprofile"") & FolderName3) Then
     | GoSubFolders colEnvVars(""userprofile"") & FolderName3
     |End If
     |If FSO.FolderExists(colEnvVars(""userprofile"") & FolderName4) Then
     | GoSubFolders colEnvVars(""userprofile"") & FolderName4
     |End If
     |
     |" + КомандаЗапуска + "
     |Set WshShell = Nothing
     | 
     |Sub DelFile(sFILE)
     | On Error Resume Next
     | FSO.DeleteFile sFILE, True
     | If Err.Number <> 0 Then
     | Wscript.Echo ""Error deleting file: "" & sFILE
     | End If
     |End sub
     | 
     |Function GetFolder(sFOLDER)
     | On Error Resume Next
     | Set GetFolder = FSO.GetFolder(sFOLDER)
     | If Err.Number <> 0 Then
     | Wscript.Echo ""Error connecting to folder:"" & sFOLDER & VBlf & ""["" & Err.Number & ""]"" & Err.Description
     | Wscript.Quit Err.Number
     | End If
     |End Function
     | 
     |Sub GoSubFolders (objDIR)
     | ProcessFilesInFolder objDIR
     | Set sFolder = GetFolder(objDIR)
     | For Each eFolder in sFolder.SubFolders
     | GoSubFolders eFolder
     | Next
     | FSO.DeleteFolder sFolder, True
     |End Sub
     |
     |Sub ProcessFilesInFolder (objDIR)
     |Set sFolder = GetFolder(objDIR)
     |For Each objFile in sFolder.Files
     | DelFile objFile
     |Next
     |End Sub");

     Попытка
            СкриптФайл.Записать(ПутьКФайлуСкрипта, КодировкаТекста.Системная);
            ЗапуститьПриложение(ПутьКФайлуСкрипта);
     Исключение
     КонецПопытки;

КонецПроцедуры 

Комментариев нет:

Отправить комментарий