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

25.04.13

База данных - Инструменты администратора БД

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

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

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

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

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

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

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

См. также

Автоподбор ролей для профилей и групп доступа в любых типовых базах 1С УТ 11, КА 2, ERP2, Розница 2/3, УНФ 16/3, БП 3, ЗУП 3 и подобных (УФ, Платформа 8.3.14+)

Инструменты администратора БД Роли и права 8.3.14 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Документооборот 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Роли… Вы тратите много времени и сил на подбор ролей среди около 2400 в ERP или 1500 в Рознице 2, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 15.12.2023, версия 1.1.

12000 руб.

06.12.2023    2976    13    1    

34

SALE! 20%

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 8000 руб.

10.11.2023    3534    11    1    

34

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2520 руб.

14.01.2013    177745    1073    0    

849

Ускоренное проведение документов (x4), устранение ошибок 60/62 счетов и зачет авансов (Бухгалтерия 3.0)

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    27378    79    146    

59

Система хранения присоединенных файлов в томах на диске

Инструменты администратора БД Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием Платные (руб)

Конфигурация Комплексная автоматизация 1.1 (и УПП 1.3 тоже) хранит файлы и изображения в справочнике Хранилище дополнительной информации в реквизите Хранилище типа ХранилищеЗначений. Та же история с ВложениямиЭлектроннойПочты. Но при этом присоединенные файлы в Электронном документообороте хранит в томах на диске. Эта доработка позволяет использовать стандартный механизм хранения файлов, изображений и вложений электронных писем в томах на диске. При этом можно разделить тома хранения по объектам конфигурации.

4200 руб.

10.11.2015    61318    88    59    

73

"Менеджер потоков 2.1": УПП: "Восстановление партий"

Инструменты администратора БД Платформа 1С v8.3 1С:Управление производственным предприятием Россия Бухгалтерский учет Управленческий учет Платные (руб)

Как оптимизировать то, что, считалось, не поддается оптимизации? Как повысить доступность базы данных? Как проводить самую «времяемкую» операцию не по паре раз в неделю, а по несколько раз в день*? Ответ есть!

20000 руб.

12.09.2019    11746    5    9    

7

Брандмауэр для сервера 1С Предприятие 8 - внешнее управление сеансами

Инструменты администратора БД Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Управление возможностью начала и возобновления сеансов пользователей по различным условиям, ограничение общего числа возможных сеансов для работы с информационной базой, резервирование возможности работы с информационной базой определенных польззователей, запрет запуска нескольких сеансов для пользователя, журнализация событий начала (возобновления) и завершения (гибернации) сеансов, ведение списка активных сеансов для информационных баз кластера серверов

3600 руб.

06.02.2017    31111    31    18    

47

Хранилище файлов на SQL

Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Управленческий учет Платные (руб)

Привязка файлов / сканов к объектам 1С с сохранением их на SQL-сервере

12000 руб.

09.10.2019    10985    5    8    

9
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. yuraos 991 26.04.13 07:10 Сейчас в теме
Интересно, практично.
Плюс за использование нестандартных для 1С средств.
---
А как бы почистить кэш для всех пользователей или для списка отмеченных ?
;)
2. User80 122 26.04.13 10:06 Сейчас в теме
Насчет очистки нескольких пользователей я не размышлял. Я попытался сделать обработку, чтобы с ней можно было работать как есть, т.е. например поместить во внешние обработки и запускать когда необходимо. Для очистки нескольких пользователей можно добавить в конфигурацию регистр сведений в котором выбирать нужный людей, а при закрытии программы в процедуре "ПередЗавершениемРаботыСистемы(Отказ)", проверять есть ли пользователь в регистре, в конце процедуры ставить Отказ = Истина, удалять пользователя из регистра и запускать эту обработку в которой заблокировать сообщение о перезапуске 1С. Ну а далее зависит от фантазии, можно подключить обработчик ожидания и сообщать, что необходимо перезапустить 1С и т.д.
3. glek 119 26.04.13 10:29 Сейчас в теме
1. Судя по приведенному коду, используется файл списка общих баз. Хотя об этом не указано в описании публикации.
2. Почему то по коду не нашел таких путей (аппдата\1с\1cestart).
Наверное, надо допилить описание публикации
4. User80 122 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\" и получается каталог информационной базы.
16. glek 119 27.04.13 10:35 Сейчас в теме
(4) User80, 1. Файл с указанным расширением и есть список баз. Как он будет использоваться (индивидуально, или один файл раскидывается по пользователям) - не важно. В общем случае (если просто создать базу) - этого файла нет. И насчет каталогов. В общем, надо "допилить" описание разработки.
28. Bassgood 1425 06.05.13 22:54 Сейчас в теме
(16) glek, ты ошибаешься, файл "1cestart" - это не список баз, это файл автозапуска платформы, который в свою очередь уже обращается к файлу списка баз пользователя, имеющего расширение "*v8i"
29. glek 119 07.05.13 10:38 Сейчас в теме
(28) Zigfridish, Ты прав, но по листингу ув. автора

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

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


