This commit is contained in:
Anton Titovets
2026-02-10 17:00:14 +03:00
parent 7e1c599c5e
commit b1b9c9d7a5
11 changed files with 0 additions and 9133 deletions
@@ -1,385 +0,0 @@
// OneScript: ./OInt/tools/Modules/OPI_ЗапросыHTTP.os
// MIT License
// Copyright (c) 2023-2026 Anton Tsitavets
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
// BSLLS:Typo-off
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// BSLLS:UnusedLocalVariable-off
// BSLLS:UsingServiceTag-off
// BSLLS:NumberOfOptionalParams-off
// BSLLS:UsingSynchronousCalls-off
//@skip-check module-unused-local-variable
//@skip-check method-too-many-params
//@skip-check module-structure-top-region
//@skip-check module-structure-method-in-regions
//@skip-check wrong-string-literal-content
//@skip-check use-non-recommended-method
// Раскомментировать, если выполняется OneScript
#Использовать "./internal"
#Использовать "../../main"
#Область ПрограммныйИнтерфейс
// Новый запрос
// Создает новый объект для работы с HTTP
//
// Возвращаемое значение:
// ОбработкаОбъект.OPI_HTTPКлиент - Объект обработки
Функция НовыйЗапрос() Экспорт
Если OPI_Инструменты.ЭтоOneScript() Тогда
//@skip-check property-not-writable
//@skip-check bsl-legacy-check-static-feature-access
Обработки = Неопределено;
ИмяТипа = "OPI_HTTPКлиент";
HTTPКлиент = Новый(ИмяТипа);
Иначе
HTTPКлиент = Обработки.OPI_HTTPКлиент.Создать();
КонецЕсли;
Возврат HTTPКлиент;
КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
#Область ЗапросыБезТела
Функция Get(Знач URL
, Знач Параметры = ""
, Знач ДопЗаголовки = ""
, Знач ФайлОтвета = Неопределено
, Знач ПолныйОтвет = Ложь) Экспорт
Возврат ВыполнитьЗапросБезТела(URL, "GET", Параметры, ДопЗаголовки, ФайлОтвета, ПолныйОтвет);
КонецФункции
Функция Head(Знач URL
, Знач Параметры = ""
, Знач ДопЗаголовки = ""
, Знач ФайлОтвета = Неопределено
, Знач ПолныйОтвет = Ложь) Экспорт
Возврат ВыполнитьЗапросБезТела(URL, "HEAD", Параметры, ДопЗаголовки, ФайлОтвета, ПолныйОтвет);
КонецФункции
Функция Delete(Знач URL
, Знач Параметры = ""
, Знач ДопЗаголовки = ""
, Знач ФайлОтвета = Неопределено
, Знач ПолныйОтвет = Ложь) Экспорт
Возврат ВыполнитьЗапросБезТела(URL, "DELETE", Параметры, ДопЗаголовки, ФайлОтвета, ПолныйОтвет);
КонецФункции
#КонецОбласти
#Область ЗапросыСТелом
Функция PostСТелом(Знач URL
, Знач Параметры = ""
, Знач ДопЗаголовки = ""
, Знач JSON = Истина
, Знач ПолныйОтвет = Ложь
, Знач ФайлОтвета = Неопределено) Экспорт
Возврат ВыполнитьЗапросСТелом(URL, "POST", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета);
КонецФункции
Функция PatchСТелом(Знач URL
, Знач Параметры = ""
, Знач ДопЗаголовки = ""
, Знач JSON = Истина
, Знач ПолныйОтвет = Ложь
, Знач ФайлОтвета = Неопределено) Экспорт
Возврат ВыполнитьЗапросСТелом(URL, "PATCH", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета);
КонецФункции
Функция PutСТелом(Знач URL
, Знач Параметры = ""
, Знач ДопЗаголовки = ""
, Знач JSON = Истина
, Знач ПолныйОтвет = Ложь
, Знач ФайлОтвета = Неопределено) Экспорт
Возврат ВыполнитьЗапросСТелом(URL, "PUT", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета);
КонецФункции
Функция DeleteСТелом(Знач URL
, Знач Параметры = ""
, Знач ДопЗаголовки = ""
, Знач JSON = Истина
, Знач ПолныйОтвет = Ложь
, Знач ФайлОтвета = Неопределено) Экспорт
Возврат ВыполнитьЗапросСТелом(URL, "DELETE", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета);
КонецФункции
#КонецОбласти
#Область ЗапросыMultipart
Функция PostMultipart(Знач URL
, Знач Параметры = ""
, Знач Файлы = ""
, Знач ТипКонтента = "image/jpeg"
, Знач ДопЗаголовки = ""
, Знач ФайлОтвета = Неопределено) Экспорт
HttpКлиент = НовыйЗапрос()
.Инициализировать(URL)
.УстановитьЗаголовки(ДопЗаголовки)
.УстановитьФайлОтвета(ФайлОтвета)
.НачатьЗаписьТелаMultipart();
Если ЗначениеЗаполнено(Файлы) Тогда
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Файлы);
//@skip-check bsl-legacy-check-for-each-statetement-collection
Для Каждого Файл Из Файлы Цикл
СтруктураИнформации = РазобратьКлючФайла(Файл.Ключ, ТипКонтента);
ИмяПоля = СтруктураИнформации["ИмяПоля"];
ИмяФайла = СтруктураИнформации["ИмяФайла"];
HttpКлиент.ДобавитьФайлMultipartFormData(ИмяПоля, ИмяФайла, Файл.Значение, ТипКонтента);
КонецЦикла;
КонецЕсли;
Если ЗначениеЗаполнено(Параметры) Тогда
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Параметры);
//@skip-check bsl-legacy-check-for-each-statetement-collection
Для Каждого Параметр Из Параметры Цикл
HttpКлиент.ДобавитьПолеMultipartFormData(Параметр.Ключ, Параметр.Значение);
КонецЦикла;
КонецЕсли;
HttpКлиент.ОбработатьЗапрос("POST");
Результат = HttpКлиент.ВернутьОтветКакJSONКоллекцию(Истина, Истина);
Если HttpКлиент.Ошибка Тогда
ВызватьИсключение HttpКлиент.ПолучитьЛог(Истина);
Иначе
Возврат Результат;
КонецЕсли;
КонецФункции
Функция PutMultipart(Знач URL
, Знач Параметры = ""
, Знач Файлы = ""
, Знач ТипКонтента = "image/jpeg"
, Знач ДопЗаголовки = ""
, Знач ФайлОтвета = Неопределено) Экспорт
Возврат ВыполнитьЗапросМультипарт(URL, "PUT", Параметры, Файлы, ТипКонтента, ДопЗаголовки, ФайлОтвета);
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ВыполнитьЗапросСТелом(Знач URL
, Знач Вид
, Знач Параметры = ""
, Знач ДопЗаголовки = ""
, Знач JSON = Истина
, Знач ПолныйОтвет = Ложь
, Знач ФайлОтвета = Неопределено)
ЧислоПопыток = 5;
HttpКлиент = НовыйЗапрос()
.Инициализировать(URL)
.УстановитьЗаголовки(ДопЗаголовки)
.УстановитьФайлОтвета(ФайлОтвета)
.МаксимумПопыток(ЧислоПопыток);
Если JSON Тогда
HttpКлиент.УстановитьJsonТело(Параметры);
Иначе
HttpКлиент.УстановитьFormТело(Параметры);
КонецЕсли;
HttpКлиент.ОбработатьЗапрос(Вид);
Если ПолныйОтвет Тогда
Результат = HttpКлиент.ВернутьОтвет(Ложь, Истина);
Иначе
Результат = HttpКлиент.ВернутьОтветКакJSONКоллекцию(Истина, Истина);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ВыполнитьЗапросБезТела(Знач URL
, Знач Вид
, Знач Параметры = ""
, Знач ДопЗаголовки = ""
, Знач ФайлОтвета = Неопределено
, Знач ПолныйОтвет = Ложь)
ЧислоПопыток = 5;
HttpКлиент = НовыйЗапрос()
.Инициализировать(URL)
.УстановитьПараметрыURL(Параметры)
.УстановитьЗаголовки(ДопЗаголовки)
.УстановитьФайлОтвета(ФайлОтвета)
.МаксимумПопыток(ЧислоПопыток)
.ОбработатьЗапрос(Вид);
Если ПолныйОтвет Тогда
Результат = HttpКлиент.ВернутьОтвет(Ложь, Истина);
Иначе
Результат = HttpКлиент.ВернутьОтветКакJSONКоллекцию(Истина, Истина);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ВыполнитьЗапросМультипарт(Знач URL
, Знач Вид
, Знач Параметры = ""
, Знач Файлы = ""
, Знач ТипКонтента = "image/jpeg"
, Знач ДопЗаголовки = ""
, Знач ФайлОтвета = Неопределено)
ЧислоПопыток = 5;
HttpКлиент = НовыйЗапрос()
.Инициализировать(URL)
.УстановитьЗаголовки(ДопЗаголовки)
.УстановитьФайлОтвета(ФайлОтвета)
.МаксимумПопыток(ЧислоПопыток)
.НачатьЗаписьТелаMultipart();
//@skip-check bsl-legacy-check-for-each-statetement-collection
Для Каждого Файл Из Файлы Цикл
СтруктураИнформации = РазобратьКлючФайла(Файл.Ключ, ТипКонтента);
ИмяПоля = СтруктураИнформации["ИмяПоля"];
ИмяФайла = СтруктураИнформации["ИмяФайла"];
HttpКлиент.ДобавитьФайлMultipartFormData(ИмяПоля, ИмяФайла, Файл.Значение, ТипКонтента);
КонецЦикла;
//@skip-check bsl-legacy-check-for-each-statetement-collection
Для Каждого Параметр Из Параметры Цикл
HttpКлиент.ДобавитьПолеMultipartFormData(Параметр.Ключ, Параметр.Значение);
КонецЦикла;
Результат = HttpКлиент.ОбработатьЗапрос("POST").ВернутьОтветКакJSONКоллекцию(Истина, Истина);
Возврат Результат;
КонецФункции
Функция РазобратьКлючФайла(Знач ДанныеФайла, Знач ТипКонтента)
ЗаменаТочки = "___";
ИмяФайла = СтрЗаменить(ДанныеФайла, ЗаменаТочки, ".");
МассивИмени = СтрРазделить(ИмяФайла, "|", Ложь);
ЧастейИмени = 2;
Если МассивИмени.Количество() = ЧастейИмени Тогда
ИмяПоля = МассивИмени[0];
ИмяФайла = МассивИмени[1];
Иначе
Если ТипКонтента = "image/jpeg" Тогда
ИмяПоля = "photo";
Иначе
ИмяПоля = Лев(ИмяФайла, СтрНайти(ИмяФайла, ".") - 1);
ИмяПоля = ?(ЗначениеЗаполнено(ИмяПоля), ИмяПоля, СтрЗаменить(ДанныеФайла, ЗаменаТочки, "."));
КонецЕсли;
КонецЕсли;
СтруктураВозврата = Новый Структура("ИмяПоля,ИмяФайла", ИмяПоля, ИмяФайла);
Возврат СтруктураВозврата;
КонецФункции
#КонецОбласти
#Region Alternate
Function NewRequest() Export
Return НовыйЗапрос();
EndFunction
Function PostWithBody(Val URL, Val Parameters = "", Val AdditionalHeaders = "", Val JSON = True, Val FullResponse = False, Val ResponseFile = Undefined) Export
Return PostСТелом(URL, Parameters, AdditionalHeaders, JSON, FullResponse, ResponseFile);
EndFunction
Function PatchWithBody(Val URL, Val Parameters = "", Val AdditionalHeaders = "", Val JSON = True, Val FullResponse = False, Val ResponseFile = Undefined) Export
Return PatchСТелом(URL, Parameters, AdditionalHeaders, JSON, FullResponse, ResponseFile);
EndFunction
Function PutWithBody(Val URL, Val Parameters = "", Val AdditionalHeaders = "", Val JSON = True, Val FullResponse = False, Val ResponseFile = Undefined) Export
Return PutСТелом(URL, Parameters, AdditionalHeaders, JSON, FullResponse, ResponseFile);
EndFunction
Function DeleteWithBody(Val URL, Val Parameters = "", Val AdditionalHeaders = "", Val JSON = True, Val FullResponse = False, Val ResponseFile = Undefined) Export
Return DeleteСТелом(URL, Parameters, AdditionalHeaders, JSON, FullResponse, ResponseFile);
EndFunction
#EndRegion
File diff suppressed because it is too large Load Diff
-6
View File
@@ -1,6 +0,0 @@
<package-def>
<module name="OPI_ЗапросыHTTP" file="Modules/OPI_ЗапросыHTTP.os"/>
<module name="OPI_HTTPRequests" file="Modules/OPI_ЗапросыHTTP.os"/>
<class name="OPI_HTTPКлиент" file="Modules/internal/Classes/OPI_HTTPКлиент.os"/>
<class name="OPI_HTTPClient" file="Modules/internal/Classes/OPI_HTTPКлиент.os"/>
</package-def>
File diff suppressed because it is too large Load Diff
@@ -1,321 +0,0 @@
// OneScript: ./OInt/tools/Modules/OPI_ЗапросыSSH.os
// MIT License
// Copyright (c) 2023-2026 Anton Tsitavets
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
// BSLLS:Typo-off
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// BSLLS:NumberOfOptionalParams-off
// BSLLS:UsingServiceTag-off
// BSLLS:LineLength-off
// BSLLS:QueryParseError-off
// BSLLS:AssignAliasFieldsInQuery-off
// BSLLS:NumberOfParams-off
// BSLLS:UsingSynchronousCalls-off
// BSLLS:MagicNumber-off
//@skip-check module-structure-top-region
//@skip-check module-structure-method-in-regions
//@skip-check wrong-string-literal-content
//@skip-check method-too-many-params
//@skip-check constructor-function-return-section
// Раскомментировать, если выполняется OneScript
#Использовать "./internal"
#Область СлужебныйПрограммныйИнтерфейс
Функция ОткрытьСоединение(Знач НастройкиSSH, Знач Прокси = "") Экспорт
Result_ = "result";
Если ЭтоКоннектор(НастройкиSSH) Тогда
Возврат НастройкиSSH;
КонецЕсли;
Коннектор = OPI_Компоненты.ПолучитьКомпоненту("SSH");
УстановкаКонфигурации = УстановитьНастройки(Коннектор, НастройкиSSH);
Если Не OPI_Инструменты.ПолучитьИли(УстановкаКонфигурации, Result_, Ложь) Тогда
Возврат УстановкаКонфигурации;
КонецЕсли;
УстановкаПрокси = УстановитьПрокси(Коннектор, Прокси);
Если Не OPI_Инструменты.ПолучитьИли(УстановкаПрокси, Result_, Ложь) Тогда
Возврат УстановкаПрокси;
КонецЕсли;
Результат = Коннектор.Connect();
Результат = OPI_Инструменты.JsonВСтруктуру(Результат);
Возврат ?(Результат[Result_], Коннектор, Результат);
КонецФункции
Функция ПолучитьКонфигурациюСоединения(Знач НастройкиSSH, Знач Прокси = Неопределено) Экспорт
СтруктураКонфигурации = Новый Структура;
OPI_Инструменты.ДобавитьПоле("set" , НастройкиSSH, "Коллекция", СтруктураКонфигурации);
OPI_Инструменты.ДобавитьПоле("proxy", Прокси , "Коллекция", СтруктураКонфигурации);
Возврат СтруктураКонфигурации;
КонецФункции
Функция ВыполнитьКоманду(Знач Соединение, Знач Команда) Экспорт
ЗакрыватьСоединение = ПроверитьСоздатьСоединение(Соединение);
Если Не ЭтоКоннектор(Соединение) Тогда
Возврат Соединение;
Иначе
OPI_ПреобразованиеТипов.ПолучитьСтроку(Команда);
Результат = Соединение.Execute(Команда);
Результат = OPI_Инструменты.JsonВСтруктуру(Результат);
Вывод = Результат["stdout"];
Если Вывод <> Неопределено Тогда
Если СтрЗаканчиваетсяНа(Вывод, Символы.ПС) Тогда
Результат["stdout"] = Лев(Вывод, СтрДлина(Вывод) - 1);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ЗакрыватьСоединение Тогда
Результат.Вставить("close_connection", ЗакрытьСоединение(Соединение));
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЗакрытьСоединение(Знач Соединение) Экспорт
ПроверитьСоздатьСоединение(Соединение);
Если Не ЭтоКоннектор(Соединение) Тогда
Возврат Соединение;
КонецЕсли;
Результат = Соединение.Disconnect();
Результат = OPI_Инструменты.JsonВСтруктуру(Результат);
//@skip-check constructor-function-return-section
Возврат Результат;
КонецФункции
Функция ЭтоКоннектор(Знач Значение) Экспорт
Возврат Строка(ТипЗнч(Значение)) = "AddIn.OPI_SSH.Main";
КонецФункции
Функция ПолучитьНастройкиЛогинПароль(Знач Хост, Знач Порт, Знач Логин, Знач Пароль = "") Экспорт
Строка_ = "Строка";
СтруктураКонфигурации = Новый Структура;
OPI_Инструменты.ДобавитьПоле("auth_type", "password", Строка_ , СтруктураКонфигурации);
OPI_Инструменты.ДобавитьПоле("host" , Хост , Строка_ , СтруктураКонфигурации);
OPI_Инструменты.ДобавитьПоле("port" , Порт , "Число" , СтруктураКонфигурации);
OPI_Инструменты.ДобавитьПоле("username" , Логин , Строка_ , СтруктураКонфигурации);
OPI_Инструменты.ДобавитьПоле("password" , Пароль , Строка_ , СтруктураКонфигурации);
Возврат СтруктураКонфигурации;
КонецФункции
Функция ПолучитьНастройкиПриватныйКлюч(Знач Хост
, Знач Порт
, Знач Логин
, Знач Приватный
, Знач Публичный = ""
, Знач Пароль = "") Экспорт
Строка_ = "Строка";
OPI_ПреобразованиеТипов.ПолучитьФайлНаДиске(Приватный);
Приватный_ = Приватный.Путь;
Если ЗначениеЗаполнено(Публичный) Тогда
OPI_ПреобразованиеТипов.ПолучитьФайлНаДиске(Публичный);
Публичный_ = Публичный.Путь;
Иначе
Публичный_ = Неопределено;
КонецЕсли;
СтруктураКонфигурации = Новый Структура;
OPI_Инструменты.ДобавитьПоле("auth_type" , "private_key" , Строка_, СтруктураКонфигурации);
OPI_Инструменты.ДобавитьПоле("host" , Хост , Строка_, СтруктураКонфигурации);
OPI_Инструменты.ДобавитьПоле("port" , Порт , "Число", СтруктураКонфигурации);
OPI_Инструменты.ДобавитьПоле("username" , Логин , Строка_, СтруктураКонфигурации);
OPI_Инструменты.ДобавитьПоле("key_path" , Приватный_ , Строка_, СтруктураКонфигурации);
OPI_Инструменты.ДобавитьПоле("pub_path" , Публичный_ , Строка_, СтруктураКонфигурации);
OPI_Инструменты.ДобавитьПоле("passphrase", Пароль , Строка_, СтруктураКонфигурации);
Возврат СтруктураКонфигурации;
КонецФункции
Функция ПолучитьНастройкиЧерезАгента(Знач Хост, Знач Порт, Знач Логин) Экспорт
Строка_ = "Строка";
СтруктураКонфигурации = Новый Структура;
OPI_Инструменты.ДобавитьПоле("auth_type" , "agent", Строка_, СтруктураКонфигурации);
OPI_Инструменты.ДобавитьПоле("host" , Хост , Строка_, СтруктураКонфигурации);
OPI_Инструменты.ДобавитьПоле("port" , Порт , "Число", СтруктураКонфигурации);
OPI_Инструменты.ДобавитьПоле("username" , Логин , Строка_, СтруктураКонфигурации);
Возврат СтруктураКонфигурации;
КонецФункции
Функция ПолучитьНастройкиПрокси(Знач Адрес
, Знач Порт
, Знач Вид = "socks5"
, Знач Логин = Неопределено
, Знач Пароль = Неопределено) Экспорт
//@skip-check constructor-function-return-section
Возврат OPI_Компоненты.ПолучитьНастройкиПрокси(Адрес, Порт, Вид, Логин, Пароль);
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ПроверитьСоздатьСоединение(Соединение)
Если Не ЭтоКоннектор(Соединение) Тогда
ЗакрыватьСоединение = Истина;
Соединение = ОткрытьСоединениеПоКонфигурации(Соединение);
Иначе
ЗакрыватьСоединение = Ложь;
КонецЕсли;
Возврат ЗакрыватьСоединение;
КонецФункции
Функция ОткрытьСоединениеПоКонфигурации(Знач СтруктураКонфигурации)
Если ЭтоКоннектор(СтруктураКонфигурации) Тогда
Возврат СтруктураКонфигурации;
КонецЕсли;
ШаблонОшибки = "Передана некорректная конфигурация соединения: %1";
Попытка
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(СтруктураКонфигурации);
Исключение
Результат = Новый Соответствие;
Результат.Вставить("result", Ложь);
Результат.Вставить("error" , СтрШаблон(ШаблонОшибки, ОписаниеОшибки()));
Возврат Результат;
КонецПопытки;
Если Не OPI_Инструменты.ПолеКоллекцииСуществует(СтруктураКонфигурации, "set") Тогда
Результат = Новый Соответствие;
Результат.Вставить("result", Ложь);
Результат.Вставить("error" , СтрШаблон(ШаблонОшибки, "отсутствуют основные параметры соединения"));
Возврат Результат;
КонецЕсли;
НастройкиSSH = СтруктураКонфигурации["set"];
Прокси = OPI_Инструменты.ПолучитьИли(СтруктураКонфигурации, "proxy", Неопределено);
Возврат ОткрытьСоединение(НастройкиSSH, Прокси);
КонецФункции
Функция УстановитьНастройки(Знач Коннектор, Знач НастройкиSSH)
ШаблонОшибки = "Передана некорректная конфигурация соединения: %1";
Попытка
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(НастройкиSSH);
Исключение
Результат = Новый Соответствие;
Результат.Вставить("result", Ложь);
Результат.Вставить("error" , СтрШаблон(ШаблонОшибки, ОписаниеОшибки()));
Возврат Результат;
КонецПопытки;
СтрокаНастроек = OPI_Инструменты.JSONСтрокой(НастройкиSSH);
Результат = Коннектор.SetSettings(СтрокаНастроек);
Результат = OPI_Инструменты.JsonВСтруктуру(Результат);
Возврат Результат;
КонецФункции
Функция УстановитьПрокси(Знач Коннектор, Знач Прокси)
Если Не ЗначениеЗаполнено(Прокси) Тогда
Возврат Новый Структура("result", Истина);
КонецЕсли;
ШаблонОшибки = "Передана некорректная конфигурация прокси: %1";
Попытка
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Прокси);
Исключение
Результат = Новый Соответствие;
Результат.Вставить("result", Ложь);
Результат.Вставить("error" , СтрШаблон(ШаблонОшибки, ОписаниеОшибки()));
Возврат Результат;
КонецПопытки;
СтрокаПрокси = OPI_Инструменты.JSONСтрокой(Прокси);
Результат = Коннектор.SetProxy(СтрокаПрокси);
Результат = OPI_Инструменты.JsonВСтруктуру(Результат);
Возврат Результат;
КонецФункции
#КонецОбласти
@@ -1,370 +0,0 @@
// OneScript: ./OInt/tools/Modules/OPI_Компоненты.os
// MIT License
// Copyright (c) 2023-2026 Anton Tsitavets
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// BSLLS:UsingHardcodePath-off
// BSLLS:Typo-off
// BSLLS:DeprecatedMessage-off
// BSLLS:UsingServiceTag-off
// BSLLS:ExecuteExternalCodeInCommonModule-off
// BSLLS:DuplicateStringLiteral-off
// BSLLS:MagicNumber-off
// BSLLS:UsingHardcodeNetworkAddress-off
// BSLLS:UsingSynchronousCalls-off
//@skip-check use-non-recommended-method
//@skip-check module-structure-top-region
//@skip-check module-structure-method-in-regions
//@skip-check undefined-function-or-procedure
//@skip-check wrong-string-literal-content
// Раскомментировать, если выполняется OneScript
#Использовать "./internal"
#Область СлужебныйПрограммныйИнтерфейс
#Область Основные
Функция ПолучитьКомпоненту(Знач ИмяКомпоненты, Знач Класс = "Main") Экспорт
Компонента = Неопределено;
Ошибка = "";
ИмяКомпоненты = "OPI_" + ИмяКомпоненты;
Если Не ИнициализироватьВнешнююКомпоненту(ИмяКомпоненты, Класс, Компонента) Тогда
Ошибка = Неопределено;
Компонента = ПодключитьКомпонентуНаСервере(ИмяКомпоненты, Класс, Ошибка);
Если ЗначениеЗаполнено(Ошибка) Тогда
СформироватьИсключениеКомпоненты(Ошибка);
КонецЕсли;
КонецЕсли;
Возврат Компонента;
КонецФункции
Функция ЭтоКомпонента(Знач Значение) Экспорт
ТипЗначения = Строка(ТипЗнч(Значение));
Возврат СтрНачинаетсяС(ТипЗначения, "AddIn.");
КонецФункции
Функция ТребуетсяПередачаЧерезФайл() Экспорт
// BSLLS:CommentedCode-off
// Компоненты в 1С на Linux не могут стабильно отдавать и принимать данные свыше 30 КБ
// https://github.com/Bayselonarrend/OpenIntegrations/issues/72
// UPD: В неизолированном режиме не падает
// Возврат Не OPI_Инструменты.ЭтоWindows() И Не OPI_Инструменты.ЭтоOneScript();
// BSLLS:CommentedCode-on
Возврат Ложь;
КонецФункции
#КонецОбласти
#Область TCP
Функция УстановитьTls(Знач Компонета, Знач Tls) Экспорт
Результат = Новый Структура("result", Истина);
Если ЗначениеЗаполнено(Tls) Тогда
СообщениеОшибки = "Переданы некорректные настройки Tls!";
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Tls, СообщениеОшибки);
ИспользоватьTls = OPI_Инструменты.ПолучитьИли(Tls, "use_tls" , Ложь);
ОтключитьВалидацию = OPI_Инструменты.ПолучитьИли(Tls, "accept_invalid_certs", Ложь);
ПутьКСертификату = OPI_Инструменты.ПолучитьИли(Tls, "ca_cert_path" , "");
OPI_ПреобразованиеТипов.ПолучитьБулево(ИспользоватьTls);
OPI_ПреобразованиеТипов.ПолучитьБулево(ОтключитьВалидацию);
OPI_ПреобразованиеТипов.ПолучитьСтроку(ПутьКСертификату);
Результат = Компонета.SetTLS(ИспользоватьTls, ОтключитьВалидацию, ПутьКСертификату);
Результат = OPI_Инструменты.JsonВСтруктуру(Результат);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПолучитьНастройкиTls(Знач ОтключитьПроверкуСертификатов, Знач ПутьКСертификату = "") Экспорт
СтруктураСертификата = Новый Структура;
OPI_Инструменты.ДобавитьПоле("use_tls" , Истина , "Булево", СтруктураСертификата);
OPI_Инструменты.ДобавитьПоле("accept_invalid_certs", ОтключитьПроверкуСертификатов, "Булево", СтруктураСертификата);
OPI_Инструменты.ДобавитьПоле("ca_cert_path" , ПутьКСертификату , "Строка", СтруктураСертификата);
Возврат СтруктураСертификата;
КонецФункции
Функция ПолучитьНастройкиПрокси(Знач Адрес
, Знач Порт
, Знач Вид = "socks5"
, Знач Логин = Неопределено
, Знач Пароль = Неопределено) Экспорт
СтруктураНастроек = Новый Структура;
OPI_Инструменты.ДобавитьПоле("server" , Адрес, "Строка", СтруктураНастроек);
OPI_Инструменты.ДобавитьПоле("port" , Порт , "Число" , СтруктураНастроек);
OPI_Инструменты.ДобавитьПоле("proxy_type", Вид , "Строка", СтруктураНастроек);
Если Не Логин = Неопределено Тогда
OPI_ПреобразованиеТипов.ПолучитьСтроку(Логин);
СтруктураНастроек.Вставить("login", Логин);
КонецЕсли;
Если Не Пароль = Неопределено Тогда
OPI_ПреобразованиеТипов.ПолучитьСтроку(Пароль);
СтруктураНастроек.Вставить("password", Пароль);
КонецЕсли;
//@skip-check constructor-function-return-section
Возврат СтруктураНастроек;
КонецФункции
#КонецОбласти
#Область ВнутреннееХранилище
Функция ПоместитьДанные(Знач Компонента, Знач Значение) Экспорт
Обработано = Ложь;
Если ТипЗнч(Значение) = Тип("Строка") Тогда
ФайлДанных = Новый Файл(Значение);
Если ФайлДанных.Существует() Тогда
Результат = Компонента.LoadFileToVault(ФайлДанных.ПолноеИмя);
Результат = OPI_Инструменты.JsonВСтруктуру(Результат);
Обработано = Истина;
Иначе
Результат = Компонента.LoadBase64ToVault(Значение);
Результат = OPI_Инструменты.JsonВСтруктуру(Результат);
Обработано = Результат["result"];
КонецЕсли;
КонецЕсли;
Если Не Обработано Тогда
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Значение, Истина, Истина);
Результат = Компонента.LoadBinaryToVault(Значение);
Результат = OPI_Инструменты.JsonВСтруктуру(Результат);
КонецЕсли;
Возврат Результат;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ИнициализироватьВнешнююКомпоненту(Знач ИмяКомпоненты, Знач Класс, Компонента)
Попытка
Компонента = Новый("AddIn." + ИмяКомпоненты + "." + Класс);
Возврат Истина;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункции
Функция ПодключитьКомпонентуНаСервере(Знач ИмяКомпоненты, Знач Класс, Ошибка)
Если OPI_Инструменты.ЭтоOneScript() Тогда
ИмяМакета = КаталогКомпонентOS() + ИмяКомпоненты + ".zip";
Иначе
ИмяМакета = "ОбщийМакет." + ИмяКомпоненты;
КонецЕсли;
Попытка
ПодключитьКомпонентуНеИзолированно(ИмяМакета, ИмяКомпоненты);
Компонента = Новый("AddIn." + ИмяКомпоненты + "." + Класс);
Ошибка = Неопределено;
Возврат Компонента;
Исключение
Ошибка = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
Возврат Неопределено;
КонецПопытки;
КонецФункции
Функция ПодключитьКомпонентуНеИзолированно(ИмяМакета, ИмяКомпоненты)
ЭтоOneScript = OPI_Инструменты.ЭтоOneScript();
НеобходимТипПоСистеме = Не ЭтоOneScript И Не OPI_Инструменты.ЭтоWindows();
Если ЭтоOneScript Тогда
НеобходимТипПоВерсии = Ложь;
Иначе
СистемнаяИнформация = Новый СистемнаяИнформация();
Версия1С = СистемнаяИнформация.ВерсияПриложения;
Версия1С = СтрРазделить(Версия1С, ".");
Часть1 = Число(Версия1С[0]);
Часть2 = Число(Версия1С[1]);
Часть3 = Число(Версия1С[2]);
НеобходимТипПоВерсии = Часть1 > 8 Или Часть2 > 3 Или Часть3 > 20;
КонецЕсли;
НеобходимТип = НеобходимТипПоВерсии И НеобходимТипПоСистеме;
Если Не НеобходимТип Тогда
Если Не НеобходимТипПоВерсии Тогда
ТипПодключенияВнешнейКомпоненты = Неопределено;
КонецЕсли;
Результат = ПодключитьВнешнююКомпоненту(ИмяМакета, ИмяКомпоненты, ТипВнешнейКомпоненты.Native);
Иначе
// BSLLS:UnusedLocalVariable-off
//@skip-check module-unused-local-variable
ТипПодключения = ТипПодключенияВнешнейКомпоненты.НеИзолированно;
//@skip-check server-execution-safe-mode
// BSLLS:UnusedLocalVariable-on
// BSLLS:LineLength-off
Результат = Вычислить("ПодключитьВнешнююКомпоненту(ИмяМакета, ИмяКомпоненты, ТипВнешнейКомпоненты.Native, ТипПодключения)");
// BSLLS:LineLength-on
КонецЕсли;
Возврат Результат;
КонецФункции
Функция КаталогКомпонентOS() Экспорт
КаталогБиблиотеки = OPI_Инструменты.ПолучитьКаталогБиблиотеки();
// BSLLS:UsingHardcodePath-off
КаталогКомпонент = СтрШаблон("%1/%2/", КаталогБиблиотеки, "addins");
// BSLLS:UsingHardcodePath-on
Возврат КаталогКомпонент;
КонецФункции
Процедура СформироватьИсключениеКомпоненты(Знач Ошибка)
Текст = "Не удалось инициализировать внешнюю компоненту. Возможно, она несовместима с вашей операционной системой.";
Если Не OPI_Инструменты.ЭтоWindows() Тогда
Текст = Текст
+ Символы.ПС
+ Символы.ПС
+ "Важно: Для работы компоненты требуется GLIBC >=2.18"
+ " и OpenSSL версии 3.x"
+ Символы.ПС
+ "Проверьте, что данные зависимости удовлетворены в вашей системе!";
КонецЕсли;
Текст = Текст
+ Символы.ПС
+ Символы.ПС
+ "Подробнее: https://openintegrations.dev/docs/Start/Component-requirements"
+ Символы.ПС
+ Символы.ПС
+ "Системная информация:"
+ Ошибка;
ВызватьИсключение Текст;
КонецПроцедуры
#КонецОбласти
#Region Alternate
Function GetAddIn(Val AddInName, Val Class = "Main") Export
Return ПолучитьКомпоненту(AddInName, Class);
EndFunction
Function IsAddIn(Val Value) Export
Return ЭтоКомпонента(Value);
EndFunction
Function FileTransferRequired() Export
Return ТребуетсяПередачаЧерезФайл();
EndFunction
Function SetTls(Val AddIn, Val Tls) Export
Return УстановитьTls(AddIn, Tls);
EndFunction
Function GetTlsSettings(Val DisableCertVerification, Val CertFilepath = "") Export
Return ПолучитьНастройкиTls(DisableCertVerification, CertFilepath);
EndFunction
Function GetProxySettings(Val Address, Val Port, Val View = "socks5", Val Login = Undefined, Val Password = Undefined) Export
Return ПолучитьНастройкиПрокси(Address, Port, View, Login, Password);
EndFunction
Function PutData(Val AddIn, Val Value) Export
Return ПоместитьДанные(AddIn, Value);
EndFunction
Function AddInsFolderOS() Export
Return КаталогКомпонентOS();
EndFunction
#EndRegion
File diff suppressed because it is too large Load Diff
@@ -1,267 +0,0 @@
// OneScript: ./OInt/tools/Modules/internal/Modules/OPI_Криптография.os
// MIT License
// Copyright (c) 2023-2026 Anton Tsitavets
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// BSLLS:UnusedLocalVariable-off
// BSLLS:UsingServiceTag-off
// BSLLS:UsingSynchronousCalls-off
//@skip-check module-structure-top-region
//@skip-check module-structure-method-in-regions
//@skip-check wrong-string-literal-content
// Раскомментировать, если выполняется OneScript
#Использовать "./internal"
#Область СлужебныйПрограммныйИнтерфейс
Функция СоздатьПодпись(Знач КлючПодписи, Знач ДанныеПодписи, Знач Алгоритм, Знач ФункцияХеша) Экспорт
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(КлючПодписи);
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(ДанныеПодписи);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Алгоритм);
Алгоритм = вРег(Алгоритм);
ФункцияХеша = вРег(ФункцияХеша);
Если Алгоритм = "HMAC" Тогда
Результат = HMAC(КлючПодписи, ДанныеПодписи, ФункцияХеша);
ИначеЕсли Алгоритм = "RSA" Тогда
Результат = RSA(КлючПодписи, ДанныеПодписи, ФункцияХеша);
Иначе
ВызватьИсключение "Ошибка работы с криптографией: неподдерживаемый метод";
КонецЕсли;
Возврат Результат;
КонецФункции
Функция RSA(Знач Ключ, Знач Данные, Знач ФункцияХеша) Экспорт
Компонента = OPI_Компоненты.ПолучитьКомпоненту("Cryptography");
Если ФункцияХеша = "SHA256" Тогда
Результат = Компонента.RsaSha256(Ключ, Данные);
ИначеЕсли ФункцияХеша = "SHA1" Тогда
Результат = Компонента.RsaSha1(Ключ, Данные);
Иначе
Результат = "неподдерживаемый метод хеширования";
КонецЕсли;
Если ТипЗнч(Результат) = Тип("Строка") Тогда
ВызватьИсключение СтрШаблон("Ошибка работы с криптографией: %1", Результат);
Иначе
Возврат Результат;
КонецЕсли;
КонецФункции
Функция JWT(Знач Payload, Знач КлючПодписи, Знач Метод, Знач ДопЗаголовки = "") Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Метод);
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Payload);
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(КлючПодписи, Истина, Ложь);
Метод = вРег(Метод);
Если Метод = "HS256" Тогда
Алгоритм = "HMAC";
ФункцияХеша = "SHA256";
ИначеЕсли Метод = "RS256" Тогда
Алгоритм = "RSA";
ФункцияХеша = "SHA256";
Иначе
ВызватьИсключение "JWT: Неподдерживаемый метод";
КонецЕсли;
Заголовки = Новый Структура("alg,typ", Метод, "JWT");
Если ЗначениеЗаполнено(ДопЗаголовки) Тогда
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(ДопЗаголовки);
//@skip-check bsl-legacy-check-for-each-statetement-collection
Для Каждого КлючЗначение Из ДопЗаголовки Цикл
Заголовки.Вставить(КлючЗначение.Ключ, КлючЗначение.Значение);
КонецЦикла;
КонецЕсли;
PayloadСтрокой = OPI_Инструменты.JSONСтрокой(Payload, , Ложь);
ЗаголовкиСтрокой = OPI_Инструменты.JSONСтрокой(Заголовки, , Ложь);
PayloadДвоичные = ПолучитьДвоичныеДанныеИзСтроки(PayloadСтрокой);
ЗаголовкиДвоичные = ПолучитьДвоичныеДанныеИзСтроки(ЗаголовкиСтрокой);
PayloadBase64 = Base64UrlEncode(PayloadДвоичные);
ЗаголовкиBase64 = Base64UrlEncode(ЗаголовкиДвоичные);
Токен = СтрШаблон("%1.%2", ЗаголовкиBase64, PayloadBase64);
ТокенДвоичные = ПолучитьДвоичныеДанныеИзСтроки(Токен);
Подпись = СоздатьПодпись(КлючПодписи, ТокенДвоичные, Алгоритм, ФункцияХеша);
ПодписьBase64 = Base64UrlEncode(Подпись);
Токен = СтрШаблон("%1.%2", Токен, ПодписьBase64);
Возврат Токен;
КонецФункции
#Область Заимствованные
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
Функция HMAC(Знач Ключ, Знач Данные, Знач ФункцияХеша) Экспорт
Дважды = 2;
РазмерБлока = 64;
ТипХеша = ХешФункция[ФункцияХеша];
Если Ключ.Размер() > РазмерБлока Тогда
Ключ = Хеш(Ключ, ТипХеша);
КонецЕсли;
Если Ключ.Размер() <= РазмерБлока Тогда
Ключ = ПолучитьHexСтрокуИзДвоичныхДанных(Ключ);
Ключ = Лев(Ключ + ПовторитьСтроку("00", РазмерБлока), РазмерБлока * Дважды);
КонецЕсли;
Ключ = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзHexСтроки(Ключ));
Ipad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("36", РазмерБлока));
Opad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("5c", РазмерБлока));
Ipad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
Ikeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ipad);
Opad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
Okeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(opad);
Возврат Хеш(СклеитьДвоичныеДанные(okeypad, Хеш(СклеитьДвоичныеДанные(ikeypad, Данные), ТипХеша)), ТипХеша);
КонецФункции
Функция Хеш(ДвоичныеДанные, Тип) Экспорт
Хеширование = Новый ХешированиеДанных(Тип);
Хеширование.Добавить(ДвоичныеДанные);
Возврат Хеширование.ХешСумма;
КонецФункции
Функция СклеитьДвоичныеДанные(ДвоичныеДанные1, ДвоичныеДанные2) Экспорт
МассивДвоичныхДанных = Новый Массив;
МассивДвоичныхДанных.Добавить(ДвоичныеДанные1);
МассивДвоичныхДанных.Добавить(ДвоичныеДанные2);
Возврат СоединитьДвоичныеДанные(МассивДвоичныхДанных);
КонецФункции
Функция ПовторитьСтроку(Строка, Количество) Экспорт
Части = Новый Массив(Количество);
Для К = 1 По Количество Цикл
Части.Добавить(Строка);
КонецЦикла;
Возврат СтрСоединить(Части, "");
КонецФункции
// The MIT License (MIT)
//
// Copyright (c) 2017 Vasily Pintov
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/pintov/1c-jwt
Функция Base64UrlEncode(Знач Значение) Экспорт
Вывод = Base64Строка(Значение);
Вывод = СтрРазделить(Вывод, "=")[0];
Вывод = СтрЗаменить(Вывод, Символы.ВК + Символы.ПС, "");
Вывод = СтрЗаменить(Вывод, "+" , "-");
Вывод = СтрЗаменить(Вывод, "/" , "_");
Возврат Вывод;
КонецФункции
#КонецОбласти
#КонецОбласти
#Region Alternate
Function CreateSignature(Val SignKey, Val SignatureData, Val Algorithm, Val HashFunc) Export
Return СоздатьПодпись(SignKey, SignatureData, Algorithm, HashFunc);
EndFunction
Function Hash(BinaryData, Type) Export
Return Хеш(BinaryData, Type);
EndFunction
Function UniteBinaryData(BinaryData1, BinaryData2) Export
Return СклеитьДвоичныеДанные(BinaryData1, BinaryData2);
EndFunction
Function RepeatString(String, Count) Export
Return ПовторитьСтроку(String, Count);
EndFunction
#EndRegion
@@ -1,45 +0,0 @@
// OneScript: ./OInt/tools/Modules/internal/Modules/internal/Modules/OPI_BuildHash.os
// MIT License
// Copyright (c) 2023-2026 Anton Tsitavets
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// BSLLS:CommonModuleMissingAPI-off
// BSLLS:CodeOutOfRegion-off
// BSLLS:UsingServiceTag-off
// https://github.com/Bayselonarrend/OpenIntegrations
//@skip-check module-structure-method-in-regions
Function GetHashSum() Export
LastBuildHash = "8F99EA97EE8F028DF9DAE298EC9F8F3AF1367CCD7AFFC692E76E16B630941C2D";
Return LastBuildHash;
EndFunction
#Region Alternate
#EndRegion
@@ -1,583 +0,0 @@
// OneScript: ./OInt/tools/Modules/internal/Modules/internal/Modules/OPI_ПреобразованиеТипов.os
// MIT License
// Copyright (c) 2023-2026 Anton Tsitavets
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// BSLLS:UnusedLocalVariable-off
// BSLLS:UsingServiceTag-off
// BSLLS:UsingSynchronousCalls-off
// BSLLS:CognitiveComplexity-off
//@skip-check module-structure-top-region
//@skip-check module-structure-method-in-regions
//@skip-check undefined-function-or-procedure
//@skip-check wrong-string-literal-content
#Область СлужебныйПрограммныйИнтерфейс
Процедура ПолучитьДвоичныеДанные(Значение, Знач Безусловно = Ложь, Знач ПопыткаB64 = Истина) Экспорт
Если Значение = Неопределено Тогда
Значение = ПолучитьДвоичныеДанныеИзСтроки("");
Возврат;
КонецЕсли;
Попытка
Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
Возврат;
ИначеЕсли ЭтоКоллекция(Значение) Тогда
Значение = JSONСтрокой(Значение);
Значение = ПолучитьДвоичныеДанныеИзСтроки(Значение);
Иначе
ПолучитьСтроку(Значение);
ПреобразоватьИсточникВЗначение(Значение, ПопыткаB64);
КонецЕсли;
Исключение
Если Безусловно Тогда
ПолучитьСтроку(Значение);
Значение = ПолучитьДвоичныеДанныеИзСтроки(Значение);
Иначе
ВызватьИсключение "Ошибка получения двоичных данных из параметра: " + ОписаниеОшибки();
КонецЕсли;
КонецПопытки;
КонецПроцедуры
Процедура ПолучитьДвоичныеИлиПоток(Значение) Экспорт
Если Значение = Неопределено Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(Значение) <> Тип("Строка") Тогда
ПолучитьДвоичныеДанные(Значение);
Возврат;
КонецЕсли;
ЗначениеУП = Значение;
ВернутьУправляющиеПоследовательности(ЗначениеУП);
Файл = Новый Файл(ЗначениеУП);
Если Файл.Существует() Тогда
Значение = Новый ФайловыйПоток(ЗначениеУП, РежимОткрытияФайла.Открыть);
Иначе
ПолучитьДвоичныеДанные(Значение);
КонецЕсли;
КонецПроцедуры
Процедура ПолучитьКоллекцию(Значение, ПоСети = Истина, Успех = Ложь) Экспорт
Успех = Ложь;
Если Значение = Неопределено Тогда
Возврат;
КонецЕсли;
Успех = Истина;
Попытка
// BSLLS:ExternalAppStarting-off
ИсходноеЗначение = Значение;
Если ЭтоКоллекция(Значение) Тогда
Возврат;
Иначе
Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
Значение = ПолучитьСтрокуИзДвоичныхДанных(Значение);
Иначе
Значение = ЧислоВСтроку(Значение);
КонецЕсли;
ЗначениеУП = Значение;
ВернутьУправляющиеПоследовательности(ЗначениеУП);
Файл = Новый Файл(ЗначениеУП);
ЧтениеJSON = Новый ЧтениеJSON;
Если Файл.Существует() Тогда
ЧтениеJSON.ОткрытьФайл(ЗначениеУП);
Значение = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO);
ЧтениеJSON.Закрыть();
ИначеЕсли ПоСети И (СтрНачинаетсяС(СокрЛ(ЗначениеУП), "http://")
Или СтрНачинаетсяС(СокрЛ(ЗначениеУП), "https://")) Тогда
Значение = СкачатьФайл(ЗначениеУП);
Иначе
ЧтениеJSON.УстановитьСтроку(СокрЛП(Значение));
Значение = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO);
ЧтениеJSON.Закрыть();
КонецЕсли;
Если (Не ЭтоКоллекция(Значение)) Или Не ЗначениеЗаполнено(Значение) Тогда
Успех = Ложь;
Значение = ИсходноеЗначение;
ЗначениеВМассив(Значение);
КонецЕсли;
КонецЕсли;
// BSLLS:ExternalAppStarting-on
Исключение
Успех = Ложь;
Значение = ИсходноеЗначение;
ЗначениеВМассив(Значение);
КонецПопытки;
КонецПроцедуры
Процедура ПолучитьКоллекциюКлючИЗначение(Значение
, Знач СообщениеОшибки = "Указанное значение не является подходящей коллекцией!") Экспорт
ПолучитьКоллекцию(Значение);
Если ТипЗнч(Значение) = Тип("Массив") Тогда
ВызватьИсключение СообщениеОшибки;
КонецЕсли;
КонецПроцедуры
Процедура ПолучитьМассив(Значение) Экспорт
Если ТипЗнч(Значение) = Тип("Массив") Тогда
Возврат;
КонецЕсли;
ПолучитьКоллекцию(Значение);
Если Не ТипЗнч(Значение) = Тип("Массив") Тогда
ЗначениеВМассив(Значение);
КонецЕсли;
КонецПроцедуры
Процедура ПолучитьБулево(Значение) Экспорт
Если Значение = Неопределено Тогда
Возврат;
КонецЕсли;
Попытка
Если ТипЗнч(Значение) = Тип("Булево") Тогда
Возврат;
Иначе
Значение = Булево(Значение);
КонецЕсли;
Исключение
ВызватьИсключение "Ошибка получения данных булево из параметра";
КонецПопытки;
КонецПроцедуры
Процедура ПолучитьСтроку(Значение, Знач ИзИсточника = Ложь) Экспорт
Если Значение = Неопределено Тогда
Возврат;
КонецЕсли;
Попытка
Если ЭтоСимвольное(Значение) Тогда
Значение = ЧислоВСтроку(Значение);
Если Не ИзИсточника Тогда
Возврат;
КонецЕсли;
ЗначениеУП = Значение;
ВернутьУправляющиеПоследовательности(ЗначениеУП);
Файл = Новый Файл(ЗначениеУП);
Если Файл.Существует() Тогда
ЧтениеТекста = Новый ЧтениеТекста(ЗначениеУП);
Значение = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
ИначеЕсли СтрНачинаетсяС(СокрЛ(ЗначениеУП), "http://")
Или СтрНачинаетсяС(СокрЛ(ЗначениеУП), "https://") Тогда
Значение = СкачатьФайл(ЗначениеУП);
ПолучитьСтроку(Значение);
Иначе
Значение = ЧислоВСтроку(Значение);
КонецЕсли;
ИначеЕсли ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
Значение = ПолучитьСтрокуИзДвоичныхДанных(Значение);
ИначеЕсли ЭтоКоллекция(Значение) Тогда
Значение = JSONСтрокой(Значение);
ИначеЕсли ТипЗнч(Значение) = Тип("ЗаписьXML") Тогда
Значение = Значение.Закрыть();
Иначе
Возврат;
КонецЕсли;
Исключение
Значение = Строка(Значение);
Возврат;
КонецПопытки;
КонецПроцедуры
Процедура ПолучитьДату(Значение) Экспорт
Если Значение = Неопределено Тогда
Возврат;
КонецЕсли;
Дата = "Дата";
Попытка
Если ТипЗнч(Значение) = Тип(Дата) Тогда
Возврат;
Иначе
Значение = XMLЗначение(Тип(Дата), Значение);
КонецЕсли;
Исключение
ООД = Новый ОписаниеТипов(Дата);
Значение = ООД.ПривестиЗначение(Значение);
КонецПопытки;
КонецПроцедуры
Процедура ПолучитьЧисло(Значение) Экспорт
Если ТипЗнч(Значение) = Тип("Число") Тогда
Возврат;
ИначеЕсли ТипЗнч(Значение) = Тип("Булево") Тогда
Значение = ?(Значение, 1, 0);
Иначе
ОписаниеТипа = Новый ОписаниеТипов("Число");
Значение_ = ОписаниеТипа.ПривестиЗначение(Значение);
Если Значение_ = 0 Тогда
Попытка
Значение_ = Строка(Значение);
Значение_ = СтрЗаменить(Значение, Символы.НПП, "");
Значение_ = СтрЗаменить(Значение, " " , "");
Значение_ = СтрЗаменить(Значение, "," , ".");
Если СтрЧислоВхождений(Значение_, ".") > 1 Тогда
МассивЧастей = СтрРазделить(Значение_, ".");
ПоследняяЧасть = МассивЧастей.ВГраница();
ДробнаяЧасть = МассивЧастей[ПоследняяЧасть];
МассивЧастей.Удалить(ПоследняяЧасть);
Значение_ = СтрШаблон("%1.%2", СтрСоединить(МассивЧастей), ДробнаяЧасть);
КонецЕсли;
// BSLLS:TryNumber-off
Значение = Число(Значение_);
// BSLLS:TryNumber-on
Исключение
Возврат;
КонецПопытки;
Иначе
Значение = Значение_;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПолучитьФайлНаДиске(Значение, Знач Расширение = "tmp") Экспорт
СтруктураВозврата = Новый Структура("Путь,Временный", "", Ложь);
ЗначениеСтрокой = ЧислоВСтроку(Значение);
ЗначениеФайл = Новый Файл(ЗначениеСтрокой);
Если ЗначениеФайл.Существует() Тогда
СтруктураВозврата.Вставить("Путь", ЗначениеФайл.ПолноеИмя);
Иначе
ПолучитьДвоичныеДанные(Значение, Истина);
// BSLLS:MissingTemporaryFileDeletion-off
//@skip-check missing-temporary-file-deletion
Путь = ПолучитьИмяВременногоФайла(Расширение);
// BSLLS:MissingTemporaryFileDeletion-on
Значение.Записать(Путь);
СтруктураВозврата.Вставить("Путь" , Путь);
СтруктураВозврата.Вставить("Временный", Истина);
КонецЕсли;
Значение = СтруктураВозврата;
КонецПроцедуры
Процедура ВернутьУправляющиеПоследовательности(Текст) Экспорт
ПолучитьСтроку(Текст);
СоответствиеСимволов = ПолучитьСоответствиеУправляющихПоследовательностей();
Для Каждого Символ Из СоответствиеСимволов Цикл
Текст = СтрЗаменить(Текст, Символ.Значение, Символ.Ключ);
КонецЦикла;
КонецПроцедуры
Процедура ЗаменитьУправляющиеПоследовательности(Текст) Экспорт
ПолучитьСтроку(Текст);
СоответствиеСимволов = ПолучитьСоответствиеУправляющихПоследовательностей();
Для Каждого Символ Из СоответствиеСимволов Цикл
Текст = СтрЗаменить(Текст, Символ.Ключ , Символ.Значение);
Текст = СтрЗаменить(Текст, "\" + Символ.Значение, Символ.Ключ);
КонецЦикла;
КонецПроцедуры
Процедура ЗначениеВМассив(Значение) Экспорт
Если ТипЗнч(Значение) = Тип("Массив") Тогда
Возврат;
КонецЕсли;
Значение_ = Новый Массив;
Значение_.Добавить(Значение);
Значение = Значение_;
КонецПроцедуры
Функция JSONСтрокой(Знач Данные
, Знач Экранирование = "Нет"
, Знач ПереносСтрок = Истина
, Знач ДвойныеКавычки = Истина) Экспорт
Перенос = ?(ПереносСтрок, ПереносСтрокJSON.Windows, ПереносСтрокJSON.Нет);
ПараметрыJSON = Новый ПараметрыЗаписиJSON(Перенос
, " "
, ДвойныеКавычки
, ЭкранированиеСимволовJSON[Экранирование]
, Ложь
, Ложь
, Ложь
, Ложь);
Попытка
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
ЗаписатьJSON(ЗаписьJSON, Данные);
Возврат ЗаписьJSON.Закрыть();
Исключение
Возврат "НЕ JSON: " + Строка(Данные);
КонецПопытки;
КонецФункции
Функция ЧислоВСтроку(Знач Значение) Экспорт
Если ТипЗнч(Значение) = Тип("Число") Тогда
Если Значение = 0 Тогда
Значение_ = "0";
Иначе
Значение_ = Формат(Значение, "ЧГ=0");
КонецЕсли;
Иначе
Значение_ = Строка(Значение);
КонецЕсли;
Возврат Значение_;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ЭтоКоллекция(Знач Значение)
Возврат ТипЗнч(Значение) = Тип("Массив")
Или ТипЗнч(Значение) = Тип("Структура")
Или ТипЗнч(Значение) = Тип("Соответствие");
КонецФункции
Функция ЭтоСимвольное(Знач Значение)
Возврат ТипЗнч(Значение) = Тип("Строка")
Или ТипЗнч(Значение) = Тип("Число")
Или ТипЗнч(Значение) = Тип("Дата");
КонецФункции
Функция ПолучитьСоответствиеУправляющихПоследовательностей()
СоответствиеСимволов = Новый Соответствие;
СоответствиеСимволов.Вставить("\n" , Символы.ПС);
СоответствиеСимволов.Вставить("\r" , Символы.ВК);
СоответствиеСимволов.Вставить("\f" , Символы.ПФ);
СоответствиеСимволов.Вставить("\v" , Символы.ВТаб);
Возврат СоответствиеСимволов;
КонецФункции
Процедура ПреобразоватьИсточникВЗначение(Значение, ПопыткаB64)
ЗначениеУП = Значение;
ВернутьУправляющиеПоследовательности(ЗначениеУП);
Файл = Новый Файл(ЗначениеУП);
Если Файл.Существует() Тогда
Значение = Новый ДвоичныеДанные(ЗначениеУП);
ИначеЕсли СтрНачинаетсяС(СокрЛ(ЗначениеУП), "http://")
Или СтрНачинаетсяС(СокрЛ(ЗначениеУП), "https://") Тогда
Значение = СкачатьФайл(ЗначениеУП);
Иначе
Если ПопыткаB64 Тогда
Значение_ = Base64Значение(Значение);
Если ТипЗнч(Значение_) = Тип("ДвоичныеДанные") Тогда
Успех = Значение_.Размер() <> 0;
Иначе
Успех = Ложь;
КонецЕсли;
Если Успех Тогда
Значение = Значение_;
КонецЕсли;
Иначе
Успех = Ложь;
КонецЕсли;
Если Не Успех Тогда
ВызватьИсключение "Значение не является путем к файлу или Base64 строкой";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
#Область HTTP
Функция СкачатьФайл(Знач URL)
ИВФ = ПолучитьИмяВременногоФайла();
КопироватьФайл(URL, ИВФ);
Данные = Новый ДвоичныеДанные(ИВФ);
//@skip-check empty-except-statement
Попытка
УдалитьФайлы(ИВФ);
Исключение КонецПопытки;
Возврат Данные;
КонецФункции
#КонецОбласти
#КонецОбласти
-13
View File
@@ -1,13 +0,0 @@
<package-def>
<module name="OPI_ЗапросыSQL" file="Modules/OPI_ЗапросыSQL.os"/>
<module name="OPI_SQLQueries" file="Modules/OPI_ЗапросыSQL.os"/>
<module name="OPI_ЗапросыSSH" file="Modules/OPI_ЗапросыSSH.os"/>
<module name="OPI_Инструменты" file="Modules/internal/Modules/OPI_Инструменты.os"/>
<module name="OPI_Tools" file="Modules/internal/Modules/OPI_Инструменты.os"/>
<module name="OPI_Компоненты" file="Modules/OPI_Компоненты.os"/>
<module name="OPI_AddIns" file="Modules/OPI_Компоненты.os"/>
<module name="OPI_Криптография" file="Modules/internal/Modules/OPI_Криптография.os"/>
<module name="OPI_Cryptography" file="Modules/internal/Modules/OPI_Криптография.os"/>
<module name="OPI_ПреобразованиеТипов" file="Modules/internal/Modules/internal/Modules/OPI_ПреобразованиеТипов.os"/>
<module name="OPI_TypeConversion" file="Modules/internal/Modules/internal/Modules/OPI_ПреобразованиеТипов.os"/>
</package-def>