Автоматическая очистка кэша конфигурации 1С 8.1, 8.2, 8.3 для сеанса текущего пользователя

14.11.17

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

Автоматическая очистка кэша конфигурации 1С для сеанса текущего пользователя (при динамическом обновлении или ручном интерактивном запуске)

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

Предлагается решение, позволяющее автоматически очищать этот проблемный кэш без помощи сисадмина.

Алгоритм:

1) создаем регистр сведений "НеобходимостьОчисткиКэша"  с одним строковым измерением "Пользователь" . Сюда будет добавляться пользователи, для которых будет необходима процедура очистки кэша при завершении работы 1С.

2) В глобальном модуле обычного приложения (для управляемых форм модуль управляемого приложения) в процедуре ПриНачалеРаботыСистемы() прописываем обработчик ожидания "ПодключитьОбработчикОжидания("ПроверкаДинОбновления",60);"

Процедура ПроверкаДинОбновления() Экспорт
    Если КонфигурацияБазыДанныхИзмененаДинамически() Тогда  //добавляем в очередь обновления кэша - когда будет выходить - очистится кэш конфигурации
        Наб1 = РегистрыСведений.НеобходимостьОчисткиКэша.СоздатьНаборЗаписей();
        Наб1.Отбор.Пользователь.Установить(ПользователиИнформационнойБазы.ТекущийПользователь().Имя);
        наб1.Прочитать();
        Если Наб1.Количество()<>0 Тогда
            Возврат;
        КонецЕсли;
        зап1 = наб1.Добавить();
        зап1.Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
        наб1.Записать();
    КонецЕсли;
КонецПроцедуры

 

3)  При завершении работы в глобальном модуле прописываем вызов функции очистки кэша:

Процедура ПриЗавершенииРаботыСистемы()

    ОчиститьКэш1С();
    
КонецПроцедуры

 

Собственно сама функция очистки кэша:

