В моей конфигурации нет БСП. При длительной операции на сервере не хватает информативности. Застывший экран не веселит. Хотелось бы понимать что процесс не стоит на месте. Вот что получилось. Оформил в стиле Такси, что бы не сильно выделялось для информативности этого достаточно.
Механизм
У меня все выполняется на локальной машине поэтому сервер и клиент общаются с друг с другом без проблем.
Механизм передачи сообщения прост. Сохраняем в текстовый файл сообщение, в каталог где лежит 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 файл и файл исходника на паскале. Пароль 1.
Если будут предложения - приветствуется! Пишите здесь в комментариях
Можно озадачится и вывести прогресс-бар с сообщением, но я думаю что эта тема для следующего раза.
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)