Skip to content

Commit a607a7b

Browse files
committed
add WebSocketConnections
1 parent 2febc0e commit a607a7b

File tree

6 files changed

+1569
-3
lines changed

6 files changed

+1569
-3
lines changed

README.md

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,19 @@ _Инструмент из разряда «MustHave». Позволяет от
3737

3838
**Баг исправлен:**
3939

40+
- [x] Исправлен: "Технологическая платформа", версия 8.3.22.2557
41+
- [x] Исправлен: "Технологическая платформа", версия 8.3.23.2236
4042
- [x] Исправлен: "Технологическая платформа", версия 8.3.24.1624
4143
- [x] Исправлен: "Технологическая платформа", версия 8.3.25.1336
42-
- [x] Исправлен: "Технологическая платформа", версия 8.3.22.2557
4344
- [x] Исправлен: "Технологическая платформа", версия 8.3.26.1318
44-
- [ ] Планируется исправить: "Технологическая платформа", версия 8.3.23
45+
- [x] Исправлен: "Технологическая платформа", версия 8.3.27.1508
4546

4647
- [HL-802851](https://bugboard.v8.1c.ru/error/000153362): Не работает отбор по свойству «ИдентификаторСообщенияЗапроса» по значению "00000000-0000-0000-0000-000000000000".
4748

4849
**Баг исправлен:**
4950

50-
- [x] Исправлен: "Технологическая платформа", версия 8.3.26.1318
51+
- [x] Исправлен: "Технологическая платформа", версия 8.3.26.1498
52+
- [x] Исправлен: "Технологическая платформа", версия 8.3.27.1508
5153

5254
| [Исходники](/src/IntegrationServicesMessages/) | [Скачать epf файл](https://infostart.ru/1c/tools/2050054/) |
5355

@@ -125,4 +127,19 @@ _Инструмент позволяет программно включать
125127

126128
---
127129

130+
`NEW` 5. **WebSocket-Соединения** `V2025.11.10`
131+
132+
_Инструмент позволяет управлять WebSocket-Соединениями_
133+
134+
Возможности:
135+
136+
- [x] Видеть список запущенных на клиенте и сервере WebSocket соединения
137+
- [x] Кнопка Закрыть выбранные соединения
138+
- [x] Совместимость с 8.3.27
139+
- [x] Отправлять текст или двоичные данные в ввыбранное соединение
140+
141+
| [Исходники](/src/WebSocketConnections/) | [Скачать epf файл](https://infostart.ru/1c/tools/2523837/) |
142+
143+
---
144+
128145
Все обработки выложены под [MIT лицензией](https://mit-license.org/)
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.20">
3+
<ExternalDataProcessor uuid="f6b64611-710f-4eb9-af53-ffe55b835f92">
4+
<InternalInfo>
5+
<xr:ContainedObject>
6+
<xr:ClassId>c3831ec8-d8d5-4f93-8a22-f9bfae07327f</xr:ClassId>
7+
<xr:ObjectId>4878bc31-ae72-445e-bcbb-57eb8778f534</xr:ObjectId>
8+
</xr:ContainedObject>
9+
<xr:GeneratedType name="ExternalDataProcessorObject.PAPI_WebSocketСоединения" category="Object">
10+
<xr:TypeId>9082a2c8-11b6-4a14-b519-e782ed7e2425</xr:TypeId>
11+
<xr:ValueId>aeba1584-867d-436f-bfbf-616b7bd93063</xr:ValueId>
12+
</xr:GeneratedType>
13+
</InternalInfo>
14+
<Properties>
15+
<Name>PAPI_WebSocketСоединения</Name>
16+
<Synonym>
17+
<v8:item>
18+
<v8:lang>ru</v8:lang>
19+
<v8:content>PAPI: WebSocket-Соединения</v8:content>
20+
</v8:item>
21+
</Synonym>
22+
<Comment>WebSocket-Соединения V2025.11.10</Comment>
23+
<DefaultForm>ExternalDataProcessor.PAPI_WebSocketСоединения.Form.Форма</DefaultForm>
24+
<AuxiliaryForm/>
25+
</Properties>
26+
<ChildObjects>
27+
<Form>Форма</Form>
28+
</ChildObjects>
29+
</ExternalDataProcessor>
30+
</MetaDataObject>
Lines changed: 264 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,264 @@
1+
#Область ИнициализацияДополнительныеОтчетыИОбработки
2+
3+
// Возвращает сведения о внешней обработке.
4+
Функция СведенияОВнешнейОбработке() Экспорт
5+
6+
Перем ПараметрыРегистрации;
7+
8+
Если ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда
9+
10+
МодульДополнительныеОтчетыИОбработки = ОбщийМодуль("ДополнительныеОтчетыИОбработки");
11+
МодульДополнительныеОтчетыИОбработкиКлиентСервер = ОбщийМодуль("ДополнительныеОтчетыИОбработкиКлиентСервер");
12+
13+
ПараметрыРегистрации = МодульДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.4.5.71");
14+
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
15+
16+
ПараметрыРегистрации.Вид = МодульДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
17+
ПараметрыРегистрации.Версия = "2025.11.10";
18+
19+
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
20+
НоваяКоманда.Представление = НСтр("ru = 'WebSocket-Соединения'");
21+
НоваяКоманда.Идентификатор = "PAPI_WebSocketСоединения";
22+
НоваяКоманда.Использование = МодульДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
23+
НоваяКоманда.ПоказыватьОповещение = Ложь;
24+
25+
КонецЕсли;
26+
27+
Возврат ПараметрыРегистрации;
28+
29+
КонецФункции
30+
31+
#КонецОбласти
32+
33+
34+
#Область СлужебныеПроцедурыИФункции
35+
36+
// Функция для возврата минимальной версии платформы
37+
Функция МинимальнаяВерсияПлатформы()
38+
Возврат "8.3.27";
39+
КонецФункции
40+
41+
// Определяет используемую версию платформы.
42+
//
43+
// Возвращаемое значение:
44+
// Структура:
45+
// Отработал - Булево - Истина, функция возвращает нормальный результат,
46+
// Ложь означает, что результат получить не удалось.
47+
// ТекстОшибки - Строка - Описание ошибки
48+
// Результат - Строка - Текущая версия конфигуратора или режима совместимости
49+
//
50+
Функция ТекущаяВерсияПлатформы() Экспорт
51+
52+
Результат = Новый Структура("Отработал, ТекстОшибки, Результат", Истина, "", 0);
53+
54+
АктуальнаяСистемнаяИнформация = Новый СистемнаяИнформация;
55+
56+
// 8.3.27.2867
57+
перВерсияПриложения = АктуальнаяСистемнаяИнформация.ВерсияПриложения;
58+
59+
МинимальнаяВерсия = МинимальнаяВерсияПлатформы();
60+
61+
// Основная проверка
62+
Если ВерсияСтаршеИлиРавнаВерсии(перВерсияПриложения, МинимальнаяВерсия) Тогда
63+
64+
Результат.Результат = перВерсияПриложения;
65+
66+
Иначе
67+
68+
Результат.Отработал = Ложь;
69+
текТекстОшибки = НСтр("ru = 'Версия платформы ( %1 ), необходима версия не ниже ( %2 )'");
70+
Результат.ТекстОшибки = СтрШаблон(текТекстОшибки, перВерсияПриложения, МинимальнаяВерсия);
71+
72+
КонецЕсли;
73+
74+
Возврат Результат;
75+
76+
КонецФункции
77+
78+
79+
// Сравниваем две версии и возвращаем Истина если ПроверяемаяВерсия >= ЭталоннаяВерсия,
80+
// в противном случае возвращаем Ложь
81+
Функция ВерсияСтаршеИлиРавнаВерсии(ПроверяемаяВерсия, ЭталоннаяВерсия)
82+
83+
СтруктураПроверяемаяВерсия = ВернутьСтруктуруПоВерсии(ПроверяемаяВерсия);
84+
СтруктураЭталоннаяВерсия = ВернутьСтруктуруПоВерсии(ЭталоннаяВерсия);
85+
86+
Результат = Истина;
87+
88+
Если Число(СтруктураПроверяемаяВерсия.НомерВерсии) > Число(СтруктураЭталоннаяВерсия.НомерВерсии) Тогда
89+
90+
Возврат Результат;
91+
92+
ИначеЕсли Число(СтруктураПроверяемаяВерсия.НомерВерсии) < Число(СтруктураЭталоннаяВерсия.НомерВерсии) Тогда
93+
94+
Результат = Ложь;
95+
96+
Иначе // СтруктураПроверяемаяВерсия.НомерВерсии = СтруктураЭталоннаяВерсия
97+
98+
Если Число(СтруктураПроверяемаяВерсия.НомерРедакции) > Число(СтруктураЭталоннаяВерсия.НомерРедакции) Тогда
99+
100+
Возврат Результат;
101+
102+
ИначеЕсли Число(СтруктураПроверяемаяВерсия.НомерРедакции) < Число(СтруктураЭталоннаяВерсия.НомерРедакции) Тогда
103+
104+
Результат = Ложь;
105+
106+
Иначе // СтруктураПроверяемаяВерсия.НомерРедакции = СтруктураЭталоннаяВерсия.НомерРедакции
107+
108+
Если Число(СтруктураПроверяемаяВерсия.НомерРелиза) > Число(СтруктураЭталоннаяВерсия.НомерРелиза) Тогда
109+
110+
Возврат Результат;
111+
112+
ИначеЕсли Число(СтруктураПроверяемаяВерсия.НомерРелиза) < Число(СтруктураЭталоннаяВерсия.НомерРелиза) Тогда
113+
114+
Результат = Ложь;
115+
116+
Иначе // СтруктураПроверяемаяВерсия.НомерРелиза = СтруктураЭталоннаяВерсия.НомерРелиза
117+
118+
Если СтруктураПроверяемаяВерсия.НомерПодрелиза <> "0" Тогда
119+
120+
Если Число(СтруктураПроверяемаяВерсия.НомерПодрелиза) > Число(СтруктураЭталоннаяВерсия.НомерПодрелиза) Тогда
121+
122+
Возврат Результат;
123+
124+
ИначеЕсли Число(СтруктураПроверяемаяВерсия.НомерПодрелиза) < Число(СтруктураЭталоннаяВерсия.НомерПодрелиза) Тогда
125+
126+
Результат = Ложь;
127+
128+
Иначе
129+
130+
Возврат Результат;
131+
132+
КонецЕсли; // НомерПодрелиза
133+
КонецЕсли; // НомерПодрелиза <> "0"
134+
КонецЕсли; // НомерРелиза
135+
КонецЕсли; // НомерРедакции
136+
КонецЕсли; // НомерВерсии
137+
138+
Возврат Результат;
139+
140+
КонецФункции
141+
142+
// Возвращает структуру по версии
143+
// Параметры:
144+
// ВерсияПлатформы - Строка - Пример: "8.3.11.2867"
145+
//
146+
// Возвращаемое значение:
147+
// Структура:
148+
// НомерВерсии - Строка - Пример: "8"
149+
// НомерРедакции - Строка - Пример: "3"
150+
// НомерРелиза - Строка - Пример: "11"
151+
// НомерПодрелиза - Строка - Пример: "2867"
152+
Функция ВернутьСтруктуруПоВерсии(ВерсияПлатформы)
153+
154+
массивРазделенныхЭлементов = СтрРазделить(ВерсияПлатформы, ".", Истина);
155+
156+
Если массивРазделенныхЭлементов.Количество() < 4 Тогда
157+
Пока массивРазделенныхЭлементов.Количество() < 4 Цикл
158+
массивРазделенныхЭлементов.Добавить("0");
159+
КонецЦикла;
160+
КонецЕсли;
161+
162+
СтруктураВерсияПриложения = Новый Структура("НомерВерсии, НомерРедакции, НомерРелиза, НомерПодрелиза"
163+
,массивРазделенныхЭлементов[0]
164+
,массивРазделенныхЭлементов[1]
165+
,массивРазделенныхЭлементов[2]
166+
,массивРазделенныхЭлементов[3]);
167+
168+
Возврат СтруктураВерсияПриложения;
169+
170+
КонецФункции
171+
172+
#КонецОбласти
173+
174+
175+
176+
177+
#Область ДополнительныеОбработкиИОтчеты
178+
179+
// Возвращает Истина, если подсистема существует.
180+
//
181+
// Параметры:
182+
// ПолноеИмяПодсистемы - Строка - полное имя объекта метаданных подсистема без слов "Подсистема.".
183+
// Например: "СтандартныеПодсистемы.БазоваяФункциональность".
184+
//
185+
// Пример вызова необязательной подсистемы:
186+
//
187+
// Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
188+
// МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
189+
// МодульУправлениеДоступом.<Имя метода>();
190+
// КонецЕсли;
191+
//
192+
// Возвращаемое значение:
193+
// Булево
194+
//
195+
Функция ПодсистемаСуществует(ПолноеИмяПодсистемы) Экспорт
196+
197+
ИменаПодсистем = ИменаПодсистем();
198+
Возврат ИменаПодсистем.Получить(ПолноеИмяПодсистемы) <> Неопределено;
199+
200+
КонецФункции
201+
202+
// Возвращает соответствие имен подсистем и значения Истина;
203+
Функция ИменаПодсистем() Экспорт
204+
205+
Возврат Новый ФиксированноеСоответствие(ИменаПодчиненныхПодсистем(Метаданные));
206+
207+
КонецФункции
208+
209+
Функция ИменаПодчиненныхПодсистем(РодительскаяПодсистема)
210+
211+
Имена = Новый Соответствие;
212+
213+
Для Каждого ТекущаяПодсистема Из РодительскаяПодсистема.Подсистемы Цикл
214+
215+
Имена.Вставить(ТекущаяПодсистема.Имя, Истина);
216+
ИменаПодчиненных = ИменаПодчиненныхПодсистем(ТекущаяПодсистема);
217+
218+
Для каждого ИмяПодчиненной Из ИменаПодчиненных Цикл
219+
Имена.Вставить(ТекущаяПодсистема.Имя + "." + ИмяПодчиненной.Ключ, Истина);
220+
КонецЦикла;
221+
КонецЦикла;
222+
223+
Возврат Имена;
224+
225+
КонецФункции
226+
227+
// Возвращает ссылку на общий модуль по имени.
228+
//
229+
// Параметры:
230+
// Имя - Строка - имя общего модуля, например:
231+
// "ОбщегоНазначения",
232+
// "ОбщегоНазначенияКлиент".
233+
//
234+
// Возвращаемое значение:
235+
// ОбщийМодуль
236+
//
237+
Функция ОбщийМодуль(Имя) Экспорт
238+
239+
Если Метаданные.ОбщиеМодули.Найти(Имя) <> Неопределено Тогда
240+
Модуль = Вычислить(Имя); // АПК:488 "Вычислить" вместо "ОбщегоНазначения.ВычислитьВБезопасномРежиме()", так как это автономная обработка.
241+
Иначе
242+
Модуль = Неопределено;
243+
КонецЕсли;
244+
245+
Если ТипЗнч(Модуль) <> Тип("ОбщийМодуль") Тогда
246+
ВызватьИсключение ПодставитьПараметрыВСтроку(НСтр("ru = 'Общий модуль ""%1"" не существует.'"), Имя);
247+
КонецЕсли;
248+
249+
Возврат Модуль;
250+
251+
КонецФункции
252+
253+
Функция ПодставитьПараметрыВСтроку(Знач СтрокаПодстановки,
254+
Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено)
255+
256+
СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%1", Параметр1);
257+
СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%2", Параметр2);
258+
СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%3", Параметр3);
259+
260+
Возврат СтрокаПодстановки;
261+
КонецФункции
262+
263+
264+
#КонецОбласти

0 commit comments

Comments
 (0)