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