видно, что это еще и каталог у него
5. LexSeIch 210 26.04.13 14:39 Сейчас в теме
Мир этому дому!
Спасибо за открытый код. Всегда интересно видеть логику решения других людей. Плюс.
6. NazarovV 87 26.04.13 14:45 Сейчас в теме
7. МихаилМ 26.04.13 15:19 Сейчас в теме
удалять файлы кэша конфигурации не нужно. достаточно их очистить.
это можно сделать в сеансе 1с.
те без бат файлов, пересоздания списка баз.
10. ixijixi 1775 26.04.13 15:59 Сейчас в теме
(7) Михаил, вот и запили сюда код, а критиковать каждый может. Человек сделал и выложил. А вам слабо?

З.Ы. Публикацию плюсую
8. andrewks 1368 26.04.13 15:50 Сейчас в теме
При очистке кэша я столкнулся с тем, что простое удаление файлов кэша ничего не дает (windows умудряется их восстанавливать и ошибка возникает вновь),


можно поподробнее? первый раз слышу о таком
11. User80 122 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. ixijixi 1775 26.04.13 17:05 Сейчас в теме
(12) ну вот, а у автора ГУИД сам вычисляет.
9. crosby 280 26.04.13 15:57 Сейчас в теме
Вот универсальное проверенное средство: http://infostart.ru/public/90572/
15. ksnik 578 26.04.13 22:44 Сейчас в теме
Спасибо, проверили - работает :-)
17. ksnik 578 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 578 29.04.13 11:57 Сейчас в теме
А еще вместо команды "удалить файл" засунул в конец батника "завершить сеанс" команду "logoff /v" :-)
19. vdovinDS 29.04.13 14:29 Сейчас в теме
У меня вопрос. Вы пишется, что пользователи должны сами ее запускать по возникновению проблем. И что, реально сами запускают? Нет, вот честно, Вам удалось научить и объяснить им это? или только у нас все пользователи лентяи, которых фиг заставишь что-то самим делать?
20. User80 122 29.04.13 15:04 Сейчас в теме
У нас в основном возникает одинаковая ошибка что-то типа "Ошибка SDBL: Ожидается имя таблицы ..." и возникает она у нескольких человек одновременно. У организации несколько регионов и бухгалтера работают рядом. Они уже сталкивались с подобными ситуациями, поэтому достаточно одному из них вспомнить о очистке кэша и тут же проверить свою теорию на практике и сразу же об этом узнают остальные. Случалось, что присылали письма со скриншотом ошибки, а после совета почистить кэш остальные уже не беспокоили. Бывало я просто говорил, что когда выскакивает предупреждение об ошибке, то попробуйте сначала почистить кэш, а затем звоните. Я не знаю, может динамическое обновление перестало глючить (что вряд-ли т.к. последние месяцев 10 мы не переходили на новый релиз), а динамически мы можем обновляться раз 30 в день, но уже около полугода я иногда для профилактики чищу кэш только себе.
21. azhilichev 213 30.04.13 09:47 Сейчас в теме
Добавлю от себя оптимизацию: функцию РазложитьСтрокуВМассивПодстрок можно переписать так

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

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

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

КонецФункции
Snegurochka; dumal; +2 Ответить
48. Oboron 14 10.12.15 11:00 Сейчас в теме
(21) 9thlevel, Хорошая оптимизация. В данном случае сработает. а так, еще нужно заменить одну кавычку на две (иначе, если в тексте встретится кавычка, то будет ошибка потока):
Функция РазложитьСтрокуВМассивПодстрок(Знач ТекстоваяСтрока, Знач Разделитель)

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

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

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

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

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

