Временное хранилище в 1С

Временное хранилище позволяет временно хранить какие-то данные в служебных файлах 1С. Эти данные не будут записаны в базу данных, но они и не будут доступны после завершения сеанса. Обычно временное хранилище используют для передачи файла с клиента на сервер, для передачи больших массивов данных и т.п.

С временным хранилищем можно работать как на сервере, так и на клиенте. Но обращение к хранилищу на клиенте выполняет неявное обращение к серверу.

Как поместить данные во временное хранилище

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

КакиеТоДанные = Новый Массив;
КакиеТоДанные.Добавить("Тестовая строка");
КакиеТоДанные.Добавить(123);
КакиеТоДанные.Добавить(Истина);
 
//массив КакиеТоДанные будет помещен во временное хранилище
Адрес = ПоместитьВоВременноеХранилище(КакиеТоДанные);

Как получить данные из временного хранилища

Для этого используется метод глобального контекста ПолучитьИзВременногоХранилища(). Первым параметром нужно передать адрес во временном хранилище, по которому находятся некие данные (они должны быть предварительно помещены туда методом ПоместитьВоВременноеХранилище). Если по указанному адресу ничего нет, метод вернет Неопределено. Например:

//Переменная АдресВремХран- это адрес во временном хранилище
КакиеТоДанные = ПолучитьИзВременногоХранилища(АдресВремХран);

Пример работы с временным хранилищем

&НаКлиенте
Процедура Команда1(Команда)
 
	//создаем строку
	КакиеТоДанные = "Какие-то данные";
 
	//помещаем строку во временное хранилище
	Адрес = ПоместитьВоВременноеХранилище(КакиеТоДанные);
 
	//Адрес - это адрес временного хранилища 1С
	//передаем его параметром на сервер
	НаСервере(Адрес);
 
КонецПроцедуры
 
&НаСервере
Процедура НаСервере(Адрес)
	//получаем строку из временного хранилища
	КакиеТоДанные = ПолучитьИзВременногоХранилища(Адрес);
 
	//если по этому адресе ничего нет в хранилище, то вернется Неопределено
	Если КакиеТоДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;	
 
	Сообщить(КакиеТоДанные);
КонецПроцедуры

Как удалить данные из временного хранилища

Чтобы явно удалить данные из временного хранилища нужно использовать метод УдалитьИзВременногоХранилища(), передав параметром адрес временного хранилища, например:

УдалитьИзВременногоХранилища(Адрес);

Как изменить данные во временном хранилище

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

&НаКлиенте
Процедура Команда1(Команда)
 
	//создаем строку
	КакиеТоДанные = "Какие-то данные";
 
	//помещаем ее во временное хранилище
	Адрес = ПоместитьВоВременноеХранилище(КакиеТоДанные, 
		Новый УникальныйИдентификатор);
 
	//передаем ее параметром на сервер
	НаСервере(Адрес);
 
	//получаем новую строку из хранилища
	ДанныеИзХранилища = ПолучитьИзВременногоХранилища(Адрес);
	Сообщить(ДанныеИзХранилища);
 
	//Результат:
	//Новые данные
 
КонецПроцедуры
 
&НаСервере
Процедура НаСервере(Адрес)
	//получаем строку из временного хранилища
	КакиеТоДанные = ПолучитьИзВременногоХранилища(Адрес);
 
	//изменяем
	КакиеТоДанные = "Новые данные";
 
	//помещаем во временное хранилище по тому же адресу
	ПоместитьВоВременноеХранилище(КакиеТоДанные, Адрес);
 
КонецПроцедуры

Время жизни данных в хранилище

Если вы внимательно разбирали последний пример, то наверняка заметили такую строчку:

//помещаем ее во временное хранилище
Адрес = ПоместитьВоВременноеХранилище(КакиеТоДанные, 
	Новый УникальныйИдентификатор);

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

Если не заполнять второй параметр, то данные будут удалены из хранилища сразу после завершения серверного вызова. Например:

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

Если указать уникальный идентификатор формы, то данные будут храниться пока открыта форма с таким идентификатором:

//УникальныйИдентификатор - это уникальный идентификатор формы, 
//в модуле которой был вызван метод ПоместитьВоВременноеХранилище
Адрес = ПоместитьВоВременноеХранилище(КакиеТоДанные, 
	УникальныйИдентификатор);

Как узнать является ли переменная адресом временного хранилища

Для этого можно использовать метод ЭтоАдресВременногоХранилища(), передавая ему параметром переменную с потенциальным адресом во временном хранилище. Если переменная является адресом временного хранилища, то метод вернет Истина, иначе Ложь. Например:

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

Так как адрес временного хранилища является обычной строкой, то можно использовать такой способ:

Если СтрНайти(АдресВремХран,"tempstorage") > 0 Тогда
	КакиеТоДанные = ПолучитьИзВременногоХранилища(АдресВремХран);
КонецЕсли;

Получение данных из фонового задания

Через временное хранилище можно получать данные из фонового задания или передавать какие-то данные в фоновое задание. Для этого нужно воспользоваться следующим алгоритмом:

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

Передача файла с клиента на сервер через временное хранилище

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

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями: