Как платформа 1С запоминает данные и когда этот кэш пора сбросить

· 10 мин

Содержание

Кэшированные значения в 1С нужны, чтобы не считать и не запрашивать одно и то же по сто раз за сеанс: платформа запоминает результат функции, настройки базы и описание конфигурации и отдаёт их из памяти или с локального диска. Очистить кэш проще всего параметром запуска /ClearCache. Если не помогло, закройте 1С и удалите папку базы в %APPDATA%\1C\1cv8 и %LOCALAPPDATA%\1C\1cv8.

Частое заблуждение: «кэш 1С — это мусор, его надо регулярно чистить ради скорости». Всё наоборот. Кэш и есть ускорение. После очистки первый запуск идёт заметно дольше, потому что клиент заново скачивает описание конфигурации. Чистят его по симптомам, а не по расписанию.

Как устроено кэширование в платформе 1С: три уровня

Под словом «кэш» в 1С прячутся три разных механизма. Путают их постоянно, отсюда и бесполезные советы.

УровеньЧто хранитсяГде живётСколько живёт
🧠 Повторно используемые значенияРезультаты функций общих модулейПамять сеанса (клиент или сервер)До конца вызова или сеанса, с ограничением по времени
💻 Кэш клиентаОписание конфигурации, метаданные форм, пользовательские файлыДиск рабочего места, профиль пользователяПока не изменится конфигурация или пока его не удалят
🖥️ Кэш сервераДанные сеансов кластера, служебные файлыКаталог srvinfo на сервере 1СПока работает кластер

Первый уровень — это механизм разработчика. Его настраивают в конфигураторе, а сбрасывают кодом. Второй и третий — забота администратора, их чистят руками или параметрами запуска.

Если пользователь жалуется «после обновления всё странно», почти всегда виноват кэш клиента. Повторно используемые значения живут не дольше сеанса, и перезапуск программы их уже сбрасывает.

Зачем нужны кэшированные значения в общих модулях

У общего модуля в конфигураторе есть свойство «Повторное использование возвращаемых значений». Три варианта:

  • ⛔ Не использовать — функция каждый раз выполняется заново.
  • ⏱️ На время вызова — результат запоминается, пока выполняется один серверный вызов. Удобно, когда в одной операции функцию дергают в цикле.
  • 🔁 На время сеанса — результат хранится, пока пользователь работает в программе.

Платформа запоминает результат отдельно для каждого набора параметров. Вызвали функцию с параметром «Москва» — результат сохранён. Вызвали с «Казань» — это уже другая запись в кэше.

По соглашению разработчиков такие модули называют с суффиксом ПовтИсп, а клиентские — КлиентПовтИсп. Так по имени сразу видно, что функция отдаёт кэшированное значение.

Что выгодно кэшировать

  • 📌 Значения констант и функциональных опций, которые читают при каждом открытии формы.
  • 📌 Ссылки на предопределённые элементы и служебные справочники.
  • 📌 Настройки пользователя и организации, которые меняются редко.
  • 📌 Результаты тяжёлых запросов к описанию метаданных.

Пример модуля РаботаСНастройкамиПовтИсп с повторным использованием «на время сеанса»:

Функция ОсновнаяВалюта() Экспорт
    Возврат Константы.ВалютаРегламентированногоУчета.Получить();
КонецФункции

