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

25.04.13

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Самостоятельная очистка кэша пользователем
.epf 8,75Kb
394
394 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

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С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    17181    120    59    

121

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

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

15000 руб.

10.11.2023    12468    49    33    

70

Инструменты администратора БД Роли и права Системный администратор Программист Пользователь 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, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 18.09.2024, версия 1.2

18000 руб.

06.12.2023    11384    48    8    

78

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

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

14400 руб.

29.04.2020    34328    109    152    

75

Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

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

3600 руб.

06.02.2017    32855    145    18    

51

Архивирование (backup) Инструменты администратора БД Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Данная разработка позволит решить вопрос с резервным копированием Ваших баз в автоматическом режиме, расположенных на сервере 1С. Система умеет ставить блокировки на вход, блокировать фоновые задания, принудительно отключать сеансы пользователей. И все это система делает в автоматически при создании бэкапа (или через команду). Выгрузка происходит в родной формат 1С - .dt. Так же система умеет архивировать данные выгрузки с установкой пароля. Умеет менять расширение файла zip или dt на любое указанное вами, что позволит сохранить выгрузки от шифровальщика. Может удалять старые копии выгрузок, оставляя указанное количество резервных копий, начиная с самой поздней. Только для WINDOWS!

6000 руб.

06.11.2012    74104    629    45    

88

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

Многие сталкиваются с проблемой когда изображения, находящиеся в базе разные по объему и размерам. Менеджеры могут добавить файлы в очень высоком разрешении, объемом свыше 20 Мегабайт. База данных становится слишком большой, выгрузка на сайт идёт медленно и требуется много место на хостинге. Как сжать картинки и уменьшить размер базы 1С? Это можно сделать с помощью данной обработки. Существует возможность выбрать различные варианты для того чтобы уменьшить картинки: в разы, в процентах от первоначального объема, а также сделать картинки одинаковой ширины. В результате размер базы 1С значительно сократится (в зависимости от количества и размера картинок), а изображения станут небольшого объема, равными по ширине, почти без потери качества. Работает на управляемых формах для УТ 11, КА, ERP.

3000 руб.

21.07.2022    10335    10    4    

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

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

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


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

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


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

А у всех пользователей можно чистить если запилить обработку в автозапуск по условию (например по флажку в справочнике сотрудников который бы снимался после выполнения)
25. User80 123 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 123 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 123 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 123 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 87 20.12.13 08:11 Сейчас в теме
(39) Aspirant, поставила параметр /ClearCache - не помогает...
46. Piroman 24.06.14 18:54 Сейчас в теме
(39) Aspirant,
ClearCache чистит в клиент-серверном варианте только кэш клиент-серверных вызовов, а кэш метаданных, в котором хранятся данные о конфигурации - нет.
40. spaminfostart 16 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 87 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" не найден. Очистка кеша невозможна.
Оставьте свое сообщение