1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2026-06-09 23:56:48 +02:00

Обработка методов с несколькми http-запросами при adv_reponse

This commit is contained in:
Anton Titovets
2026-05-17 20:12:13 +03:00
parent 52fdfa21b5
commit fd03b537de
26 changed files with 344 additions and 77 deletions
+1
View File
@@ -15,6 +15,7 @@
Обработчик = Новый SpellCheckMethods(ДанныеПроекта);
Обработчик = Новый Versioning(ДанныеПроекта);
Обработчик = Новый HttpToClientConverter(ДанныеПроекта);
Обработчик = Новый IntermediateResultProcessingCheck(ДанныеПроекта);
Обработчик = Новый ConversionMethods(ДанныеПроекта);
Обработчик = Новый ACIndexGenerator(ДанныеПроекта);
Обработчик = Новый LocalizationMethods(ДанныеПроекта);
@@ -0,0 +1,118 @@
#Использовать "./internal"
#Использовать osparser
Перем БылиОшибки;
Процедура ПриСозданииОбъекта(Знач ДанныеПроекта_ = Неопределено)
Если ДанныеПроекта_ = Неопределено Тогда
ДанныеПроекта = Новый ProjectData;
Иначе
ДанныеПроекта = ДанныеПроекта_;
КонецЕсли;
CommonTools.СообщитьПроцесс("Intermediate result processing check");
БылиОшибки = Ложь;
Расположение = ДанныеПроекта.ПолучитьЗначениеНастройки("paths.configurationSrc");
ОбщийМассивМодулей = Новый Массив;
ФайлыМодулей = НайтиФайлы(Расположение, "*.bsl", Истина);
Для Каждого ФайлМодуля Из ФайлыМодулей Цикл
ПроверитьМодуль(ФайлМодуля);
КонецЦикла;
Если БылиОшибки Тогда
ВызватьИсключение "Processing check failed!";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьМодуль(Знач ФайлМодуля)
ДокументМодуля = Новый ТекстовыйДокумент();
ДокументМодуля.Прочитать(ФайлМодуля.ПолноеИмя);
ТекстМодуля = ДокументМодуля.ПолучитьТекст();
Парсер = Новый ПарсерВстроенногоЯзыка;
СтруктураМодуля = Парсер.Разобрать(ТекстМодуля);
МассивПризнаков = ПолучитьМассивПризнаков(СтруктураМодуля, ДокументМодуля);
Для Каждого Метод Из СтруктураМодуля.Объявления Цикл
Если Метод.Тип = "ОбъявлениеМетода" Тогда
ТекстМетода = ПолучитьТекстМетода(Метод, ДокументМодуля);
ЧислоВхожденийHttp = 0;
Для Каждого Признак Из МассивПризнаков Цикл
ЧислоВхожденийHttp = ЧислоВхожденийHttp + СтрЧислоВхождений(ТекстМетода, Признак);
КонецЦикла;
ЧислоВхожденийОбработка = СтрЧислоВхождений(ТекстМетода, "НормализоватьПромежуточныйРезультат");
ЧислоВхожденийПропуска = СтрЧислоВхождений(ТекстМетода, "!IRPSkip");
Если ЧислоВхожденийОбработка + ЧислоВхожденийПропуска < ЧислоВхожденийHttp - 1 Тогда
БылиОшибки = Истина;
CommonTools.СообщитьПроцесс(СтрШаблон("Intermediate result processing not found: %1.%2"
, ФайлМодуля.Путь
, Метод.Сигнатура.Имя));
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ПолучитьТекстМетода(Знач Метод, Знач ДокументМодуля)
МассивСтрокМетода = Новый Массив;
Для Н = Метод.Начало.НомерСтроки + 1 По Метод.Конец.НомерСтроки - 1 Цикл
МассивСтрокМетода.Добавить(ДокументМодуля.ПолучитьСтроку(Н));
КонецЦикла;
Возврат СтрСоединить(МассивСтрокМетода, Символы.ПС);
КонецФункции
Функция ПолучитьМассивПризнаков(Знач ДанныеМодуля, Знач ТекстовыйДокументМодуля)
СписокФункций = Новый Массив;
КоличествоФункций = 0;
СписокФункций.Добавить("OPI_HTTPКлиент");
СписокФункций.Добавить("OPI_ЗапросыHTTP");
Пока КоличествоФункций <> СписокФункций.Количество() Цикл
КоличествоФункций = СписокФункций.Количество();
Для Каждого Метод Из ДанныеМодуля.Объявления Цикл
Если Метод.Тип = "ОбъявлениеМетода" Тогда
ТекстМетод = ПолучитьТекстМетода(Метод, ТекстовыйДокументМодуля);
ИмяМетода = Метод.Сигнатура.Имя + "(";
Для Каждого Имя Из СписокФункций Цикл
Если СтрНайти(ТекстМетод, Имя) > 0 И СписокФункций.Найти(ИмяМетода) = Неопределено Тогда
СписокФункций.Добавить(ИмяМетода);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат СписокФункций;
КонецФункции
+44
View File
@@ -0,0 +1,44 @@
---
sidebar_position: 3
---
# Работа с версией для 1С:Предприятие
Открытый пакет интеграций изначально разрабатывается как расширение конфигурации для платформы 1С:Предприятие 8. Его методы доступны в виде общих модулей и могут использоваться в любой конфигурации, совместимой с требованиями проекта
:::important
Разработка ведется в режиме совместимости `8.3.10` с вариантом проверки `Предупреждать`. Режим совместимости расширения установлен в `8.3.15`
:::
## Установка
Для начала работы необходимо добавить модули Открытого пакета интеграций в свою конфигурацию. Сделать это можно одним из нескольких способов:
1. Из файла расширения `CFE` (рекомендуемый способ):
Скачайте файл `OpenIntegrations_x.x.x_lang.cfe` из [последнего релиза](https://github.com/Bayselonarrend/OpenIntegrations/releases/latest) или [раздела «Скачать»](/download), после чего загрузите его в список расширений конфигурации через конфигуратор
2. Из XML-выгрузки:
Скачайте архив `XML.zip`, распакуйте его и загрузите расширение через панель расширений, указав каталог с XML-файлами
3. Из проекта EDT:
Скачайте архив `EDT.zip` или подключите исходный проект из репозитория в 1С:EDT. Подробнее в разделе [Сборка из исходников](/docs/Start/Build-from-source)
4. Через сравнение-объединение с CF-файлом конфигурации:
Кроме вариантов поставки в виде расширения, Открытый пакет интеграций также доступен в виде `cf` файла конфигурации. Файл `OpenIntegrations_x.x.x_lang.cf` может быть использован для сравнения-объединения объектов ОПИ с основной конфигурацией, если использование расширения нежелательно или невозможно
Подробное описание каждого варианта поставки приведено в разделе [Про варианты релизов](/docs/Start/Release-variants). Независимо от способа установки рекомендуется получать файлы из релиза, [страницы загрузок](/download) или ветки `stable` репозитория
Также допустимо вручную скопировать нужные общие модули из исходников в свой проект, однако для регулярного обновления удобнее использовать готовые варианты поставки
## Использование на клиенте и на сервере
Начиная с версии `2.1.0`, все основные модули Открытого пакета интеграций доступны как на сервере, так и на клиенте. Однако, в отличии от серверных вызовов, работа с методами ОПИ на клиенте сопряжена с некоторыми особенностями:
+ `Web-клиент` не поддерживается
+ Не поддерживается запуск фоновых заданий через параметр `dontwait` настроек [расширенного вызова](/docs/Start/Advanced-call)
+ При первом вызове функции библиотеки, использующей внешние компоненты, будет произведена их установка. Подробнее в разделе [О внешних компонентах](/docs/Start/Component-requirements)
+1 -1
View File
@@ -1,5 +1,5 @@
---
sidebar_position: 4
sidebar_position: 5
keywords: [1C, 1С, 1С:Предприятие, OneScript, CLI, HTTP, прокси, таймаут, расширенный вызов]
---
+1 -1
View File
@@ -1,5 +1,5 @@
---
sidebar_position: 6
sidebar_position: 7
---
# Об обратной совместимости
+1 -1
View File
@@ -1,5 +1,5 @@
---
sidebar_position: 7
sidebar_position: 8
---
# Сборка из исходников
+7 -1
View File
@@ -1,5 +1,5 @@
---
sidebar_position: 5
sidebar_position: 6
---
# О внешних компонентах
@@ -50,6 +50,12 @@ sidebar_position: 5
<hr/>
## Внешние компоненты `НаКлиенте` в версии для 1С:Предприятие
Работа с методами, использующими внешние компоненты, в версии для 1С:Предприятие доступна как на стороне сервера, так и на стороне клиента. Но, в отличии от серверного варианта, где использование компонент скрыто и происходит бесшовно, в клиентском варианте внешние компоненты требуют обязательной интерактивной установки на конкретной клиентской машине. Этот процесс начинается при первом вызове функции для каждой используемой компоненты и сопровождается выводом диалогового окна, а также исключением с информацией о необходимости вызвать необходимую функцию повторно
Кроме установки компонент по необходимости, все (или выбранные) компоненты могут быть установлены на конкретном клиенте заранее через обработку `Панель управления (ОПИ)`
## FAQ
Некоторые вопросы о работе и реализации внешних компонент, несвязанные напрямую с работой ОПИ
+1 -1
View File
@@ -1,5 +1,5 @@
---
sidebar_position: 3
sidebar_position: 4
---
# Работа с OneScript-версией
@@ -2649,10 +2649,12 @@
OPI_Инструменты.ДобавитьПоле("id", IDКаталога, "Строка", Параметры);
Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры);
Результат = Ответ["result"];
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
Результат = Тело["result"];
Если ЗначениеЗаполнено(Результат) Тогда
ИмяПоля = Результат["field"];
URLЗагрузки = Результат["uploadUrl"];
@@ -548,20 +548,15 @@
OPI_ПреобразованиеТипов.ПолучитьСтроку(UUID);
OPI_ПреобразованиеТипов.ПолучитьБулево(ПолучитьФайл);
URL = СформироватьURL("/print/orders/" + UUID, ТестовыйAPI);
URL = СформироватьURL(СтрШаблон("/print/orders/%1", UUID), ТестовыйAPI);
Заголовки = СоздатьЗаголовкиЗапроса(Токен);
Ответ = OPI_ЗапросыHTTP.Get(URL, , Заголовки);
Если ПолучитьФайл Тогда
Содержимое = Ответ["entity"];
Если Не ЗначениеЗаполнено(Содержимое) Тогда
Возврат Ответ;
КонецЕсли;
URL = Содержимое["url"];
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
URL = OPI_Инструменты.ПолучитьИли(Тело, "entity.url", Неопределено);
Если Не ЗначениеЗаполнено(URL) Тогда
Возврат Ответ;
@@ -652,13 +647,8 @@
Если ПолучитьФайл Тогда
Содержимое = Ответ["entity"];
Если Не ЗначениеЗаполнено(Содержимое) Тогда
Возврат Ответ;
КонецЕсли;
URL = Содержимое["url"];
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
URL = OPI_Инструменты.ПолучитьИли(Тело, "entity.url", Неопределено);
Если Не ЗначениеЗаполнено(URL) Тогда
Возврат Ответ;
@@ -136,6 +136,7 @@
Если ЗначениеЗаполнено(Аккаунт) Тогда
Результат = ПолучитьАккаунт(Токен, Аккаунт);
Иначе
// !IRPSkip
Результат = ПолучитьСвойАккаунт(Токен);
КонецЕсли;
@@ -277,6 +278,7 @@
Если Размер > Граница Тогда
Ответ = ЗагрузитьБольшойФайл(Токен, Файл, Путь, Режим);
Иначе
// !IRPSkip
Ответ = ЗагрузитьМалыйФайл(Токен, Файл, Путь, Режим);
КонецЕсли;
@@ -803,6 +805,7 @@
Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
Ответ = PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки);
Иначе
// !IRPSkip
Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
Ответ = OPI_ЗапросыHTTP.PostСТелом(URL, Параметры, Заголовки);
КонецЕсли;
@@ -859,7 +862,9 @@
ТекущаяПозиция = 0;
ПрочитаноБайт = 0;
ОбщийРазмер = Файл.Размер();
Сессия = ОткрытьСессию(Токен);
// !IRPSkip
Сессия = ОткрытьСессию(Токен);
Если OPI_Инструменты.ЭтоКоллекция(Сессия) Тогда
Возврат Сессия;
@@ -884,7 +889,8 @@
Прервать;
КонецЕсли;
Ответ = PostBinary(URL, ТекущиеДанные, Заголовки);
// !IRPSkip
PostBinary(URL, ТекущиеДанные, Заголовки);
ТекущаяПозиция = СледующаяПозиция;
@@ -932,8 +938,9 @@
Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
Ответ = PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки);
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
Сессия = Ответ[SessionId];
Сессия = Тело[SessionId];
Если Сессия = Неопределено Тогда
Сессия = Ответ;
@@ -651,7 +651,8 @@
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
Существующее = ЗначениеЗаполнено(Событие);
URL = "https://www.googleapis.com/calendar/v3/calendars/"
URL = "https://www.googleapis.com/calendar/v3/calendars/"
+ Календарь
+ "/events"
+ ?(Существующее, "/" + Событие, "");
@@ -680,6 +681,7 @@
OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры);
// !IRPSkip
Если Существующее Тогда
Ответ = OPI_ЗапросыHTTP.PatchСТелом(URL, Параметры, Заголовки, Истина);
Иначе
@@ -703,9 +705,11 @@
Результат = OPI_ЗапросыHTTP.Get("https://www.googleapis.com/calendar/v3/users/me/calendarList"
, Параметры
, Заголовки);
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Результат);
Календари = Результат[Items];
Страница = Результат[NPT];
Календари = Тело[Items];
Страница = Тело[NPT];
Для Каждого Календарь Из Календари Цикл
МассивКалендарей.Добавить(Календарь);
@@ -731,8 +735,10 @@
, Параметры
, Заголовки);
События = Результат[Items];
Страница = Результат[NPT];
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Результат);
События = Тело[Items];
Страница = Тело[NPT];
Для Каждого Событие Из События Цикл
МассивСобытий.Добавить(Событие);
@@ -184,6 +184,7 @@
Отбор.Добавить("name contains '" + ИмяСодержит + "'");
КонецЕсли;
// !IRPSkip
ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, Подробно, Отбор);
Если Подробно Тогда
@@ -559,9 +560,10 @@
КонецЕсли;
Результат = OPI_ЗапросыHTTP.Get(URL, Параметры, Заголовки);
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Результат);
Объекты = Результат[Files];
Страница = Результат[NPT];
Объекты = Тело[Files];
Страница = Тело[NPT];
Для Каждого ТекущийОбъект Из Объекты Цикл
МассивОбъектов.Добавить(ТекущийОбъект);
@@ -638,7 +640,9 @@
MimeType = "mimeType";
Если ЗначениеЗаполнено(Идентификатор) Тогда
MIME = ПолучитьИнформациюОбОбъекте(Токен, Идентификатор)[MimeType];
Информация = ПолучитьИнформациюОбОбъекте(Токен, Идентификатор);
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Информация);
MIME = Тело[MimeType];
Иначе
MIME = Описание["MIME"];
КонецЕсли;
@@ -663,11 +667,13 @@
Если Размер < РазмерЧасти И ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда
Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор);
Иначе
// !IRPSkip
Ответ = ЗагрузитьБольшойФайл(Описание, СоответствиеФайла, Заголовки, Идентификатор);
КонецЕсли;
Иначе
Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор);
// !IRPSkip
Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор);
КонецЕсли;
Возврат Ответ;
@@ -719,6 +725,7 @@
HttpКлиент = OPI_ЗапросыHTTP.НовыйЗапрос().Инициализировать(URL);
// !IRPSkip
Ответ = HttpКлиент.УстановитьЗаголовки(Заголовки)
.УстановитьJsonТело(Описание)
.ОбработатьЗапрос(Метод)
@@ -727,6 +734,7 @@
АдресЗагрузки = Ответ.Заголовки["Location"];
Если Не ЗначениеЗаполнено(АдресЗагрузки) Тогда
// !IRPSkip
Возврат HttpКлиент.ВернутьОтветКакJSONКоллекцию(Истина, Истина);
КонецЕсли;
@@ -908,7 +908,9 @@
Если Удалять Тогда
IDУведомления = Ответ["receiptId"];
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
IDУведомления = Тело["receiptId"];
Если ЗначениеЗаполнено(IDУведомления) Тогда
Ответ.Вставить("deleting", УдалитьУведомление(ПараметрыДоступа, IDУведомления));
@@ -192,6 +192,7 @@
URL = "https://neocities.org/api/upload";
Заголовки = СоздатьЗаголовкиЗапроса(Токен);
// !IRPSkip
КонечныйОтвет = OPI_ЗапросыHTTP.PostMultipart(URL
,
, ОбработанноеСоответствие
@@ -292,8 +293,9 @@
КонецЕсли;
УдаленныеФайлы = ПолучитьСписокФайлов(Токен, УдаленныйКаталог);
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(УдаленныеФайлы);
Если Не УдаленныеФайлы["result"] = "success" Тогда
Если Не Тело["result"] = "success" Тогда
//@skip-check constructor-function-return-section
Возврат УдаленныеФайлы;
КонецЕсли;
@@ -368,8 +370,9 @@
Если Не МассивУдаляемых.Количество() = 0 Тогда
Ответ = УдалитьВыбранныеФайлы(Токен, МассивУдаляемых);
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
Если Не Ответ["result"] = "success" Тогда
Если Не Тело["result"] = "success" Тогда
МассивОшибок.Добавить(Ответ);
Иначе
@@ -392,8 +395,9 @@
Для Каждого ЛокальныйПуть Из ЛокальныеПути Цикл
Ответ = ЗагрузитьФайл(Токен, ЛокальныйПуть.Ключ, ЛокальныйПуть.Значение);
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
Если Не Ответ["result"] = "success" Тогда
Если Не Тело["result"] = "success" Тогда
МассивОшибок.Добавить(Ответ);
@@ -103,6 +103,7 @@
ДобавитьРодителяСтраницы(Родитель, Истина, Параметры);
// !IRPSkip
Свойства = ЗаполнитьДанныеПоСхеме(Родитель, Данные, Токен);
Параметры.Вставить("properties", Свойства);
@@ -167,10 +168,14 @@
Files = "files";
Если ЗначениеЗаполнено(Данные)
И (ТипЗнч(Данные) = Тип("Соответствие") Или ТипЗнч(Данные) = Тип("Структура")) Тогда
Свойства = ЗаполнитьДанныеПоСхеме(Страница, Данные, Токен, Ложь);
И (ТипЗнч(Данные) = Тип("Соответствие")
Или ТипЗнч(Данные) = Тип("Структура")) Тогда
// !IRPSkip
Свойства = ЗаполнитьДанныеПоСхеме(Страница, Данные, Токен, Ложь);
Иначе
Свойства = Новый Соответствие;
Свойства = Новый Соответствие;
КонецЕсли;
Если ЗначениеЗаполнено(Иконка) Тогда
@@ -354,8 +359,11 @@
ПреобразоватьИД(Родитель);
Если ТипЗнч(Блок) = Тип("Строка") Тогда
ПреобразоватьИД(Блок);
Блок = ВернутьБлок(Токен, Блок);
Блок = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Блок);
КонецЕсли;
МассивБлоков = Новый Массив;
@@ -654,6 +662,8 @@
ДанныеСхемы = ПолучитьСтраницу(Токен, Схема);
КонецЕсли;
ДанныеСхемы = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(ДанныеСхемы);
ПоляБазы = ДанныеСхемы["properties"];
Свойства = Новый Соответствие;
@@ -595,7 +595,8 @@
Ответ = ЗагрузитьОбъектЧастями(Наименование, Бакет, Содержимое, ОсновныеДанные_, Заголовки, Размеры, Каталог);
Иначе
// !IRPSkip
Ответ = ЗагрузитьОбъектЦеликом(Наименование, Бакет, Содержимое, ОсновныеДанные_, Заголовки, Каталог);
КонецЕсли;
@@ -836,7 +837,8 @@
ОсновныеДанные_ = OPI_Инструменты.КопироватьКоллекцию(ОсновныеДанные);
ЗаполнитьURLОбъекта(ОсновныеДанные_, Наименование, Бакет, Версия, Каталог);
Ответ = ОтправитьЗапросБезТела("HEAD", ОсновныеДанные_, , Заголовки);
Ответ = ОтправитьЗапросБезТела("HEAD", ОсновныеДанные_, , Заголовки);
Ответ["response"] = Новый Структура;
Возврат Ответ;
@@ -871,6 +873,7 @@
, Знач ПутьСохранения = ""
, Знач Каталог = Ложь) Экспорт
// !IRPSkip
ОсновныеДанные_ = OPI_Инструменты.КопироватьКоллекцию(ОсновныеДанные);
ИнформацияОбъекта = ПолучитьОписаниеОбъекта(Наименование, Бакет, ОсновныеДанные_, Версия, , Каталог);
@@ -899,6 +902,7 @@
Иначе
// !IRPSkip
Ответ = ПолучитьОбъектЦеликом(ОсновныеДанные_, Заголовки, ПутьСохранения);
КонецЕсли;
@@ -1370,6 +1374,8 @@
ТелоОтвета = ?(ОжидаютсяДвоичные
, Ответ.ВернутьОтветКакДвоичныеДанные(Ложь, Истина)
, Ответ.ВернутьОтветКакСтроку(Ложь, Истина));
ТелоОтвета = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(ТелоОтвета);
Ответ = ОформитьОтвет(HTTPОтвет, ТелоОтвета);
@@ -1444,6 +1450,7 @@
ЗаголовокИсточника.Вставить("Range", ЗаголовокУчастка);
ДобавитьДополнительныеЗаголовки(Заголовки, ЗаголовокИсточника);
// !IRPSkip
ПромежуточныйРезультат = ПолучитьОбъектЦеликом(ОсновныеДанные, ЗаголовокИсточника);
ЗаписьФайла.Записать(ПромежуточныйРезультат);
@@ -1509,6 +1516,7 @@
OPI_ПреобразованиеТипов.ПолучитьДвоичныеИлиПоток(Содержимое);
НачалоЗагрузки = ИнициализироватьЗагрузкуЧастями(Наименование, Бакет, ОсновныеДанные, Заголовки, Каталог);
ТелоНачала = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(НачалоЗагрузки);
ПолеID = "response.InitiateMultipartUploadResult.UploadId";
IDЗагрузки = Неопределено;
@@ -1517,7 +1525,7 @@
ПрочитаноБайт = 0;
НомерЧасти = 1;
Если Не OPI_Инструменты.ПолеКоллекцииСуществует(НачалоЗагрузки, ПолеID, IDЗагрузки) Тогда
Если Не OPI_Инструменты.ПолеКоллекцииСуществует(ТелоНачала, ПолеID, IDЗагрузки) Тогда
Возврат НачалоЗагрузки;
КонецЕсли;
@@ -1550,6 +1558,8 @@
, НомерЧасти
, ТекущиеДанные
, Каталог);
Ответ = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
Если Ответ["status"] > ПоследнийКодУспеха Тогда
ВызватьИсключение "Сервер вернул статус " + Строка(Ответ["status"]);
@@ -1600,6 +1610,7 @@
Если Ошибка Тогда
Ответ = ОтменитьЗагрузкуЧастями(Наименование, Бакет, ОсновныеДанные, IDЗагрузки, , Каталог);
Иначе
// !IRPSkip
Ответ = ЗавершитьЗагрузкуЧастями(Наименование, Бакет, ОсновныеДанные, IDЗагрузки, МассивТегов, , Каталог);
КонецЕсли;
@@ -725,9 +725,11 @@
OPI_Инструменты.ДобавитьПоле("filename", ИмяФайла, Строка_, Параметры);
OPI_Инструменты.ДобавитьПоле("length" , Размер , Строка_, Параметры);
Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры, Заголовки);
URL = Ответ[Upload_url];
Идентификатор = Ответ[File_id];
Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры, Заголовки);
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
URL = Тело[Upload_url];
Идентификатор = Тело[File_id];
Если Не ЗначениеЗаполнено(URL) Или Не ЗначениеЗаполнено(Идентификатор) Тогда
Возврат Ответ;
@@ -736,6 +738,7 @@
Файлы = Новый Соответствие;
Файлы.Вставить(ИмяФайла, Файл);
// !IRPSkip
Ответ = OPI_ЗапросыHTTP.PostMultipart(URL, , Файлы, , Заголовки);
URL = "https://slack.com/api/files.completeUploadExternal";
ФайлСлак = Новый Структура("id, title", Идентификатор, Заголовок);
@@ -994,6 +997,7 @@
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("channel", Канал, "Строка", Параметры);
// !IRPSkip
Если ВидЗапроса = "POST" Тогда
Ответ = OPI_ЗапросыHTTP.PostСТелом(URL, Параметры, Заголовки);
Иначе
@@ -1012,6 +1016,7 @@
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("file", ИдентификаторФайла , "Строка", Параметры);
// !IRPSkip
Если ВидЗапроса = "POST" Тогда
Ответ = OPI_ЗапросыHTTP.PostСТелом(URL, Параметры, Заголовки);
Иначе
@@ -167,8 +167,6 @@
// ДвоичныеДанные - данные файла
Функция СкачатьФайл(Знач Токен, Знач IDФайла) Экспорт
Result = "result";
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла);
@@ -177,11 +175,11 @@
URL = СтрШаблон("api.telegram.org/bot%1/getFile", Токен);
Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры);
OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
Ответ = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
Путь = Ответ[Result]["file_path"];
Путь = Неопределено;
Если Не ЗначениеЗаполнено(Путь) Тогда
Если Не OPI_Инструменты.ПолеКоллекцииСуществует(Ответ, "result.file_path", Путь) Тогда
Загружен = Ложь;
@@ -189,9 +187,10 @@
OPI_Инструменты.Пауза(Н);
Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры);
Путь = Ответ[Result]["file_path"];
Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры);
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
Путь = OPI_Инструменты.ПолучитьИли(Тело, "result.file_path", Неопределено);
Загружен = ЗначениеЗаполнено(Путь);
Если Загружен Тогда
@@ -136,6 +136,7 @@
Для Каждого КартинкаПоста Из МассивКартинок Цикл
// !IRPSkip
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
ОтветСоответствие = ПолучитьСоответствиеКартинки(КартинкаПоста, Параметры_, "Пост");
@@ -249,8 +250,10 @@
Параметры_.Вставить("add_answers", Ответы);
Параметры_.Вставить("question" , Вопрос);
Опрос = OPI_ЗапросыHTTP.Get("api.vk.com/method/polls.create", Параметры_);
ОпросСоответствие = Опрос.Получить(Response_);
Опрос = OPI_ЗапросыHTTP.Get("api.vk.com/method/polls.create", Параметры_);
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Опрос);
ОпросСоответствие = Тело.Получить(Response_);
Если Не ЗначениеЗаполнено(ОпросСоответствие) Тогда
Возврат Опрос;
@@ -275,6 +278,7 @@
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Картинка);
// !IRPSkip
ОтветСоответствие = ПолучитьСоответствиеКартинки(Картинка, Параметры_, "Пост");
OwnerId = ОтветСоответствие.Получить("owner_id");
@@ -451,8 +455,9 @@
OPI_Инструменты.ДобавитьПоле("album_id" , Альбом , Строка_, Параметры);
Ответ = OPI_ЗапросыHTTP.Get("api.vk.com/method/video.save", Параметры);
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
Результат = Ответ["response"];
Результат = Тело["response"];
Если Не ЗначениеЗаполнено(Результат) Тогда
Возврат Ответ;
@@ -507,7 +512,8 @@
Файлы.Вставить(КлючКартинка, Картинка);
Ответ = OPI_ЗапросыHTTP.Get(Загрузка, Параметры);
Результат = Ответ[Response_];
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
Результат = Тело[Response_];
Если ЗначениеЗаполнено(Результат) Тогда
@@ -526,12 +532,13 @@
Для Н = 1 По 5 Цикл
Ответ = OPI_ЗапросыHTTP.PostMultipart(URL, Параметры, Файлы);
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
Если ТипЗнч(Ответ) <> Тип("Соответствие") Тогда
Если ТипЗнч(Тело) <> Тип("Соответствие") Тогда
Продолжить;
КонецЕсли;
Успех = ЗаполнитьПараметрыЗагрузкиФото(Метод, Ответ, Параметры);
Успех = ЗаполнитьПараметрыЗагрузкиФото(Метод, Тело, Параметры);
Если Не Успех Тогда
Продолжить;
@@ -772,8 +779,10 @@
СтрокаНомеров = СтрСоединить(МассивНабора, ",");
Параметры_.Вставить("post_ids", СтрокаНомеров);
Статистика = OPI_ЗапросыHTTP.Get("api.vk.com/method/stats.getPostReach", Параметры_);
МассивСтатистики = Статистика[Response_];
Статистика = OPI_ЗапросыHTTP.Get("api.vk.com/method/stats.getPostReach", Параметры_);
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Статистика);
МассивСтатистики = Тело[Response_];
Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл
МассивОтветов.Добавить(ЭлементСтатистики);
@@ -789,7 +798,8 @@
Параметры_.Вставить("post_ids", СтрокаНомеров);
Статистика = OPI_ЗапросыHTTP.Get("api.vk.com/method/stats.getPostReach", Параметры_);
МассивСтатистики = Статистика[Response_];
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Статистика);
МассивСтатистики = Тело[Response_];
Если ТипЗнч(МассивСтатистики) = Тип("Массив") Тогда
Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл
@@ -981,8 +991,10 @@
Response_ = "response";
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
Ответ = OPI_ЗапросыHTTP.Get("api.vk.com/method/market.getCategories", Параметры_);
Результат = Ответ[Response_];
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
Результат = Тело[Response_];
Если ЗначениеЗаполнено(Результат) Тогда
@@ -997,8 +1009,10 @@
КонецЕсли;
Параметры_.Вставить("count", Количество);
Ответ = OPI_ЗапросыHTTP.Get("api.vk.com/method/market.getCategories", Параметры_);
Результат = Ответ[Response_];
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
Результат = Тело[Response_];
Если ЗначениеЗаполнено(Результат) Тогда
@@ -1702,7 +1716,8 @@
Функция ПолучитьСоответствиеКартинки(Знач Картинка, Знач Параметры, Знач Вид)
Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры, Вид);
ОтветМассив = Ответ.Получить("response");
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
ОтветМассив = Тело.Получить("response");
Если Не ЗначениеЗаполнено(ОтветМассив) Или Не ТипЗнч(ОтветМассив) = Тип("Массив") Тогда
Возврат Ответ;
@@ -197,6 +197,7 @@
Если Не ЗначениеЗаполнено(Размер) Тогда
Ответ = OPI_ЗапросыHTTP.Get(URL);
Ответ = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
Размер = Ответ.Размер();
КонецЕсли;
@@ -144,8 +144,9 @@
Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
Ответ = OPI_ЗапросыHTTP.PutСТелом(URL + Параметры, , Заголовки, Ложь);
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
URLОтвета = Ответ[Href];
URLОтвета = Тело[Href];
Если Не ЗначениеЗаполнено(URLОтвета) Тогда
Возврат Ответ;
@@ -229,8 +230,9 @@
Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
Ответ = OPI_ЗапросыHTTP.PostСТелом(URL + Параметры, , Заголовки, Ложь);
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
URLОтвета = Ответ[Href];
URLОтвета = Тело[Href];
Если Не ЗначениеЗаполнено(URLОтвета) Тогда
Возврат Ответ;
@@ -400,7 +402,8 @@
Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
Ответ = OPI_ЗапросыHTTP.PostСТелом(URL + Параметры, , Заголовки, Ложь);
URLОтвета = Ответ[Href];
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
URLОтвета = Тело[Href];
Если Не ЗначениеЗаполнено(URLОтвета) Тогда
Возврат Ответ;
@@ -699,8 +702,9 @@
Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
Ответ = OPI_ЗапросыHTTP.PostСТелом(Адрес + Параметры, , Заголовки, Ложь);
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
URLОтвета = Ответ[Href];
URLОтвета = Тело[Href];
Если Не ЗначениеЗаполнено(URLОтвета) Тогда
Возврат Ответ;
@@ -734,8 +738,9 @@
Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
Ответ = OPI_ЗапросыHTTP.PutСТелом(URL + Параметры, , Заголовки, Ложь);
Тело = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Ответ);
URLОтвета = Ответ[Href];
URLОтвета = Тело[Href];
Если Не ЗначениеЗаполнено(URLОтвета) Тогда
Возврат Ответ;
@@ -55,6 +55,8 @@
Если OPI_Инструменты.ЭтоOneScript() Тогда
// !IRPSkip
//@skip-check property-not-writable
//@skip-check bsl-legacy-check-static-feature-access
Обработки = Неопределено;
@@ -65,6 +67,7 @@
Иначе
#Если НаКлиенте Тогда
// !IRPSkip
HTTPКлиент = ПолучитьФорму("Обработка.OPI_HTTPКлиент.Форма.ОбъектКлиентскогоВызова");
#Иначе
HTTPКлиент = Обработки.OPI_HTTPКлиент.Создать(); // !OPI
@@ -59,15 +59,22 @@
Значение = ПолучитьДвоичныеДанныеИзСтроки(Значение);
Иначе
// !IRPSkip
ПолучитьСтроку(Значение);
// !IRPSkip
ПреобразоватьИсточникВЗначение(Значение, ПопыткаB64);
КонецЕсли;
Исключение
Если Безусловно Тогда
// !IRPSkip
ПолучитьСтроку(Значение);
Значение = ПолучитьДвоичныеДанныеИзСтроки(Значение);
Иначе
ВызватьИсключение "Ошибка получения двоичных данных из параметра: " + ОписаниеОшибки();
КонецЕсли;
@@ -83,11 +90,14 @@
КонецЕсли;
Если ТипЗнч(Значение) <> Тип("Строка") Тогда
// !IRPSkip
ПолучитьДвоичныеДанные(Значение);
Возврат;
КонецЕсли;
ЗначениеУП = Значение;
// !IRPSkip
ВернутьУправляющиеПоследовательности(ЗначениеУП);
Файл = Новый Файл(ЗначениеУП);
@@ -127,6 +137,8 @@
КонецЕсли;
ЗначениеУП = Значение;
// !IRPSkip
ВернутьУправляющиеПоследовательности(ЗначениеУП);
Файл = Новый Файл(ЗначениеУП);
@@ -142,6 +154,7 @@
Или СтрНачинаетсяС(СокрЛ(ЗначениеУП), "https://")) Тогда
Значение = ПолучитьHttpКлиент().Get(ЗначениеУП);
Значение = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Значение);
Иначе
@@ -239,6 +252,8 @@
КонецЕсли;
ЗначениеУП = Значение;
// !IRPSkip
ВернутьУправляющиеПоследовательности(ЗначениеУП);
Файл = Новый Файл(ЗначениеУП);
@@ -253,6 +268,7 @@
Или СтрНачинаетсяС(СокрЛ(ЗначениеУП), "https://") Тогда
Значение = ПолучитьHttpКлиент().Get(ЗначениеУП);
Значение = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Значение);
ПолучитьСтроку(Значение);
Иначе
@@ -521,6 +537,8 @@
Процедура ПреобразоватьИсточникВЗначение(Значение, ПопыткаB64)
ЗначениеУП = Значение;
// !IRPSkip
ВернутьУправляющиеПоследовательности(ЗначениеУП);
Файл = Новый Файл(ЗначениеУП);
@@ -533,6 +551,7 @@
Или СтрНачинаетсяС(СокрЛ(ЗначениеУП), "https://") Тогда
Значение = ПолучитьHttpКлиент().Get(ЗначениеУП);
Значение = OPI_РасширенныйВызов.НормализоватьПромежуточныйРезультат(Значение);
Иначе
@@ -571,21 +590,27 @@
Если ЭтоOneScript() Тогда
Попытка
// !IRPSkip
// !OInt OPI_ЗапросыHTTP = Неопределено;
Возврат Неопределено; // !OPI
Исключение
// !IRPSkip
Возврат OPI_ЗапросыHTTP;
КонецПопытки;
// !IRPSkip
// !OInt ПутьКлиента = ПолучитьПутьHttpКлиента();
// !OInt Попытка ПодключитьСценарий(ПутьКлиента, "OPI_ЗапросыHTTP"); Исключение КонецПопытки;
// !IRPSkip
//@skip-check bsl-legacy-check-string-literal
//@skip-check bsl-legacy-check-method-for-statements-after-return
HttpКлиент = Новый("OPI_ЗапросыHTTP");
Возврат HttpКлиент;
Иначе
// !IRPSkip
Возврат OPI_ЗапросыHTTP; // !OPI
КонецЕсли;
@@ -233,18 +233,20 @@
КонецФункции
Процедура НормализоватьПромежуточныйРезультат(Результат) Экспорт
Функция НормализоватьПромежуточныйРезультат(Знач Результат) Экспорт
НормализованныйРезультат = Неопределено;
Если OPI_Инструменты.ПолучитьИли(ПолучитьТекущиеНастройки(), "adv_response", Ложь)
И OPI_Инструменты.ПолеКоллекцииСуществует(Результат, "body", НормализованныйРезультат) Тогда
Результат = НормализованныйРезультат;
Возврат НормализованныйРезультат;
КонецЕсли;
Возврат Результат;
КонецПроцедуры
КонецФункции
Процедура УдалитьНастройки() Экспорт
@@ -3532,7 +3532,9 @@
Процедура Bitrix24_СоздатьПользователя(ПараметрыФункции)
URL = ПараметрыФункции["Bitrix24_URL"];
Почта = Строка(Новый УникальныйИдентификатор) + "@example.org";
Почта = "example@mail.ru";
Почта = Строка(Новый УникальныйИдентификатор) + "@mail.org"; // SKIP
// Полную структуру можно получить функцией ПолучитьСтруктуруПользователя
@@ -3546,7 +3548,8 @@
URL = ПараметрыФункции["Bitrix24_Domain"];
Токен = ПараметрыФункции["Bitrix24_Token"];
Почта = Строка(Новый УникальныйИдентификатор) + "@example.org";
Почта = Строка(Новый УникальныйИдентификатор) + "@mail.org"; // SKIP
СтруктураПользователя = Новый Структура;
СтруктураПользователя.Вставить("EMAIL" , Почта);