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