ВременноеХранилище и папки temp: что 1С держит в памяти, а что пишет на диск
Содержание
Временное хранилище 1С 8.3 — это не папка на диске, а область данных сеанса. В файловом варианте она живёт в памяти процесса, который выполняет серверную часть (обычно сам 1cv8.exe или процесс веб-сервера). В клиент-серверном — в памяти рабочих процессов rphost и в сервисе сеансовых данных кластера, который сбрасывает данные на диск в каталоги snccntx… внутри srvinfo. Обычные же временные файлы (выгрузки, печать, распакованные вложения) лежат в папке %TEMP% той учётной записи, от имени которой работает процесс.
Типичная ситуация: разработчик загружает Excel-файл через форму, кладёт его во временное хранилище, а на сервере получает Неопределено. Или администратор видит, что диск C: на сервере 1С забит, и ищет, где «то самое хранилище». Ниже — разбор обоих случаев, с путями и кодом. Всё описанное относится к платформе, а не к конкретной конфигурации: в БП, ЗУП и УТ механизм один.
Как устроено временное хранилище 1С
Временное хранилище появилось вместе с управляемым приложением. Оно решает одну задачу: передать между клиентом и сервером (или между вызовами сервера) значение, которое неудобно или нельзя гонять в параметрах формы. Например, двоичные данные файла, таблицу значений на 100 000 строк или результат фонового задания.
Ключевые свойства:
- 🔑 Доступ по адресу. Метод
ПоместитьВоВременноеХранилище()возвращает строку-адрес. По ней значение потом читают. Сама строка — это ссылка, а не данные. - ⏳ Ограниченное время жизни. Значение удаляется автоматически: после закрытия формы, если при помещении передан её уникальный идентификатор, либо по окончании вызова сервера, если идентификатор не передан.
- 👤 Привязка к сеансу. Значение видно только внутри сеанса, который его поместил. После завершения сеанса всё, что в нём лежало, исчезает.
- 💾 Сериализуемость. Помещать можно только то, что платформа умеет сохранить: двоичные данные, таблицы значений, структуры, массивы. Объекты вроде
ЗаписьXMLили открытого запроса туда не положить.
Отсюда главный вывод. «Найти временное хранилище в проводнике» и открыть его как файл нельзя. Можно найти только физические следы: память процессов и служебные каталоги, где платформа хранит данные сеансов.
Временные данные в файловом варианте базы
В файловом режиме отдельного сервера нет. Серверную часть кода выполняет тот же процесс, что и клиентскую: тонкий или толстый клиент 1cv8.exe, а при веб-публикации — процесс веб-сервера с модулем расширения 1С.
Что где лежит:
| Что | Где физически | Когда исчезает |
|---|---|---|
| Значения временного хранилища | Память процесса 1cv8.exe (или процесса веб-сервера) | По истечении срока жизни или при закрытии сеанса |
| Временные файлы из кода | %TEMP% пользователя Windows, обычно C:\Users\<имя>\AppData\Local\Temp | Только когда их удалят явно |
| Кэш конфигурации и метаданных | %APPDATA%\1C\1cv8\<GUID базы> и %LOCALAPPDATA%\1C\1cv8\<GUID базы> | При очистке кэша |
| Данные самой базы | Файл 1Cv8.1CD в каталоге базы | Не временные |
Чтобы быстро открыть папку временных файлов, нажмите Win+R, введите %TEMP% и Enter. Каталог кэша открывается так же через %APPDATA%\1C\1cv8.
Если база открыта через веб-клиент из файловой публикации, временные значения живут в памяти процесса веб-сервера (для IIS это пул приложений, для Apache — его рабочий процесс). Перезапуск пула или службы Apache обнуляет все такие значения у всех пользователей.
Где хранятся данные временного хранилища в клиент-серверном варианте
Здесь картина сложнее. Сеанс пользователя обслуживает рабочий процесс rphost, и серверный код выполняется в нём. Но сеанс может переходить с одного рабочего процесса на другой, поэтому данные сеанса платформа держит в отдельном сервисе кластера — сервисе сеансовых данных.
Как это выглядит на диске сервера:
- 📁 Каталог кластера —
srvinfo\reg_1541(номер зависит от порта менеджера кластера). На Windows по умолчаниюsrvinfoлежит вC:\Program Files\1cv8\srvinfo, на Linux — в домашнем каталоге пользователяusr1cv8. - 📁 Каталоги
snccntx<GUID>внутриreg_1541— хранилище сеансовых данных. Сюда сервис сбрасывает данные сеансов, в том числе крупные значения временного хранилища. - 📁
%TEMP%учётной записи службы — например,C:\Users\USR1CV8\AppData\Local\Temp. Сюда попадают файлы, которые серверный код создаёт черезПолучитьИмяВременногоФайла(). - 🗄️ Временные таблицы запросов к временному хранилищу отношения не имеют. Они создаются на стороне СУБД (в MS SQL — в
tempdb, в PostgreSQL — во временных объектах сессии).
Последний пункт часто путают. Если растёт tempdb, чистить srvinfo бесполезно: проблема в запросах, а не в хранилище платформы.
Каталоги snccntx… нельзя удалять при работающей службе агента сервера 1С. Это приводит к ошибкам в сеансах и может уронить рабочие процессы.
Как проверить, какие каталоги реально используются:
- Откройте свойства службы агента сервера 1С и посмотрите командную строку запуска. Параметр
-dуказывает на каталогsrvinfo. - Там же, на вкладке входа в систему, посмотрите учётную запись службы. Её
%TEMP%и будет каталогом временных файлов сервера. - Отсортируйте папки
snccntx…по дате изменения. Свежие даты при работающих пользователях — норма, рост размера при пустом кластере — повод разбираться.
Сколько данных держит сервис сеансовых данных, зависит от того, что пользователи кладут в хранилище. Пять человек, которые одновременно загружают по 200 МБ выписок, легко дадут гигабайт данных сеансов.
Работа с временным хранилищем из кода
Основные методы глобального контекста:
| Метод | Что делает |
|---|---|
ПоместитьВоВременноеХранилище(Данные, Адрес) | Кладёт значение, возвращает адрес |
ПолучитьИзВременногоХранилища(Адрес) | Возвращает значение по адресу |
УдалитьИзВременногоХранилища(Адрес) | Удаляет значение сразу, не дожидаясь конца срока |
ЭтоАдресВременногоХранилища(Адрес) | Проверяет, что строка — адрес хранилища |
Второй параметр ПоместитьВоВременноеХранилище() определяет срок жизни. Это может быть уникальный идентификатор формы или уже существующий адрес, который нужно перезаписать.
Загрузка файла с клиента на сервер
Классическая схема для тонкого и веб-клиента: пользователь выбирает файл, платформа передаёт его на сервер во временное хранилище, сервер читает двоичные данные.
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
Оповещение = Новый ОписаниеОповещения("ЗагрузитьФайлЗавершение", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Результат Тогда
ОбработатьФайлНаСервере(Адрес);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбработатьФайлНаСервере(Адрес)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные.Записать(ИмяФайла);
Попытка
// чтение файла, например через ТабличныйДокумент.Прочитать(ИмяФайла)
Исключение
УдалитьФайлы(ИмяФайла);
ВызватьИсключение;
КонецПопытки;
УдалитьФайлы(ИмяФайла);
УдалитьИзВременногоХранилища(Адрес);
КонецПроцедуры
Здесь три приёма, которые знает каждый практик:
- Передать
УникальныйИдентификаторформы. Без него значение может исчезнуть раньше, чем сервер до него доберётся. - Удалить временный файл в любом исходе.
ПолучитьИмяВременногоФайла()только придумывает имя. Сам файл платформа автоматически не удаляет. - Освободить хранилище явно. Если форма живёт долго, а файл большой,
УдалитьИзВременногоХранилища()сразу снимает нагрузку с сервиса сеансовых данных.
Результат фонового задания
Фоновое задание выполняется в своём сеансе. Поэтому адрес нужно зарезервировать заранее, в сеансе формы, и передать его в задание параметром:
&НаСервере
Функция ЗапуститьРасчетНаСервере()
АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
Параметры = Новый Массив;
Параметры.Добавить(АдресРезультата);
ФоновыеЗадания.Выполнить("МойОбщийМодуль.ВыполнитьРасчет", Параметры);
Возврат АдресРезультата;
КонецФункции
Внутри задания результат кладут по тому же адресу: ПоместитьВоВременноеХранилище(Результат, АдресРезультата). Форма потом читает его через ПолучитьИзВременногоХранилища(). В типовых конфигурациях на БСП эту схему уже реализует общий модуль ДлительныеОперации, поэтому писать её вручную в них не нужно.
Не храните во временном хранилище то, что должно пережить сеанс. Для этого есть регистры сведений, константы и ХранилищеЗначения в реквизитах объектов.
Где 1С сохраняет обычные временные файлы
Временное хранилище и временные файлы — разные механизмы, хотя в запросах их называют одинаково. Файлы появляются, когда 1С:
- 📄 сохраняет печатную форму перед открытием во внешней программе;
- 📎 распаковывает вложение из присоединённых файлов для просмотра;
- 📊 записывает двоичные данные, чтобы прочитать их как Excel, XML или ZIP;
- 🔄 готовит пакеты обмена и выгрузки.
Каталог определяет функция КаталогВременныхФайлов(). Она возвращает папку временных файлов той учётной записи, под которой работает процесс:
| Где выполняется код | Типичный каталог |
|---|---|
| Клиент на Windows | C:\Users\<пользователь>\AppData\Local\Temp |
Сервер 1С на Windows (служба от USR1CV8) | C:\Users\USR1CV8\AppData\Local\Temp |
| Сервер 1С на Linux | /tmp |
| Терминальный сервер | %TEMP% профиля, часто с подпапкой номера сеанса RDP |
Чтобы узнать точный путь на сервере, выполните в обработке или консоли кода серверную процедуру и выведите КаталогВременныхФайлов() через Сообщить(). Это надёжнее, чем угадывать по профилю: службу могли запустить от другой учётной записи.
Очистка временного хранилища и папок temp
Само временное хранилище вручную не чистят. Его освобождают закрытие форм, завершение сеансов и вызовы УдалитьИзВременногоХранилища(). Чистить приходится то, что осталось на диске.
Клиентский компьютер
- Закройте все сеансы 1С на этом компьютере.
- Откройте
%TEMP%и удалите содержимое. Файлы, занятые другими программами, просто пропустите. - Если после этого 1С ведёт себя странно (старые формы, ошибки при открытии), очистите кэш: запустите базу с параметром
/ClearCacheили удалите папки базы в%APPDATA%\1C\1cv8и%LOCALAPPDATA%\1C\1cv8.
Сервер 1С:Предприятия
- Предупредите пользователей: при остановке службы все сеансы оборвутся, несохранённые данные пропадут. Делайте это в нерабочее время.
- Остановите службу агента сервера 1С (
1C:Enterprise 8.3 Server Agentна Windows,srv1cv8на Linux). - Очистите
%TEMP%учётной записи службы. - При ошибках сеансовых данных удалите каталоги
snccntx<GUID>внутриsrvinfo\reg_1541. Остальные файлыreg_1541(реестр кластера1CV8Clst.lstи каталоги баз) не трогайте. - Запустите службу и проверьте вход пользователей.
Перед удалением чего-либо в srvinfo скопируйте каталог целиком в другое место. Файл 1CV8Clst.lst хранит список баз кластера: без него придётся регистрировать базы заново.
Оптимизация, чтобы не чистить постоянно
- 🧹 В своём коде удаляйте временные файлы через
УдалитьФайлы()и в веткеИсключение. - 📉 Передавайте в хранилище только нужные данные. Таблица из трёх колонок легче, чем результат запроса со всеми реквизитами.
- 🕗 Настройте плановую очистку
%TEMP%учётной записи службы через планировщик Windows в ночное окно. - 💽 Держите
srvinfoна диске с запасом места. Каталог можно перенести на другой диск при установке сервера или через параметры службы.
Диагностика: данные пропали или диск заполнен
Проблемы с временными данными сводятся к двум симптомам: значение не находится по адресу или на диске кончается место. Ниже — быстрая сортировка.
Если ни один вариант не подошёл, включите технологический журнал (logcfg.xml в каталоге conf платформы) с событиями EXCP и посмотрите, на каком вызове падает сеанс. Это даёт точное место в коде, а не догадку.