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