gifts2017

Очистка кэша 1С из сеанса 1С Предприятие

Опубликовал Пользователь Фамилия (User80) в раздел Программирование - Практика программирования

Очистка кэша 1С из сеанса 1С Предприятие
Обработка для самостоятельной очистки пользователем кэша базы в которой он работает.

Многие сталкивались с тем, что при динамичесом обновлении новая версия конфигурации может работать с ошибками, причем ошибки могут быть совершенно не связаны с измененным объектом и даже не поддаваться никакому логическому объяснению как например ошибка формата потока. Для их устранения нужно всего-лишь отчистить кэш пользователя у которого она возникает. Было решено не чистить кэш при каждом динамическом обновлении, а чистить только тогда, когда это действительно необходимо, причем пользователь сам решит, когда ему удобно произвести очистку.

Есть много решений данной проблемы, и хочется добавить к ним еще один вариант решения, который успешно работает и для кого-то может быть более удобным.

Основное отличие обработки:

1. Очистка производится с помощью bat файла

2. Очищается только каталог в котором находится кэш текущего сеанса работы

3. При очистке кэша я столкнулся с тем, что простое удаление файлов кэша ничего не дает (windows умудряется их восстанавливать и ошибка возникает вновь), поэтому при очистке генерируется новый уникальный идентификатор базы, а старые файлы кэша удаляются вместе с каталогом в котором они находятся.

Разработка выполнялась для себя, поэтому предполагается, что пользователь работает с 1С8.2 и в клиент-серверном варианте работы программы.


////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ

// Помещает в массив строки, которые разделены указанным символом
// Параметры
//         Стр - строка, которую необходимо разложить
//         Разделитель - строка, символ разделяющий строки
//
// Возвращаемое значение
//      Массив строк
//
Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",")
    
    МассивСтрок = Новый Массив();
    Если Разделитель = " " Тогда
        Стр = СокрЛП(Стр);
        Пока 1=1 Цикл
            Поз = Найти(Стр,Разделитель);
            Если Поз=0 Тогда
                МассивСтрок.Добавить(Стр);
                Возврат МассивСтрок;
            КонецЕсли;
            МассивСтрок.Добавить(Лев(Стр,Поз-1));
            Стр = СокрЛ(Сред(Стр,Поз));
        КонецЦикла;
    Иначе
        ДлинаРазделителя = СтрДлина(Разделитель);
        Пока 1=1 Цикл
            Поз = Найти(Стр,Разделитель);
            Если Поз=0 Тогда
                МассивСтрок.Добавить(Стр);
                Возврат МассивСтрок;
            КонецЕсли;
            МассивСтрок.Добавить(Лев(Стр,Поз-1));
            Стр = Сред(Стр,Поз+ДлинаРазделителя);
        КонецЦикла;
    КонецЕсли;
    
КонецФункции // глРазложить

// Возвращает строку запуска 1С
// Параметры
//         Нет
//
// Возвращаемое значение
//      Строка для запуска 1С
//
Функция ПолучитьСтрокуЗапуска1С()
    
    ПутьКФайлуЗапуска = "";
    Если КаталогИлиФайлСуществует("C:\Program Files (x86)\1cv82\common\1cestart.exe") Тогда
        ПутьКФайлуЗапуска = """C:\Program Files (x86)\1cv82\common\1cestart.exe";
    ИначеЕсли КаталогИлиФайлСуществует("C:\Program Files\1cv82\common\1cestart.exe") Тогда    
        ПутьКФайлуЗапуска = """C:\Program Files\1cv82\common\1cestart.exe";
    Иначе    
        Возврат "";
    КонецЕсли;
    
    ИмяИБ = "";
    ИмяСервера = "";
    
    ПодстрокиСтрокиСоединения  = РазложитьСтрокуВМассивПодстрок(СтрокаСоединенияИнформационнойБазы(),";");
    Если ПодстрокиСтрокиСоединения.Количество()> 1 и Лев(ПодстрокиСтрокиСоединения[0], 5) = "Srvr=" и Лев(ПодстрокиСтрокиСоединения[1], 4) = "Ref=" Тогда
        
        ИмяСервера = Сред(ПодстрокиСтрокиСоединения[0],7, СтрДлина(ПодстрокиСтрокиСоединения[0]) - 7);
        ИмяИБ      = Сред(ПодстрокиСтрокиСоединения[1],6, СтрДлина(ПодстрокиСтрокиСоединения[1]) - 6);
        
    КонецЕсли;
    
    ИмяТекПользователя = ?(ПользователиИнформационнойБазы.ТекущийПользователь().АутентификацияОС = Истина,"",ИмяПользователя());
    
    ПараметрыСтрокиЗапуска = "";
    Если ИмяСервера <> "" И ИмяИБ <> "" Тогда
        ПараметрыСтрокиЗапуска = """ ENTERPRISE" + " /S""" + ИмяСервера + "\" + ИмяИБ + """/N""" + ИмяТекПользователя + """";
    КонецЕсли;

    Возврат ПутьКФайлуЗапуска + ПараметрыСтрокиЗапуска;    