Процедура ОчиститьКэш1С()
    //определяем нужно ли текущему пользователю очистка кэша
    запр1 = Новый Запрос;
    запр1.УстановитьПараметр("Пользователь", ПользователиИнформационнойБазы.ТекущийПользователь().Имя);
    запр1.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
                  |    НеобходимостьОчисткиКэша.Пользователь
                  |ИЗ
                  |    РегистрСведений.НеобходимостьОчисткиКэша КАК НеобходимостьОчисткиКэша
                  |ГДЕ
                  |    НеобходимостьОчисткиКэша.Пользователь = &Пользователь";
    тз1 = запр1.Выполнить().Выгрузить();
    Если тз1.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    
    СтрокаПоиска = "Connect="+СтрокаСоединенияИнформационнойБазы();
    Ф1 = Новый ТекстовыйДокумент;
    ф1.ТолькоПросмотр = Истина;
    Шелл = Новый COMОбъект("WScript.Shell");
     АППДата = Шелл.ExpandEnvironmentStrings("%APPDATA%");
     АППДата2 = Шелл.ExpandEnvironmentStrings("%LOCALAPPDATA%");
    ИмяФайла = АППДата+"\1C\1CEStart\ibases.v8i";
    //сообщить(ИмяФайла);
    ф1.Прочитать(ИмяФайла);
    Для сч1 = 1 по ф1.КоличествоСтрок() Цикл
        стр1 = СокрЛП(ф1.ПолучитьСтроку(сч1));
        Если стр1 <> СтрокаПоиска Тогда
            Продолжить;
        КонецЕсли;
        ИДБазы = стрЗаменить(СокрЛП(ф1.ПолучитьСтроку(сч1 + 1)), "ID=", "");
        //сообщить(ИДБазы);
        прервать;
    КонецЦикла;
    Путь1 = АППДата + "\1C\1Cv82\"+ИДБазы+"\";   //пользовательские настройки  - ничего не трогаем
    Путь2 = АППДата2 + "\1C\1Cv82\"+ИДБазы+"\*";   //кэш конфигурации - удаляем только его
    
    ИмяСкрипта1 = ПолучитьИмяВременногоФайла("cmd");
    
    ф2 = Новый ТекстовыйДокумент;
    //Удал1 = "del /f /s /q """+Путь1+""""; //пользовательские настройки
    Удал2 = "del /f /s /q """+Путь2+""""; //кеш конфигурации
    ф2.ДобавитьСтроку("ping -n 11 127.0.0.1 & "+Удал2);  //пауза 10 сек + удаление кеша конфигурации -  В нескольких строках не срабатывает!!!
    ф2.Записать(ИмяСкрипта1, КодировкаТекста.ANSI);
    Шелл.Run(""""+ИмяСкрипта1+"""",0); 

        
    //удаляем из очереди очистки кэша текущего пользователя
    Наб1 = РегистрыСведений.НеобходимостьОчисткиКэша.СоздатьНаборЗаписей();
    Наб1.Отбор.Пользователь.Установить(ПользователиИнформационнойБазы.ТекущийПользователь().Имя);
    наб1.Прочитать();
    наб1.Очистить();
    наб1.Записать();
КонецПроцедуры

 

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

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

 

Примечание: процедура очистки корректно отрабатывает при локальном подключении и терминальном подключении. При подключении на ферму с несколькими терминальными серверами - процедура работает некорректно, из-за того что очищает кэш только для текущего терминального сервера, не затрагивая остальные сервера фермы.

кэш 1с очистка кэша 1с

См. также

"2iS:Интеграция" - Центр управления обменом данными. Сервисная шина предприятия (ESB).

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

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

360000 руб.

10.08.2012    115828    35    121    

188

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

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

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

14400 руб.

29.04.2020    24184    75    144    

58

Контроль действий пользователей II

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

Контролируйте, кто и что менял при работе в базах 1С: создание, правки, удаление, поиск потерявшихся данных, вычисление злоумышленников. Подсистема содержит 10 точных отчетов, гибкая настройка контроля. Не тормозит работу, не грузит базу 1С. Позволяет контролировать работу пользователей удаленно со смартфона.

14280 руб.

07.07.2023    3427    1    3    

7

SALE! 25%

PowerTools

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

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

3600 2700 руб.

14.01.2013    169992    1049    0    

789

Конфигурация Session Monitor

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

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

1500 руб.

01.12.2020    12520    26    0    

41

Сжатие (уменьшение) картинок в базе 1С и приведение их к одинаковой ширине

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

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

2000 руб.

21.07.2022    8042    5    3    

9

Завершение сеанса неактивных пользователей на сервере

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

Обработка позволяет отключить сеанс пользователя 1С при его простое (бездействии).

1000 руб.

30.03.2018    17807    5    5    

6

Инструменты для чистки кэша 1С

Инструменты администратора БД Абонемент ($m)

Публикация содержит набор bat файлов, используемых мной для умной чистки кэша 1С. Основой файлов являются PowerShell скрипты, которые используются для автоматизации чистки кэша, например, удаление кэш файлов старше десяти дней.

1 стартмани

05.06.2023    6555    39    Viki_push    21    

139
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. DrAku1a 1605 15.11.17 09:10 Сейчас в теме
В стандартных конфигурациях можно использовать механизмы настроек пользователя, чтобы не городить отдельный регистр.
Timon_132; +1 Ответить
2. user764938 15.11.17 09:51 Сейчас в теме
Подскажите пожалуйста, "Процедура ОчиститьКэш1С" использует запрос, у меня конфигуратор ругается на Элемент "Запрос", я не очень понимаю, разве запрос вообще можно сделать в модуле управляемых приложений"? Возможно я делаю что-то не то?
18. websamson 306 11.04.18 05:29 Сейчас в теме
(2) Для УФ есть параметр запуска /ClearCache
3. golovkodv 70 15.11.17 10:38 Сейчас в теме
В управляемых формах чтение данных с регистра "НеобходимостьОчисткиКэша" необходимо прописывать в серверной функции, а саму очистку в клиентской, т.е. разделить процедуру ОчиститьКэш1С на 2 части - серверную и клиентскую.
sqncng; user764938; +2 Ответить
5. user764938 15.11.17 10:49 Сейчас в теме
(3) Спасибо!
4. w-divin 15.11.17 10:46 Сейчас в теме
Очень смутил момент:
ИмяФайла = АППДата+"\1C\1CEStart\ibases.v8i";
//сообщить(ИмяФайла);
ф1.Прочитать(ИмяФайла);


у меня везде этот файлик пуст - опубликованы приложения с прописанной строкой подключения....
8. golovkodv 70 15.11.17 13:03 Сейчас в теме
(4)
Не могу даже сказать.
У меня файл "ibases.v8i" всегда присутствует.
Может при веб-подключении его нет.
Как тогда найти ID базы не знаю
6. frkbvfnjh 765 15.11.17 11:32 Сейчас в теме
А разве кэш 1С можно удалить из самого 1С пока он работает?
Какие-то файлы все равно будут заняты же
juricher; +1 Ответить
7. golovkodv 70 15.11.17 13:01 Сейчас в теме
(6)
У меня на закрытие приложения 1с дается 10 сек ("ping -n 11 127.0.0.1").
1с закрывается, а командная консоль еще висит и потом делает, что нужно.
9. japopov 68 15.11.17 15:00 Сейчас в теме
Вопрос, что будет на линуксовых и веб-клиентах, излишен, да? Очень костыльное и ограниченное решение.
10. golovkodv 70 15.11.17 15:45 Сейчас в теме
Кому-то может и пригодится
11. zxc753 15.11.17 17:47 Сейчас в теме
А еще можно использовать Обновлятор 1С)
12. madonov 169 16.11.17 06:42 Сейчас в теме
Зачем проверять динамическое обновление каждую минуту?
Зачем писать в регистр и читать из него?
Почему нельзя выполнить эту проверку 1 раз при завершении работы системы?

Не очень понимаю зачем столько шагов. Почему не сделать так?
Процедура ПриЗавершенииРаботыСистемы()
    ОчиститьКэш1С();    
КонецПроцедуры


Процедура ОчиститьКэш1С()
    //определяем нужно ли текущему пользователю очистка кэша
    Если не КонфигурацияБазыДанныхИзмененаДинамически() Тогда
        Возврат;
    КонецЕсли;
    
    СтрокаПоиска = "Connect="+СтрокаСоединенияИнформационнойБазы();
    Ф1 = Новый ТекстовыйДокумент;
    ф1.ТолькоПросмотр = Истина;
    Шелл = Новый COMОбъект("WScript.Shell");
    //АППДата = Шелл.ExpandEnvironmentStrings("%APPDATA%");
    АППДата2 = Шелл.ExpandEnvironmentStrings("%LOCALAPPDATA%");
    ИмяФайла = АППДата+"\1C\1CEStart\ibases.v8i";
    //сообщить(ИмяФайла);
    ф1.Прочитать(ИмяФайла);
    Для сч1 = 1 по ф1.КоличествоСтрок() Цикл
        стр1 = СокрЛП(ф1.ПолучитьСтроку(сч1));
        Если стр1 <> СтрокаПоиска Тогда
            Продолжить;
        КонецЕсли;
        ИДБазы = стрЗаменить(СокрЛП(ф1.ПолучитьСтроку(сч1 + 1)), "ID=", "");
        //сообщить(ИДБазы);
        прервать;
    КонецЦикла;
    //Путь1 = АППДата + "\1C\1Cv82\"+ИДБазы+"\";   //пользовательские настройки  - ничего не трогаем
    Путь2 = АППДата2 + "\1C\1Cv82\"+ИДБазы+"\*";   //кэш конфигурации - удаляем только его
    
    ИмяСкрипта1 = ПолучитьИмяВременногоФайла("cmd");
    
    ф2 = Новый ТекстовыйДокумент;
    //Удал1 = "del /f /s /q """+Путь1+""""; //пользовательские настройки
    Удал2 = "del /f /s /q """+Путь2+""""; //кеш конфигурации
    ф2.ДобавитьСтроку("ping -n 11 127.0.0.1 & "+Удал2);  //пауза 10 сек + удаление кеша конфигурации -  В нескольких строках не срабатывает!!!
    ф2.Записать(ИмяСкрипта1, КодировкаТекста.ANSI);
    Шелл.Run(""""+ИмяСкрипта1+"""",0); 

КонецПроцедуры
Показать
14. golovkodv 70 16.11.17 11:10 Сейчас в теме
(12)
Пользователь не всегда корректно выходит с программы. Если по каким-либо причинам будет аварийное завершение работы, то по вашему методу кэш просто не очистится. Здесь он добавляется в очередь и при первом же корректном выходе очищает кэш с удалением из очереди.
13. madonov 169 16.11.17 08:11 Сейчас в теме
Ну и вообще, надежность такого подхода несколько хромает:
Пользователь открыл 1 экземпляр программы,
Пользователь открыл 2 экземпляр программы на этом же ПК под этой же учетной записью,
Динамическое обновление - пользователь в очереди на очистку кэша,
Пользователь закрыл любой из экземпляров программы - пользователь исключен из очереди на очистку кэша, однако очистка не произошла, тк открыт другой экземпляр программы.

Справедливости ради стоит отметить, что если проверять наличие динамического обновления при завершении, то такая коллизия тоже возможна, но при ином сценарии:
Пользователь открыл 1 экземпляр программы,
Динамическое обновление,
Пользователь открыл 2 экземпляр программы на этом же ПК под этой же учетной записью,
Пользователь закрыл 1 экземпляр программы - однако очистка не произошла, тк открыт 2 экземпляр программы.
Пользователь закрыл 2 экземпляр программы - однако во время работы этого экземпляра динамического обновления не происходило и кэш не очищается.

Для того, чтобы кэш точно не вызывал проблем - его нужно очищать при каждом завершении работы, но это приведет к необоснованному замедлению старта программы.
15. golovkodv 70 16.11.17 11:16 Сейчас в теме
(13)
У меня на работе для пользователей не предусмотрено открытие нескольких экземпляров 1с. Поэтому я их и не рассматривал. Но думаю можно и такой случай предусмотреть: При завершении работы просмотреть активные сеансы (функция "ПолучитьСеансыИнформационнойБазы ") для своего текущего пользователя. И запускать очистку только если сеанс текущего пользователя присутствует в единственном числе . Иначе ничего не делать.
16. Andreeei 45 21.11.17 13:12 Сейчас в теме
Как отработает очистка, если у пользователя включена защита от опасных действий; база прописана в списке баз больше одного раза; настроен общий (на сетевом ресурсе) список баз?
17. golovkodv 70 21.11.17 17:00 Сейчас в теме
(16)
1) там не запускаются никаких внешних обработок - поэтому все будет работать
2) по коду видно - находит нужную первую запись ид базы и останавливает цикл поиска. Не понимаю смысла заводить 2 одинаковые строчки в списке баз. ИД базы определяет первую. С кэшем первой дальше и работает - ее и очищает. Последующие строки с таким ид не обрабатывает. Ходите обрабатывать - допилите код немного.
3) этого не знаю. Не тестил такой вариант.
Оставьте свое сообщение