ВременноеХранилище 1С: что лежит в памяти, а что на диске

· 8 мин

Содержание

Временное хранилище 1С — это не папка и не таблица базы. Это область сеансовых данных платформы: значения лежат в памяти серверного процесса, а при нехватке памяти и в клиент-серверном варианте — в служебных файлах кластера в каталоге srvinfo. В файловом режиме серверная часть работает внутри процесса клиента, поэтому всё, что выгружается на диск, попадает во временный каталог пользователя Windows (%TEMP%).

Типичная ситуация: разработчик загружает Excel-файл через форму, а администратор через неделю находит на сервере гигабайты непонятных файлов и спрашивает, «где это 1С хранит». Ответ зависит от режима работы базы и от того, как написан код. Разберём оба варианта, а затем — как чистить и что проверять при сбоях.

Как устроено временное хранение данных в 1С

Временное хранилище появилось вместе с управляемыми формами. Клиент и сервер обмениваются данными через вызовы, и тащить в каждом вызове мегабайты двоичных данных невыгодно. Поэтому значение кладут на сервер один раз, а между клиентом и сервером передают только короткий адрес — строку вида e1cib/tempstorage/<идентификатор>.

Ключевые свойства хранилища:

  • 🧠 Привязано к сеансу. Другой пользователь по вашему адресу ничего не получит. После завершения сеанса данные удаляются.
  • ⏳ Живёт ограниченное время. Если значение связано с уникальным идентификатором формы, оно удаляется при закрытии формы. Без идентификатора рассчитывать можно только на ближайший вызов сервера.
  • 📦 Хранит любое сериализуемое значение. Чаще всего это ДвоичныеДанные загруженного файла, табличный документ, таблица значений или результат фонового задания.
  • 🚫 Не пишется в базу. Это не регистр сведений и не реквизит типа ХранилищеЗначения. Перезапуск сервера или сеанса стирает всё.

Чтобы не путать понятия, сведём рядом похожие механизмы.

МеханизмГде физическиСколько живёт
Временное хранилищеПамять сеанса, сеансовые данные кластераДо закрытия формы или конца сеанса
Реквизит ХранилищеЗначенияТаблица информационной базыПока не удалят объект
Временные таблицы запросаСУБД (в MS SQL — tempdb)До закрытия менеджера временных таблиц
Временные файлы (ПолучитьИмяВременногоФайла())Каталог %TEMP% пользователя процессаПока код или ОС их не удалит
Кэш клиента%APPDATA%\1C\1cv8 и %LOCALAPPDATA%\1C\1cv8До очистки кэша

Половина вопросов «где хранится временное хранилище» на деле про последние две строки. Именно временные файлы и кэш растут на диске, а не само хранилище.

Где лежат временные данные в файловом режиме

В файловом варианте отдельного сервера 1С нет. Серверный контекст поднимается внутри процесса 1cv8.exe (тонкий или толстый клиент) либо внутри процесса веб-сервера, если база опубликована.

Отсюда простые правила:

  1. Временное хранилище живёт в оперативной памяти процесса 1cv8.exe на компьютере пользователя.
  2. Временные файлы, которые создаёт код (ПолучитьИмяВременногоФайла()), ложатся в каталог, который возвращает КаталогВременныхФайлов(). Обычно это C:\Users\<пользователь>\AppData\Local\Temp.
  3. Если база опубликована на IIS или Apache, серверная часть работает в процессе веб-сервера. Временные файлы окажутся в temp-каталоге учётной записи, под которой запущен пул приложений или служба Apache.
  4. Рядом с файлом базы 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");
    Данные.Записать(ИмяФайла);
    Попытка
        // разбор файла
    Исключение
        УдалитьФайлы(ИмяФайла);
        УдалитьИзВременногоХранилища(Адрес);
        ВызватьИсключение;
    КонецПопытки;
    УдалитьФайлы(ИмяФайла);
    УдалитьИзВременногоХранилища(Адрес);
КонецПроцедуры

Два приёма, которые знает каждый, кто чистил сервер от мусора:

  1. Удаляйте временный файл и в ветке Исключение. Иначе каждая ошибка разбора оставит файл в %TEMP% навсегда.
  2. Освобождайте хранилище явно. Форма может висеть открытой весь день, а с ней и 200 МБ двоичных данных в памяти rphost.

Получение результата фонового задания

Фоновое задание работает в своём сеансе и в хранилище формы напрямую писать не может. Поэтому адрес готовят заранее и передают параметром:

&НаСервере
Функция ЗапуститьФормирование()
    АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
    Параметры = Новый Массив;
    Параметры.Добавить(АдресРезультата);
    ФоновыеЗадания.Выполнить("МойОбщийМодуль.Сформировать", Параметры);
    Возврат АдресРезультата;
КонецФункции

Внутри МойОбщийМодуль.Сформировать результат кладут вызовом ПоместитьВоВременноеХранилище(Результат, АдресРезультата). Форма по таймеру проверяет задание и забирает значение через ПолучитьИзВременногоХранилища. В типовых конфигурациях на БСП для этого есть готовый механизм длительных операций, писать обвязку руками там не нужно.

Не кладите в хранилище то, что нужно хранить дольше сеанса. Для этого есть регистр сведений с реквизитом ХранилищеЗначения или присоединённые файлы.

Очистка временных файлов и сеансовых данных

Само временное хранилище вручную не чистят — оно очищается при закрытии форм и сеансов. Чистят то, что вокруг него накопилось на диске.

Файловый режим и рабочие места

  1. Закройте 1С у пользователя.
  2. Откройте %TEMP% (Win+R, ввести %TEMP%) и удалите старые файлы. Занятые система не даст удалить — их пропустите.
  3. При странностях интерфейса очистите кэш клиента: запустите 1С с ключом /ClearCache или удалите подкаталоги с идентификаторами в %APPDATA%\1C\1cv8 и %LOCALAPPDATA%\1C\1cv8. Файлы .v8i со списком баз не трогайте.

Сервер 1С

Остановка службы оборвёт сеансы всех пользователей всех баз кластера. Делайте это вне рабочего времени и предупредите людей заранее.

  1. Завершите работу пользователей и фоновых заданий, проверьте через консоль кластера, что сеансов нет.
  2. Остановите службу «Агент сервера 1С:Предприятия 8.3».
  3. Сделайте копию каталога reg_1541 на случай ошибки.
  4. Удалите подкаталоги snccntx* внутри reg_1541. Файл 1CV8Clst.lst и каталоги с идентификаторами баз не удаляйте — в них реестр кластера.
  5. Очистите temp-каталог учётной записи службы (например, профиль USR1CV8).
  6. Запустите службу и проверьте вход в базу.

Удаление 1CV8Clst.lst стирает список баз и настройки кластера. Его восстанавливают только из копии.

Для регулярной уборки temp на сервере подойдёт задача в Планировщике Windows, удаляющая файлы старше 2-3 суток. Файлы моложе не трогайте: их может держать долгое фоновое задание.

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

Сбои вокруг хранилища узнаются по симптомам. Сопоставьте свой случай:

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

Что посмотреть в первую очередь:

  • 📊 Размер каталогов. На Windows удобно смотреть свойства srvinfo и temp-каталога службы, на Linux — du -sh /home/usr1cv8/.1cv8/1C/1cv8/reg_1541/*.
  • 🔍 Технологический журнал. Если включён, события EXCP покажут, какой модуль падает при разборе файла и оставляет мусор.
  • 🧪 Права учётной записи службы. Если служба не может писать в свой temp, серверный код с временными файлами падает. Проверьте права на каталог.
  • 🧩 Код загрузки. Поиском по конфигурации найдите ПолучитьИмяВременногоФайла и проверьте, что рядом есть УдалитьФайлы.

Если не помогло

Если после очистки место снова быстро уходит, включите технологический журнал на короткое время и посмотрите, какие операции идут в момент роста. Часто виновата одна обработка обмена или загрузки, которая на каждом запуске оставляет копию файла. Чинить надо её, а не ставить уборку temp каждые полчаса.

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

Можно ли посмотреть содержимое временного хранилища другого пользователя?
Нет. Хранилище привязано к сеансу, и по чужому адресу значение не вернётся.
Сохраняется ли временное хранилище после перезапуска сервера 1С?
Нет. После остановки службы или завершения сеанса все значения пропадают. Для долгого хранения используйте реквизит типа ХранилищеЗначения.
Есть ли ограничение на размер значения в хранилище?
Жёсткого лимита в коде нет, но всё упирается в память рабочего процесса и диск сервера. Файлы на сотни мегабайт лучше обрабатывать частями или через временный файл.
Почему КаталогВременныхФайлов на клиенте и на сервере разный?
Функция возвращает temp того пользователя, под которым работает процесс. На клиенте это пользователь Windows, на сервере — учётная запись службы 1С.
Влияет ли очистка кэша клиента на временное хранилище?
Нет. Кэш клиента хранит метаданные и настройки интерфейса, а хранилище живёт в сеансе на сервере.