КонецФункции    

// Проверяет существование каталога
// Параметры
//         Путь - путь к проверяемому каталогу
//
// Возвращаемое значение
//      Булево. Истина, если каталог существует, Ложь, если каталог не существует
//
Функция КаталогИлиФайлСуществует(Путь)
    
    КаталогНаДиске = Новый Файл(Путь);
    
    Если КаталогНаДиске.Существует() Тогда
        Возврат Истина;
    Иначе
        Возврат Ложь;
    КонецЕсли;    

КонецФункции


////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ - ДЕЙСТВИЯ ФОРМЫ

// Процедура вызывается при нажатии кнопки "Сформировать" командной панели формы
//
Процедура КнопкаСформироватьНажатие(Кнопка)
    
    //Проверка штука хорошая, однако я столкнулся с ограничениями доступа пользователей. Для
    //того, чтобы все было корректно необходимо положить ее в привелигированный модуль.
    //    
    //МассивСоединений = ПолучитьСоединенияИнформационнойБазы();
    //НомерТекущегоСоединения = НомерСоединенияИнформационнойБазы();
    //ИмяТекПользователя = ИмяПользователя();
    //
    //Для каждого Соединение ИЗ МассивСоединений Цикл                    
    //    Если Соединение.ИмяПриложения <> "Designer"
    //        И Соединение.НомерСоединения <> НомерТекущегоСоединения
    //        И Соединение.Пользователь <> Неопределено
    //        И СокрЛП(Соединение.Пользователь.Имя) = ИмяТекПользователя
    //        Тогда
    //        Предупреждение("Существует несколько сеансов работы с текущей базой. Закройте их.");
    //        Возврат;
    //    КонецЕсли;        
    //КонецЦикла;    

    WSH=Новый COMobject("wscript.shell");
    ПрофильПользователя = WSH.ExpandEnvironmentStrings("%APPDATA%");//Возвращает используемое по умолчанию размещение данных приложений
    
    Каталог = ПрофильПользователя+"\1C\1CEStart\";    
    КаталогСуществует = КаталогИлиФайлСуществует(Каталог);    
    
    Если КаталогСуществует  = Ложь Тогда
        Сообщить("Не найден каталог инфрормационной базы. Очистка кеша невозможна. ");
        Возврат;
    КонецЕсли;
    
    Каталог = Каталог + "ibases.v8i";
    Если КаталогИлиФайлСуществует(Каталог) Тогда
        
        Текст = Новый ТекстовыйДокумент;
        Текст.Прочитать(Каталог);
        
        ТекстФайла = Текст.ПолучитьТекст();
        
        Позиция = Найти(ТекстФайла,СтрокаСоединенияИнформационнойБазы());
        Если Позиция = 0 Тогда
            Сообщить("GUID информационной базы не найден. Очистка кеша невозможна.");
            Возврат;
        Иначе    
            ТекстФайла = Прав(ТекстФайла,СтрДлина(ТекстФайла) - Позиция + 1);
            Позиция = Найти(ТекстФайла,"ID=");
            GUID = Сред(ТекстФайла, Позиция + 3, 36);
            
            НовыйGUID = Новый УникальныйИдентификатор;
            Пока Найти(ТекстФайла,НовыйGUID) > 0 Цикл
                НовыйGUID = Новый УникальныйИдентификатор;
            КонецЦикла;    
            
            Если Вопрос("Необходимо перезагрузить программу. Перезагружаем?",РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
                Возврат;
            КонецЕсли;    
            
            //Присвоим базе новый УИД
            ТекстФайла = Текст.ПолучитьТекст();
            ТекстФайла = СтрЗаменить(ТекстФайла,GUID,НовыйGUID);
            Текст.УстановитьТекст(ТекстФайла);
            Текст.Записать(Каталог);
        КонецЕсли;
        
    Иначе
        Сообщить("Файл ""ibases.v8i"" не найден. Очистка кеша невозможна.");
        Возврат;
    КонецЕсли;    
    
    Каталог = СтрЗаменить(Каталог,"1CEStart\ibases.v8i","") + "1Cv82\" + GUID + "\";
    Если КаталогИлиФайлСуществует(Каталог) Тогда
                
        ПутьКФайлу = Каталог + "1Cv8.lck";
        
        ТекстBatФайла = "
            |cd\
            |cls
            |rem Restart 1C
            |@echo off
            |rem Файл работает следующим образом:
            |rem ждем пока удалится файл 1Cv8_1.lck (удаляется при закрытии 1С) и чистим кэш
            |rem если файл не удаляется в течение 40 сек. завершаем работу программы
            |set /a count=1
            |:flag
            |if %count% gtr 8 goto end
            |if Not exist """ + ПутьКФайлу + """ goto go
            |ping -n 5 127.0.0.1 > NUL
            |call set /a count+=1
            |goto flag
            |:go
            |rem Удаляем все файлы
            |Del /F /Q """ + Каталог + "*.*""
            |rem Удаляем все каталоги
            |for /d %%i in ("""+ Каталог + "*"") do rmDir /s /q ""%%i""
            |rem Удаляем основной каталог
            |rmDir """ + Лев(Каталог,СтрДлина(Каталог)-1) + """
            |:end
            |rem Запускаем 1С
            |" + ПолучитьСтрокуЗапуска1С() + "
            |rem Удаляем этот файл
            |del %0";
            
            
        Текст = Новый ТекстовыйДокумент;
        Текст.УстановитьТекст(ТекстBatФайла);
        Текст.Записать(КаталогВременныхФайлов() + "\ClearCache.bat",КодировкаТекста.OEM);
        ЗапуститьПриложение("""" + КаталогВременныхФайлов() + "\ClearCache.bat""");            
        ЗавершитьРаботуСистемы(Ложь);
        
    Иначе
        Сообщить("Каталог с GUIDом """ + GUID + """ не найден. Очистка кеша невозможна.");
        Возврат;
    КонецЕсли;    
    
КонецПроцедуры

Скачать файлы

Наименование Файл Версия Размер
Самостоятельная очистка кэша пользователем 373
.epf 8,75Kb
25.04.13
373
.epf 8,75Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Юрий Осипов (yuraos) 26.04.13 07:10
Интересно, практично.
Плюс за использование нестандартных для 1С средств.
---
А как бы почистить кэш для всех пользователей или для списка отмеченных ?
;)
2. Пользователь Фамилия (User80) 26.04.13 10:06
Насчет очистки нескольких пользователей я не размышлял. Я попытался сделать обработку, чтобы с ней можно было работать как есть, т.е. например поместить во внешние обработки и запускать когда необходимо. Для очистки нескольких пользователей можно добавить в конфигурацию регистр сведений в котором выбирать нужный людей, а при закрытии программы в процедуре "ПередЗавершениемРаботыСистемы(Отказ)", проверять есть ли пользователь в регистре, в конце процедуры ставить Отказ = Истина, удалять пользователя из регистра и запускать эту обработку в которой заблокировать сообщение о перезапуске 1С. Ну а далее зависит от фантазии, можно подключить обработчик ожидания и сообщать, что необходимо перезапустить 1С и т.д.
3. Дмитрий Глеков (glek) 26.04.13 10:29
1. Судя по приведенному коду, используется файл списка общих баз. Хотя об этом не указано в описании публикации.
2. Почему то по коду не нашел таких путей (аппдата\1с\1cestart).
Наверное, надо допилить описание публикации
4. Пользователь Фамилия (User80) 26.04.13 11:19
Это не общий список баз. У каждого пользователя свой индивидуальный список.
В связи с тем, что 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

У меня например Win XP
ПрофильПользователя = "C:\Documents and Settings\%userprofile%\Application Data"
добавляем сюда "\1C\1CEStart\" и получается каталог информационной базы.
5. Сергей Маслов (LexSeIch) 26.04.13 14:39
Мир этому дому!
Спасибо за открытый код. Всегда интересно видеть логику решения других людей. Плюс.
6. Вадим Назаров (NazarovV) 26.04.13 14:45
7. Михаил Максимов (МихаилМ) 26.04.13 15:19
удалять файлы кэша конфигурации не нужно. достаточно их очистить.
это можно сделать в сеансе 1с.
те без бат файлов, пересоздания списка баз.
8. andrewks 26.04.13 15:50
При очистке кэша я столкнулся с тем, что простое удаление файлов кэша ничего не дает (windows умудряется их восстанавливать и ошибка возникает вновь),


можно поподробнее? первый раз слышу о таком
9. Станислав Яцкевич (crosby) 26.04.13 15:57
Вот универсальное проверенное средство: http://infostart.ru/public/90572/
10. Maxim Kolkin (the1) 26.04.13 15:59
(7) Михаил, вот и запили сюда код, а критиковать каждый может. Человек сделал и выложил. А вам слабо?

З.Ы. Публикацию плюсую
11. Пользователь Фамилия (User80) 26.04.13 16:33
(8) andrewks, Я не могу внятно объяснить как это получается, поэтому напишу как я пришел к такому выводу. Сначала я просто удалял файлы кэша из папки, удалял их на своей машине (Win XP) и все работало прекрасно, затем я попытался почистить кэш на терминальном сервере (Win 7) и требуемого результата не получил. Первая мысль была, что где-то ошибка, поэтому я попробовал не перезапускать базу, каталог с временными файлами был пуст. Запущенная программа 1С опять показала ошибку, затем я удалил файлы в каталоге в котором находился кэш вместе с самим каталогом, убедился что каталога нет, запущенная 1С показала ошибку и уже после изменения уникального идентификатора базы в файле "ibases.v8i" ошибка исчезла. Разработка писалась долго и тестировалась на нескольких пользователях результат был одинаков, пока я не изменил УИД базы ошибка повторялась.
12. Михаил Максимов (МихаилМ) 26.04.13 16:59
(8)
в каталоге
C:\Documents and Settings\%userprofile% \Local Settings\Application Data\1C\1Cv82
GUID бд\config\

есть файлы кэша конфигурации : cacheStorage и cacheVersions

вот их и надо очищать, тк удалить их нельзя.

если разобраться, что cacheVersions (это не сложно) и где 1с в озу хранит список загруженных метаданных,
то можно написать обновление метаданных налету.
и прославится во веки.
13. Михаил Максимов (МихаилМ) 26.04.13 17:02
+(12)
уточнение:
удалять нельзя при запущенной 1с.
14. Maxim Kolkin (the1) 26.04.13 17:05
(12) ну вот, а у автора ГУИД сам вычисляет.
15. Сергей Космачев (ksnik) 26.04.13 22:44
Спасибо, проверили - работает :-)
16. Дмитрий Глеков (glek) 27.04.13 10:35
(4) User80, 1. Файл с указанным расширением и есть список баз. Как он будет использоваться (индивидуально, или один файл раскидывается по пользователям) - не важно. В общем случае (если просто создать базу) - этого файла нет. И насчет каталогов. В общем, надо "допилить" описание разработки.
17. Сергей Космачев (ksnik) 29.04.13 10:39
Я сделал через меню сервис в этой обработке 2 кнопки "завершить сеанс" и "перезапустить" (может прийдется еще допиливать батники, например для борьбы с синим экраном в терминалке) и чтоб в лог писалось. И чтоб все завершальсь даже если темп почистить не удалось:

//Завершить сеанс и перезапустить
Процедура КнопкаПерезапуститьНажатие(Кнопка)
	
    Если Привелегированный.ПроверкаЕдинственногоСеанса() = Ложь Тогда
		Предупреждение("Существует несколько сеансов работы с текущей базой.
		|Закройте их сами или обратитесь в ИТ-отдел, чтобы их удалили.");
		Возврат;
	КонецЕсли;
		
	WSH=Новый COMobject("wscript.shell"); 
	ПрофильПользователя = WSH.ExpandEnvironmentStrings("%APPDATA%");//Возвращает используемое по умолчанию размещение данных приложений
	
	Каталог = ПрофильПользователя+"\1C\1CEStart\";	
	КаталогСуществует = КаталогИлиФайлСуществует(Каталог);	
	
	Если КаталогСуществует  = Ложь Тогда
		Сообщить("Не найден каталог инфрормационной базы. Очистка кеша невозможна. ");
		Возврат;
	КонецЕсли;
	
	Каталог = Каталог + "ibases.v8i";
	Если КаталогИлиФайлСуществует(Каталог) Тогда
		
		Текст = Новый ТекстовыйДокумент;
		Текст.Прочитать(Каталог);
		
		ТекстФайла = Текст.ПолучитьТекст();
		
		Позиция = Найти(ТекстФайла,СтрокаСоединенияИнформационнойБазы());
		Если Позиция = 0 Тогда
			Сообщить("GUID информационной базы не найден. Очистка кеша невозможна.");
			Возврат;
		Иначе	
			ТекстФайла = Прав(ТекстФайла,СтрДлина(ТекстФайла) - Позиция + 1);
			Позиция = Найти(ТекстФайла,"ID=");
			GUID = Сред(ТекстФайла, Позиция + 3, 36);
			
			НовыйGUID = Новый УникальныйИдентификатор;
			Пока Найти(ТекстФайла,НовыйGUID) > 0 Цикл
				НовыйGUID = Новый УникальныйИдентификатор;
			КонецЦикла;	
			
			Если Вопрос("Необходимо перезагрузить программу. Перезагружаем?",РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
				Возврат;
			КонецЕсли;	
			
			//Присвоим базе новый УИД
			ТекстФайла = Текст.ПолучитьТекст();
			ТекстФайла = СтрЗаменить(ТекстФайла,GUID,НовыйGUID);
			Текст.УстановитьТекст(ТекстФайла);
			Текст.Записать(Каталог);
		КонецЕсли;
		
	Иначе
		Сообщить("Файл ""ibases.v8i"" не найден. Очистка кеша невозможна.");
		Возврат;
	КонецЕсли;	
	
	Каталог = СтрЗаменить(Каталог,"1CEStart\ibases.v8i","") + "1Cv82\" + GUID + "\";
	Если КаталогИлиФайлСуществует(Каталог) Тогда
				
		ПутьКФайлу = Каталог + "1Cv8.lck";
		
		ТекстBatФайла = "
			|cd\
			|cls
			|@echo off
			|echo ""Restart "" %UserName% %DATE% %TIME%
			|echo ""Restart "" %UserName% %DATE% %TIME% >> d:\obmen\1c_close_log.txt
			|rem Файл работает следующим образом:
			|rem ждем пока удалится файл 1Cv8_1.lck (удаляется при закрытии 1С) и чистим кэш
			|rem если файл не удаляется в течение 60 сек. завершаем работу программы
			|set /a count=1
			|:flag
			|if %count% gtr 12 goto end
			|if Not exist """ + ПутьКФайлу + """ goto go
			|ping -n 5 127.0.0.1 > NUL
			|call set /a count+=1
			|goto flag
			|:go
			|rem Удаляем все файлы
			|Del /F /Q """ + Каталог + "*.*"" >> d:\obmen\1c_close_log.txt
			|rem Удаляем все каталоги
			|for /d %%i in ("""+ Каталог + "*"") do rmDir /s /q ""%%i"" >> d:\obmen\1c_close_log.txt
			|rem Удаляем основной каталог
			|rmDir """ + Лев(Каталог,СтрДлина(Каталог)-1) + """ >> d:\obmen\1c_close_log.txt
			|:end
			|rem Запускаем 1С
			|" + ПолучитьСтрокуЗапуска1С() + "
			|rem Удаляем этот файл
			|del %0";
			
			
		Текст = Новый ТекстовыйДокумент;
		Текст.УстановитьТекст(ТекстBatФайла);
		Текст.Записать(КаталогВременныхФайлов() + "\ClearCache.bat",КодировкаТекста.OEM);
		ЗапуститьПриложение("""" + КаталогВременныхФайлов() + "\ClearCache.bat""");			
		ЗавершитьРаботуСистемы(Ложь);
		
	Иначе
		Сообщить("Каталог с GUIDом """ + GUID + """ не найден. Очистка кеша невозможна.");
		Предупреждение("Каталог с GUIDом """ + GUID + """ не найден. Очистка кеша невозможна.");
		ЗавершитьРаботуСистемы(Ложь);
		Возврат;
	КонецЕсли;	
	
КонецПроцедуры

Процедура КнопкаЗавершитьСеансНажатие(Кнопка)
	
    Если Привелегированный.ПроверкаЕдинственногоСеанса() = Ложь Тогда
		Предупреждение("Существует несколько сеансов работы с текущей базой.
		|Закройте их сами или обратитесь в ИТ-отдел, чтобы их удалили.");
		Возврат;
	КонецЕсли;
		
	WSH=Новый COMobject("wscript.shell"); 
	ПрофильПользователя = WSH.ExpandEnvironmentStrings("%APPDATA%");//Возвращает используемое по умолчанию размещение данных приложений
	
	Каталог = ПрофильПользователя+"\1C\1CEStart\";	
	КаталогСуществует = КаталогИлиФайлСуществует(Каталог);	
	
	Если КаталогСуществует  = Ложь Тогда
		Сообщить("Не найден каталог инфрормационной базы. Очистка кеша невозможна. ");
		Возврат;
	КонецЕсли;
	
	Каталог = Каталог + "ibases.v8i";
	Если КаталогИлиФайлСуществует(Каталог) Тогда
		
		Текст = Новый ТекстовыйДокумент;
		Текст.Прочитать(Каталог);
		
		ТекстФайла = Текст.ПолучитьТекст();
		
		Позиция = Найти(ТекстФайла,СтрокаСоединенияИнформационнойБазы());
		Если Позиция = 0 Тогда
			Сообщить("GUID информационной базы не найден. Очистка кеша невозможна.");
			Возврат;
		Иначе	
			ТекстФайла = Прав(ТекстФайла,СтрДлина(ТекстФайла) - Позиция + 1);
			Позиция = Найти(ТекстФайла,"ID=");
			GUID = Сред(ТекстФайла, Позиция + 3, 36);
			
			НовыйGUID = Новый УникальныйИдентификатор;
			Пока Найти(ТекстФайла,НовыйGUID) > 0 Цикл
				НовыйGUID = Новый УникальныйИдентификатор;
			КонецЦикла;	
			
			Если Вопрос("Закрыть 1С?",РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
				Возврат;
			КонецЕсли;	
			
			//Присвоим базе новый УИД
			ТекстФайла = Текст.ПолучитьТекст();
			ТекстФайла = СтрЗаменить(ТекстФайла,GUID,НовыйGUID);
			Текст.УстановитьТекст(ТекстФайла);
			Текст.Записать(Каталог);
		КонецЕсли;
		
	Иначе
		Сообщить("Файл ""ibases.v8i"" не найден. Очистка кеша невозможна.");
		Возврат;
	КонецЕсли;	
	
	Каталог = СтрЗаменить(Каталог,"1CEStart\ibases.v8i","") + "1Cv82\" + GUID + "\";
	Если КаталогИлиФайлСуществует(Каталог) Тогда
				
		ПутьКФайлу = Каталог + "1Cv8.lck";
		
		ТекстBatФайла = "
			|cd\
			|cls
			|@echo off
			|echo ""Close "" %UserName% %DATE% %TIME%
			|echo ""Close "" %UserName% %DATE% %TIME% >> d:\obmen\1c_close_log.txt
			|rem Файл работает следующим образом:
			|rem ждем пока удалится файл 1Cv8_1.lck (удаляется при закрытии 1С) и чистим кэш
			|rem если файл не удаляется в течение 60 сек. завершаем работу программы
			|set /a count=1
			|:flag
			|if %count% gtr 12 goto end
			|if Not exist """ + ПутьКФайлу + """ goto go
			|ping -n 5 127.0.0.1 > NUL
			|call set /a count+=1
			|goto flag
			|:go
			|rem Удаляем все файлы
			|Del /F /Q """ + Каталог + "*.*"" >> d:\obmen\1c_close_log.txt
			|rem Удаляем все каталоги
			|for /d %%i in ("""+ Каталог + "*"") do rmDir /s /q ""%%i"" >> d:\obmen\1c_close_log.txt
			|rem Удаляем основной каталог
			|rmDir """ + Лев(Каталог,СтрДлина(Каталог)-1) + """ >> d:\obmen\1c_close_log.txt
			|:end
			|rem Удаляем этот файл
			//|rem copy con d:\temp\1c_close_log.txt
			|del %0";
			
			
		Текст = Новый ТекстовыйДокумент;
		Текст.УстановитьТекст(ТекстBatФайла);
		Текст.Записать(КаталогВременныхФайлов() + "\ClearCache.bat",КодировкаТекста.OEM);
		ЗапуститьПриложение("""" + КаталогВременныхФайлов() + "ClearCache.bat""");			
		ЗавершитьРаботуСистемы(Ложь);
		
	Иначе
		Сообщить("Каталог с GUIDом """ + GUID + """ не найден. Очистка кеша невозможна.");
		Предупреждение("Каталог с GUIDом """ + GUID + """ не найден. Очистка кеша невозможна.");
		ЗавершитьРаботуСистемы(Ложь);
		Возврат;
	КонецЕсли;	
	
КонецПроцедуры
...Показать Скрыть
18. Сергей Космачев (ksnik) 29.04.13 11:57
А еще вместо команды "удалить файл" засунул в конец батника "завершить сеанс" команду "logoff /v" :-)
19. Дмитрий Вдовин (vdovinDS) 29.04.13 14:29
У меня вопрос. Вы пишется, что пользователи должны сами ее запускать по возникновению проблем. И что, реально сами запускают? Нет, вот честно, Вам удалось научить и объяснить им это? или только у нас все пользователи лентяи, которых фиг заставишь что-то самим делать?
20. Пользователь Фамилия (User80) 29.04.13 15:04
У нас в основном возникает одинаковая ошибка что-то типа "Ошибка SDBL: Ожидается имя таблицы ..." и возникает она у нескольких человек одновременно. У организации несколько регионов и бухгалтера работают рядом. Они уже сталкивались с подобными ситуациями, поэтому достаточно одному из них вспомнить о очистке кэша и тут же проверить свою теорию на практике и сразу же об этом узнают остальные. Случалось, что присылали письма со скриншотом ошибки, а после совета почистить кэш остальные уже не беспокоили. Бывало я просто говорил, что когда выскакивает предупреждение об ошибке, то попробуйте сначала почистить кэш, а затем звоните. Я не знаю, может динамическое обновление перестало глючить (что вряд-ли т.к. последние месяцев 10 мы не переходили на новый релиз), а динамически мы можем обновляться раз 30 в день, но уже около полугода я иногда для профилактики чищу кэш только себе.
21. 9thlevel (alexzhilichev) 30.04.13 09:47
Добавлю от себя оптимизацию: функцию РазложитьСтрокуВМассивПодстрок можно переписать так

Функция РазложитьСтрокуВМассивПодстрок(Знач ТекстоваяСтрока, Знач Разделитель)

СтрокаДанных = ТекстоваяСтрока;
ЧислоВхождений = СтрЧислоВхождений(СтрокаДанных, Разделитель);
СтрокаДанных = СтрЗаменить(СтрокаДанных, Разделитель, """},{""S"",""" );
СтрокаДанных = "{""#"",51e7a0d2-530b-11d4-b98a-008048da3034,{" + СтрЗаменить(ЧислоВхождений + 1, Символы.НПП, "") + ",{""S"",""" + СтрокаДанных + """}}}";

Возврат ЗначениеИзСтрокиВнутр(СтрокаДанных);

КонецФункции
Snegurochka; dumal; +2 Ответить 1
22. Dima Dima (dumal) 01.05.13 14:21
Спасибо, удобная обработка. Я-то по-старинке чищу все лапками. Может, и впрямь, можно пользователям доверить эту ответственную миссию?
23. Пользователь Фамилия (User80) 01.05.13 16:25
Попробуйте. Даже, если пользователь просто почистит кэш от нечего делать ничего ведь не произойдет, да и Вам может быть удобнее подключится к пользователю и запустить обработку очистки, чем искать файлы кэша пользователя, ждать пока он закроет 1С и затем сообщать ему, что уже можно заходить в программу.
24. Александр (Иной) 02.05.13 20:02
Спасибо за открытый код. Чистил по старинке (удаляя базу из списка и прописывая заново), теперь можно будет поэкспериментировать.

А у всех пользователей можно чистить если запилить обработку в автозапуск по условию (например по флажку в справочнике сотрудников который бы снимался после выполнения)
25. Пользователь Фамилия (User80) 03.05.13 00:08
(24) Иной, нет никаких ограничений, кэш можно чистить у любого пользователя.
26. Александр (Иной) 03.05.13 00:50
Кеш находится на профиле пользователя. Если кластер и в нем 2 терминалки, тогда для одного и того же пользователя есть 2 физических профиля. Соответственно 2 кеша. А на одной терминалке для каждого пользователя по профилю. Поэто да, чистить можно у каждого пользователя, но лучше сделать это "на широкую ногу" - прописав очистку при запуске базы пользователем по флагу или признаку какому-то. Но это уже не типовая конфигурация будет.

Как для типовой - удачное решение.
27. Anton Bashkeev (BAMPER) 06.05.13 04:52
+ за открытый код!
И за публикацию в целом! =)
28. Zigfridish (Bassgood) 06.05.13 22:54
(16) glek, ты ошибаешься, файл "1cestart" - это не список баз, это файл автозапуска платформы, который в свою очередь уже обращается к файлу списка баз пользователя, имеющего расширение "*v8i"
29. Дмитрий Глеков (glek) 07.05.13 10:38
(28) Zigfridish, Ты прав, но по листингу ув. автора

ПрофильПользователя = WSH.ExpandEnvironmentStrings("%APPDATA%");//Возвращает используемое по умолчанию размещение данных приложений

Каталог = ПрофильПользователя+"\1C\1CEStart\";


видно, что это еще и каталог у него
30. Константин (maverick76) 07.05.13 11:36
+,возьму себе на вооружение
31. УльтраЮнион Центр Информационных Технологий (Ultraunion.ru) 08.05.13 18:46
Не согласен с тем, что кэшем, который нужно удалять (в данной публикации) называется всё то, что находится в папке с именем базы - в папке обычно также лежат и профайлы *.pfl и прочие файлы, которые содержат настройки отборов в отчетах, расположения форм на экране и прочее (читай документацию). Если их удалять, то пользователь будет по-новому у себя делать все настройки отчетов и прочего. Если и удалять, то только кэш самой конфы, а не всё подряд.
32. Пользователь Фамилия (User80) 08.05.13 20:59
(31) Ultraunion.ru, Спорить не буду, расположение форм, настройки отборов и т.п. штука хорошая, но в своей практике я сталкивался с ошибками при восстановлении настроек и мне приходилось комментировать восстановление настройки и сохранять ее заново, а так я точно уверен, что все чисто. Хотя должен сказать, что подобные ошибки встречаются крайне редко, я лично видел всего 3 штуки. Подумаю над Вашим замечанием, наверно допишу возможность сохранения настроек.
33. Степан S (Ed111111) 15.05.13 17:59
Если рассматривать ее работу на платформах Server 2007, server 2008, server 2008 R2, server 2012
Прошу рассказать подробнее. Тестировалась ли данная программа на чистке в этих системах?
34. Max S (Maxs_1919) 16.05.13 07:37
во-первых вот это конечно полная хрень:
ПутьКФайлуЗапуска = "";
Если КаталогИлиФайлСуществует("C:\Program Files (x86)\1cv82\common\1cestart.exe") Тогда
ПутьКФайлуЗапуска = """C:\Program Files (x86)\1cv82\common\1cestart.exe";
ИначеЕсли КаталогИлиФайлСуществует("C:\Program Files\1cv82\common\1cestart.exe") Тогда
ПутьКФайлуЗапуска = """C:\Program Files\1cv82\common\1cestart.exe";
Иначе
Возврат "";
КонецЕсли;
а если не Це системный диск???
в 1с изобрели уже команду КаталогПрограммы()

во-вторых Если ПодстрокиСтрокиСоединения.Количество()> 1 и Лев(ПодстрокиСтрокиСоединения[0], 5) = "Srvr=" и Лев(ПодстрокиСтрокиСоединения[1], 4) = "Ref=" Тогда
ничего сложного нет добавить сюда ИначеЕсли Лев(ПодстрокиСтрокиСоединения[0], 5) = "File=" и т.д.

в-третих а че в ХР работает такая конструкция WSH.ExpandEnvironmentStrings("%APPDATA%")??

сыровато как то.
35. Пользователь Фамилия (User80) 16.05.13 12:15
(33) Ed111111, тип SQL сервера значения не имеет.
36. Пользователь Фамилия (User80) 16.05.13 12:29
(34) Maxs_1919, вот Вы все знаете, а я не такой умный, поэтому забыл, что команда КаталогПрограммы() может помочь мне в определении каталога.
"ничего сложного нет добавить сюда ИначеЕсли Лев(ПодстрокиСтрокиСоединения[0], 5) = "File=" и т.д."
Да Вы правы это не сложно.
"в-третих а че в ХР работает такая конструкция WSH.ExpandEnvironmentStrings("%APPDATA%")"
Да, работает.
Спасибо за комментарий, когда появится свободная минутка я исправлю код и выложу новую обработку.
37. andrey dyak (dyak84) 27.06.13 12:51
Спасибо автору вещь очень нужная и неоходимая. Чистил руками появятся деньги оюязательно скачаю.Так держать
38. andrey dyak (dyak84) 27.06.13 14:54
Автор есть такое маленькое замечание после перезапуска сеанса 1С имя пользователя если садержит украинскую букву і замемяется на символ ? как бі хорошо билоб поравить ето дело
39. Fred (Aspirant) 19.09.13 11:47
Поясните чем хуже /ClearCache в Дополнительных параметрах запуска конкретной базы?
40. Sergey A. (spaminfostart) 26.09.13 15:35
Немного передалал батник:
Вместо
|rem Удаляем все файлы
|Del /F /Q """ + Каталог + "*.*""
|rem Удаляем все каталоги
|for /d %%i in ("""+ Каталог + "*"") do rmDir /s /q ""%%i""
|rem Удаляем основной каталог
|rmDir """ + Лев(Каталог,СтрДлина(Каталог)-1) + """
Достаточно
|rem Удаляем основной каталог
|rmDir """ + Лев(Каталог,СтрДлина(Каталог)-1) + """ + /s /q

Плюс убрал запуск 1С в батнике, иначе создаётся папка 0000-000...
Плюс добавил справку, флажок, обновлять ли GUID, ну и по мелочи подправил.
Вот дополненный вариант http://infostart.ru/public/202156/
41. kiv82 (AltF1) 30.09.13 10:37
Ключ запуска прописать для ярлыка.
При запуске пользователем ИБ - кэш будет чиститься.
42. andrey dyak (dyak84) 30.09.13 11:40
Автор подскажите а обстоит ситуация когда профиль 1С размещен не стандартно на диске D: Очистка кеша будет работать или нет. И еще такой вопрос как настройки имя последнего пользователя они тоже по идее будут стерті так ли ето.Зарание спасибо за ответ
43. Елена Елена (prog-eg) 20.12.13 08:11
(39) Aspirant, поставила параметр /ClearCache - не помогает...
44. Елена Елена (prog-eg) 20.12.13 08:14
я его поставила для общего ярлыка, попробую поставить для конкретной базы...
45. Алексей Верещагин (alexware) 28.03.14 00:58
Здесь на самом деле ещё одна проблема. Автор в своём алгоритме определяет строку подключения и затем делает поиск её в файле ibases.v8i. При этом подразумевается, что в файле ibases.v8i каждая строка подключения может встречаться только один раз.
Но это совсем не так! Правда, при попытке создания ещё одной записи с существующей строкой подключения система предупредит, что мол есть уже такая база в списке, однако позволяет игнорировать такое предупреждение.
Я сам частенько пользуюсь этой возможностью. Удобно иметь ссылки на одну и ту же базу но с разными другими параметрами режима запуска. Например у меня есть записи для запуска толстого клиента, тонкого, обычного приложения, разного языка интерфейса платформы, с выбором пользователя или с автоматическим запуском под пользователем Windows и т.д. и т.п.
46. Алексей Пикулев (Piroman) 24.06.14 18:54
(39) Aspirant,
ClearCache чистит в клиент-серверном варианте только кэш клиент-серверных вызовов, а кэш метаданных, в котором хранятся данные о конфигурации - нет.
47. Сергей Сергей (s.matyukin_visma) 01.05.15 11:34
Столкнулся вот с такой проблемой ошибка блокировки участка файла cachestorage. У меня стояла КА 1.1 (1.1.58.4) и платформа 8.3.5.1383. Динамически обновил конфигурацию и после повторного входа вылезла ошибка. Вообще динамическое обновление работает не слишком корректно даже 8.3 вынужден от него отказаться, во избежании проблем с Кэшом. В моем случае помогла очистка Кэша по ссылке http://programmist1s.ru/wp-content/uploads/2013/02/OchistkaKesha-bat.zip
48. Олег Грибов (Oboron) 10.12.15 11:00
(21) 9thlevel, Хорошая оптимизация. В данном случае сработает. а так, еще нужно заменить одну кавычку на две (иначе, если в тексте встретится кавычка, то будет ошибка потока):
Функция РазложитьСтрокуВМассивПодстрок(Знач ТекстоваяСтрока, Знач Разделитель)

СтрокаДанных = ТекстоваяСтрока;
ЧислоВхождений = СтрЧислоВхождений(СтрокаДанных, Разделитель);
ВременнаяЗамена = "#";
Пока Найти(СтрокаДанных, ВременнаяЗамена) > 0 Цикл
	ВременнаяЗамена = ВременнаяЗамена + "#";
КонецЦикла;

СтрокаДанных = СтрЗаменить(СтрокаДанных, Разделитель, ВременнаяЗамена);
СтрокаДанных = СтрЗаменить(СтрокаДанных, """", """""");	//Меняем одиночную кавычку на двойную везде, кроме разделителя
СтрокаДанных = "{""#"",51e7a0d2-530b-11d4-b98a-008048da3034,
|{" + Формат(ЧислоВхождений + 1, "ЧГ=0") + ",
|{""S"",""" + СтрЗаменить(СтрокаДанных, ВременнаяЗамена, """},
|{""S"",""") + """}}}";

Возврат ЗначениеИзСтрокиВнутр(СтрокаДанных);

КонецФункции 
...Показать Скрыть
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа