К статье
Практический материал

Разработка и Конфигурация · 10 мин

Где хранится временное хранилище в 1С

Разбираем, где физически хранится временное хранилище 1С, как работает ПоместитьВоВременноеХранилище, время жизни данных и типичные ошибки разработчиков.

Временное хранилище в 1С — это механизм платформы, который позволяет передавать данные между сервером и клиентом, между формами и между вызовами внутри одного сеанса. Разработчики сталкиваются с ним каждый раз, когда загружают файл, передают таблицу значений в форму или возвращают результат длительной операции. При этом вопрос «где физически лежат эти данные» вызывает путаницу, потому что ответ зависит от режима работы информационной базы.

Ключевая особенность механизма: данные помещаются в хранилище на сервере 1С:Предприятия (или в память приложения в файловом режиме), а клиент получает только адрес — строковый идентификатор вида e1cib/tempstorage/.... По этому адресу платформа при следующем обращении извлекает значение. Понимание того, где живут эти данные и сколько они хранятся, помогает избежать утечек памяти, ошибок «значение не найдено» и проблем с производительностью.

Где физически хранятся данные временного хранилища

В клиент-серверном режиме данные, помещённые во временное хранилище, находятся в оперативной памяти рабочего процесса сервера 1С:Предприятия (rphost в Windows, аналогичный процесс в Linux). Никаких таблиц в базе данных SQL Server, PostgreSQL или Oracle для этого не создаётся — СУБД здесь не участвует. Именно поэтому перезапуск сервера 1С или аварийное завершение рабочего процесса уничтожает все содержимое хранилищ всех активных сеансов.

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

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

Как данные попадают в хранилище и как их получить

Для работы с хранилищем платформа предоставляет три основных метода. ПоместитьВоВременноеХранилище(Значение, Адрес) размещает значение и возвращает адрес; если второй параметр не передан, адрес генерируется автоматически. ПолучитьИзВременногоХранилища(Адрес) извлекает значение по адресу. УдалитьИзВременногоХранилища(Адрес) освобождает память.

Типичный сценарий — передача двоичных данных файла с клиента на сервер. Клиент помещает файл через НачатьПомещениеФайла, получает адрес, затем серверная процедура забирает данные по этому адресу и обрабатывает их. Обратная схема применяется при формировании отчёта или файла на сервере: результат кладётся в хранилище, а клиент забирает его по адресу и сохраняет на диск.

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

Обратите внимание на второй параметр метода ПоместитьВоВременноеХранилище. Если передать туда уникальный идентификатор формы, время жизни данных привязывается к времени жизни этой формы. Это стандартный и рекомендуемый способ: пока форма открыта, данные доступны; после закрытия формы платформа удалит их сама.

Время жизни данных: сколько хранится значение

Поведение платформы зависит от того, как был сформирован адрес. Если при помещении указан идентификатор формы, данные живут, пока существует форма. Если идентификатор не указан, данные привязываются к сеансу и удаляются при его завершении, но с оговоркой: платформа очищает такие значения при очередном серверном вызове, если с момента помещения прошло определённое время.

Именно из-за этой логики возникает классическая ошибка: данные поместили в хранилище без привязки к форме, пользователь надолго отошёл, а при следующем обращении по адресу платформа сообщает, что значение не найдено. Особенно часто это проявляется в фоновых заданиях и длительных операциях, где между помещением и чтением проходит заметное время.

Передача данных между формами через хранилище

Одно из самых частых применений — передача результата из дочерней формы в родительскую. Например, форма подбора номенклатуры собирает таблицу выбранных позиций, помещает её в хранилище с привязкой к идентификатору формы-владельца и возвращает адрес через Закрыть(Адрес) или оповещение. Родительская форма получает значение по адресу и обрабатывает его.

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

Передача таблицы из дочерней формы
  1. 1
    В дочерней форме сформируйте таблицу значений с результатом
  2. 2
    Вызовите ПоместитьВоВременноеХранилище(Таблица, ИдентификаторВладельца), где ИдентификаторВладельца — УникальныйИдентификатор родительской формы
  3. 3
    Передайте адрес в родительскую форму через параметр закрытия или Оповестить()
  4. 4
    В родительской форме вызовите ПолучитьИзВременногоХранилища(Адрес) и обработайте данные
  5. 5
    Убедитесь, что повторное чтение по тому же адресу не требуется, либо сохраните результат в реквизит формы

