Очистка кэша 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 + """ не найден. Очистка кеша невозможна.");
        Возврат;
    КонецЕсли;    
    
КонецПроцедуры

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

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

См. также

Комментарии
1. Юрий Осипов (yuraos) 882 26.04.13 07:10 Сейчас в теме
Интересно, практично.
Плюс за использование нестандартных для 1С средств.
---
А как бы почистить кэш для всех пользователей или для списка отмеченных ?
;)
2. Пользователь Фамилия (User80) 118 26.04.13 10:06 Сейчас в теме
Насчет очистки нескольких пользователей я не размышлял. Я попытался сделать обработку, чтобы с ней можно было работать как есть, т.е. например поместить во внешние обработки и запускать когда необходимо. Для очистки нескольких пользователей можно добавить в конфигурацию регистр сведений в котором выбирать нужный людей, а при закрытии программы в процедуре "ПередЗавершениемРаботыСистемы(Отказ)", проверять есть ли пользователь в регистре, в конце процедуры ставить Отказ = Истина, удалять пользователя из регистра и запускать эту обработку в которой заблокировать сообщение о перезапуске 1С. Ну а далее зависит от фантазии, можно подключить обработчик ожидания и сообщать, что необходимо перезапустить 1С и т.д.
3. Дмитрий Глеков (glek) 111 26.04.13 10:29 Сейчас в теме
1. Судя по приведенному коду, используется файл списка общих баз. Хотя об этом не указано в описании публикации.
2. Почему то по коду не нашел таких путей (аппдата\1с\1cestart).
Наверное, надо допилить описание публикации
4. Пользователь Фамилия (User80) 118 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) 182 26.04.13 14:39 Сейчас в теме
Мир этому дому!
Спасибо за открытый код. Всегда интересно видеть логику решения других людей. Плюс.
6. Вадим Назаров (NazarovV) 78 26.04.13 14:45 Сейчас в теме
7. Михаил Максимов (МихаилМ) 26.04.13 15:19 Сейчас в теме
удалять файлы кэша конфигурации не нужно. достаточно их очистить.
это можно сделать в сеансе 1с.
те без бат файлов, пересоздания списка баз.
8. andrewks 1194 26.04.13 15:50 Сейчас в теме
При очистке кэша я столкнулся с тем, что простое удаление файлов кэша ничего не дает (windows умудряется их восстанавливать и ошибка возникает вновь),


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

З.Ы. Публикацию плюсую
11. Пользователь Фамилия (User80) 118 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) 279 26.04.13 17:05 Сейчас в теме
(12) ну вот, а у автора ГУИД сам вычисляет.
15. Сергей Космачев (ksnik) 234 26.04.13 22:44 Сейчас в теме
Спасибо, проверили - работает :-)
16. Дмитрий Глеков (glek) 111 27.04.13 10:35 Сейчас в теме
(4) User80, 1. Файл с указанным расширением и есть список баз. Как он будет использоваться (индивидуально, или один файл раскидывается по пользователям) - не важно. В общем случае (если просто создать базу) - этого файла нет. И насчет каталогов. В общем, надо "допилить" описание разработки.
17. Сергей Космачев (ksnik) 234 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) 234 29.04.13 11:57 Сейчас в теме
А еще вместо команды "удалить файл" засунул в конец батника "завершить сеанс" команду "logoff /v" :-)
19. Дмитрий Вдовин (vdovinDS) 29.04.13 14:29 Сейчас в теме
У меня вопрос. Вы пишется, что пользователи должны сами ее запускать по возникновению проблем. И что, реально сами запускают? Нет, вот честно, Вам удалось научить и объяснить им это? или только у нас все пользователи лентяи, которых фиг заставишь что-то самим делать?
20. Пользователь Фамилия (User80) 118 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) 118 01.05.13 16:25 Сейчас в теме
Попробуйте. Даже, если пользователь просто почистит кэш от нечего делать ничего ведь не произойдет, да и Вам может быть удобнее подключится к пользователю и запустить обработку очистки, чем искать файлы кэша пользователя, ждать пока он закроет 1С и затем сообщать ему, что уже можно заходить в программу.
24. Александр (Иной) 02.05.13 20:02 Сейчас в теме
Спасибо за открытый код. Чистил по старинке (удаляя базу из списка и прописывая заново), теперь можно будет поэкспериментировать.

А у всех пользователей можно чистить если запилить обработку в автозапуск по условию (например по флажку в справочнике сотрудников который бы снимался после выполнения)
25. Пользователь Фамилия (User80) 118 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) 111 07.05.13 10:38 Сейчас в теме
(28) Zigfridish, Ты прав, но по листингу ув. автора

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

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


видно, что это еще и каталог у него
30. Константин (maverick76) 10 07.05.13 11:36 Сейчас в теме
+,возьму себе на вооружение
31. УльтраЮнион Центр Информационных Технологий (Ultraunion.ru) 2 08.05.13 18:46 Сейчас в теме
Не согласен с тем, что кэшем, который нужно удалять (в данной публикации) называется всё то, что находится в папке с именем базы - в папке обычно также лежат и профайлы *.pfl и прочие файлы, которые содержат настройки отборов в отчетах, расположения форм на экране и прочее (читай документацию). Если их удалять, то пользователь будет по-новому у себя делать все настройки отчетов и прочего. Если и удалять, то только кэш самой конфы, а не всё подряд.
32. Пользователь Фамилия (User80) 118 08.05.13 20:59 Сейчас в теме
(31) Ultraunion.ru, Спорить не буду, расположение форм, настройки отборов и т.п. штука хорошая, но в своей практике я сталкивался с ошибками при восстановлении настроек и мне приходилось комментировать восстановление настройки и сохранять ее заново, а так я точно уверен, что все чисто. Хотя должен сказать, что подобные ошибки встречаются крайне редко, я лично видел всего 3 штуки. Подумаю над Вашим замечанием, наверно допишу возможность сохранения настроек.
33. Степан S (Ed111111) 11 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) 118 16.05.13 12:15 Сейчас в теме
(33) Ed111111, тип SQL сервера значения не имеет.
36. Пользователь Фамилия (User80) 118 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) 3 19.09.13 11:47 Сейчас в теме
Поясните чем хуже /ClearCache в Дополнительных параметрах запуска конкретной базы?
40. Sergey A. (spaminfostart) 13 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) 63 20.12.13 08:11 Сейчас в теме
(39) Aspirant, поставила параметр /ClearCache - не помогает...
44. Елена Елена (prog-eg) 63 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) 14 10.12.15 11:00 Сейчас в теме
(21) 9thlevel, Хорошая оптимизация. В данном случае сработает. а так, еще нужно заменить одну кавычку на две (иначе, если в тексте встретится кавычка, то будет ошибка потока):
Функция РазложитьСтрокуВМассивПодстрок(Знач ТекстоваяСтрока, Знач Разделитель)

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

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

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

КонецФункции 
...Показать Скрыть
Оставьте свое сообщение