Кэш сервера 1С и кэш клиента: как правильно очистить
Очистка кэша — частый совет при странных ошибках 1С, но у клиента и у сервера кэши разные, и чистить их нужно по-разному. В статье — что именно кэширует 1С, как очистить кэш клиента параметром /ClearCache и вручную на Windows и Linux, где лежит кэш сервера 1С в каталоге srvinfo, как почистить его с блокировкой сеансов через консоль или rac и что не трогать, чтобы не сломать кластер.
Что кэширует 1С и когда кэш мешает
Под словами «кэш 1С» обычно имеют в виду два разных хранилища:
- Кэш клиента — данные на компьютере пользователя. Главная его часть — кэш клиент-серверных вызовов: метаданные форм, модули и другие сведения о конфигурации, которые клиент сохраняет, чтобы не загружать их с сервера при каждом запуске.
- Кэш сервера 1С — сеансовые данные кластера. В них хранятся временное хранилище и служебная информация сеансов. За ними отвечает менеджер кластера
rmngr, а на диске это каталогиsnccntx<GUID>внутри каталога кластера.
В нормальной работе кэш ускоряет запуск и открытие форм, и чистить его «для профилактики» не нужно. Поводы для очистки — симптомы после обновления конфигурации или сбоя: формы открываются в старом виде, появляются ошибки формата потока или «непредвиденные ошибки» у отдельных пользователей, клиент не видит изменений, которые точно загружены в базу. Если проблема у одного пользователя, начинайте с его компьютера. К серверу переходите, когда ошибка проявляется у всех.
Как очистить кэш 1С на компьютере пользователя
Параметр /ClearCache
Самый безопасный способ — запуск с параметром командной строки /ClearCache. По документации платформы он очищает кэш клиент-серверных вызовов, где хранятся метаданные форм, модули и т. п. При запуске Конфигуратора с этим ключом дополнительно очищается индекс поиска по модулям.
- В окне запуска 1С выделите базу и нажмите «Изменить».
- Пройдите до последнего шага мастера и в поле «Дополнительные параметры запуска» впишите
/ClearCache. - Нажмите «Готово» и запустите базу.
- После успешного запуска удалите параметр, иначе кэш будет сбрасываться при каждом входе, и запуск станет медленнее.
Тот же ключ можно указать в ярлыке:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /S "srv01\trade" /ClearCache
Удаление папок кэша вручную
Если /ClearCache не помог или база не запускается вовсе, удалите кэш вручную. Сначала закройте все окна 1С на компьютере. Кэш лежит в профиле пользователя, в подкаталогах с именами-идентификаторами (GUID) — по одному на каждую базу из списка:
| ОС | Каталоги кэша | Что не трогать |
|---|---|---|
| Windows | %APPDATA%\1C\1cv8\ и %LOCALAPPDATA%\1C\1cv8\ | Список баз %APPDATA%\1C\1CEStart\ibases.v8i |
| Linux | ~/.1cv8/1C/1cv8/ | Список баз ~/.1C/1cestart/ibases.v8i |
Чтобы очистить кэш только одной базы, найдите её идентификатор в файле ibases.v8i — это значение строки ID в разделе базы — и удалите папки с таким же именем в обоих каталогах:
[Торговля]
Connect=Srvr="srv01";Ref="trade";
ID=3f6a2c1e-8d4b-4f0a-9c55-2b7e1a9d0c11
...
Для очистки кэша всех баз на компьютере пригодится командный файл. Он удаляет только папки с именами вида GUID и не трогает список баз:
@echo off
rem Перед запуском закройте все окна 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С очищен
Учтите: в каталоге из %APPDATA% хранятся и локальные настройки клиента. Некоторые конфигурации держат там, например, параметры подключённого оборудования, поэтому после удаления их может понадобиться настроить заново. Если хотите действовать осторожнее, сначала переименуйте папку, а удалите после проверки.
Терминальный сервер и много пользователей
На терминальном сервере у каждого пользователя свой профиль, а значит, и свой кэш. Очистка в одном профиле не помогает остальным: командный файл нужно выполнить от имени каждого пользователя, например сценарием входа в систему, или пройтись по каталогам профилей от имени администратора, когда все сеансы 1С закрыты. Пример для администратора, который чистит кэш во всех профилях сервера:
Get-ChildItem "C:\Users" -Directory | ForEach-Object {
foreach ($sub in "AppData\Roaming\1C\1cv8", "AppData\Local\1C\1cv8") {
$path = Join-Path $_.FullName $sub
if (Test-Path $path) {
Get-ChildItem $path -Directory |
Where-Object { $_.Name -match '^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$' } |
Remove-Item -Recurse -Force
}
}
}
Регулярное выражение отбирает только папки с именами в формате GUID, так что настройки и список баз остаются на месте. Если профили перемещаемые, кэш из Roaming может вернуться с сервера профилей, поэтому чистите его и там. После массового обновления конфигурации полезнее разово запустить базу с /ClearCache у всех пользователей, чем удалять кэш по расписанию.
Веб-клиент
Веб-клиент не использует каталоги платформы: его файлы кэширует браузер. Очистите кэш браузера для адреса публикации или откройте базу в приватном окне. Если после обновления платформы веб-клиент ведёт себя странно, проверьте и саму публикацию на веб-сервере.
Кэш сервера 1С: где он лежит
Каталог данных кластера по умолчанию: в Windows — srvinfo в каталоге установки (например, C:\Program Files\1cv8\srvinfo), в Linux — /home/usr1cv8/.1cv8/1C/1cv8. Путь может быть переопределён ключом -d в параметрах запуска агента сервера. Внутри него:
| Объект | Что это | Можно ли удалять |
|---|---|---|
reg_1541 | Каталог кластера; число совпадает с портом менеджера кластера | Нет |
reg_1541\1CV8Clst.lst | Реестр кластера: базы, настройки, администраторы | Нет — потеряете настройки кластера |
reg_1541\<GUID базы> | Данные базы на сервере: журнал регистрации, индексы полнотекстового поиска | Нет, если база используется |
reg_1541\snccntx<GUID> | Сеансовые данные — то, что называют кэшем сервера | Да, только при остановленной службе |
Сеансовые данные могут занимать много места. Методика 1С отдельно предупреждает: следите за свободным местом на диске с сеансовыми данными и не размещайте на нём технологический журнал — нехватка места сказывается на стабильности сервера.
Как почистить кэш на сервере 1С
Очистка кэша сервера 1С требует остановки службы, то есть отключения всех пользователей всех баз кластера. Порядок:
- Предупредите пользователей. Для каждой базы включите блокировку начала сеансов и регламентных заданий.
- Завершите оставшиеся сеансы.
- Остановите службу агента сервера и убедитесь, что процессы
ragent,rmngrиrphostзавершились. - Перенесите каталоги
snccntx*в резервную папку вне каталога кластера (надёжнее, чем сразу удалять). - Запустите службу, снимите блокировки и проверьте вход в базы.
- Если всё работает, удалите перенесённые каталоги.
Блокировку и завершение сеансов удобно выполнить утилитой rac — так работают и на Linux, и в скриптах. Сервер администрирования ras должен быть запущен:
rac cluster list
rac infobase --cluster=<id_кластера> summary list
rac infobase --cluster=<id_кластера> update --infobase=<id_базы> \
--infobase-user="Администратор" --infobase-pwd="пароль" \
--sessions-deny=on --scheduled-jobs-deny=on \
--denied-message="Обслуживание сервера" --permission-code=7351
rac session --cluster=<id_кластера> list --infobase=<id_базы>
rac session --cluster=<id_кластера> terminate --session=<id_сеанса>
В Windows те же действия доступны в консоли «Администрирование серверов 1С:Предприятия»: свойства базы — блокировка начала сеансов, раздел «Сеансы» — удаление сеанса. Подробнее о консоли и rac — в статье про сервер 1С:Предприятия и кластер.
Остановка службы и перенос каталогов в Windows (PowerShell от имени администратора):
$svc = Get-Service | Where-Object { $_.DisplayName -like "*1C:Enterprise*Server Agent*" }
$svc | Stop-Service
$reg = "C:\Program Files\1cv8\srvinfo\reg_1541"
$bak = "D:\1c_snccntx_backup\" + (Get-Date -Format "yyyyMMdd_HHmm")
New-Item -ItemType Directory -Path $bak -Force | Out-Null
Get-ChildItem $reg -Directory -Filter "snccntx*" | Move-Item -Destination $bak
$svc | Start-Service
В Linux начиная с версии 8.3.21 сервер управляется юнитом systemd, в имени которого есть номер версии; в более старых установках служба называлась srv1cv83:
sudo systemctl stop srv1cv8-8.3.27.xxxx@default
sudo mkdir -p /var/backups/snccntx
sudo find /home/usr1cv8/.1cv8/1C/1cv8/reg_1541 -maxdepth 1 -type d -name 'snccntx*' \
-exec mv {} /var/backups/snccntx/ \;
sudo systemctl start srv1cv8-8.3.27.xxxx@default
Если после этого ошибка не ушла, дело не в кэше: проверьте журнал регистрации, технологический журнал и конфигурацию базы. Очистка сеансовых данных — разовая мера администратора, а не регламентная операция.
Кэш на уровне конфигурации: повторно используемые значения
Есть и третий кэш, который часто путают с первыми двумя: общие модули со свойством «Повторное использование возвращаемых значений» («На время вызова» или «На время сеанса»). Функции таких модулей запоминают результат, и если значение константы или настройки изменилось в течение сеанса, пользователь продолжает видеть старое. Чистить файлы здесь бесполезно. Нужно либо перезапустить сеанс, либо сбросить кэш программно:
&НаСервере
Процедура ВключитьУчетПоЯчейкамНаСервере()
Константы.ИспользоватьСкладскиеЯчейки.Установить(Истина);
// Сбрасываем кэш повторно используемых значений текущего сеанса,
// чтобы функции общих модулей с повторным использованием
// вернули уже новое значение константы
ОбновитьПовторноИспользуемыеЗначения();
КонецПроцедуры
Метод действует только на текущий сеанс: у других пользователей кэш «на время сеанса» обновится после перезапуска их сеансов.
Типичные ошибки при очистке кэша
- Удалять весь каталог
reg_1541или файл1CV8Clst.lstвместо сеансовых данных — кластер теряет список баз и настройки. - Чистить
snccntxпри работающей службе: файлы заняты, а частичное удаление может привести к новым ошибкам. - Оставлять
/ClearCacheв параметрах запуска навсегда — каждый вход становится медленнее. - Удалять
ibases.v8iвместе с кэшем — пропадает список баз пользователя. - Чистить кэш сервера, когда ошибка только у одного пользователя: сначала очистите кэш на его компьютере, как описано в статье про ошибку формата потока.
- Ждать, что очистка кэша исправит ошибку в данных или конфигурации. Если проблема повторяется, ищите причину в журналах — общий порядок разбора есть в статье про ошибки при запуске 1С.
Актуальность для новых версий
Расположение кэша клиента и каталога кластера, параметр /ClearCache и устройство сеансовых данных (snccntx в каталоге reg_<порт>) не меняются в пределах версии 8.3. С версии 8.3.21 сервер на Linux запускается юнитом systemd с номером версии в имени, раньше служба называлась srv1cv83. В документации к ветке 8.5 описание /ClearCache расширено: очищаются служебные данные в каталоге данных приложения, поэтому сверяйтесь с «Руководством администратора» своего релиза на ИТС.
Частые вопросы
Где хранится кэш 1С на компьютере пользователя?
В Windows — в папках %APPDATA%\1C\1cv8 и %LOCALAPPDATA%\1C\1cv8, в подкаталогах с именами-идентификаторами баз. В Linux — в ~/.1cv8/1C/1cv8. Список баз хранится отдельно в файле ibases.v8i, его удалять не нужно.
Что делает параметр /ClearCache?
При запуске с этим ключом платформа очищает кэш клиент-серверных вызовов, где хранятся метаданные форм и модули. При запуске Конфигуратора дополнительно очищается индекс поиска по модулям. После успешного запуска ключ лучше убрать.
Где находится кэш сервера 1С?
В каталоге кластера: в Windows по умолчанию C:\Program Files\1cv8\srvinfo\reg_1541, в Linux — /home/usr1cv8/.1cv8/1C/1cv8/reg_1541. Кэшем сервера называют каталоги сеансовых данных snccntx с идентификатором в имени.
Можно ли очистить кэш сервера 1С без остановки службы?
Нет. Каталоги сеансовых данных заняты процессами кластера, поэтому службу агента сервера нужно остановить, предварительно заблокировав начало сеансов и завершив работу пользователей. После переноса каталогов snccntx службу запускают снова.
Есть ли в rac команда очистки кэша?
Отдельной команды очистки кэша нет. С помощью rac удобно подготовить сервер: заблокировать начало сеансов и регламентные задания, получить список сеансов и завершить их. Сами каталоги snccntx удаляют средствами ОС при остановленной службе.