Как устроено временное хранилище в 1С 8.3 и что делать, когда оно разрастается
Содержание
Временное хранилище 1С — это механизм платформы, через который форма, сервер и фоновые задания передают друг другу данные: файлы, табличные документы, результаты расчётов. Отдельной папки «временное хранилище» нет. В клиент-серверной базе данные лежат в памяти рабочих процессов rphost и в сеансовых данных кластера (каталоги snccntx* в srvinfo\reg_1541), в файловой базе — в процессе самого клиента. Очищается оно двумя путями: в коде через УдалитьИзВременногоХранилища() и на сервере — чисткой сеансовых данных и временных файлов при остановленной службе.
Если у вас «распухла» папка srvinfo, кончилось место на диске сервера или обработка загрузки файла падает с ошибкой, ниже есть порядок действий для каждого случая. Настройку и очистку ведёт администратор сервера, исправление кода — разработчик.
Как работает временное хранилище и зачем оно нужно
Клиент и сервер 1С живут в разных процессах, часто на разных компьютерах. Передавать большой файл в каждом серверном вызове дорого. Поэтому платформа кладёт значение в хранилище один раз и отдаёт взамен короткую строку — адрес. Дальше по сети ходит только адрес.
Типичные сценарии:
- 📎 загрузка файла с компьютера пользователя на сервер (
НачатьПомещениеФайла,ПоместитьФайл); - 🖼️ передача картинки или двоичных данных в поле формы — поле картинки умеет показывать значение прямо по адресу;
- ⏳ возврат результата фонового задания: задание пишет результат по адресу, форма периодически проверяет, готов ли он;
- 📊 передача табличного документа или большой таблицы значений между вызовами без повторного расчёта.
Сколько живёт значение
Срок жизни задаёт второй параметр метода ПоместитьВоВременноеХранилище(Данные, Адрес):
| Что передано вторым параметром | Сколько хранятся данные |
|---|---|
| Уникальный идентификатор формы | Пока открыта форма; после закрытия платформа удаляет значение сама |
Ничего (Неопределено) | Короткое время — до завершения ближайшего серверного вызова; дольше полагаться нельзя |
| Уже существующий адрес | Значение по этому адресу заменяется новым, срок жизни остаётся прежним |
При любом раскладе хранилище привязано к сеансу. Завершился сеанс — данные по его адресам недоступны. Адрес из одного сеанса в другом не работает , записывать его в регистр или реквизит бессмысленно.
Хранилище и фоновые задания
Фоновое задание выполняется в отдельном сеансе, но адрес, созданный формой, ему доступен. Отсюда стандартный приём: форма заранее резервирует адрес, передаёт его в задание, а задание кладёт туда результат.
&НаСервере
Функция ЗапуститьРасчет()
АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
Параметры = Новый Массив;
Параметры.Добавить(АдресРезультата);
ФоновыеЗадания.Выполнить("МойОбщийМодуль.ВыполнитьРасчет", Параметры);
Возврат АдресРезультата;
КонецФункции
В процедуре общего модуля в конце расчёта вызывается ПоместитьВоВременноеХранилище(Результат, АдресРезультата). Форма по обработчику ожидания проверяет, есть ли значение по адресу. Так устроены длительные операции в типовых конфигурациях на БСП: пользователь не ждёт с зависшим окном, а результат приходит без повторного расчёта.
Если форму закрыли раньше, чем задание закончило, результат уйдёт в пустоту и будет удалён вместе с привязкой к форме. Это нормальное поведение, а не ошибка.
Для долгого хранения есть другие инструменты: реквизит типа ХранилищеЗначения, присоединённые файлы, регистр сведений. Временное хранилище — именно временное.
Где физически лежат данные на клиенте и сервере
Путаница начинается с того, что «временным хранилищем» называют три разных места. Разведём их.
| Место | Что там лежит | Путь по умолчанию |
|---|---|---|
| Сеансовые данные кластера | Данные сеансов, в том числе содержимое временного хранилища | Windows: C:\Program Files\1cv8\srvinfo\reg_1541\snccntx<GUID>; Linux: /home/usr1cv8/.1cv8/1C/1cv8/reg_1541/snccntx<GUID> |
| Временный каталог пользователя службы | Временные файлы рабочих процессов: выгрузки, файлы, полученные из хранилища | Windows: %TEMP% учётной записи службы, обычно C:\Users\USR1CV8\AppData\Local\Temp; Linux: /tmp |
| Кэш клиента | Кэш метаданных и форм, настройки пользователя | %APPDATA%\1C\1cv8 и %LOCALAPPDATA%\1C\1cv8 на компьютере пользователя |
Клиент-серверная база
Значение помещается в память рабочего процесса, который обслуживает сеанс. Чтобы сеанс пережил перезапуск процесса или переход на другой процесс, кластер хранит сеансовые данные на диске, в каталогах snccntx* внутри reg_<порт>. Отсюда главный симптом: при тяжёлых загрузках и долгих сеансах эти каталоги вырастают до десятков гигабайт.
Файловая база
Отдельного сервера нет: клиент и «сервер» работают внутри одного процесса 1cv8.exe или 1cv8c.exe. Данные хранилища живут в памяти этого процесса и исчезают при его закрытии. Объёмные операции оставляют следы во временном каталоге Windows текущего пользователя.
Кэш клиента — не хранилище
Ключ запуска /ClearCache и удаление папок в %APPDATA%\1C\1cv8 чистят кэш метаданных. К временному хранилищу это отношения не имеет. Помогает при «старых» формах после обновления, но не освободит место на сервере.
Почему разрастаются сеансовые данные и как их очистить
Причины, которые встречаются на практике:
- 🔁 код помещает файлы в хранилище без идентификатора формы в цикле и не удаляет их, а сеанс живёт неделями;
- 📦 загрузка крупных файлов (выписки, прайсы, сканы) через форму, которая открыта весь день;
- 🧵 фоновые задания с большим результатом, который никто не забирает;
- 💥 аварийное завершение рабочих процессов: на диске остаются сеансовые данные, которые некому удалить;
- 🗂️ старые каталоги
snccntx*от прошлых версий платформы после обновления.
Шаг 1. Освободить хранилище в коде
Это лечение причины. Разработчик проверяет места, где вызывается ПоместитьВоВременноеХранилище, и добавляет удаление после использования. Пример загрузки файла с клиента на сервер с уборкой за собой:
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
ОбработатьФайлНаСервере(Адрес);
КонецПроцедуры
&НаСервере
Процедура ОбработатьФайлНаСервере(Адрес)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
// ... чтение и обработка файла ...
УдалитьФайлы(ИмяВременногоФайла);
УдалитьИзВременногоХранилища(Адрес);
КонецПроцедуры
Здесь две уборки: удаляется и значение из хранилища, и временный файл на диске сервера. Забытый УдалитьФайлы — частая причина того, что %TEMP% службы растёт на гигабайты.
Шаг 2. Почистить сеансовые данные на сервере
Перед очисткой все пользователи выходят из баз, иначе их сеансы оборвутся с потерей несохранённых данных. Работы планируйте на вечер или выходные.
- Предупредите пользователей и дождитесь, пока в консоли кластера список сеансов опустеет.
- Сделайте копию каталога
srvinfoцеликом, хотя бы файлов1CV8Clst.lstи1CV8Reg.lst: в них реестр кластера и список баз. - Остановите службу «Агент сервера 1С:Предприятия 8.3».
- Удалите в
reg_1541каталогиsnccntx*. Файлы.lstи остальные каталоги не трогайте. - Запустите службу и проверьте вход в базу.
Для Windows то же самое в виде скрипта (запуск от администратора, имя службы проверьте в services.msc):
@echo off
set SVC=1C:Enterprise 8.3 Server Agent (x86-64)
set REG=C:\Program Files\1cv8\srvinfo\reg_1541
net stop "%SVC%"
for /d %%D in ("%REG%\snccntx*") do rd /s /q "%%D"
net start "%SVC%"
Если в srvinfo несколько кластеров (reg_1541, reg_2541 и т. д.), каталог snccntx* нужно чистить в каждом, где он раздулся. Не удаляйте весь srvinfo: это сбросит регистрацию баз в кластере.
Шаг 3. Почистить временный каталог службы
Пока служба остановлена, удалите старые файлы из %TEMP% учётной записи, от которой работает агент. Безопасный вариант — только файлы старше суток:
Get-ChildItem "C:\Users\USR1CV8\AppData\Local\Temp" -File -Recurse |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-1) } |
Remove-Item -Force -ErrorAction SilentlyContinue
На Linux аналогичную задачу решает find /tmp -user usr1cv8 -mtime +1 -delete, тоже при остановленной службе srv1cv83.
Настройки сервера, которые влияют на хранилище
Отдельного параметра «размер временного хранилища» в консоли администрирования нет. На поведение влияют настройки памяти рабочих процессов и размещение каталогов.
Параметры рабочего сервера
Открываются в консоли кластера: Кластеры → <кластер> → Рабочие серверы → <сервер> → Свойства. Нас интересуют параметры памяти:
| Параметр | На что влияет |
|---|---|
| Временно допустимый объём памяти процессов | Порог, после превышения которого кластер начинает перезапускать рабочие процессы |
| Интервал превышения допустимого объёма памяти процессов | Сколько секунд процессам разрешено держаться выше порога |
| Безопасный расход памяти за один вызов | Вызов, съевший больше, прерывается — защита от одной тяжёлой загрузки, которая кладёт весь процесс |
Если загрузка большого файла через хранилище регулярно обрывается, проверьте последний параметр. Значение 0 означает расчёт платформой по умолчанию, −1 снимает ограничение. Снимать его на рабочем сервере без анализа не стоит: один пользователь сможет занять всю память.
Перенос каталогов на другой диск
Когда системный диск маленький, переносят и srvinfo, и временный каталог службы:
- 💾 каталог
srvinfoзадаётся параметром-dв строке запуска службыragent; меняют его при переустановке службы или правкой пути в её свойствах в реестре, всегда при остановленной службе; - 📁 временный каталог меняют переменными
TEMPиTMPучётной записи службы (USR1CV8или той, что указана во вкладке «Вход в систему»), после чего службу перезапускают.
Ставьте мониторинг свободного места на этом диске. Сеансовые данные растут постепенно, и порог в 15–20% свободного места даёт время на плановую чистку вместо аварийной.
Ошибки при работе с временным хранилищем и проблемы доступа
Права учётной записи службы
Половина «загадочных» ошибок записи файлов на сервере — это права. Рабочие процессы работают не от имени пользователя 1С, а от учётной записи службы. Проверьте:
- Какая учётная запись указана в свойствах службы агента, вкладка «Вход в систему».
- Есть ли у неё право «Изменение» на
srvinfoи на свой%TEMP%. - Если код сохраняет файлы в сетевую папку — есть ли у неё доступ к этой папке. Локальная учётная запись
USR1CV8в сеть не ходит, для сетевых путей нужна доменная.
Диагностика через журнал и технологический журнал
Первым смотрите журнал регистрации базы: Администрирование → Обслуживание → Журнал регистрации, отбор по уровню «Ошибка» и времени сбоя. Если причина в падении рабочего процесса, полезен технологический журнал с событиями EXCP и PROC: он покажет, какой процесс перезапускался и почему.
Когда чистить не нужно
Не каждый рост каталогов — проблема. Чистка не требуется, если:
- ✅ размер
snccntx*стабилен неделями и не приближается к пределу диска; - ✅ рост объясним — днём идут массовые загрузки, а ночью после перезапуска процессов объём возвращается;
- ✅ база файловая: у неё нет сеансовых данных кластера, достаточно закрыть клиент.
Регулярная чистка по расписанию вместо исправления кода лишь прячет утечку. Если каталог вырос за неделю до прежнего размера, ищите обработку, которая не вызывает УдалитьИзВременногоХранилища.