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