Как правильно работать с временным хранилищем в 1С: передача данных, управление адресами и временем жизни

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Основы работы с временным хранилищем: можно ли задать адрес вручную?

Один из первых вопросов, который возникает у разработчиков: можно ли задать адрес во временном хранилище в виде произвольной строки (например, "МоиДанные")? Проанализируем работу метода ПоместитьВоВременноеХранилище(). Платформа устроена так, что при помещении данных она сама генерирует уникальный идентификатор (строку внутреннего формата, похожую на GUID). Пытаться передать в параметр Адрес произвольный текст не имеет смысла, так как система ожидает либо пустую переменную, куда будет записан новый адрес, либо уже существующий валидный адрес для обновления данных.

Рассмотрим стандартный пример помещения данных:


// В контексте формы или модуля
ДанныеДляСохранения = ПолучитьВажныеДанные(); 
// Платформа вернет уникальную строку-адрес
АдресХранилища = ПоместитьВоВременноеХранилище(ДанныеДляСохранения); 

Важно: Если вы хотите обновить данные по уже имеющемуся адресу, вы передаете этот адрес вторым параметром. Но "придумать" свой адрес с нуля нельзя — его должна выдать платформа.

Передача данных из формы в общий модуль

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


&НаКлиенте
Процедура ВыполнитьОбработкуДанных()
    // 1. Помещаем данные во временное хранилище
    Адрес = ПоместитьВоВременноеХранилище(Объект.ТабличнаяЧасть.Выгрузить());
    
    // 2. Передаем адрес в метод общего модуля
    МойОбщийМодуль.ОбработатьДанныеВХ(Адрес);
КонецПроцедуры

// В общем модуле (Сервер)
Процедура ОбработатьДанныеВХ(Адрес) Экспорт
    // 3. Извлекаем данные по переданному адресу
    Данные = ПолучитьИзВременногоХранилища(Адрес);
    
    Если Данные <> Неопределено Тогда
        // Обработка данных
    КонецЕсли;
КонецПроцедуры

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

Управление временем жизни данных (Владелец хранилища)

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

  1. Привязка к форме: Если в качестве владельца передать УникальныйИдентификатор формы, данные будут жить ровно до тех пор, пока эта форма открыта. Это "золотой стандарт" управления памятью, так как система сама очистит хранилище при закрытии окна пользователем.
  2. Привязка к сеансу: Если владелец не указан или указан идентификатор сеанса, данные живут до завершения работы пользователя с базой. Будьте осторожны: если помещать туда большие объемы данных, это может привести к утечкам памяти на сервере (процесс rphost начнет потреблять слишком много ресурсов).
  3. Автоматическое удаление: В некоторых случаях данные удаляются при следующем переходе с сервера на клиент, если они не были привязаны к конкретному владельцу.

Особенности работы с фоновыми заданиями

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

  1. В основном сеансе (в форме) создаем "пустой" адрес: Адрес = ПоместитьВоВременноеХранилище(Неопределено, ЭтаФорма.УникальныйИдентификатор);.
  2. Передаем этот готовый Адрес в параметры фонового задания при его запуске.
  3. Внутри кода фонового задания вызываем ПоместитьВоВременноеХранилище(Результат, Адрес);.
  4. В основном сеансе дожидаемся завершения задания и только тогда считываем данные методом ПолучитьИзВременногоХранилища(Адрес).

Важный нюанс: Данные станут доступны в родительском сеансе только после того, как фоновое задание полностью завершит свою работу.

Ограничения и оптимизация

Посмотрим, какие данные можно помещать в хранилище. Помните, что во временное хранилище можно записывать только те объекты, которые поддерживают сериализацию. Это могут быть ТаблицаЗначений, Структура, Массив или ДвоичныеДанные. Нельзя поместить туда "мутабельные" объекты, например, объект документа (ДокументОбъект) для передачи с сервера на клиент.

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

Проанализируем пример очистки:


&НаСервере
Процедура ОбработатьИОчистить()
    Адрес = ПоместитьВоВременноеХранилище(БольшойМассивДанных, ЭтаФорма.УникальныйИдентификатор);
    
    // Выполняем действия
    // ...
    
    // Если данные больше не пригодятся в этой сессии работы формы
    УдалитьИзВременногоХранилища(Адрес);
КонецПроцедуры

Подведем итоги

Временное хранилище — это незаменимый инструмент для обмена данными. Основные правила работы с ним:

Соблюдение этих простых принципов позволит вам писать стабильный и производительный код, избегая типичных ошибок с потерей данных или перерасходом памяти сервера.

← На главную