ВременноеХранилище 1С: что лежит в памяти, а что на диске
Содержание
Временное хранилище 1С — это не папка и не таблица базы. Это область сеансовых данных платформы: значения лежат в памяти серверного процесса, а при нехватке памяти и в клиент-серверном варианте — в служебных файлах кластера в каталоге srvinfo. В файловом режиме серверная часть работает внутри процесса клиента, поэтому всё, что выгружается на диск, попадает во временный каталог пользователя Windows (%TEMP%).
Типичная ситуация: разработчик загружает Excel-файл через форму, а администратор через неделю находит на сервере гигабайты непонятных файлов и спрашивает, «где это 1С хранит». Ответ зависит от режима работы базы и от того, как написан код. Разберём оба варианта, а затем — как чистить и что проверять при сбоях.
Как устроено временное хранение данных в 1С
Временное хранилище появилось вместе с управляемыми формами. Клиент и сервер обмениваются данными через вызовы, и тащить в каждом вызове мегабайты двоичных данных невыгодно. Поэтому значение кладут на сервер один раз, а между клиентом и сервером передают только короткий адрес — строку вида e1cib/tempstorage/<идентификатор>.
Ключевые свойства хранилища:
- 🧠 Привязано к сеансу. Другой пользователь по вашему адресу ничего не получит. После завершения сеанса данные удаляются.
- ⏳ Живёт ограниченное время. Если значение связано с уникальным идентификатором формы, оно удаляется при закрытии формы. Без идентификатора рассчитывать можно только на ближайший вызов сервера.
- 📦 Хранит любое сериализуемое значение. Чаще всего это
ДвоичныеДанныезагруженного файла, табличный документ, таблица значений или результат фонового задания. - 🚫 Не пишется в базу. Это не регистр сведений
и не реквизит типа
ХранилищеЗначения. Перезапуск сервера или сеанса стирает всё.
Чтобы не путать понятия, сведём рядом похожие механизмы.
| Механизм | Где физически | Сколько живёт |
|---|---|---|
| Временное хранилище | Память сеанса, сеансовые данные кластера | До закрытия формы или конца сеанса |
Реквизит ХранилищеЗначения | Таблица информационной базы | Пока не удалят объект |
| Временные таблицы запроса | СУБД (в MS SQL — tempdb) | До закрытия менеджера временных таблиц |
Временные файлы (ПолучитьИмяВременногоФайла()) | Каталог %TEMP% пользователя процесса | Пока код или ОС их не удалит |
| Кэш клиента | %APPDATA%\1C\1cv8 и %LOCALAPPDATA%\1C\1cv8 | До очистки кэша |
Половина вопросов «где хранится временное хранилище» на деле про последние две строки. Именно временные файлы и кэш растут на диске, а не само хранилище.
Где лежат временные данные в файловом режиме
В файловом варианте отдельного сервера 1С нет. Серверный контекст поднимается внутри процесса 1cv8.exe (тонкий или толстый клиент) либо внутри процесса веб-сервера, если база опубликована.
Отсюда простые правила:
- Временное хранилище живёт в оперативной памяти процесса
1cv8.exeна компьютере пользователя. - Временные файлы, которые создаёт код (
ПолучитьИмяВременногоФайла()), ложатся в каталог, который возвращаетКаталогВременныхФайлов(). Обычно этоC:\Users\<пользователь>\AppData\Local\Temp. - Если база опубликована на IIS или Apache, серверная часть работает в процессе веб-сервера. Временные файлы окажутся в temp-каталоге учётной записи, под которой запущен пул приложений или служба Apache.
- Рядом с файлом базы
1Cv8.1CDво время работы может появляться служебный файл1Cv8tmp.1CD. Это рабочий файл движка файловой базы для временных данных, а не временное хранилище из кода. Пока база открыта, его не трогают.
Чтобы узнать точный путь на конкретной машине, выполните в режиме 1С:Предприятие через «Выполнить произвольный код» или в обработке строку Сообщить(КаталогВременныхФайлов());. Вызов на клиенте и на сервере может дать разные ответы.
Закрыли 1С — память освободилась. А вот файлы в %TEMP% остаются, если программист не удалил их в конце обработки.
Хранилище в клиент-серверном варианте: каталог srvinfo
Здесь всё интереснее. Значение кладётся в память рабочего процесса rphost. Но сеанс может переходить между рабочими процессами, поэтому кластер держит сеансовые данные в отдельном сервисе. Большие и долго живущие значения он сбрасывает на диск.
Где это физически на сервере Windows:
- 📁 Каталог службы кластера — по умолчанию
C:\Program Files\1cv8\srvinfo. Точный путь виден в параметрах службы «Агент сервера 1С:Предприятия 8.3» после ключа-d. - 📁 Внутри — каталог реестра кластера
reg_1541(номер совпадает с портом менеджера кластера). - 📁 Сеансовые данные лежат в подкаталогах с именем, начинающимся на
snccntx, за которым следует идентификатор.
На Linux каталог по умолчанию — домашний каталог пользователя usr1cv8, путь /home/usr1cv8/.1cv8/1C/1cv8/, внутри та же структура reg_1541.
Временные файлы, которые создаёт серверный код, идут в temp-каталог учётной записи службы. Для стандартной установки это профиль пользователя USR1CV8. Если служба запущена от другой учётной записи, ищите её профиль.
Каталог snccntx — не мусорная корзина. Пока служба работает, там лежат живые данные сеансов. Удаление на ходу приводит к сбоям у пользователей.
Отдельно о временных таблицах запросов. Они живут не в srvinfo, а в СУБД: в MS SQL — в базе tempdb, в PostgreSQL — во временных схемах сеанса. К ПоместитьВоВременноеХранилище() они отношения не имеют.
Программная работа с временным хранилищем
Весь API — четыре функции глобального контекста:
| Функция | Что делает |
|---|---|
ПоместитьВоВременноеХранилище(Данные, Адрес) | Кладёт значение, возвращает адрес |
ПолучитьИзВременногоХранилища(Адрес) | Возвращает значение или Неопределено, если его уже нет |
УдалитьИзВременногоХранилища(Адрес) | Удаляет значение сразу |
ЭтоАдресВременногоХранилища(Адрес) | Проверяет, похожа ли строка на адрес хранилища |
Второй параметр ПоместитьВоВременноеХранилище решает судьбу значения. Передайте УникальныйИдентификатор формы — данные проживут, пока форма открыта. Передайте уже существующий адрес — значение перезапишется по нему.
Загрузка файла с клиента и разбор на сервере
Классический сценарий: пользователь выбирает файл, он уходит на сервер через хранилище, сервер пишет его во временный файл и обрабатывает.
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
ОбработатьФайлНаСервере(Адрес);
КонецПроцедуры
&НаСервере
Процедура ОбработатьФайлНаСервере(Адрес)
Данные = ПолучитьИзВременногоХранилища(Адрес);
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
Данные.Записать(ИмяФайла);
Попытка
// разбор файла
Исключение
УдалитьФайлы(ИмяФайла);
УдалитьИзВременногоХранилища(Адрес);
ВызватьИсключение;
КонецПопытки;
УдалитьФайлы(ИмяФайла);
УдалитьИзВременногоХранилища(Адрес);
КонецПроцедуры
Два приёма, которые знает каждый, кто чистил сервер от мусора:
- Удаляйте временный файл и в ветке
Исключение. Иначе каждая ошибка разбора оставит файл в%TEMP%навсегда. - Освобождайте хранилище явно. Форма может висеть открытой весь день, а с ней и 200 МБ двоичных данных в памяти
rphost.
Получение результата фонового задания
Фоновое задание работает в своём сеансе и в хранилище формы напрямую писать не может. Поэтому адрес готовят заранее и передают параметром:
&НаСервере
Функция ЗапуститьФормирование()
АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
Параметры = Новый Массив;
Параметры.Добавить(АдресРезультата);
ФоновыеЗадания.Выполнить("МойОбщийМодуль.Сформировать", Параметры);
Возврат АдресРезультата;
КонецФункции
Внутри МойОбщийМодуль.Сформировать результат кладут вызовом ПоместитьВоВременноеХранилище(Результат, АдресРезультата). Форма по таймеру проверяет задание и забирает значение через ПолучитьИзВременногоХранилища. В типовых конфигурациях на БСП для этого есть готовый механизм длительных операций, писать обвязку руками там не нужно.
Не кладите в хранилище то, что нужно хранить дольше сеанса. Для этого есть регистр сведений с реквизитом ХранилищеЗначения или присоединённые файлы.
Очистка временных файлов и сеансовых данных
Само временное хранилище вручную не чистят — оно очищается при закрытии форм и сеансов. Чистят то, что вокруг него накопилось на диске.
Файловый режим и рабочие места
- Закройте 1С у пользователя.
- Откройте
%TEMP%(Win+R, ввести%TEMP%) и удалите старые файлы. Занятые система не даст удалить — их пропустите. - При странностях интерфейса очистите кэш клиента: запустите 1С с ключом
/ClearCacheили удалите подкаталоги с идентификаторами в%APPDATA%\1C\1cv8и%LOCALAPPDATA%\1C\1cv8. Файлы.v8iсо списком баз не трогайте.
Сервер 1С
Остановка службы оборвёт сеансы всех пользователей всех баз кластера. Делайте это вне рабочего времени и предупредите людей заранее.
- Завершите работу пользователей и фоновых заданий, проверьте через консоль кластера, что сеансов нет.
- Остановите службу «Агент сервера 1С:Предприятия 8.3».
- Сделайте копию каталога
reg_1541на случай ошибки. - Удалите подкаталоги
snccntx*внутриreg_1541. Файл1CV8Clst.lstи каталоги с идентификаторами баз не удаляйте — в них реестр кластера. - Очистите temp-каталог учётной записи службы (например, профиль
USR1CV8). - Запустите службу и проверьте вход в базу.
Удаление 1CV8Clst.lst стирает список баз и настройки кластера. Его восстанавливают только из копии.
Для регулярной уборки temp на сервере подойдёт задача в Планировщике Windows, удаляющая файлы старше 2-3 суток. Файлы моложе не трогайте: их может держать долгое фоновое задание.
Диагностика проблем с временными файлами
Сбои вокруг хранилища узнаются по симптомам. Сопоставьте свой случай:
Что посмотреть в первую очередь:
- 📊 Размер каталогов. На Windows удобно смотреть свойства
srvinfoи temp-каталога службы, на Linux —du -sh /home/usr1cv8/.1cv8/1C/1cv8/reg_1541/*. - 🔍 Технологический журнал. Если включён, события
EXCPпокажут, какой модуль падает при разборе файла и оставляет мусор. - 🧪 Права учётной записи службы. Если служба не может писать в свой temp, серверный код с временными файлами падает. Проверьте права на каталог.
- 🧩 Код загрузки. Поиском по конфигурации найдите
ПолучитьИмяВременногоФайлаи проверьте, что рядом естьУдалитьФайлы.
Если не помогло
Если после очистки место снова быстро уходит, включите технологический журнал на короткое время и посмотрите, какие операции идут в момент роста. Часто виновата одна обработка обмена или загрузки, которая на каждом запуске оставляет копию файла. Чинить надо её, а не ставить уборку temp каждые полчаса.