Как для типовой - удачное решение.
27. BAMPER 06.05.13 04:52 Сейчас в теме
+ за открытый код!
И за публикацию в целом! =)
30. maverick76 11 07.05.13 11:36 Сейчас в теме
+,возьму себе на вооружение
31. UltraUnion2005 41 08.05.13 18:46 Сейчас в теме
Не согласен с тем, что кэшем, который нужно удалять (в данной публикации) называется всё то, что находится в папке с именем базы - в папке обычно также лежат и профайлы *.pfl и прочие файлы, которые содержат настройки отборов в отчетах, расположения форм на экране и прочее (читай документацию). Если их удалять, то пользователь будет по-новому у себя делать все настройки отчетов и прочего. Если и удалять, то только кэш самой конфы, а не всё подряд.
32. User80 122 08.05.13 20:59 Сейчас в теме
(31) Ultraunion.ru, Спорить не буду, расположение форм, настройки отборов и т.п. штука хорошая, но в своей практике я сталкивался с ошибками при восстановлении настроек и мне приходилось комментировать восстановление настройки и сохранять ее заново, а так я точно уверен, что все чисто. Хотя должен сказать, что подобные ошибки встречаются крайне редко, я лично видел всего 3 штуки. Подумаю над Вашим замечанием, наверно допишу возможность сохранения настроек.
33. Ed111111 11 15.05.13 17:59 Сейчас в теме
Если рассматривать ее работу на платформах Server 2007, server 2008, server 2008 R2, server 2012
Прошу рассказать подробнее. Тестировалась ли данная программа на чистке в этих системах?
35. User80 122 16.05.13 12:15 Сейчас в теме
(33) Ed111111, тип SQL сервера значения не имеет.
34. 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%")??

сыровато как то.
36. User80 122 16.05.13 12:29 Сейчас в теме
(34) Maxs_1919, вот Вы все знаете, а я не такой умный, поэтому забыл, что команда КаталогПрограммы() может помочь мне в определении каталога.
"ничего сложного нет добавить сюда ИначеЕсли Лев(ПодстрокиСтрокиСоединения[0], 5) = "File=" и т.д."
Да Вы правы это не сложно.
"в-третих а че в ХР работает такая конструкция WSH.ExpandEnvironmentStrings("%APPDATA%")"
Да, работает.
Спасибо за комментарий, когда появится свободная минутка я исправлю код и выложу новую обработку.
37. dyak84 27.06.13 12:51 Сейчас в теме
Спасибо автору вещь очень нужная и неоходимая. Чистил руками появятся деньги оюязательно скачаю.Так держать
38. dyak84 27.06.13 14:54 Сейчас в теме
Автор есть такое маленькое замечание после перезапуска сеанса 1С имя пользователя если садержит украинскую букву і замемяется на символ ? как бі хорошо билоб поравить ето дело
39. Aspirant 4 19.09.13 11:47 Сейчас в теме
Поясните чем хуже /ClearCache в Дополнительных параметрах запуска конкретной базы?
43. prog-eg 85 20.12.13 08:11 Сейчас в теме
(39) Aspirant, поставила параметр /ClearCache - не помогает...
46. Piroman 24.06.14 18:54 Сейчас в теме
(39) Aspirant,
ClearCache чистит в клиент-серверном варианте только кэш клиент-серверных вызовов, а кэш метаданных, в котором хранятся данные о конфигурации - нет.
40. spaminfostart 15 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. AltF1 8 30.09.13 10:37 Сейчас в теме
Ключ запуска прописать для ярлыка.
При запуске пользователем ИБ - кэш будет чиститься.
42. dyak84 30.09.13 11:40 Сейчас в теме
Автор подскажите а обстоит ситуация когда профиль 1С размещен не стандартно на диске D: Очистка кеша будет работать или нет. И еще такой вопрос как настройки имя последнего пользователя они тоже по идее будут стерті так ли ето.Зарание спасибо за ответ
44. prog-eg 85 20.12.13 08:14 Сейчас в теме
я его поставила для общего ярлыка, попробую поставить для конкретной базы...
45. alexware 28.03.14 00:58 Сейчас в теме
Здесь на самом деле ещё одна проблема. Автор в своём алгоритме определяет строку подключения и затем делает поиск её в файле ibases.v8i. При этом подразумевается, что в файле ibases.v8i каждая строка подключения может встречаться только один раз.
Но это совсем не так! Правда, при попытке создания ещё одной записи с существующей строкой подключения система предупредит, что мол есть уже такая база в списке, однако позволяет игнорировать такое предупреждение.
Я сам частенько пользуюсь этой возможностью. Удобно иметь ссылки на одну и ту же базу но с разными другими параметрами режима запуска. Например у меня есть записи для запуска толстого клиента, тонкого, обычного приложения, разного языка интерфейса платформы, с выбором пользователя или с автоматическим запуском под пользователем Windows и т.д. и т.п.
47. Minakov00078 38 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
49. balhomes 6 03.07.20 13:26 Сейчас в теме
не работает.

выдает ошибку

Каталог с GUIDом "599d9cc7-8574-44f0-a16a-39388091a555" не найден. Очистка кеша невозможна.
Оставьте свое сообщение