ПолучитьФайлИзХранилищаВСервисе (БСП)

Автор: 1С
ОбщийМодуль.ОбменДаннымиСервер
1С БСП

Получить файл из хранилища сервисе. Функция по переданному идентификатору скачивает файл из сервиса передачи файлов.

// Функция по переданному идентификатору скачивает файл из сервиса передачи файлов.
//
// Параметры:
//  ИдентификаторФайла       - УникальныйИдентификатор - идентификатор получаемого файла.
//  ПараметрыДоступаКСервису - Структура: АдресСервиса, ИмяПользователя, ПарольПользователя. 
//  РазмерЧасти              - Число - размер части в килобайтах. Если значение равно 0,
//                             то разбивка на части не производится.
// Возвращаемое значение:
//  Строка - путь к полученному файлу.
//
Функция ПолучитьФайлИзХранилищаВСервисе(Знач ИдентификаторФайла, Знач УзелИнформационнойБазы, Знач РазмерЧасти = 1024, Знач ПараметрыАутентификации = Неопределено) Экспорт
	
	// Возвращаемое значение функции.
	ИмяФайлаРезультата = "";
	
	ДополнительныеПараметры = Новый Структура("ПараметрыАутентификации", ПараметрыАутентификации);
	
	Прокси = WSПроксиДляУзлаИнформационнойБазы(УзелИнформационнойБазы, , ДополнительныеПараметры);
	
	ИдентификаторСессии = Неопределено;
	КоличествоЧастей    = Неопределено;
	
	Прокси.PrepareGetFile(ИдентификаторФайла, РазмерЧасти, ИдентификаторСессии, КоличествоЧастей);
	
	ИменаФайлов = Новый Массив;
	
	КаталогСборки = ПолучитьИмяВременногоФайла();
	СоздатьКаталог(КаталогСборки);
	
	ШаблонИмениФайла = "data.zip.[n]";
	
	// Протоколирование событий обмена.
	СтруктураНастроекОбмена = Новый Структура("КлючСообщенияЖурналаРегистрации");
	СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных);
	
	Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Начало получения сообщения обмена из Интернета (количество частей файла %1).'"),
		Формат(КоличествоЧастей, "ЧН=0; ЧГ=0"));
	ЗаписьЖурналаРегистрацииОбменаДанными(Комментарий, СтруктураНастроекОбмена);
	
	Для НомерЧасти = 1 По КоличествоЧастей Цикл
		ДанныеЧасти = Неопределено;
		Попытка
			Прокси.GetFilePart(ИдентификаторСессии, НомерЧасти, ДанныеЧасти);
		Исключение
			Прокси.ReleaseFile(ИдентификаторСессии);
			ВызватьИсключение;
		КонецПопытки;
		
		ИмяФайла = СтрЗаменить(ШаблонИмениФайла, "[n]", Формат(НомерЧасти, "ЧГ=0"));
		ИмяФайлаЧасти = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогСборки, ИмяФайла);
		
		ДанныеЧасти.Записать(ИмяФайлаЧасти);
		ИменаФайлов.Добавить(ИмяФайлаЧасти);
	КонецЦикла;
	ДанныеЧасти = Неопределено;
	
	Прокси.ReleaseFile(ИдентификаторСессии);
	
	ИмяАрхива = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогСборки, "data.zip");
	
	ОбъединитьФайлы(ИменаФайлов, ИмяАрхива);
	
	Разархиватор = Новый ЧтениеZipФайла(ИмяАрхива);
	Если Разархиватор.Элементы.Количество() = 0 Тогда
		Попытка
			УдалитьФайлы(КаталогСборки);
		Исключение
			ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУдалениеВременногоФайла(),
				УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		КонецПопытки;
		ВызватьИсключение(НСтр("ru = 'Файл архива не содержит данных.'"));
	КонецЕсли;
	
	// Протоколирование событий обмена.
	ФайлАрхива = Новый Файл(ИмяАрхива);
	
	Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Окончание получения сообщения обмена из Интернета (размер сжатого сообщения обмена %1 Мб).'"),
		Формат(Окр(ФайлАрхива.Размер() / 1024 / 1024, 3), "ЧН=0; ЧГ=0"));
	ЗаписьЖурналаРегистрацииОбменаДанными(Комментарий, СтруктураНастроекОбмена);
	
	ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогСборки, Разархиватор.Элементы[0].Имя);
	
	Разархиватор.Извлечь(Разархиватор.Элементы[0], КаталогСборки);
	Разархиватор.Закрыть();
	
	Файл = Новый Файл(ИмяФайла);
	
	ВременныйКаталог = ПолучитьИмяВременногоФайла();
	СоздатьКаталог(ВременныйКаталог);
	
	ИмяФайлаРезультата = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ВременныйКаталог, Файл.Имя);
	
	ПереместитьФайл(ИмяФайла, ИмяФайлаРезультата);
	
	Попытка
		УдалитьФайлы(КаталогСборки);
	Исключение
		ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУдалениеВременногоФайла(),
			УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
	КонецПопытки;
		
	Возврат ИмяФайлаРезультата;
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

ПолучитьФайлИзХранилищаМенеджераСервиса (БСП)

ПоместитьФайлВХранилищеМенеджераСервиса (БСП)

ПолучитьФайлИзХранилища (БСП)

ПолучитьПрисоединенныйФайл (БСП)

ВыгрузитьОбластьВХранилищеМС (БСП)

ПолучитьФайлыКлассификаторов (БСП)

ПолучитьНавигационнуюСсылкуВоВременномХранилище (БСП)

Получить (БСП)

TurboConf 6 - расширение Конфигуратора 1С