Функция СписокСкладовОрганизации(Организация) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Склады.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник.Склады КАК Склады
    |ГДЕ
    |    Склады.Организация = &Организация
    |    И НЕ Склады.ПометкаУдаления";
    Запрос.УстановитьПараметр("Организация", Организация);
    Возврат Новый ФиксированныйМассив(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"));
КонецФункции

Имена константы и справочника условные: в вашей конфигурации они могут быть другими. Суть в приёме.

Почему результат возвращают фиксированным

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

Чем кэш отличается от параметров сеанса

Повторно используемые значенияПараметры сеанса
ЗаполнениеСами, при первом вызове функцииЯвно, в модуле сеанса или по требованию
СбросМожет быть вытеснен платформойЖивут весь сеанс
КлючНабор параметров функцииИмя параметра
Гарантия наличияНет, значение могут пересчитатьЕсть

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

Где лежат файлы кэша 1С в Windows и Linux

Кэш клиента хранится в профиле пользователя, в отдельной папке на каждую информационную базу. Имя папки — длинный идентификатор вида a1b2c3d4-.... Он совпадает с параметром ID= у этой базы в файле списка ibases.v8i.

ОСГде искать кэш клиента
Windows%APPDATA%\1C\1cv8\ и %LOCALAPPDATA%\1C\1cv8\
Linux~/.1cv8/1C/1cv8/ в домашнем каталоге пользователя

В Windows папок две. В %LOCALAPPDATA% лежит основной объём: скачанное описание конфигурации. В %APPDATA% (роуминговая часть профиля) — то, что должно ездить за пользователем между компьютерами.

Чтобы понять, какая папка относится к нужной базе:

  1. Откройте %APPDATA%\1C\1CEStart\ibases.v8i в Блокноте.
  2. Найдите блок с названием базы в квадратных скобках.
  3. Скопируйте значение строки ID=.
  4. Папка с таким же именем в каталогах кэша и есть кэш этой базы.

Файл ibases.v8i — это список баз в окне запуска, а не кэш. Не удаляйте его, иначе пользователь увидит пустое окно запуска и базы придётся добавлять заново.

Серверный кэш в клиент-серверном варианте лежит в каталоге кластера srvinfo. По умолчанию на Windows это C:\Program Files\1cv8\srvinfo\reg_1541\, на Linux — /home/usr1cv8/.1cv8/1C/1cv8/reg_1541/. Если сервер ставили с другим каталогом данных, путь будет свой: его видно в параметрах запуска службы агента сервера. Кэш данных сеансов — это папки snccntx<идентификатор> внутри reg_1541.

Симптомы: когда виноват кэш клиента

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

Типичные признаки:

  • 🔸 после обновления у одного пользователя остались старые формы и команды, а у коллег всё новое;
  • 🔸 программа долго висит на заставке или закрывается сразу после запуска только на одном компьютере;
  • 🔸 форма открывается пустой или с «поехавшими» полями;
  • 🔸 странные ошибки при открытии документов, которые пропадают, если войти под тем же пользователем с другого компьютера;
  • 🔸 в профиле пользователя кэш 1С разросся до нескольких гигабайт.

Главный тест простой: воспроизводится ли проблема на другом рабочем месте. Если там всё работает — почти наверняка дело в локальном кэше. Если сбоит у всех — кэш клиента ни при чём, ищите причину в базе или на сервере.

Диагностика: выберите симптом

Как очистить кэш 1С: от мягкого способа к радикальному

Двигайтесь сверху вниз. Каждый следующий способ сильнее предыдущего.

СпособКогда подходитЧем рискуете
Параметр /ClearCacheПервая попытка, один пользовательНичем, только долгим первым запуском
Удаление папки базы/ClearCache не помогСбросятся локальные настройки этой базы на компьютере
Удаление всего кэша клиентаНе понятно, какая папка нужнаТо же, но для всех баз
ОбновитьПовторноИспользуемыеЗначения()Устаревшие значения в кодеНичем
Очистка snccntx на сервереПроблема у всех, кэш сервера повреждёнОбрыв всех сеансов кластера

Способ 1. Параметр запуска /ClearCache

  1. В окне запуска выделите базу и нажмите Изменить.
  2. Пройдите мастер до последней страницы.
  3. В поле дополнительных параметров запуска впишите /ClearCache.
  4. Нажмите Готово и запустите базу.

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

Тот же параметр работает из командной строки или ярлыка:

"C:\Program Files\1cv8\8.3.25.1374\bin\1cv8.exe" ENTERPRISE /S"srv1c\buh" /ClearCache

Номер версии в пути замените на установленный у вас. Для файловой базы вместо /S указывают путь к каталогу: /F"D:\Bases\Buh".

Способ 2. Удалить папку кэша конкретной базы

  1. Попросите пользователя закрыть все окна 1С.
  2. Найдите идентификатор базы в ibases.v8i, как описано выше.
  3. Удалите папку с этим именем в %APPDATA%\1C\1cv8\ и в %LOCALAPPDATA%\1C\1cv8\.
  4. Запустите базу.

Пока 1С открыта, часть файлов занята и не удалится. Если система пишет «файл используется», проверьте в диспетчере задач, не остались ли процессы 1cv8c.exe или 1cv8.exe.

Способ 3. Очистить весь кэш клиента одним скриптом

Подходит, когда баз много или нужно пройтись по десятку компьютеров. Скрипт удаляет только папки-идентификаторы и не трогает 1CEStart со списком баз:

@echo off
taskkill /IM 1cv8c.exe /F >nul 2>&1
taskkill /IM 1cv8.exe /F >nul 2>&1
for /d %%D in ("%APPDATA%\1C\1cv8\*-*-*-*-*") do rd /s /q "%%D"
for /d %%D in ("%LOCALAPPDATA%\1C\1cv8\*-*-*-*-*") do rd /s /q "%%D"
echo Кэш 1С очищен

taskkill закрывает 1С без сохранения. Несохранённый документ пропадёт. Запускайте скрипт, только когда пользователь вышел из программы.

В Linux то же самое делается одной командой при закрытой 1С:

find ~/.1cv8/1C/1cv8 -maxdepth 1 -type d -name '*-*-*-*-*' -exec rm -rf {} +

Способ 4. Сбросить повторно используемые значения из кода

Если вы изменили константу или настройку, а код продолжает видеть старое значение, вызовите глобальный метод:

ОбновитьПовторноИспользуемыеЗначения();

Он сбрасывает весь кэш возвращаемых значений текущего сеанса. Вызывают его сразу после записи настройки, которую читают через модуль ПовтИсп. Сбросить одно значение выборочно нельзя: очищается всё, и следующие вызовы будут считать заново.

Способ 5. Очистить серверный кэш сеансов

Этот способ нужен редко: когда проблема у всех пользователей, а журнал и обновление базы её не объясняют.

  1. Предупредите пользователей и сделайте это в нерабочее время. Остановка службы обрывает все сеансы всех баз кластера.
  2. Остановите службу агента сервера 1С:Предприятия (services.msc в Windows, systemctl stop с именем вашей службы в Linux).
  3. В каталоге reg_1541 удалите только папки snccntx.... Файлы реестра кластера и папки баз не трогайте.
  4. Запустите службу и проверьте вход.

Перед удалением скопируйте папки snccntx в сторону. Если что-то пойдёт не так, вернёте их обратно.

Профилактика: чтобы кэш помогал, а не мешал

Большая часть проблем с кэшем решается настройкой рабочих мест, а не регулярной очисткой.

  • 🛡️ Исключения в антивирусе. Добавьте папки кэша 1С и каталог srvinfo в исключения проверки. Антивирус, который сканирует каждый файл кэша, замедляет запуск и иногда блокирует запись, а это прямой путь к повреждённому кэшу.
  • 💾 Место на диске. Кэш одной типовой конфигурации весит сотни мегабайт. Если на диске C: пусто впритык, запись обрывается на середине.
  • 🖧 Терминальные серверы. При перемещаемых профилях роуминговая часть кэша едет при каждом входе. Следите, чтобы основной объём лежал в %LOCALAPPDATA%, и периодически удаляйте папки баз, которые больше не используются.
  • 🔄 Обновления. После обновления конфигурации не запускайте 1С на десятке компьютеров по слабой сети одновременно. Первый запуск у каждого скачивает новое описание.
  • 🧹 Старые базы. Удалили базу из списка — удалите и её папку кэша. Сама 1С этого не делает.

Для разработчиков свои правила:

  • в ПовтИсп не кладите то, что меняется в течение сеанса: остатки, курсы на текущую минуту, статусы документов;
  • не возвращайте из кэшированной функции изменяемые коллекции;
  • не рассчитывайте, что значение пролежит весь сеанс: функция должна давать верный результат при любом пересчёте;
  • режим «на время вызова» используйте для функций, которые дёргают в цикле одной операции, а «на время сеанса» — для редко меняющихся настроек.
Перед очисткой кэша клиента
Выполнено: 0 / 5

Частые вопросы

Сбрасывается ли кэш при обновлении конфигурации?
Да, клиент сам видит, что конфигурация изменилась, и докачивает новое описание. Ручная очистка нужна, только если этот процесс прервался и кэш остался в промежуточном состоянии.
Потеряются ли мои настройки отчётов при очистке кэша?
Основная часть пользовательских настроек хранится в самой информационной базе, а не на диске. Удаление папки кэша обычно сбрасывает только локальные мелочи: положение окон и подобное.
Можно ли удалить кэш у пользователя, который работает через веб-клиент?
У веб-клиента нет папки кэша в профиле Windows. Ему помогает очистка кэша браузера или вход в режиме инкогнито.
Почему после /ClearCache 1С запускается несколько минут?
Клиент заново получает описание всей конфигурации с сервера. У крупных конфигураций по медленной сети это действительно долго. Второй запуск будет обычным.
Работает ли ОбновитьПовторноИспользуемыеЗначения для всех пользователей?
Нет. Метод сбрасывает кэш только того сеанса, в котором вызван. Остальные пользователи увидят новое значение после перезапуска своего сеанса или когда их кэш устареет.