Временное хранилище в фоновых заданиях и длительных операциях

Фоновое задание выполняется в отдельном сеансе, но доступ к временному хранилищу у него есть. Стандартный приём: фоновое задание помещает результат по адресу, переданному через параметры, а основной сеанс периодически проверяет завершение и забирает данные. Библиотека стандартных подсистем (БСП) реализует это в механизме длительных операций именно через временное хранилище.

Ограничение, о котором часто забывают: адрес, сформированный в одном сеансе, корректно читается из фонового задания только если оно запущено из этого же сеанса и работает в пределах той же информационной базы. Передать адрес другому пользователю или использовать его после перезапуска сеанса нельзя — хранилище не является межсеансовым механизмом обмена.

Как диагностировать проблемы и освобождать память

Признак того, что временные хранилища «съедают» память, — устойчивый рост потребления памяти рабочими процессами сервера без видимой нагрузки со стороны запросов к СУБД. Проверить это можно через консоль кластера серверов 1С, наблюдая за процессами rphost, а в коде — через аудит мест, где вызывается ПоместитьВоВременноеХранилище без последующего удаления.

Правила гигиены просты: удаляйте значение сразу после использования вызовом УдалитьИзВременногоХранилища, привязывайте данные к форме, если они нужны только ей, и не помещайте в хранилище то, что можно передать напрямую через параметры процедуры или реквизиты формы. Для больших файлов рассмотрите потоковую работу с файловой системой сервера вместо загрузки всего содержимого в память.

Типичные ошибки
01
Помещение данных без привязки к форме — значение пропадает до момента чтения, пользователь получает ошибку «значение не найдено по адресу»
02
Отсутствие вызова УдалитьИзВременногоХранилища — память сервера растёт с каждой операцией и не освобождается до конца сеанса
03
Попытка использовать адрес в другом сеансе или после перезапуска сервера — данные безвозвратно потеряны
04
Хранение в реквизите формы адреса вместо самих данных без контроля времени жизни — нестабильное поведение при длительной работе пользователя

Чем заменить временное хранилище, если оно не подходит

Если данные должны переживать сеанс или быть доступны другим пользователям, временное хранилище не подходит по определению. Альтернативы: регистр сведений для структурированных данных, хранилище значения в реквизите объекта для файлов и сериализованных структур, каталог временных файлов на сервере для больших двоичных данных с последующей регламентной очисткой.

Для передачи данных между клиентом и сервером внутри одного вызова хранилище вообще не нужно — достаточно параметров серверной процедуры, если тип значения сериализуем. Хранилище оправдано там, где обмен происходит в разные моменты времени или инициируется платформой, как при помещении файла с клиента.

Сравнение вариантов хранения

Временное хранилище

Передача между клиентом, сервером и формами в рамках сеанса. Не переживает завершение сеанса и перезапуск сервера

Регистр сведений

Данные, доступные разным сеансам и пользователям. Требует проектирования структуры и регламентной очистки

Хранилище значения в реквизите

Файлы и сериализованные данные, привязанные к конкретному объекту базы. Увеличивает размер базы

Файлы на диске сервера

Большие двоичные данные без нагрузки на память. Требует управления каталогом и прав доступа

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

Можно ли посмотреть содержимое временного хранилища в отладчике?

Да. В конфигураторе при отладке вызовите ПолучитьИзВременногоХранилища(Адрес) в окне «Вычислить выражение», подставив конкретный адрес — значение отобразится, если оно ещё живо и доступно в текущем сеансе.

Почему адрес временного хранилища перестаёт работать?

Чаще всего данные удалены: либо истекло время жизни без привязки к форме, либо форма-владелец закрыта, либо сеанс завершён или рабочий процесс сервера был перезапущен. Проверьте, как формировался адрес и к чему привязано значение.

Сохраняются ли данные хранилища при перезапуске сервера 1С?

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

Можно ли передать адрес хранилища другому пользователю?

Нет. Адрес действителен только в рамках сеанса, в котором были помещены данные (и фоновых заданий, запущенных из него). Для обмена между пользователями используйте объекты базы данных.

Что лучше для большого файла — временное хранилище или запись на диск сервера?

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

Итог

Что важно запомнить

Временное хранилище 1С живёт в памяти сервера (или клиента в файловом режиме), привязано к сеансу или форме и не переживает перезапуск. Привязывайте данные к форме, удаляйте после использования и не применяйте хранилище для межсеансового обмена и больших файлов.