Отправить (БСП)

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

Отправить.

Функция Отправить(ПараметрыДоступа, ВФизическоеХранилище = Ложь, ИдентификаторХранилища, Данные, Знач ИмяФайла) Экспорт
	
	Результат = Неопределено;
	
	СтруктураURI = СтруктураURI(ПараметрыДоступа.URL);
	Соединение = Соединение(СтруктураURI, ПараметрыДоступа.UserName, ПараметрыДоступа.Password);
	
	Если ВФизическоеХранилище Тогда
		
		АдресРесурсаШаблон = "/hs/dt/volume/%1/%2";
		
	Иначе
		
		АдресРесурсаШаблон = "/hs/dt/storage/%1/%2";
		
	КонецЕсли;
	
	Если НЕ ЗначениеЗаполнено(ИмяФайла) И ТипЗнч(Данные) = Тип("Файл") Тогда
		
		ИмяФайла = Данные.Имя;
		
	ИначеЕсли НЕ ЗначениеЗаполнено(ИмяФайла) Тогда
		
		ФайлОбъект = Новый Файл(ПолучитьИмяВременногоФайла());
		ИмяФайла = ФайлОбъект.Имя;
		
	КонецЕсли;
	
	АдресРесурса = СтруктураURI.ПутьНаСервере + СтрШаблон(АдресРесурсаШаблон, ИдентификаторХранилища, ИмяФайла);
	
	РазмерБлокаОтправкиДанных = РазмерБлокаОтправкиДанных();
	
	ЗапросРесурса = Новый HTTPЗапрос(АдресРесурса);
	ЗапросРесурса.Заголовки.Вставить("IBSession", "start");
	
	ОтветНаЗапросРесурса = Соединение.ОтправитьДляОбработки(ЗапросРесурса);
	
	Если ОтветНаЗапросРесурса.КодСостояния = 400 Тогда
		
		ЗапросРесурса.Заголовки.Удалить("IBSession");
		ОтветНаЗапросРесурса = Соединение.ОтправитьДляОбработки(ЗапросРесурса);
		
	КонецЕсли;
	
	Если ОтветНаЗапросРесурса.КодСостояния = 200 Тогда
		
		Location = ОтветНаЗапросРесурса.Заголовки.Получить("Location");
		SetCookie = ОтветНаЗапросРесурса.Заголовки.Получить("Set-Cookie");
		
		СтруктураURI = СтруктураURI(Location);
		Соединение = Соединение(СтруктураURI, ПараметрыДоступа.UserName, ПараметрыДоступа.Password);
		
		ЗапросДанных = Новый HTTPЗапрос(СтруктураURI.ПутьНаСервере);
		
		Если ЗначениеЗаполнено(SetCookie) Тогда
			
			ЗапросДанных.Заголовки.Вставить("Cookie", SetCookie);
			
		КонецЕсли;
		
		Если РазмерБлокаОтправкиДанных > 0 Тогда
			
			Если ЭтоАдресВременногоХранилища(Данные) Тогда
				
				ПотокДанных = ПолучитьИзВременногоХранилища(Данные).ОткрытьПотокДляЧтения();
				
			ИначеЕсли ТипЗнч(Данные) = Тип("Строка") Тогда
				
				ПотокДанных = ФайловыеПотоки.Открыть(Данные, РежимОткрытияФайла.Открыть, ДоступКФайлу.Чтение);
				
			ИначеЕсли ТипЗнч(Данные) = Тип("Файл") Тогда
				
				ПотокДанных = ФайловыеПотоки.Открыть(Данные.ПолноеИмя, РежимОткрытияФайла.Открыть, ДоступКФайлу.Чтение);
				
			ИначеЕсли ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
				
				ПотокДанных = Данные.ОткрытьПотокДляЧтения();
				
			КонецЕсли;
			
			ОтправляемыйДиапазон = Новый Структура("Начало, Конец", 0, Мин(РазмерБлокаОтправкиДанных - 1, ПотокДанных.Размер() - 1));
			
			Пока Истина Цикл
				
				Буфер = Новый БуферДвоичныхДанных(ОтправляемыйДиапазон.Конец - ОтправляемыйДиапазон.Начало + 1);
				ПотокДанных.Перейти(ОтправляемыйДиапазон.Начало, ПозицияВПотоке.Начало);
				Прочитано = ПотокДанных.Прочитать(Буфер, 0, Буфер.Размер);
				ЗапросДанных.УстановитьТелоИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(Буфер));
			
				ЗапросДанных.Заголовки.Вставить("Content-Range", СтрШаблон("bytes %1-%2/%3", Формат(ОтправляемыйДиапазон.Начало, "ЧН=0; ЧГ=0"), Формат(ОтправляемыйДиапазон.Начало + Прочитано - 1, "ЧН=0; ЧГ=0"), Формат(ПотокДанных.Размер(), "ЧН=0; ЧГ=0")));
				
				Если ОтправляемыйДиапазон.Конец = ПотокДанных.Размер() - 1 И ЗначениеЗаполнено(SetCookie) Тогда
					
					ЗапросДанных.Заголовки.Вставить("IBSession", "finish");
					
				КонецЕсли;
				
				ОтветНаЗапросДанных = Соединение.Записать(ЗапросДанных);
				
				Если ОтветНаЗапросДанных.КодСостояния = 201 Тогда
					
				    ЧтениеJSON = Новый ЧтениеJSON;
				    ЧтениеJSON.УстановитьСтроку(ОтветНаЗапросДанных.ПолучитьТелоКакСтроку());
					ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
					
					Если ДанныеОтвета.Количество() = 1 И ДанныеОтвета.Свойство("id") Тогда
						
						Результат = ДанныеОтвета.id;
						
					Иначе
						
						Результат = ДанныеОтвета;
						
					КонецЕсли;
					
					ПотокДанных.Закрыть();
					Прервать;
					
				ИначеЕсли ОтветНаЗапросДанных.КодСостояния <> 202 Тогда
					
					ОшибкаПриОтправкеДанных(ОтветНаЗапросДанных);
					
					ПотокДанных.Закрыть();
					Прервать;
					
				КонецЕсли;
				
				ОтправляемыйДиапазон = Новый Структура("Начало, Конец", ОтправляемыйДиапазон.Конец + 1, Мин(ОтправляемыйДиапазон.Конец + РазмерБлокаОтправкиДанных, ПотокДанных.Размер() - 1));
				
			КонецЦикла;
			
		Иначе
			
			Если ЭтоАдресВременногоХранилища(Данные) Тогда
				
				ЗапросДанных.УстановитьТелоИзДвоичныхДанных(ПолучитьИзВременногоХранилища(Данные));
				
			ИначеЕсли ТипЗнч(Данные) = Тип("Строка") Тогда
				
				ЗапросДанных.УстановитьИмяФайлаТела(Данные);
				
			ИначеЕсли ТипЗнч(Данные) = Тип("Файл") Тогда
				
				ЗапросДанных.УстановитьИмяФайлаТела(Данные.ПолноеИмя);
				
			ИначеЕсли ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
				
				ЗапросДанных.УстановитьТелоИзДвоичныхДанных(Данные);
				
			КонецЕсли;
			
			ЗапросДанных.Заголовки.Вставить("IBSession", "finish");
			ОтветНаЗапросДанных = Соединение.Записать(ЗапросДанных);
			
			Если ОтветНаЗапросДанных.КодСостояния = 201 Тогда
				
			    ЧтениеJSON = Новый ЧтениеJSON;
			    ЧтениеJSON.УстановитьСтроку(ОтветНаЗапросДанных.ПолучитьТелоКакСтроку());
				ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
				
				Если ДанныеОтвета.Количество() = 1 И ДанныеОтвета.Свойство("id") Тогда
					
					Результат = ДанныеОтвета.id;
					
				Иначе
					
					Результат = ДанныеОтвета;
					
				КонецЕсли;
				
			КонецЕсли;
			
		КонецЕсли;
		
	Иначе
		
		ОшибкаПриОтправкеДанных(ОтветНаЗапросРесурса);
		
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

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

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

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

КомандаОтправить (БСП)

ОтправитьЗаявление (БСП)

ОтправитьСообщение (БСП)

СоздатьИОтправитьСообщениеSMS (БСП)

НеУдалосьОтправитьОповещение (БСП)

ОтправитьЗаявлениеНаПодключение (БСП)

ОтправитьПодписанноеЗаявление (БСП)

ОтправитьФайлыПоПочте (БСП)

СформироватьСообщениеИОтправить (БСП)

Синтакс-помощник БСП с нейросетевым ассистентом