Автоматическая очистка кэша конфигурации 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с

См. также

SALE! 15%

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

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

8400 7140 руб.

20.08.2024    8065    60    28    

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

16800 руб.

06.12.2023    8949    42    5    

74

SALE! 15%

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

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

10000 8500 руб.

10.11.2023    10533    37    27    

62

SALE! 35%

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

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

4800 3120 руб.

14.01.2013    188183    1141    0    

912

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

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

14400 руб.

29.04.2020    32762    106    152    

73

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

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

6000 руб.

06.11.2012    72840    627    45    

85

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

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

4200 руб.

10.11.2015    62859    94    59    

79

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

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

3000 руб.

21.07.2022    9863    7    4    

15
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. DrAku1a 1745 15.11.17 09:10 Сейчас в теме
В стандартных конфигурациях можно использовать механизмы настроек пользователя, чтобы не городить отдельный регистр.
Timon_132; +1 Ответить
2. user764938 15.11.17 09:51 Сейчас в теме
Подскажите пожалуйста, "Процедура ОчиститьКэш1С" использует запрос, у меня конфигуратор ругается на Элемент "Запрос", я не очень понимаю, разве запрос вообще можно сделать в модуле управляемых приложений"? Возможно я делаю что-то не то?
18. websamson 307 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 Сейчас в теме
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 805 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 259 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 259 16.11.17 08:11 Сейчас в теме
Ну и вообще, надежность такого подхода несколько хромает:
Пользователь открыл 1 экземпляр программы,
Пользователь открыл 2 экземпляр программы на этом же ПК под этой же учетной записью,
Динамическое обновление - пользователь в очереди на очистку кэша,
Пользователь закрыл любой из экземпляров программы - пользователь исключен из очереди на очистку кэша, однако очистка не произошла, тк открыт другой экземпляр программы.

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

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