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

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

Временное хранилище в 1С: что это такое и как с ним работать

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

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

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

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

Что такое временное хранилище и как оно устроено

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

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

Для работы с хранилищем используются три глобальных метода:

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

Зачем нужен механизм: типовые сценарии

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

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

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

Файл с клиента на серверХранилище обязательно

Двоичные данные файла передаются только через временное хранилище

Табличный документ с сервераХранилище нужно

ТабДокумент сериализуется и передаётся клиенту по адресу

Простые типы (строка, число)Хранилище не нужно

Сериализуемые типы передаются между клиентом и сервером напрямую

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

Фоновое задание возвращает данные только через адрес хранилища

Срок жизни данных и идентификатор формы

Ключевой параметр ПоместитьВоВременноеХранилище() — второй аргумент, идентификатор формы. От него зависит, как долго данные проживут в хранилище.

Если передать УникальныйИдентификатор формы, данные будут храниться до закрытия этой формы — это самый распространённый и безопасный вариант для реквизитов формы типа «АдресКартинки» или «АдресФайла». Если передать Неопределено, данные живут только до конца текущего вызова сервера: после возврата управления на клиент адрес станет недействительным. Есть также вариант передать пустой уникальный идентификатор — тогда данные живут в течение сеанса.

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

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

Типовой код загрузки картинки в управляемой форме выглядит так:

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

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

&НаСервере
Процедура СохранитьНаСервере()
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресКартинки);
	// дальше - запись в реквизит объекта типа ХранилищеЗначения
КонецПроцедуры

Обратите внимание на два момента. Во-первых, в НачатьПомещениеФайла последним параметром передаётся УникальныйИдентификатор формы — благодаря этому адрес останется действительным, пока форма открыта, и картинку можно будет показать в элементе «Поле картинки» просто присвоив адрес реквизиту. Во-вторых, на сервере данные извлекаются один раз — при сохранении — и записываются уже в постоянное место (реквизит объекта, регистр сведений).

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

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

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

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

Типичные ошибки и как их диагностировать

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

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

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

Как проверить корректность работы

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

Строка с GUID, непустая

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

Пустая строка или Неопределено

Чтение в следующем вызове сервера
Норма

Данные извлекаются без ошибки

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

Ошибка получения данных — неверный срок жизни

Память сервера при массовой обработке
Норма

Расход памяти стабилен после завершения операций

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

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

Ограничения и альтернативы

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

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

Маршрут решения

Как выбрать способ передачи данных

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

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

Итог

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

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

Частые вопросы о временном хранилище 1С

Чем временное хранилище отличается от хранилища значения?

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

Почему возникает ошибка «Ошибка получения данных по адресу временного хранилища»?

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

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

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

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

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

Нужно ли удалять данные из хранилища вручную?

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

Работает ли временное хранилище в веб-клиенте?

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