1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-08-24 19:49:22 +02:00

Дополнение словаря

This commit is contained in:
Anton Titovets
2025-04-26 15:36:05 +03:00
parent 565eca63c0
commit 8652f6a76a
7 changed files with 7794 additions and 8002 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -146,7 +146,7 @@
// Параметры:
// Токен - Строка - Токен - token
// Файл - ДвоичныеДанные,Строка - Загружаемый файл - file
// Описание - Соответствие Из КлючИЗначение - См. ПолучитьОписаниеФайла - props - JSON описания или путь к .json
// Описание - Соответствие Из КлючИЗначение - См. ПолучитьОписаниеФайла - props
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
@@ -619,32 +619,42 @@
КонецЦикла;
URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable";
Если ЗначениеЗаполнено(Идентификатор) Тогда
URL = СтрЗаменить(URL, "/files", "/files/" + Идентификатор);
Ответ = OPI_ЗапросыHTTP.PatchСТелом(URL, Описание, Заголовки, Истина, Истина);
Метод = "PATCH";
Иначе
Ответ = OPI_ЗапросыHTTP.PostСТелом(URL, Описание, Заголовки, Истина, Истина);
Метод = "POST";;
КонецЕсли;
HttpКлиент = OPI_ЗапросыHTTP.НовыйЗапрос().Инициализировать(URL);
Ответ = HttpКлиент.УстановитьЗаголовки(Заголовки)
.УстановитьJsonТело(Описание)
.ОбработатьЗапрос(Метод)
.ВернутьОтвет(Ложь, Истина);
АдресЗагрузки = Ответ.Заголовки["Location"];
Если Не ЗначениеЗаполнено(АдресЗагрузки) Тогда
OPI_Инструменты.ОбработатьОтвет(Ответ);
Возврат Ответ;
Возврат HttpКлиент.ВернутьОтветКакJSONКоллекцию(Истина, Истина);
КонецЕсли;
ОтветЗагрузки = ЗагрузитьФайлЧастями(Двоичные, АдресЗагрузки);
Ответ = ?(ЗначениеЗаполнено(ОтветЗагрузки), ОтветЗагрузки, Ответ);
OPI_Инструменты.ОбработатьОтвет(Ответ);
HttpКлиентЗагрузки = ЗагрузитьФайлЧастями(Двоичные, АдресЗагрузки);
Если HttpКлиентЗагрузки <> Неопределено Тогда
Ответ = HttpКлиентЗагрузки.ВернутьОтветКакJSONКоллекцию(Истина, Истина);
Иначе
Ответ = HttpКлиент.ВернутьОтветКакJSONКоллекцию(Истина, Истина);
КонецЕсли;
Возврат Ответ;
КонецФункции
Функция ЗагрузитьФайлЧастями(Знач Двоичные, Знач АдресЗагрузки)
Ответ = "";
HttpКлиент = Неопределено;
РазмерЧасти = 268435456;
ПрочитаноБайт = 0;
ТекущаяПозиция = 0;
@@ -677,11 +687,16 @@
ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока);
ДопЗаголовки.Вставить("Content-Type" , "application/octet-stream");
Ответ = OPI_ЗапросыHTTP.PutСТелом(АдресЗагрузки, ТекущиеДанные, ДопЗаголовки, Ложь, Истина);
HttpКлиент = OPI_ЗапросыHTTP
.НовыйЗапрос()
.Инициализировать(АдресЗагрузки)
.УстановитьЗаголовки(ДопЗаголовки)
.УстановитьДвоичноеТело(ТекущиеДанные)
.ОбработатьЗапрос("PUT");
РезультатПроверки = ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция);
РезультатПроверки = ПроверитьЗагрузкуЧасти(HttpКлиент, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция);
Если ЗначениеЗаполнено(РезультатПроверки) Тогда
Если РезультатПроверки <> Неопределено Тогда
Возврат РезультатПроверки;
КонецЕсли;
@@ -694,29 +709,33 @@
КонецЦикла;
Возврат Ответ;
Возврат HttpКлиент;
КонецФункции
Функция ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция)
Функция ПроверитьЗагрузкуЧасти(HttpКлиент, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция)
НачалоКодовОшибок = 400;
КонецКодовПадений = 600;
НачалоКодовУспеха = 200;
КонецКодовУспеха = 300;
Перенаправление = 308;
Ответ = HttpКлиент.ВернутьОтвет(Ложь, Истина);
Если Ответ.КодСостояния >= НачалоКодовОшибок И Ответ.КодСостояния < КонецКодовПадений Тогда
ЗаголовокПотока = "bytes */" + СтрОбщийРазмер;
ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока);
ОтветПроверки = OPI_ЗапросыHTTP.PutСТелом(АдресЗагрузки, "", ДопЗаголовки, Ложь, Истина);
HttpКлиентПроверки = OPI_ЗапросыHTTP.НовыйЗапрос().Инициализировать(АдресЗагрузки);
ОтветПроверки = HttpКлиентПроверки.УстановитьЗаголовки(ДопЗаголовки)
.ОбработатьЗапрос("PUT")
.ВернутьОтвет(Ложь, Истина);
Если ОтветПроверки.КодСостояния >= НачалоКодовУспеха И ОтветПроверки.КодСостояния < КонецКодовУспеха Тогда
OPI_Инструменты.ОбработатьОтвет(ОтветПроверки);
Возврат ОтветПроверки;
Возврат HttpКлиентПроверки;
ИначеЕсли ОтветПроверки.КодСостояния = Перенаправление Тогда
@@ -724,8 +743,7 @@
Иначе
OPI_Инструменты.ОбработатьОтвет(Ответ);
Возврат Ответ;
Возврат HttpКлиент;
КонецЕсли;
@@ -734,8 +752,7 @@
КонецЕсли;
Если Не ЗначениеЗаполнено(ЗагруженныеДанные) Тогда
OPI_Инструменты.ОбработатьОтвет(Ответ);
Возврат Ответ;
Возврат HttpКлиент;
КонецЕсли;
ЗагруженныеДанные = СтрЗаменить(ЗагруженныеДанные, "bytes=", "");
@@ -743,13 +760,12 @@
НеобходимоЧастей = 2;
Если Не МассивИнформации.Количество() = НеобходимоЧастей Тогда
OPI_Инструменты.ОбработатьОтвет(Ответ);
Возврат Ответ;
Возврат HttpКлиент;
КонецЕсли;
ТекущаяПозиция = Число(МассивИнформации[1]) + 1;
Возврат "";
Возврат Неопределено;
КонецФункции

View File

@@ -924,6 +924,7 @@
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("GD_Catalog" , ПараметрыТеста);
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture2" , ПараметрыТеста);
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Big" , ПараметрыТеста);
ПараметрыТеста.Вставить("МассивУдаляемых", Новый Массив);
@@ -5777,7 +5778,25 @@
OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GD_File", Идентификатор);
OPI_Инструменты.ДобавитьПоле("GD_File", Идентификатор, "Строка", ПараметрыФункции);
Если Не OPI_Инструменты.ЭтоOneScript() Тогда
БольшойФайл = ПараметрыФункции["Big"];
Описание.Вставить("Имя", "big.rar");
Результат = OPI_GoogleDrive.ЗагрузитьФайл(Токен, БольшойФайл, Описание);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл (большой)", "GoogleDrive");
OPI_ПолучениеДанныхТестов.Проверка_ГуглОбъект(Результат, Описание);
Идентификатор = Результат["id"];
МассивУдаляемых = ПараметрыФункции["МассивУдаляемых"];
МассивУдаляемых.Добавить(Идентификатор);
ПараметрыФункции.Вставить("МассивУдаляемых", МассивУдаляемых);
КонецЕсли;
КонецПроцедуры
Процедура GoogleDrive_СкопироватьОбъект(ПараметрыФункции)

View File

@@ -244,7 +244,7 @@
Результат = HttpКлиент.ВернутьОтветКакJSONКоллекцию(Истина, Истина);
КонецЕсли;
Возврат Результат;
Возврат Результат;
КонецФункции

View File

@@ -2463,9 +2463,9 @@
КонецФункции
Функция ПолучитьОбщийМодуль(Знач Имя)
Модуль = Вычислить(Имя);
Возврат Модуль;
КонецФункции

View File

@@ -166,7 +166,7 @@
OPI_Инструменты.ВернутьУправляющиеПоследовательности(URL);
Если ПолучитьНастройку("КодировкаURL") Тогда
OPI_Инструменты.КодироватьURLВURL(URL);
КодироватьURLВURL(URL);
КонецЕсли;
ЗапросURL = URL;
@@ -2218,6 +2218,16 @@
КонецПроцедуры
Процедура КодироватьURLВURL(URL) Экспорт
Заглушка = СтрШаблон("@#%1#@", Строка(Новый УникальныйИдентификатор));
URL = СтрЗаменить(URL, "&", Заглушка);
URL = КодироватьСтроку(URL, СпособКодированияСтроки.URLВКодировкеURL);
URL = СтрЗаменить(URL, Заглушка, "&");
КонецПроцедуры
Функция ШаблонФункции()
Попытка

View File

@@ -42,63 +42,6 @@
#Область РаботаССетью
Процедура ОбработатьОтвет(Ответ, Знач ПолныйОтвет = Ложь) Экспорт
Если ПолныйОтвет Или ТипЗнч(Ответ) <> Тип("HTTPОтвет") Тогда
Возврат;
КонецЕсли;
ФайлТела = Ответ.ПолучитьИмяФайлаТела();
Если Не ФайлТела = Неопределено Тогда
Ответ = ФайлТела;
Возврат;
КонецЕсли;
GZip = "gzip";
НужнаРаспаковка = Ответ.Заголовки.Получить("Content-Encoding") = GZip
Или Ответ.Заголовки.Получить("content-encoding") = GZip;
Если НужнаРаспаковка Тогда
Ответ = РаспаковатьОтвет(Ответ);
КонецЕсли;
Ответ = ?(ТипЗнч(Ответ) = Тип("HTTPОтвет"), Ответ.ПолучитьТелоКакДвоичныеДанные(), Ответ);
Если ТипЗнч(Ответ) = Тип("ДвоичныеДанные") Тогда
Если Ответ.Размер() = 0 Тогда
Ответ = ПолучитьДвоичныеДанныеИзСтроки("{}");
КонецЕсли;
Попытка
Ответ = JsonВСтруктуру(Ответ);
Исключение
Возврат;
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Процедура КодироватьURLВURL(URL) Экспорт
ЭтоOS = ЭтоOneScript();
Заглушка = СтрШаблон("@#%1#@", Строка(Новый УникальныйИдентификатор));
URL = СтрЗаменить(URL, "&" , Заглушка);
URL = КодироватьСтроку(URL, СпособКодированияСтроки.URLВКодировкеURL);
URL = СтрЗаменить(URL, Заглушка, "&");
КонецПроцедуры
Функция ПараметрыЗапросаВСтроку(Знач Параметры, Знач ОтдельныеЭлементыМассивов = Ложь, Знач Начало = Истина) Экспорт
Если Параметры.Количество() = 0 Тогда
@@ -1178,204 +1121,4 @@
КонецФункции
#Область GZip
// Описание структур см. здесь https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
// Источник: https://github.com/vbondarevsky/Connector
// Коннектор: удобный HTTP-клиент для 1С:Предприятие 8
//
// Copyright 2017-2023 Vladimir Bondarevskiy
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//
// URL: https://github.com/vbondarevsky/Connector
// e-mail: vbondarevsky@gmail.com
// Версия: 2.4.8
//
// Требования: платформа 1С версии 8.3.10 и выше
Функция РаспаковатьОтвет(Ответ)
Попытка
Возврат ПрочитатьGZip(Ответ.ПолучитьТелоКакДвоичныеДанные());
Исключение
Возврат Ответ;
КонецПопытки;
КонецФункции
Функция ПрочитатьGZip(СжатыеДанные) Экспорт
РазмерПрефиксаGZip = 10;
РазмерПостфиксаGZip = 8;
РазмерДД = ZipРазмерDD();
РазмерСДХ = ZipРазмерCDH();
РазмерЕСД = ZipРазмерEOCD();
РазмерЛФХ = ZipРазмерLFH();
ЧтениеДанных = Новый ЧтениеДанных(СжатыеДанные);
ЧтениеДанных.Пропустить(РазмерПрефиксаGZip);
РазмерСжатыхДанных = ЧтениеДанных.ИсходныйПоток().Размер() - РазмерПрефиксаGZip - РазмерПостфиксаGZip;
ПотокZip = Новый ПотокВПамяти(РазмерЛФХ + РазмерСжатыхДанных + РазмерДД + РазмерСДХ + РазмерЕСД);
ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipLFH());
ЧтениеДанных.КопироватьВ(ЗаписьДанных, РазмерСжатыхДанных);
ЗаписьДанных.Закрыть();
ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
CRC32 = ЧтениеДанных.ПрочитатьЦелое32();
РазмерНесжатыхДанных = ЧтениеДанных.ПрочитатьЦелое32();
ЧтениеДанных.Закрыть();
ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipDD(CRC32 , РазмерСжатыхДанных, РазмерНесжатыхДанных));
ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipEOCD(РазмерСжатыхДанных));
ЗаписьДанных.Закрыть();
Возврат ПрочитатьZip(ПотокZip);
КонецФункции
Функция ПрочитатьZip(СжатыеДанные, ТекстОшибки = Неопределено)
Каталог = ПолучитьИмяВременногоФайла();
ЧтениеZip = Новый ЧтениеZipФайла(СжатыеДанные);
ИмяФайла = ЧтениеZip.Элементы[0].Имя;
Попытка
ЧтениеZip.Извлечь(ЧтениеZip.Элементы[0], Каталог, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
Исключение
// Игнорируем проверку целостности архива, просто читаем результат
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
ЧтениеZip.Закрыть();
Результат = Новый ДвоичныеДанные(Каталог + ПолучитьРазделительПути() + ИмяФайла);
УдалитьФайлы(Каталог);
Возврат Результат;
КонецФункции
Функция ZipРазмерLFH()
Возврат 34;
КонецФункции
Функция ZipРазмерDD()
Возврат 16;
КонецФункции
Функция ZipРазмерCDH()
Возврат 50;
КонецФункции
Функция ZipРазмерEOCD()
Возврат 22;
КонецФункции
Функция ZipLFH()
// Local file header
Буфер = Новый БуферДвоичныхДанных(ZipРазмерLFH());
Буфер.ЗаписатьЦелое32(0, 67324752); // signature 0x04034b50
Буфер.ЗаписатьЦелое16(4, 20); // version
Буфер.ЗаписатьЦелое16(6, 10); // bit flags
Буфер.ЗаписатьЦелое16(8, 8); // compression method
Буфер.ЗаписатьЦелое16(10, 0); // time
Буфер.ЗаписатьЦелое16(12, 0); // date
Буфер.ЗаписатьЦелое32(14, 0); // crc-32
Буфер.ЗаписатьЦелое32(18, 0); // compressed size
Буфер.ЗаписатьЦелое32(22, 0); // uncompressed size
Буфер.ЗаписатьЦелое16(26, 4); // filename legth - "data"
Буфер.ЗаписатьЦелое16(28, 0); // extra field length
Буфер.Записать(30, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь));
Возврат Буфер;
КонецФункции
Функция ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)
// Data descriptor
Буфер = Новый БуферДвоичныхДанных(ZipРазмерDD());
Буфер.ЗаписатьЦелое32(0, 134695760);
Буфер.ЗаписатьЦелое32(4, CRC32);
Буфер.ЗаписатьЦелое32(8, РазмерСжатыхДанных);
Буфер.ЗаписатьЦелое32(12, РазмерНесжатыхДанных);
Возврат Буфер;
КонецФункции
Функция ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)
// Central directory header
Буфер = Новый БуферДвоичныхДанных(ZipРазмерCDH());
Буфер.ЗаписатьЦелое32(0, 33639248); // signature 0x02014b50
Буфер.ЗаписатьЦелое16(4, 798); // version made by
Буфер.ЗаписатьЦелое16(6, 20); // version needed to extract
Буфер.ЗаписатьЦелое16(8, 10); // bit flags
Буфер.ЗаписатьЦелое16(10, 8); // compression method
Буфер.ЗаписатьЦелое16(12, 0); // time
Буфер.ЗаписатьЦелое16(14, 0); // date
Буфер.ЗаписатьЦелое32(16, CRC32); // crc-32
Буфер.ЗаписатьЦелое32(20, РазмерСжатыхДанных); // compressed size
Буфер.ЗаписатьЦелое32(24, РазмерНесжатыхДанных); // uncompressed size
Буфер.ЗаписатьЦелое16(28, 4); // file name length
Буфер.ЗаписатьЦелое16(30, 0); // extra field length
Буфер.ЗаписатьЦелое16(32, 0); // file comment length
Буфер.ЗаписатьЦелое16(34, 0); // disk number start
Буфер.ЗаписатьЦелое16(36, 0); // internal file attributes
Буфер.ЗаписатьЦелое32(38, 2176057344); // external file attributes
Буфер.ЗаписатьЦелое32(42, 0); // relative offset of local header
Буфер.Записать(46, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь));
Возврат Буфер;
КонецФункции
Функция ZipEOCD(РазмерСжатыхДанных)
// End of central directory
РазмерCDH = 50;
Буфер = Новый БуферДвоичныхДанных(ZipРазмерEOCD());
Буфер.ЗаписатьЦелое32(0, 101010256); // signature 0x06054b50
Буфер.ЗаписатьЦелое16(4, 0); // number of this disk
Буфер.ЗаписатьЦелое16(6, 0); // number of the disk with the start of the central directory
Буфер.ЗаписатьЦелое16(8, 1); // total number of entries in the central directory on this disk
Буфер.ЗаписатьЦелое16(10, 1); // total number of entries in the central directory
Буфер.ЗаписатьЦелое32(12, РазмерCDH); // size of the central directory
// offset of start of central directory with respect to the starting disk number
Буфер.ЗаписатьЦелое32(16, ZipРазмерLFH() + РазмерСжатыхДанных + ZipРазмерDD());
Буфер.ЗаписатьЦелое16(20, 0); // the starting disk number
Возврат Буфер;
КонецФункции
#КонецОбласти
#КонецОбласти