В процессе эксплуатации систем на базе 1С:Предприятие 8.3 разработчики и системные администраторы часто сталкиваются с необъяснимым поведением программы. Это могут быть внезапные ошибки при открытии форм, «пропадание» кнопок, некорректное отображение данных или ошибки вида «Объект не найден», которые не подтверждаются в консоли запросов. В подавляющем большинстве случаев причиной является повреждение или устаревание локального кэша метаданных. В данной статье мы подробно разберем, как эффективно бороться с этой проблемой, используя различные подходы: от штатных параметров запуска до написания собственных скриптов автоматизации.
Давайте проанализируем ситуацию: платформа 1С для ускорения работы копирует часть метаданных конфигурации с сервера на локальный компьютер пользователя. Это позволяет не скачивать конфигурацию целиком при каждом запуске. Однако при динамическом обновлении конфигурации, сбоях сети или некорректном завершении работы системы локальные файлы могут «рассинхронизироваться» с серверной базой. В результате платформа пытается обратиться к старым индексам или описаниям типов, что приводит к критическим ошибкам. Выясним причину, почему простым перезапуском программы проблему решить не удается: файлы кэша сохраняются между сессиями и требуют принудительного удаления.
Рассмотрим самый простой и доступный метод, который предоставляет сама платформа. Существует специальный ключ запуска, который заставляет систему игнорировать текущий кэш при старте. Разберем по шагам, как его применить:
/ClearCache.Важно понимать, что данный метод имеет свои особенности. Рассмотрим подробнее: параметр /ClearCache очищает только кэш запросов к серверу, но не затрагивает локальные папки с метаданными полностью. Если ошибка сохраняется, нам придется перейти к более радикальным методам.
Проанализируем структуру хранения временных файлов 1С. Обычно они располагаются в профиле пользователя операционной системы. Нам необходимо обратить внимание на две основные директории:
%LOCALAPPDATA%\1C\1Cv8%APPDATA%\1C\1Cv8Внутри этих папок мы увидим множество каталогов со странными именами в виде идентификаторов (GUID), например 0a928c11-7365-4f32.... Это и есть локальный кэш конкретных информационных баз. Посмотрим на алгоритм действий: необходимо закрыть все сеансы 1С на данном компьютере, зайти в указанные папки и удалить все подпапки с длинными именами. Обратите внимание: файлы ibases.v8i и 1cecmconf трогать не нужно, так как в них хранится список баз и настройки подключения.
Если в организации много пользователей, ручная очистка становится неэффективной. Разберем пример кода командного файла, который можно распространить через групповые политики или просто запускать при возникновении проблем. Посмотрим на пример реализации такого скрипта:
@echo off
taskkill /f /im 1cv8.exe
taskkill /f /im 1cv8c.exe
set base_path_1=%LOCALAPPDATA%\1C\1Cv8
set base_path_2=%APPDATA%\1C\1Cv8
for /d %%i in ("%base_path_1%\*") do (
if exist "%%i\Config" rd /s /q "%%i"
if exist "%%i\ConfigSave" rd /s /q "%%i"
)
for /d %%i in ("%base_path_2%\*") do (
if exist "%%i\Config" rd /s /q "%%i"
)
echo Очистка кэша завершена!
pause
Проанализируем, что делает этот код. Сначала мы принудительно завершаем процессы 1cv8.exe (толстый клиент) и 1cv8c.exe (тонкий клиент), так как при запущенной программе файлы кэша будут заблокированы. Затем мы циклом проходим по папкам и удаляем те из них, которые содержат подкаталоги Config или ConfigSave. Это гарантирует, что мы удаляем именно временные данные, а не пользовательские настройки.
Иногда требуется реализовать механизм самоочистки прямо внутри конфигурации. Рассмотрим, как это можно сделать программно. Выясним причину сложности: 1С не может удалить папку кэша текущего сеанса, так как она используется в данный момент. Однако мы можем подготовить «почву» для очистки при следующем запуске или очистить кэш других баз. Разберем по шагам использование объекта Файл и метода УдалитьФайлы().
Процедура ОчиститьЛокальныйКэшПрограммно()
ПутьККэшу = КаталогВременныхФайлов();
// Обычно путь выглядит как ...\AppData\Local\Temp\v8_XXXX_XX
// Но нам нужны основные папки кэша метаданных
// В данном примере мы воспользуемся системной переменной через оболочку
Shell = Новый COMОбъект("WScript.Shell");
AppDataLocal = Shell.ExpandEnvironmentStrings("%LOCALAPPDATA%");
Путь1С = AppDataLocal + "\1C\1Cv8";
НайденныеФайлы = НайтиФайлы(Путь1С, "*", Ложь);
Для Каждого ТекФайл Из НайденныеФайлы Цикл
Если ТекФайл.ЭтоКаталог() Тогда
// Пытаемся удалить, если папка не занята другим сеансом
Попытка
УдалитьФайлы(ТекФайл.ПолноеИмя);
Сообщить("Удален каталог кэша: " + ТекФайл.Имя);
Исключение
// Пропускаем, если файл занят
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
В приведенном коде мы используем COMОбъект("WScript.Shell") для получения доступа к переменным окружения Windows. Метод НайтиФайлы позволяет нам получить список всех объектов в директории 1Cv8. Обратите внимание на блок Попытка...Исключение — он критически важен, так как попытка удаления кэша текущей работающей базы вызовет ошибку доступа, которую программа должна корректно обработать.
Рассмотрим ситуацию, когда очистка на стороне клиента не помогает. В этом случае проблема может крыться в серверном кэше. Проанализируем, как ведут себя файлы в каталоге сервера приложений (обычно это C:\Program Files\1cv8\srvinfo). Там хранятся данные сеансов и серверный кэш метаданных. В случае серьезных сбоев рекомендуется остановить службу 1C:Enterprise 8.3 Server Agent и очистить содержимое папки snccntx. Будьте осторожны: удаление других файлов в srvinfo может привести к потере списка баз на сервере или настроек кластера.
Для минимизации проблем с кэшем мы рекомендуем придерживаться следующих правил:
/ClearCache в настройки баз централизованно через файл common_v8i.Таким образом, мы проанализировали все доступные способы очистки кэша в 1С. Понимание того, как устроены временные файлы системы, позволяет программисту быстро диагностировать и устранять странные ошибки интерфейса, экономя время пользователей и собственные ресурсы на поиск несуществующих багов в коде.