1С8: Прогресс выполнения — на сервере и в COM соединении

Программа состоящая из UDP клиента (внешняя компонента) и сервера (программа) — клиент отправляет сообщения, сервер принимает.
Можно получать сообщения из COM соединения.
Работает только если сервер и клиент находятся в одной сети.

Программа состоящая из UDP клиента (внешняя компонента) и сервера (exe — программа)  — клиент отправляет сообщения, сервер принимает.

При запуске UDP клиента (на сервере и в COM соединении), он возвращает порт на котором запустился (диапазон портов указывается в ВК).

UDP сервер запускается на указанном порту, и получает широковещательные сообщения.

Если UDP сервер будет не доступен, это никак не повлияет на работу UDP клиента. (1С тормозить не будет)

 

UDP сервер — приложение 1cProgress.exe, запускается с параметром "порт", например: "1cProgress.exe 50500"

Не забываем создать правило в брандмауэре, для портов.

Имя класса компоненты: "УДПКлиент"

Функции и процедуры внешней компоненты:

Порт = ВК.Запустить(ПортНачальный, ПортКонечный, ШироковещательныйАдрес);

Аналог: Begin

Запускает UDP клиента, при запуске ищется свободный порт из указанного диапазона.

Порт — порт на котором запущен UDP клиент

ПортНачальный — начальный порт из диапазона (по умолчанию 50500)

ПортКонечный — начальный порт из диапазона (по умолчанию 50500)

ШироковещательныйАдрес — широковещательный адрес, например: 192.168.1.255

ВК.Прогресс(ТекстСостояния, ТекстСообщения, ПроцентВыполнения);

Аналог: Progress

Отправляет сообщение на UDP сервер.

ТекстСостояния — выводится под прогрессбаром

ТекстСообщения — выводится в окно сообщений (добавляется новая строка)

ПроцентВыполнения — прогрессбар

ВК.Закрыть();

Аналог: Closed

Отправляет сообщение "закрытия" на UDP сервер.

При получении, окно прогресса закроется.

******************************************************************

Логи UDP клиента (на 1С сервере имя пользователя "USR1CV8"): C:Users<имя пользователя>DocumentsUDP_Progress.log

 

Пример моей реализации:

ОбщийМакет.УДПКлиент — двоичный файл "УДПКлиент.zip" 

ОбщийМакет.УДПСервер — двоичный файл "1cProgress.exe"  

Общий модуль: УДП_Сообщения

&НаСервере
Функция ПодключитьУДПКомпоненту() Экспорт

КомпУст=Ложь;
Попытка
КомпУст=ПодключитьВнешнююКомпоненту("ОбщийМакет.УДПКлиент","компонента",ТипВнешнейКомпоненты.Native);
Исключение
ЗаписьЖурналаРегистрации("УДПКлиент",УровеньЖурналаРегистрации.Ошибка,,"Произошла исключительная ошибка при подключении компоненты!");
КонецПопытки;
Если Не КомпУст Тогда
ЗаписьЖурналаРегистрации("УДПКлиент",УровеньЖурналаРегистрации.Ошибка,,"Произошла ошибка при подключении компоненты!");
КонецЕсли;

УДПКлиент = Новый("AddIn.компонента.УДПКлиент");
Порт = УДПКлиент.Запустить(50500,50600,"192.168.10.255");

Попытка
СтруктураКомпонента = Новый Структура("УДПКлиент",УДПКлиент);
АдресУДПКлиент = ПоместитьВоВременноеХранилище(СтруктураКомпонента,Новый УникальныйИдентификатор);
Возврат Новый Структура("АдресУДПКлиент,Порт",АдресУДПКлиент,Порт);
Исключение
ЗаписьЖурналаРегистрации("УДПКлиент",УровеньЖурналаРегистрации.Ошибка,,ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;

КонецФункции



&НаСервере
Функция ПолучитьКомпоненту(АдресУДПКлиент) Экспорт

Попытка
Если НЕ ПустаяСтрока(АдресУДПКлиент) Тогда
Подключение = ПолучитьИзВременногоХранилища(АдресУДПКлиент).УДПКлиент;
Возврат Подключение;
КонецЕсли;
Исключение
Возврат Неопределено;
КонецПопытки;

КонецФункции



&НаСервере
Процедура ОсвободитьКомпоненту(АдресУДПКлиент) Экспорт

УдалитьИзВременногоХранилища(АдресУДПКлиент);

КонецПроцедуры

 

Модуль формы, обработки:

&НаСервере
Функция КомандаНаСервере()

Возврат УДП_Сообщения.ПодключитьУДПКомпоненту();

КонецФункции



&НаСервере
Процедура Проверка(АдресУДПКлиент)

Об=УДП_Сообщения.ПолучитьКомпоненту(АдресУДПКлиент);
ы = 100000;
Для ф=1 По ы Цикл
Справочники.Контрагенты.НайтиПоКоду("1527278");
Если (ф%1000) = 0 Тогда //каждые 1000
Об.Прогресс("Выгрузка: "+Строка(ф)+" из "+Строка(ы) ,"Выгруженно: "+Строка(ф),ф/ы*100);
КонецЕсли;
КонецЦикла;
Об.Закрыть();
УДП_Сообщения.ОсвободитьКомпоненту(АдресУДПКлиент);

КонецПроцедуры



&НаКлиенте
Процедура Команда(Команда)

ПараметрыПодключения = КомандаНаСервере();
Если НЕ ПараметрыПодключения = Неопределено Тогда
//ПараметрыПодключения.АдресУДПКлиент
//ПараметрыПодключения.Порт
Попытка
ПолучитьОбщийМакет("УДПСервер").Записать(КаталогВременныхФайлов()+"UDPServer.exe");
Исключение
КонецПопытки;
ЗапуститьПриложение(КаталогВременныхФайлов()+"UDPServer.exe "+Формат(ПараметрыПодключения.Порт,"ЧГ=0"));
Проверка(ПараметрыПодключения.АдресУДПКлиент);
КонецЕсли;

КонецПроцедуры

 

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *