Гельмер Александр

+79129291010 Telegram,WhatsApp,Viber ( helmer@ya.ru )

Публикация 000000093

при длительных серверных операциях выводит сообщения на экран

Название Версия Размер Цена
   msg_v1_00.rar      v1.0 от 20/10/23     159kb     100.00 

инфостарт

В моей конфигурации нет БСП. При длительной операции на сервере не хватает информативности. Застывший экран не веселит. Хотелось бы понимать что процесс не стоит на месте. Вот что получилось. Оформил в стиле Такси, что бы не сильно выделялось для информативности этого достаточно.

Механизм

У меня все выполняется на локальной машине поэтому сервер и клиент общаются с друг с другом без проблем.

Механизм передачи сообщения прост. Сохраняем в текстовый файл сообщение, в каталог где лежит msg_from_1c.exe. Что бы все сообщения доходили до пользователя и не перетирались новыми, в 1с заведен счетчик и каждое сообщение записывается в свой файл с именем 00000ХХХ.txt, что бы можно было сортировать и выводить по порядку



В обработке что приложена к публикации EXE в макете в двоичном виде и перед началом длительной операцией на сервере извлекается, создается папка во временных файлах и все сообщения и он сам хранятся там. После обработки сообщения файл удаляется. После завершения длительной операции из 1с посылается сообщение с текстом FINISH. msg_from_1c.exe прочитав его закрывается. в 1с удалется временная папка. все чисто!

Думаю что и на клиент-серверном варианте пойдет, если у вас есть общая папка которую видит сервер и клиент. Варианты есть.

Как на уровне программы все сделано:

В модуле формы заводим переменную - счетчик сообщений для формирования файлов по порядку. Он инициализируется вызовом ОбнулитьНомерСообщения()

Все сообщения выводим процедурой ВывестиСообщение(_Сообщение) с директивой на сервере. Если у вас общая папка, то можно и с клиента сообщения сохранять. Тут все на фантазии разработчика.


&НаСервере
Перем НомерСообщения;

&НаСервере
Процедура ВыводНаСервере()
ОбнулитьНомерСообщения
();
времяначала
=текущаядата();
ВывестиСообщение
("Начало:"+ВремяНачала);
........
ВывестиСообщение
("Создаем каталоги");
.........
ВывестиСообщение
("Выгружаем изображения"); .......

ВывестиСообщение
("всего время:"+Формат((текущаядата()-ВремяНачала)/60,"ЧДЦ=0")+"мин");
//ВывестиСообщение("FINISH"); //закрыть программу с показом сообщений

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

&НаСервере
Процедура ВывестиСообщение(_сообщение)
НомерСообщения
=НомерСообщения+1;
файл
=Формат(НомерСообщения,"ЧЦ=10; ЧВН=; ЧГ=0")+".txt";//00000001.txt
текст
=новый ЗаписьТекста("с:\1с\"+файл,КодировкаТекста.ANSI);
текст
.ЗаписатьСтроку(""+НомерСообщения+" "+_сообщение);
текст
.Закрыть();
КонецПроцедуры

&НаСервере
Процедура ОбнулитьНомерСообщения()
НомерСообщения
=0;
КонецПроцедуры

&НаСервере
Процедура ПодлючитьПоказСообщенийНаКлиенте()
ЗапуститьПриложение
("с:\1с\msg_from_1c.exe",,ложь);
КонецПроцедуры


msg_from_1c.exe опрашивает папку, где расположен сам 1 раз в 2 сек и следит за txt фалами. Повторный вызов невозможен пока он находится в памяти.

Если в сообщение разместить строку

FINISH

то msg_from_1c.exe закроется

Если разместить

START

то очистит список сообщений у себя на форме

ИМХО: пытливые умы конечно скажут, что это примитивно и можно сделать круче, но мне этого функционала достаточно.

Во вложении zip архива - EXE файл и файл исходника на паскале. Пароля нет.

Если будут предложения - приветствуется! Пишите здесь в комментариях

Можно озадачится и вывести прогресс-бар с сообщением, но я думаю что эта тема для следующего раза.

21/10/23

приложил отдельно обработку в которой реализован весь механизм



Процедура Задержка(ЗадержкаСекунд = 3)

Если ЗадержкаСекунд = 0 Тогда
Возврат
КонецЕсли;

СтрокаЗапроса
= "ping -n 1 -w "+Формат(1000 * ЗадержкаСекунд, "ЧДЦ=0; ЧГ=") + " 127.255.255.255";
WshShell
= Новый COMОбъект("WScript.Shell");
WshShell
.Run(СтрокаЗапроса, 0, -1);
КонецПроцедуры

&НаСервере
Процедура ВывестиСообщение(_сообщение,КаталогСообщений,НомерСообщения)
НомерСообщения
=НомерСообщения+1;
файл
=Формат(НомерСообщения,"ЧЦ=10; ЧВН=; ЧГ=0")+".txt";
Сообщить
("файл:"+файл+" сообщение:"+_сообщение);
текст
=новый ЗаписьТекста(КаталогСообщений+"\"+файл,КодировкаТекста.ANSI);
текст
.ЗаписатьСтроку(""+НомерСообщения+" "+_сообщение); //текст.ЗаписатьСтроку(""+НомерСообщения+" "+ТекущаяДата()+" "+_сообщение);
текст
.Закрыть();
КонецПроцедуры

&НаСервере
Процедура ПодлючитьПоказСообщенийНаКлиенте(_Каталог) Экспорт
КаталогСообщений
=_каталог;
НомерСообщения
=0;
КонецПроцедуры

&НаСервере
Процедура тестНаСервере(КаталогСообщений,НомерСообщения)
Для й=1 по 5 цикл
ВывестиСообщение
(""+й,КаталогСообщений,НомерСообщения);
Задержка
(1);
КонецЦикла;
ВывестиСообщение
("FINISH",КаталогСообщений,НомерСообщения);
Задержка
(3); //Оставить так как msg.exe не успевает обработать строку. ее нижний алгоритм удаляет быстрее вместе с каталогом!
КонецПроцедуры

&НаСервере
функция ПолучитьМакетНаСервере()
возврат РеквизитФормыВЗначение("Объект").ПолучитьМакет("msg_from_1c");
конецФункции

&НаКлиенте
Процедура тест(Команда)
КаталогСообщений
=ПолучитьИмяВременногоФайла(""); //Создать каталог в tmp
exeФайл
=КаталогСообщений+"\msg.exe"; //поместить в него exe
СоздатьКаталог
(КаталогСообщений); //туда же будем выкладывать файлы сообщений что бы не перемешивать с остальными tmp
макет
=ПолучитьМакетНаСервере();
макет
.Записать(exeФайл);
ЗапуститьПриложение
(exeФайл,,ложь);
НомерСообщения
=0; //имя файла начнется с 000000001.txt
тестНаСервере
(КаталогСообщений,НомерСообщения); //поехали!
попытка
УдалитьФайлы
(КаталогСообщений); //Удалить врем каталог
Исключение
КонецПопытки;
КонецПроцедуры



Проверялось на 1С:Предприятие 8.3 (8.3.20.1789) и Бухгалтерия предприятия 3.0 (3.0.143.32)

---------------------------------------------

Публикация 000000093

при длительных серверных операциях выводит сообщения на экран

Название Версия Размер Цена
   msg_v1_00.rar      v1.0 от 20/10/23     159kb     100.00 


©AlexHelmer 2023