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

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

Как поместить файл во временное хранилище в 1С

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

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

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

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

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

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

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

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

Метод ПоместитьВоВременноеХранилище на сервере

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

&НаСервере

Процедура СформироватьНаСервере()

ДвоичныеДанные = Новый ДвоичныеДанные("C:\Import\price.xlsx");

АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторФормы);

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

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

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

Помещение файла с клиента: НачатьПомещениеФайлаВоВременноеХранилище

Когда файл выбирает пользователь на своём компьютере, серверный метод недоступен — сервер не видит клиентскую файловую систему. Для этого сценария существует асинхронный метод НачатьПомещениеФайлаВоВременноеХранилище(). Он объединяет диалог выбора файла, передачу данных на сервер и помещение в хранилище в один вызов с оповещением о завершении.

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

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

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

НачатьПомещениеФайлаВоВременноеХранилище(Оповещение, , , Истина, УникальныйИдентификатор);

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

&НаКлиенте

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

Если Не Помещен Тогда

Возврат; // пользователь отменил выбор

КонецЕсли;

АдресХранилища = Адрес;

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

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

&НаСервере

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

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

// дальнейшая обработка: запись во временный файл, разбор и т.д.

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

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

Получение данных и передача адреса между формами

На сервере данные извлекаются одной строкой: ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес). Тип возвращаемого значения совпадает с типом помещённого — если клали таблицу значений, получите таблицу значений. Если адрес недействителен или данные удалены, платформа выбросит исключение, поэтому при сомнениях вызов стоит оборачивать в попытку.

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

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

Время жизни хранилища и очистка

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

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

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

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

Вторая группа ошибок — путаница клиент-серверных контекстов: попытка вызвать НачатьПомещениеФайлаВоВременноеХранилище в серверной процедуре (метод доступен только на клиенте) или передать двоичные данные напрямую с сервера на клиент минуя хранилище. Двоичные данные между клиентом и сервером в управляемых формах передаются именно через адрес хранилища — это архитектурное ограничение платформы.

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

Проверка результата

После помещения убедитесь, что адрес не пустой: Если Не ПустаяСтрока(АдресХранилища) Тогда .... На сервере дополнительно можно проверить тип и размер полученных данных: для двоичных данных доступен метод Размер(), который позволяет отсечь пустые файлы ещё до начала разбора.

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

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

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

Непустая строка с адресом хранилища

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

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

Данные на сервере
Норма

ПолучитьИзВременногоХранилища возвращает значение ожидаемого типа, размер больше нуля

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

Исключение о неверном адресе или нулевой размер данных

Повторное обращение к адресу
Норма

Данные доступны, пока открыта форма-владелец

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

Ошибка при повторном вызове — хранилище очищено раньше времени

Для отладки удобно временно выводить адрес и размер данных в сообщение пользователю или журнал регистрации. Это быстро показывает, на каком этапе цепочки «клиент → хранилище → сервер» данные теряются.

Итог

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

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

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

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

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

Работает ли помещение файла в веб-клиенте?

Да, метод НачатьПомещениеФайлаВоВременноеХранилище работает в веб-клиенте без установки расширения работы с файлами, поскольку использует штатные средства браузера для выбора и загрузки файла. Это одно из его преимуществ перед устаревшим НачатьПомещениеФайла.

Можно ли поместить в хранилище не файл, а таблицу значений?

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

Как передать файл из одной формы в другую?

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

Что делать, если возникает ошибка «неверный адрес временного хранилища»?

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

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

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