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