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

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

Как получить адрес временного хранилища в 1С

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

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

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

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

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

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

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

Как получить адрес: функция ПоместитьВоВременноеХранилище

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

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

&НаСервере

Функция ПолучитьАдресДанных()

ТаблицаДанных = Новый ТаблицаЗначений;

ТаблицаДанных.Колонки.Добавить("Номенклатура");

// ... заполнение таблицы ...

Адрес = ПоместитьВоВременноеХранилище(ТаблицаДанных,

ЭтаФорма.УникальныйИдентификатор);

Возврат Адрес;

КонецФункции

Функция возвращает строку. Сохраните её в реквизит формы типа «Строка», чтобы адрес был доступен и на клиенте, и в последующих серверных вызовах.

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

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

Порядок действий
  1. 1
    Объявите реквизит формы АдресХранилища типа Строка для сохранения адреса
  2. 2
    Вызовите НачатьПомещениеФайла с описанием оповещения о завершении
  3. 3
    В обработчике оповещения получите параметр Адрес и сохраните его в реквизит
  4. 4
    Вызовите серверную процедуру, передав адрес параметром
  5. 5
    На сервере извлеките данные через ПолучитьИзВременногоХранилища(Адрес)
&НаКлиенте

Процедура ЗагрузитьФайл(Команда)

Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);

НачатьПомещениеФайла(Оповещение, , , Истина,

ЭтаФорма.УникальныйИдентификатор);

КонецПроцедуры

&НаКлиенте

Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДопПараметры) Экспорт

Если Результат Тогда

АдресХранилища = Адрес; // адрес временного хранилища получен

ОбработатьФайлНаСервере(АдресХранилища);

КонецЕсли;

КонецПроцедуры

&НаСервере

Процедура ОбработатьФайлНаСервере(Адрес)

ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);

// ... обработка двоичных данных ...

КонецПроцедуры

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

Время жизни данных и удаление из хранилища

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

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

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

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

&НаСервере

Процедура Обработать(Адрес)

Если Не ЭтоАдресВременногоХранилища(Адрес) Тогда

ВызватьИсключение "Передан некорректный адрес хранилища";

КонецЕсли;

Данные = ПолучитьИзВременногоХранилища(Адрес);

Если Данные = Неопределено Тогда

ВызватьИсключение "Данные по адресу отсутствуют или удалены";

КонецЕсли;

КонецПроцедуры

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

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

Значение переменной после ПоместитьВоВременноеХранилище
Норма

Непустая строка с адресом вида e1cib/tempstorage/...

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

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

ЭтоАдресВременногоХранилища(Адрес)
Норма

Возвращает Истина

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

Возвращает Ложь — адрес недействителен

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

Ожидаемое значение (двоичные данные, таблица и т.д.)

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

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

Типичные ошибки при работе с адресом хранилища

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

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

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

Альтернативы и смежные механизмы

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

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

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

Подходит для передачи данных между клиентом и сервером в рамках сеанса работы формы. Ограничение: данные временные и привязаны к времени жизни формы или вызова.

ХранилищеЗначения в базе

Подходит для постоянного хранения файлов и больших данных. Ограничение: требует записи в базу и увеличивает её объём.

Прямой возврат значения из функции

Подходит для небольших сериализуемых структур и таблиц. Ограничение: неэффективно для больших двоичных данных.

Выбор зависит от объёма данных и длительности их использования: временное хранилище оптимально для разовой передачи в рамках интерактивной работы, всё остальное — повод рассмотреть альтернативы.

Итог

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

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

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

Что возвращает ПоместитьВоВременноеХранилище?

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

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

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

Можно ли передать адрес хранилища в фоновое задание?

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

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

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

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

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

Как получить адрес хранилища для картинки на форме?

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