Разработка и Конфигурация · 10 мин
Где хранится временное хранилище в 1С
Разбираем, где физически хранится временное хранилище 1С, как работает ПоместитьВоВременноеХранилище, время жизни данных и типичные ошибки разработчиков.
Временное хранилище в 1С — это механизм платформы, который позволяет передавать данные между сервером и клиентом, между формами и между вызовами внутри одного сеанса. Разработчики сталкиваются с ним каждый раз, когда загружают файл, передают таблицу значений в форму или возвращают результат длительной операции. При этом вопрос «где физически лежат эти данные» вызывает путаницу, потому что ответ зависит от режима работы информационной базы.
Ключевая особенность механизма: данные помещаются в хранилище на сервере 1С:Предприятия (или в память приложения в файловом режиме), а клиент получает только адрес — строковый идентификатор вида e1cib/tempstorage/.... По этому адресу платформа при следующем обращении извлекает значение. Понимание того, где живут эти данные и сколько они хранятся, помогает избежать утечек памяти, ошибок «значение не найдено» и проблем с производительностью.
Где физически хранятся данные временного хранилища
В клиент-серверном режиме данные, помещённые во временное хранилище, находятся в оперативной памяти рабочего процесса сервера 1С:Предприятия (rphost в Windows, аналогичный процесс в Linux). Никаких таблиц в базе данных SQL Server, PostgreSQL или Oracle для этого не создаётся — СУБД здесь не участвует. Именно поэтому перезапуск сервера 1С или аварийное завершение рабочего процесса уничтожает все содержимое хранилищ всех активных сеансов.
В файловом режиме, когда сервер 1С не используется, данные хранятся в памяти самого клиентского приложения — тонкого или толстого клиента. При работе через веб-сервер (публикация файловой базы) хранилище живёт в памяти рабочего процесса веб-сервера, который обслуживает сеанс.
Важное следствие: объём данных во временном хранилище напрямую расходует оперативную память сервера. Если пользователи массово загружают большие файлы или обработки помещают в хранилище громоздкие таблицы значений и не освобождают их, потребление памяти процессом rphost растёт, что может привести к перезапуску рабочего процесса по лимиту памяти и обрыву сеансов пользователей.
Как данные попадают в хранилище и как их получить
Для работы с хранилищем платформа предоставляет три основных метода. ПоместитьВоВременноеХранилище(Значение, Адрес) размещает значение и возвращает адрес; если второй параметр не передан, адрес генерируется автоматически. ПолучитьИзВременногоХранилища(Адрес) извлекает значение по адресу. УдалитьИзВременногоХранилища(Адрес) освобождает память.
Типичный сценарий — передача двоичных данных файла с клиента на сервер. Клиент помещает файл через НачатьПомещениеФайла, получает адрес, затем серверная процедура забирает данные по этому адресу и обрабатывает их. Обратная схема применяется при формировании отчёта или файла на сервере: результат кладётся в хранилище, а клиент забирает его по адресу и сохраняет на диск.
// Серверная процедура
Адрес = ПоместитьВоВременноеХранилище(ТаблицаРезультата, УникальныйИдентификаторФормы);
// Клиентская процедура
Данные = ПолучитьИзВременногоХранилища(Адрес);
УдалитьИзВременногоХранилища(Адрес);Обратите внимание на второй параметр метода ПоместитьВоВременноеХранилище. Если передать туда уникальный идентификатор формы, время жизни данных привязывается к времени жизни этой формы. Это стандартный и рекомендуемый способ: пока форма открыта, данные доступны; после закрытия формы платформа удалит их сама.
Время жизни данных: сколько хранится значение
Поведение платформы зависит от того, как был сформирован адрес. Если при помещении указан идентификатор формы, данные живут, пока существует форма. Если идентификатор не указан, данные привязываются к сеансу и удаляются при его завершении, но с оговоркой: платформа очищает такие значения при очередном серверном вызове, если с момента помещения прошло определённое время.
Именно из-за этой логики возникает классическая ошибка: данные поместили в хранилище без привязки к форме, пользователь надолго отошёл, а при следующем обращении по адресу платформа сообщает, что значение не найдено. Особенно часто это проявляется в фоновых заданиях и длительных операциях, где между помещением и чтением проходит заметное время.
Передача данных между формами через хранилище
Одно из самых частых применений — передача результата из дочерней формы в родительскую. Например, форма подбора номенклатуры собирает таблицу выбранных позиций, помещает её в хранилище с привязкой к идентификатору формы-владельца и возвращает адрес через Закрыть(Адрес) или оповещение. Родительская форма получает значение по адресу и обрабатывает его.
Здесь важно привязывать данные именно к идентификатору той формы, которая будет их читать, а не к текущей. Если привязать к закрывающейся форме, данные могут быть удалены раньше, чем родительская форма успеет их забрать.
- 1В дочерней форме сформируйте таблицу значений с результатом
- 2Вызовите ПоместитьВоВременноеХранилище(Таблица, ИдентификаторВладельца), где ИдентификаторВладельца — УникальныйИдентификатор родительской формы
- 3Передайте адрес в родительскую форму через параметр закрытия или Оповестить()
- 4В родительской форме вызовите ПолучитьИзВременногоХранилища(Адрес) и обработайте данные
- 5Убедитесь, что повторное чтение по тому же адресу не требуется, либо сохраните результат в реквизит формы
Временное хранилище в фоновых заданиях и длительных операциях
Фоновое задание выполняется в отдельном сеансе, но доступ к временному хранилищу у него есть. Стандартный приём: фоновое задание помещает результат по адресу, переданному через параметры, а основной сеанс периодически проверяет завершение и забирает данные. Библиотека стандартных подсистем (БСП) реализует это в механизме длительных операций именно через временное хранилище.
Ограничение, о котором часто забывают: адрес, сформированный в одном сеансе, корректно читается из фонового задания только если оно запущено из этого же сеанса и работает в пределах той же информационной базы. Передать адрес другому пользователю или использовать его после перезапуска сеанса нельзя — хранилище не является межсеансовым механизмом обмена.
Как диагностировать проблемы и освобождать память
Признак того, что временные хранилища «съедают» память, — устойчивый рост потребления памяти рабочими процессами сервера без видимой нагрузки со стороны запросов к СУБД. Проверить это можно через консоль кластера серверов 1С, наблюдая за процессами rphost, а в коде — через аудит мест, где вызывается ПоместитьВоВременноеХранилище без последующего удаления.
Правила гигиены просты: удаляйте значение сразу после использования вызовом УдалитьИзВременногоХранилища, привязывайте данные к форме, если они нужны только ей, и не помещайте в хранилище то, что можно передать напрямую через параметры процедуры или реквизиты формы. Для больших файлов рассмотрите потоковую работу с файловой системой сервера вместо загрузки всего содержимого в память.
Чем заменить временное хранилище, если оно не подходит
Если данные должны переживать сеанс или быть доступны другим пользователям, временное хранилище не подходит по определению. Альтернативы: регистр сведений для структурированных данных, хранилище значения в реквизите объекта для файлов и сериализованных структур, каталог временных файлов на сервере для больших двоичных данных с последующей регламентной очисткой.
Для передачи данных между клиентом и сервером внутри одного вызова хранилище вообще не нужно — достаточно параметров серверной процедуры, если тип значения сериализуем. Хранилище оправдано там, где обмен происходит в разные моменты времени или инициируется платформой, как при помещении файла с клиента.
Сравнение вариантов хранения
Передача между клиентом, сервером и формами в рамках сеанса. Не переживает завершение сеанса и перезапуск сервера
Данные, доступные разным сеансам и пользователям. Требует проектирования структуры и регламентной очистки
Файлы и сериализованные данные, привязанные к конкретному объекту базы. Увеличивает размер базы
Большие двоичные данные без нагрузки на память. Требует управления каталогом и прав доступа
Частые вопросы
Можно ли посмотреть содержимое временного хранилища в отладчике?
Да. В конфигураторе при отладке вызовите ПолучитьИзВременногоХранилища(Адрес) в окне «Вычислить выражение», подставив конкретный адрес — значение отобразится, если оно ещё живо и доступно в текущем сеансе.
Почему адрес временного хранилища перестаёт работать?
Чаще всего данные удалены: либо истекло время жизни без привязки к форме, либо форма-владелец закрыта, либо сеанс завершён или рабочий процесс сервера был перезапущен. Проверьте, как формировался адрес и к чему привязано значение.
Сохраняются ли данные хранилища при перезапуске сервера 1С?
Нет. Хранилище существует только в оперативной памяти рабочих процессов, поэтому перезапуск сервера или рабочего процесса уничтожает все данные без возможности восстановления.
Можно ли передать адрес хранилища другому пользователю?
Нет. Адрес действителен только в рамках сеанса, в котором были помещены данные (и фоновых заданий, запущенных из него). Для обмена между пользователями используйте объекты базы данных.
Что лучше для большого файла — временное хранилище или запись на диск сервера?
Для больших файлов надёжнее запись во временный файл на сервере: это не расходует память рабочего процесса и не рискует оборвать сеансы других пользователей. Хранилище уместно для небольших данных и короткоживущих передач.
Что важно запомнить
Временное хранилище 1С живёт в памяти сервера (или клиента в файловом режиме), привязано к сеансу или форме и не переживает перезапуск. Привязывайте данные к форме, удаляйте после использования и не применяйте хранилище для межсеансового обмена и больших файлов.