1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2026-04-26 20:43:22 +02:00

Обложка WS, мелкие исправления

This commit is contained in:
Anton Titovets
2026-03-30 16:10:49 +03:00
parent af11a2f840
commit c056bd643e
16 changed files with 59 additions and 215 deletions
+5 -1
View File
@@ -24,7 +24,7 @@
},
"osPath": {
"description": "OneScript exe path",
"value": "D:/OneScript/"
"value": "D:/OneScript"
},
"ghcliPath": {
"description": "GitHub CLI exe path",
@@ -57,6 +57,10 @@
"releaseWorkspace": {
"description": "Artifacts root folder",
"value": "C:/Users/bayselonarrend/AppData/Local/Jenkins/.jenkins/workspace/OpiBuild/OpiRelease"
},
"yadiskPath": {
"description": "Yandex Disk mount path",
"value": "D:/Yandex.Disk-bayselonarrend"
}
}
},
+2 -6
View File
@@ -110,15 +110,11 @@
OPI_ПреобразованиеТипов.ПолучитьСтроку(IDРелиза);
КонецЕсли;
СтруктураЗапроса = Новый Структура;
СтруктураЗапроса.Вставить("publish", Ложь);
СозданиеДрафта = OPI_ЗапросыHTTP
.НовыйЗапрос()
.Инициализировать(СтрШаблон("https://api.sourcecraft.tech/releases/id:%1", IDРелиза))
.Инициализировать(СтрШаблон("https://api.sourcecraft.tech/releases/id:%1/publish", IDРелиза))
.ДобавитьBearerАвторизацию(Токен)
.УстановитьJsonТело(СтруктураЗапроса)
.ОбработатьЗапрос("PATCH")
.ОбработатьЗапрос("POST")
.ВернутьОтветКакСтроку();
CommonTools.СообщитьПроцесс(СозданиеДрафта);
@@ -4,6 +4,8 @@
Перем Путь1с;
Перем Сервер1с;
Перем КаталогOscript;
Перем КаталогКонфигурацииYaxUnit;
Перем ШаблонКонфигурацииYaxUnit;
@@ -47,6 +49,8 @@
Сервер1с = ДанныеПроекта.ПолучитьЗначениеНастройки("local.serverName");
ХостJenkins = ДанныеПроекта.ПолучитьЗначениеНастройки("local.jenkinsHost");
КаталогOscript = ДанныеПроекта.ПолучитьЗначениеНастройки("local.osPath");
ДанныеКонфигурацииТестов = ДанныеПроекта.ПолучитьЗначениеНастройки("tests.availability");
КаталогКонфигурацииYaxUnit = ДанныеПроекта.ПолучитьЗначениеНастройки("tests.yaxunitConf");
ПутьJenkinsFull = ДанныеПроекта.ПолучитьЗначениеНастройки("tests.jenkinsFull");
@@ -189,8 +193,8 @@
ТекстВыполненияCLI = ПолучитьТекстВыполненияOs(ТаблицаТестов, СписокБиблиотек, МодульТестовCLI, Язык);
ТекстВыполнения1С = ПолучитьТекстВыполнения1c(ТаблицаТестов, СписокБиблиотек, МодульТестов, Язык);
ТекстJFCLI = СтрШаблон(ШаблонCliWindows, Язык, ТекстВыполненияCLI);
ТекстJFOS = СтрШаблон(ШаблонOsWindows, Язык, ТекстВыполненияOS);
ТекстJFCLI = СтрШаблон(ШаблонCliWindows, Язык, ТекстВыполненияCLI, КаталогOscript);
ТекстJFOS = СтрШаблон(ШаблонOsWindows, Язык, ТекстВыполненияOS, КаталогOscript);
ТекстJFOSRPM = СтрШаблон(ШаблонOsLinux, Язык, ТекстВыполненияOS, "Rpm-Agent");
ТекстJFOSDEB = СтрШаблон(ШаблонOsLinux, Язык, ТекстВыполненияOS, "Deb-Agent");
+6 -4
View File
@@ -14,6 +14,7 @@
Перем ХешСумма;
Перем НеобходимоеЧислоАртефактов;
Перем ДанныеПроекта;
Перем КаталогЯндексДиск;
Процедура ПриСозданииОбъекта(Знач ДанныеПроекта_ = Неопределено)
@@ -39,6 +40,7 @@
ОСкрипт = ДанныеПроекта.ПолучитьЗначениеНастройки("local.osPath");
ПутьGHCLI = ДанныеПроекта.ПолучитьЗначениеНастройки("local.ghcliPath");
ПутьInnoSetup = ДанныеПроекта.ПолучитьЗначениеНастройки("local.innoPath");
КаталогЯндексДиск = ДанныеПроекта.ПолучитьЗначениеНастройки("local.yadiskPath");
ПутьВыгрузки = СтрШаблон("./%1/", Версия);
ХешСумма = ПолучитьСтрокуИзДвоичныхДанных(Новый ДвоичныеДанные("./service/last_build_hash.txt"));
@@ -134,7 +136,7 @@
CommonTools.СообщитьПроцесс("Files uploading");
КаталогПререлиза = "D:\Yandex.Disk-bayselonarrend\OpenIntegrations\prerelease"; // TODO: Добавить в conf
КаталогПререлиза = КаталогЯндексДиск + "/OpenIntegrations/prerelease";
Для Каждого ФайлРелиза Из ФайлыРелиза Цикл
@@ -268,19 +270,19 @@
ИмяOSPX = СтрШаблон("%1-%2_%3.ospx", ИдентификаторOSPX, Версия, Префикс);
КонечныйПутьOSPX = ПутьВыгрузки + ИмяOSPX;
СборкаOS = СтрШаблон("""%2bin/opm.bat"" b -o %1", ВременныКаталог, ОСкрипт);
СборкаOS = СтрШаблон("""%2/bin/opm.bat"" b -o %1", ВременныКаталог, ОСкрипт);
CommonTools.ЗапуститьВнешнееПриложение(СборкаOS, ПутьСборки);
ПереместитьФайл(ОбъединитьПути(ВременныКаталог, СтандартноеИмяOSPX), КонечныйПутьOSPX);
УдалитьФайлы(СтрШаблон("%1lib/%2", Оскрипт, ИдентификаторOSPX));
УдалитьФайлы(СтрШаблон("%1/lib/%2", Оскрипт, ИдентификаторOSPX));
Приостановить(1000);
СтрокаВызова = СтрШаблон("""%2bin/opm.bat"" install -f ""%1""", КонечныйПутьOSPX, ОСкрипт);
CommonTools.ЗапуститьВнешнееПриложение(СтрокаВызова);
Приостановить(1000);
НачальныйПуть = СтрШаблон("%1lib/%2", ОСкрипт, ИдентификаторOSPX);
НачальныйПуть = СтрШаблон("%1/lib/%2", ОСкрипт, ИдентификаторOSPX);
КонечныйПуть = СтрШаблон("./ci/installer_set/share/oint/lib/%1", ИдентификаторOSPX);
ФС.КопироватьСодержимоеКаталога(НачальныйПуть, КонечныйПуть);
+1
View File
@@ -48,6 +48,7 @@ Fast navigation:
<a href="/docs/Instructions/SFTP/"><img src={require('../../static/img/APIs/SFTP.png').default} width="32" class="wp_logo"/></a>
<a href="/docs/Instructions/TCP/"><img src={require('../../static/img/APIs/TCP.png').default} width="32" class="wp_logo"/></a>
<a href="/docs/Instructions/HTTP/"><img src={require('../../static/img/APIs/HTTP.png').default} width="32" class="wp_logo"/></a>
<a href="/docs/Instructions/WebSocket/"><img src={require('../../static/img/APIs/WebSocket.png').default} width="32" class="wp_logo"/></a>
<a href="/docs/Instructions/GRPC/"><img src={require('../../static/img/APIs/gRPC.png').default} width="32" class="wp_logo"/></a>
<a href="/docs/Instructions/SSH/"><img src={require('../../static/img/APIs/SSH.png').default} width="32" class="wp_logo"/></a>
<a href="/docs/Instructions/RCON/"><img src={require('../../static/img/APIs/RCON.png').default} width="32" class="wp_logo"/></a>
+1
View File
@@ -49,6 +49,7 @@ keywords: [1C, 1С, 1С:Предприятие, 1С:Предприятие 8.3,
<a href="/docs/Instructions/SFTP/"><img src={require('../../static/img/APIs/SFTP.png').default} width="32" class="wp_logo"/></a>
<a href="/docs/Instructions/TCP/"><img src={require('../../static/img/APIs/TCP.png').default} width="32" class="wp_logo"/></a>
<a href="/docs/Instructions/HTTP/"><img src={require('../../static/img/APIs/HTTP.png').default} width="32" class="wp_logo"/></a>
<a href="/docs/Instructions/WebSocket/"><img src={require('../../static/img/APIs/WebSocket.png').default} width="32" class="wp_logo"/></a>
<a href="/docs/Instructions/GRPC/"><img src={require('../../static/img/APIs/gRPC.png').default} width="32" class="wp_logo"/></a>
<a href="/docs/Instructions/SSH/"><img src={require('../../static/img/APIs/SSH.png').default} width="32" class="wp_logo"/></a>
<a href="/docs/Instructions/RCON/"><img src={require('../../static/img/APIs/RCON.png').default} width="32" class="wp_logo"/></a>
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 MiB

After

Width:  |  Height:  |  Size: 846 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

+7 -1
View File
@@ -4,13 +4,19 @@
"title": "Version 1.35.0 - .04.2026",
"summary_ru": "Методы работы с Websocket",
"summary_en": "Methods of working with Websocket",
"image": "media/Covers/RSS.png",
"image": "media/Covers/WebSocket.png",
"changes": [
{
"lib": "WebSocket",
"icon": "media/WebSocket.png",
"description_ru": "Методы клиента (3 функции)",
"description_en": "Client methods (3 functions)"
},
{
"lib": "SQLite",
"icon": "media/SQLite.png",
"description_ru": "Исправлена работа с расширениями для новых версий платформы",
"description_en": "Fixed extension compatibility with new platform versions"
}
]
},
@@ -33,7 +33,7 @@ pipeline {
stage('Remove oint.bat if exists') {
steps {
powershell encoding: 'UTF-8', script: '''
$batFile = "D:\\OneScript\\bin\\oint.bat"
$batFile = "%3/oint.bat"
if (Test-Path $batFile) {
Remove-Item -Path $batFile -Force
Write-Host "Файл oint.bat удален."
@@ -44,7 +44,7 @@ pipeline {
// Проверяем, что файл действительно удален
powershell encoding: 'UTF-8', script: '''
$batFile = "D:\\OneScript\\bin\\oint.bat"
$batFile = "%3/oint.bat"
if (Test-Path $batFile) {
Write-Error "Ошибка: Файл oint.bat не удален!"
exit 1
@@ -27,7 +27,7 @@ pipeline {
try {
// Удаление каталога C:\Program Files\OneScript\lib\oint, если существует
powershell encoding: 'UTF-8', script: '''
$dirPath = "D:\\OneScript\\lib\\oint"
$dirPath = "%3/lib/oint"
if (Test-Path $dirPath) {
Write-Host "Каталог oint найден. Удаляем..."
Remove-Item -Path $dirPath -Recurse -Force
@@ -39,7 +39,7 @@ pipeline {
// Проверяем, что каталог действительно удален
powershell encoding: 'UTF-8', script: '''
$dirPath = "D:\\OneScript\\lib\\oint"
$dirPath = "%3/lib/oint"
if (Test-Path $dirPath) {
Write-Error "Ошибка: Каталог oint всё ещё существует после попытки удаления!"
exit 1
-184
View File
@@ -1,184 +0,0 @@
# common-core
Общая библиотека для создания 1С Native API расширений с автоматической защитой от panic.
## Возможности
-**Trait ValueType** - универсальный trait для работы с типами 1С
-**Макрос impl_raw_addin!** - автоматическая генерация RawAddin impl
-**Защита от panic** - автоматический перехват panic и возврат ошибки в 1С
-**Логирование** - опциональное логирование всех panic
-**Нет boilerplate** - весь повторяющийся код генерируется макросом
## Установка
Добавь в `Cargo.toml`:
```toml
[dependencies]
common-core = { path = "../commons/common-core" }
```
## Использование
### Базовое использование
**Было (старый способ):**
```rust
// src/core/mod.rs
pub mod getset;
use addin1c::{name, RawAddin, Variant};
use crate::component::{METHODS, PROPS, get_params_amount, cal_func, AddIn};
impl RawAddin for AddIn {
fn register_extension_as(&mut self) -> &'static [u16] {
name!("Main")
}
// ... 20+ строк boilerplate кода ...
fn call_as_func(&mut self, num: usize, params: &mut [Variant], ret_value: &mut Variant) -> bool {
cal_func(self, num, params).get_value(ret_value)
}
}
impl std::ops::Index<usize> for AddIn {
// ... ещё код ...
}
impl std::ops::IndexMut<usize> for AddIn {
// ... ещё код ...
}
```
**Стало (новый способ):**
```rust
// src/core/mod.rs
pub use common_core::getset;
use common_core::impl_raw_addin;
use crate::component::{AddIn, METHODS, PROPS, get_params_amount, cal_func};
impl_raw_addin!(AddIn, METHODS, PROPS, get_params_amount, cal_func);
```
Всё! Одна строка макроса заменяет весь boilerplate код.
### С логированием panic
Если хочешь логировать все panic в файл:
```rust
use common_core::impl_raw_addin_with_logging;
use crate::component::{AddIn, METHODS, PROPS, get_params_amount, cal_func};
impl_raw_addin_with_logging!(
AddIn,
METHODS,
PROPS,
get_params_amount,
cal_func,
"D:\\my_addon_panic.log"
);
```
## Что генерирует макрос
Макрос автоматически генерирует:
1. **Полную реализацию RawAddin** - все 15+ методов
2. **Защиту от panic** - `catch_unwind` в `call_as_func`
3. **Index/IndexMut** - для доступа к полям через `self[index]`
4. **Обработку ошибок** - извлечение сообщения из `Any` panic
5. **Опциональное логирование** - запись всех panic в файл
## Защита от panic
Макрос автоматически оборачивает `call_as_func` в `catch_unwind`:
```rust
fn call_as_func(&mut self, num: usize, params: &mut [Variant], ret_value: &mut Variant) -> bool {
let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
cal_func(self, num, params)
}));
match result {
Ok(value) => value.get_value(ret_value),
Err(panic_info) => {
// Извлекаем сообщение из panic
let error_msg = if let Some(s) = panic_info.downcast_ref::<&str>() {
format!("Internal error (panic): {}", s)
} else if let Some(s) = panic_info.downcast_ref::<String>() {
format!("Internal error (panic): {}", s)
} else {
"Internal error: unknown panic occurred".to_string()
};
// Возвращаем ошибку в 1С вместо краша
ret_value.set_str(&error_msg);
true
}
}
}
```
Это означает, что:
-**Нет краша 1С** - даже если происходит panic
-**Информативные ошибки** - пользователь видит, что произошло
-**Легко отлаживать** - можно включить логирование
## Требования
В `Cargo.toml` должно быть:
```toml
[profile.release]
panic = "unwind" # НЕ "abort"!
```
Это необходимо для работы `catch_unwind`.
## Миграция существующих проектов
1. Добавь зависимость `common-core`
2. Замени содержимое `src/core/mod.rs` на одну строку макроса
3. Удали `src/core/getset.rs` (теперь используется из common-core)
4. Убедись, что `panic = "unwind"` в Cargo.toml
## Пример полной структуры проекта
```
my-addon/
├── Cargo.toml
├── src/
│ ├── lib.rs
│ ├── core/
│ │ └── mod.rs # Только макрос, 3 строки
│ └── component/
│ ├── mod.rs # METHODS, PROPS, AddIn, cal_func, get_params_amount
│ └── ...
```
**src/core/mod.rs:**
```rust
pub use common_core::getset;
use common_core::impl_raw_addin;
use crate::component::{AddIn, METHODS, PROPS, get_params_amount, cal_func};
impl_raw_addin!(AddIn, METHODS, PROPS, get_params_amount, cal_func);
```
Готово!
## Преимущества
1. **Меньше кода** - 3 строки вместо 50+
2. **Меньше ошибок** - нет дублирования кода между проектами
3. **Автоматическая защита** - все проекты автоматически защищены от panic
4. **Легко обновлять** - изменения в одном месте применяются ко всем проектам
5. **Единообразие** - все проекты используют одинаковую логику
## Лицензия
MIT
@@ -69,7 +69,7 @@
OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
OPI_Инструменты.ВернутьУправляющиеПоследовательности(База);
Коннектор = OPI_Компоненты.ПолучитьКомпоненту("SQLite");
Коннектор = OPI_Компоненты.ПолучитьКомпоненту("SQLite", , Истина);
Коннектор.Database = База;
@@ -48,7 +48,7 @@
#Область Основные
Функция ПолучитьКомпоненту(Знач ИмяКомпоненты, Знач Класс = "Main") Экспорт
Функция ПолучитьКомпоненту(Знач ИмяКомпоненты, Знач Класс = "Main", НеИзолированно = Ложь) Экспорт
Компонента = Неопределено;
Ошибка = "";
@@ -57,7 +57,7 @@
Если Не ИнициализироватьВнешнююКомпоненту(ИмяКомпоненты, Класс, Компонента) Тогда
Ошибка = Неопределено;
Компонента = ПодключитьКомпонентуНаСервере(ИмяКомпоненты, Класс, Ошибка);
Компонента = ПодключитьКомпонентуНаСервере(ИмяКомпоненты, Класс, Ошибка, НеИзолированно);
Если ЗначениеЗаполнено(Ошибка) Тогда
СформироватьИсключениеКомпоненты(Ошибка);
@@ -235,7 +235,7 @@
КонецФункции
Функция ПодключитьКомпонентуНаСервере(Знач ИмяКомпоненты, Знач Класс, Ошибка)
Функция ПодключитьКомпонентуНаСервере(Знач ИмяКомпоненты, Знач Класс, Ошибка, НеИзолированно)
Если OPI_Инструменты.ЭтоOneScript() Тогда
ИмяМакета = СтрШаблон("%1%2.zip" , КаталогКомпонентOS(), ИмяКомпоненты);
@@ -244,7 +244,7 @@
КонецЕсли;
Попытка
ПодключитьКомпонентуНеИзолированно(ИмяМакета, ИмяКомпоненты);
ПодключитьКомпонентуВРежиме(ИмяМакета, ИмяКомпоненты, НеИзолированно);
Компонента = Новый(СтрШаблон("AddIn.%1.%2", ИмяКомпоненты, Класс));
Ошибка = Неопределено;
Возврат Компонента;
@@ -255,12 +255,14 @@
КонецФункции
Функция ПодключитьКомпонентуНеИзолированно(ИмяМакета, ИмяКомпоненты)
Функция ПодключитьКомпонентуВРежиме(ИмяМакета, ИмяКомпоненты, ПринудительноНеИзолированно)
ЭтоOneScript = OPI_Инструменты.ЭтоOneScript();
НеобходимТипПоСистеме = Не ЭтоOneScript И Не OPI_Инструменты.ЭтоWindows();
НеобходимТипПоVM = Не ЭтоOneScript;
НеобходимТипПоСистеме = Не OPI_Инструменты.ЭтоWindows();
Если ЭтоOneScript Тогда
Если Не НеобходимТипПоVM Тогда
НеобходимТипПоВерсии = Ложь;
@@ -279,7 +281,7 @@
КонецЕсли;
НеобходимТип = НеобходимТипПоВерсии И НеобходимТипПоСистеме;
НеобходимТип = НеобходимТипПоVM И НеобходимТипПоВерсии И (НеобходимТипПоСистеме Или ПринудительноНеИзолированно);
Если Не НеобходимТип Тогда
@@ -7869,6 +7869,8 @@
Данные = ПолучитьСтрокуИзДвоичныхДанных(Данные);
ОжидаетЧто(Данные).Равно(Сообщение);
Результат["message"] = "<ДвоичныеДанные>";
КонецЕсли;
@@ -13617,9 +13619,12 @@
ОжидаетЧто(СтрНайти(Результат, "<rss") > 0).Равно(Истина);
ОжидаетЧто(СтрНайти(Результат, "<channel>") > 0).Равно(Истина);
ОжидаетЧто(СтрНайти(Результат, "<item>") > 0).Равно(Истина);
ИВФ = ПолучитьИмяВременногоФайла("xml");
ПолучитьДвоичныеДанныеИзСтроки(Результат).Записать(ИВФ);
ЗаписатьПараметр("RSS_FeedXML", Результат);
Параметры.Вставить("RSS_FeedXML", Результат);
ЗаписатьПараметр("RSS_FeedXML", ИВФ);
Параметры.Вставить("RSS_FeedXML", ИВФ);
Возврат Результат;
@@ -13671,9 +13676,12 @@
ОжидаетЧто(СтрНайти(Результат, "<feed") > 0).Равно(Истина);
ОжидаетЧто(СтрНайти(Результат, "xmlns=""http://www.w3.org/2005/Atom""") > 0).Равно(Истина);
ОжидаетЧто(СтрНайти(Результат, "<entry>") > 0).Равно(Истина);
ИВФ = ПолучитьИмяВременногоФайла("xml");
ПолучитьДвоичныеДанныеИзСтроки(Результат).Записать(ИВФ);
ЗаписатьПараметр("RSS_AtomFeedXML", Результат);
Параметры.Вставить("RSS_AtomFeedXML", Результат);
ЗаписатьПараметр("RSS_AtomFeedXML", ИВФ);
Параметры.Вставить("RSS_AtomFeedXML", ИВФ);
Возврат Результат;
@@ -29631,6 +29631,8 @@
// END
Обработать(Результат, "RSS", "РазобратьФидRSS");
OPI_Инструменты.УдалитьФайлВПопытке(ФидXML, "Не удалось удалить временный файл после теста!");
КонецПроцедуры
@@ -29701,6 +29703,8 @@
// END
Обработать(Результат, "RSS", "РазобратьФидAtom");
OPI_Инструменты.УдалитьФайлВПопытке(ФидXML, "Не удалось удалить временный файл после теста!");
КонецПроцедуры