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

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

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

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

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

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

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

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

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

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

Практическое следствие: нельзя «зайти в папку» и посмотреть содержимое хранилища, нельзя скопировать его сторонними средствами. Единственный легальный способ доступа — встроенный язык 1С: методы ПоместитьВоВременноеХранилище(), ПолучитьИзВременногоХранилища(), УдалитьИзВременногоХранилища() и ЭтоАдресВременногоХранилища().

Как поместить данные и получить адрес

Базовый сценарий выглядит так: значение (двоичные данные, картинка, таблица значений, результат запроса) передаётся в метод ПоместитьВоВременноеХранилище(), а платформа возвращает строку-адрес. Этот адрес сохраняют в реквизите формы, параметре или переменной и используют для последующего чтения.

1c
&НаСервере
Функция СохранитьФайл(ДвоичныеДанные)
    Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторФормы);
    Возврат Адрес;
КонецФункции

&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
    ДвоичныеДанные = Новый ДвоичныеДанные("C:\Документы\отчет.pdf");
    АдресХранилища = СохранитьФайл(ДвоичныеДанные);
КонецПроцедуры

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

Получение данных выполняется зеркальным методом ПолучитьИзВременногоХранилища(Адрес). Если адрес недействителен или срок жизни истёк, метод вернёт Неопределено. Перед получением полезно проверять адрес функцией ЭтоАдресВременногоХранилища().

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

Срок жизни данных и когда они удаляются

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

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

Кроме автоматической очистки, данные всегда можно удалить явно методом УдалитьИзВременногоХранилища(Адрес). Это рекомендуется делать с крупными объектами — файлами, большими таблицами значений, — чтобы не держать память рабочего процесса сервера дольше необходимого.

Типичные сценарии использования

Передача файла с клиента на сервер

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

Хранение картинок и данных в форме

Картинки, отображаемые в форме, но не записанные в базу, обычно держат в хранилище, а в реквизите формы типа «Строка» хранят только адрес. Элемент формы «Поле картинки» умеет показывать изображение прямо по такому адресу. Это удобно для предпросмотра фото товара перед записью или для временных изображений, которые не нужно сохранять.

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

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

Чем заменить временное хранилище

Реквизит объекта или регистр сведений

Подходит, когда данные нужны дольше одного сеанса или должны переживать перезапуск сервера; требует записи в базу и занимает место в ней

Параметры сеанса

Подходят для небольших значений, нужных весь сеанс; не предназначены для файлов и больших структур

Хранилище общих настроек

Подходит для пользовательских настроек малого объёма; не рассчитано на двоичные данные большого размера

Временные файлы на диске

Вариант для очень больших файлов, когда память сервера ограничена; требует контроля прав и самостоятельной очистки

Ограничения и частые ошибки

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

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

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

Как проверить, что всё работает правильно

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

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

Контрольные точки

Как проверить результат

Адрес после помещения
Норма

Непустая строка с префиксом временного хранилища

Тревожный признак

Пустая строка или Неопределено — значение не было помещено

Результат ПолучитьИзВременногоХранилища
Норма

Возвращается значение того же типа, что помещалось

Тревожный признак

Неопределено — срок жизни истёк или адрес из другого сеанса

Память рабочих процессов сервера
Норма

Потребление памяти rphost стабильно при массовых операциях

Тревожный признак

Память растёт и не освобождается — данные не удаляются из хранилища

FAQ

Можно ли найти временное хранилище 1С в виде папки на диске?

Нет. Это область оперативной памяти серверного процесса (или клиентского приложения в файловом режиме). Файлов на диске и таблиц в базе не создаётся, доступ возможен только программно по адресу через встроенный язык.

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

Всё содержимое удаляется без возможности восстановления. Если данные должны переживать перезапуск, их нужно сохранять в базу данных, а не во временное хранилище.

Почему ПолучитьИзВременногоХранилища возвращает Неопределено?

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

Сколько данных можно поместить во временное хранилище?

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

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

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

Чем адрес временного хранилища отличается от навигационной ссылки?

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

Итог

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

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