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

· 9 мин

Содержание

Временное хранилище 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. Откройте свойства службы агента сервера 1С и посмотрите командную строку запуска. Параметр -d указывает на каталог srvinfo.
  2. Там же, на вкладке входа в систему, посмотрите учётную запись службы. Её %TEMP% и будет каталогом временных файлов сервера.
  3. Отсортируйте папки snccntx… по дате изменения. Свежие даты при работающих пользователях — норма, рост размера при пустом кластере — повод разбираться.

Сколько данных держит сервис сеансовых данных, зависит от того, что пользователи кладут в хранилище. Пять человек, которые одновременно загружают по 200 МБ выписок, легко дадут гигабайт данных сеансов.

Работа с временным хранилищем из кода

Основные методы глобального контекста:

МетодЧто делает
ПоместитьВоВременноеХранилище(Данные, Адрес)Кладёт значение, возвращает адрес
ПолучитьИзВременногоХранилища(Адрес)Возвращает значение по адресу
УдалитьИзВременногоХранилища(Адрес)Удаляет значение сразу, не дожидаясь конца срока
ЭтоАдресВременногоХранилища(Адрес)Проверяет, что строка — адрес хранилища

Второй параметр ПоместитьВоВременноеХранилище() определяет срок жизни. Это может быть уникальный идентификатор формы или уже существующий адрес, который нужно перезаписать.

Загрузка файла с клиента на сервер

Классическая схема для тонкого и веб-клиента: пользователь выбирает файл, платформа передаёт его на сервер во временное хранилище, сервер читает двоичные данные.

&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
    Оповещение = Новый ОписаниеОповещения("ЗагрузитьФайлЗавершение", ЭтотОбъект);
    НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
    Если Результат Тогда
        ОбработатьФайлНаСервере(Адрес);
    КонецЕсли;
КонецПроцедуры

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

Здесь три приёма, которые знает каждый практик:

  1. Передать УникальныйИдентификатор формы. Без него значение может исчезнуть раньше, чем сервер до него доберётся.
  2. Удалить временный файл в любом исходе. ПолучитьИмяВременногоФайла() только придумывает имя. Сам файл платформа автоматически не удаляет.
  3. Освободить хранилище явно. Если форма живёт долго, а файл большой, УдалитьИзВременногоХранилища() сразу снимает нагрузку с сервиса сеансовых данных.

Результат фонового задания

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

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

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

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

Где 1С сохраняет обычные временные файлы

Временное хранилище и временные файлы — разные механизмы, хотя в запросах их называют одинаково. Файлы появляются, когда 1С:

  • 📄 сохраняет печатную форму перед открытием во внешней программе;
  • 📎 распаковывает вложение из присоединённых файлов для просмотра;
  • 📊 записывает двоичные данные, чтобы прочитать их как Excel, XML или ZIP;
  • 🔄 готовит пакеты обмена и выгрузки.

Каталог определяет функция КаталогВременныхФайлов(). Она возвращает папку временных файлов той учётной записи, под которой работает процесс:

Где выполняется кодТипичный каталог
Клиент на WindowsC:\Users\<пользователь>\AppData\Local\Temp
Сервер 1С на Windows (служба от USR1CV8)C:\Users\USR1CV8\AppData\Local\Temp
Сервер 1С на Linux/tmp
Терминальный сервер%TEMP% профиля, часто с подпапкой номера сеанса RDP

Чтобы узнать точный путь на сервере, выполните в обработке или консоли кода серверную процедуру и выведите КаталогВременныхФайлов() через Сообщить(). Это надёжнее, чем угадывать по профилю: службу могли запустить от другой учётной записи.

Очистка временного хранилища и папок temp

Само временное хранилище вручную не чистят. Его освобождают закрытие форм, завершение сеансов и вызовы УдалитьИзВременногоХранилища(). Чистить приходится то, что осталось на диске.

Клиентский компьютер

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

Сервер 1С:Предприятия

  1. Предупредите пользователей: при остановке службы все сеансы оборвутся, несохранённые данные пропадут. Делайте это в нерабочее время.
  2. Остановите службу агента сервера 1С (1C:Enterprise 8.3 Server Agent на Windows, srv1cv8 на Linux).
  3. Очистите %TEMP% учётной записи службы.
  4. При ошибках сеансовых данных удалите каталоги snccntx<GUID> внутри srvinfo\reg_1541. Остальные файлы reg_1541 (реестр кластера 1CV8Clst.lst и каталоги баз) не трогайте.
  5. Запустите службу и проверьте вход пользователей.

Перед удалением чего-либо в srvinfo скопируйте каталог целиком в другое место. Файл 1CV8Clst.lst хранит список баз кластера: без него придётся регистрировать базы заново.

Оптимизация, чтобы не чистить постоянно

  • 🧹 В своём коде удаляйте временные файлы через УдалитьФайлы() и в ветке Исключение.
  • 📉 Передавайте в хранилище только нужные данные. Таблица из трёх колонок легче, чем результат запроса со всеми реквизитами.
  • 🕗 Настройте плановую очистку %TEMP% учётной записи службы через планировщик Windows в ночное окно.
  • 💽 Держите srvinfo на диске с запасом места. Каталог можно перенести на другой диск при установке сервера или через параметры службы.

Диагностика: данные пропали или диск заполнен

Проблемы с временными данными сводятся к двум симптомам: значение не находится по адресу или на диске кончается место. Ниже — быстрая сортировка.

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

Если ни один вариант не подошёл, включите технологический журнал (logcfg.xml в каталоге conf платформы) с событиями EXCP и посмотрите, на каком вызове падает сеанс. Это даёт точное место в коде, а не догадку.

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

Можно ли открыть временное хранилище 1С как папку?
Нет. Это область данных сеанса в памяти процесса и в сервисе сеансовых данных. Открыть можно только связанные каталоги: %TEMP% и snccntx, но не отдельное значение по адресу.
Как долго живёт значение во временном хранилище?
С идентификатором формы — до её закрытия. Без идентификатора — до конца вызова сервера. В любом случае не дольше сеанса.
Есть ли ограничение на размер данных во временном хранилище?
Жёсткого лимита в виде числа нет, ограничивают память и диск сервера. Файлы в сотни мегабайт технически пройдут, но несколько таких сеансов одновременно заметно нагрузят сервер.
Видит ли другой пользователь мои данные по адресу хранилища?
Нет. Адрес действует только в сеансе, который поместил значение. Передать адрес другому пользователю бессмысленно — он получит пустое значение.
Безопасно ли удалять папку Temp на сервере 1С днём?
Только файлы, которые не заняты процессами. Полную очистку, а тем более каталоги snccntx, делайте при остановленной службе вне рабочего времени.