Отправить.
Функция Отправить(ПараметрыДоступа, ВФизическоеХранилище = Ложь, ИдентификаторХранилища, Данные, Знач ИмяФайла) Экспорт
Результат = Неопределено;
Структура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 (БСП)
НеУдалосьОтправитьОповещение (БСП)
ОтправитьЗаявлениеНаПодключение (БСП)
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)