В процессе разработки на платформе 1С:Предприятие 8 часто возникает необходимость временного сохранения данных на стороне сервера. Временное хранилище (ВХ) — это мощный инструмент, который позволяет передавать информацию между клиентом и сервером, а также сохранять состояние между различными серверными вызовами. Разберем подробно, как эффективно использовать этот механизм, и ответим на распространенные вопросы разработчиков.
Один из первых вопросов, который возникает у разработчиков: можно ли задать адрес во временном хранилище в виде произвольной строки (например, "МоиДанные")? Проанализируем работу метода ПоместитьВоВременноеХранилище(). Платформа устроена так, что при помещении данных она сама генерирует уникальный идентификатор (строку внутреннего формата, похожую на GUID). Пытаться передать в параметр Адрес произвольный текст не имеет смысла, так как система ожидает либо пустую переменную, куда будет записан новый адрес, либо уже существующий валидный адрес для обновления данных.
Рассмотрим стандартный пример помещения данных:
// В контексте формы или модуля
ДанныеДляСохранения = ПолучитьВажныеДанные();
// Платформа вернет уникальную строку-адрес
АдресХранилища = ПоместитьВоВременноеХранилище(ДанныеДляСохранения);
Важно: Если вы хотите обновить данные по уже имеющемуся адресу, вы передаете этот адрес вторым параметром. Но "придумать" свой адрес с нуля нельзя — его должна выдать платформа.
Рассмотрим ситуацию, когда нам нужно поместить данные в хранилище внутри модуля формы, а затем обработать их в общем модуле. Поскольку адрес — это всего лишь строка, мы можем передавать её как обычный параметр функции. Выясним, как это выглядит на практике:
&НаКлиенте
Процедура ВыполнитьОбработкуДанных()
// 1. Помещаем данные во временное хранилище
Адрес = ПоместитьВоВременноеХранилище(Объект.ТабличнаяЧасть.Выгрузить());
// 2. Передаем адрес в метод общего модуля
МойОбщийМодуль.ОбработатьДанныеВХ(Адрес);
КонецПроцедуры
// В общем модуле (Сервер)
Процедура ОбработатьДанныеВХ(Адрес) Экспорт
// 3. Извлекаем данные по переданному адресу
Данные = ПолучитьИзВременногоХранилища(Адрес);
Если Данные <> Неопределено Тогда
// Обработка данных
КонецЕсли;
КонецПроцедуры
Таким образом, проблема "неизвестного адреса" решается простой передачей переменной по цепочке вызовов. Если же данные должны быть доступны в разных местах без прямой передачи, адрес можно сохранить в реквизит формы или (в крайнем случае) в ПараметрыСеанса, хотя последнее чаще всего избыточно.
Проанализируем крайне важный аспект — как долго данные будут находиться в памяти сервера. Платформа 1С предлагает три режима владения адресом, которые зависят от второго параметра функции ПоместитьВоВременноеХранилище(Данные, Владелец):
УникальныйИдентификатор формы, данные будут жить ровно до тех пор, пока эта форма открыта. Это "золотой стандарт" управления памятью, так как система сама очистит хранилище при закрытии окна пользователем.rphost начнет потреблять слишком много ресурсов).Разберем ситуацию, когда данные помещаются в хранилище внутри фонового задания, а получить их нужно в основном сеансе. Напрямую фоновое задание не может "создать" адрес, который увидит основной сеанс. Выясним правильный алгоритм действий:
Адрес = ПоместитьВоВременноеХранилище(Неопределено, ЭтаФорма.УникальныйИдентификатор);.Адрес в параметры фонового задания при его запуске.ПоместитьВоВременноеХранилище(Результат, Адрес);.ПолучитьИзВременногоХранилища(Адрес).Важный нюанс: Данные станут доступны в родительском сеансе только после того, как фоновое задание полностью завершит свою работу.
Посмотрим, какие данные можно помещать в хранилище. Помните, что во временное хранилище можно записывать только те объекты, которые поддерживают сериализацию. Это могут быть ТаблицаЗначений, Структура, Массив или ДвоичныеДанные. Нельзя поместить туда "мутабельные" объекты, например, объект документа (ДокументОбъект) для передачи с сервера на клиент.
С точки зрения производительности, данные хранятся в оперативной памяти процесса rphost. Если данных становится слишком много, система сбрасывает их во временные файлы на диске. Чтобы не нагружать сервер, рекомендуем принудительно очищать память, если данные вам больше не нужны, используя метод УдалитьИзВременногоХранилища(Адрес).
Проанализируем пример очистки:
&НаСервере
Процедура ОбработатьИОчистить()
Адрес = ПоместитьВоВременноеХранилище(БольшойМассивДанных, ЭтаФорма.УникальныйИдентификатор);
// Выполняем действия
// ...
// Если данные больше не пригодятся в этой сессии работы формы
УдалитьИзВременногоХранилища(Адрес);
КонецПроцедуры
Временное хранилище — это незаменимый инструмент для обмена данными. Основные правила работы с ним:
Соблюдение этих простых принципов позволит вам писать стабильный и производительный код, избегая типичных ошибок с потерей данных или перерасходом памяти сервера.