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

20.10.23

Администрирование - Мониторинг

Столкнулся с тем, что в собственной конфигурации долго выполняются операции на сервере и что бы не пялиться в замерший экран реализовал данный механизм

Скачать файлы

Наименование Файл Версия Размер
msg_from_1c.exe утилита вывода сообщений
.zip 869,78Kb
0
.zip v1.2 от 21/10/23 869,78Kb Скачать
обработка 1с с макетом
.epf 292,06Kb
0
.epf 292,06Kb Скачать

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

Механизм

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

Механизм передачи сообщения прост. Сохраняем в текстовый файл сообщение, в каталог где лежит 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)

См. также

Мониторинг баз и серверов 1С

Журнал регистрации Мониторинг Платформа 1С v8.3 Платные (руб)

В сферу обязанностей при работе с клиентами входит контроль работы баз данных и серверов 1С. Нужно понимать что происходит в базах, есть ли ошибки, зависания у пользователей и фоновых задач, блокировки или какое-то необычное поведение системы, получение информации о причинах возникновения проблем и их оперативное устранение и т.д. В качестве источников информации использую консоль кластеров 1С, технологический журнал 1С, журналы регистрации базы 1С. Для автоматизации части операций мониторинга и анализа создал инструмент на основе 1С.

9000 руб.

28.08.2019    30547    14    21    

63

Уведомления на почту по событиям журнала регистрации на email и в Telegram (для УНФ, УТ 11, БП 3.0, ЗУП 3.0, ERP)

Мессенджеры и боты Журнал регистрации Мониторинг Email рассылки Платформа 1С v8.3 Управляемые формы 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Платные (руб)

Рассылка уведомлений о событиях журнала регистрации на электронную почту и в Телеграмм. Программа позволяет анализировать журнал регистрации по заданным критериям, находить в нём интересующие события, и отправлять уведомления об этих событиях на электронную почту (одного или нескольких получателей) или в телеграмм. Может работать и как внешняя обработка, и как регламентное задание. Для УНФ, УТ 11, БП 3.0, ЗУП 3.0, ERP.

10800 руб.

18.06.2017    32057    3    2    

15

Конфигурация Session Monitor

Мониторинг Инструменты администратора БД Платформа 1С v8.3 Россия Платные (руб)

Конфигурация Session Monitor предназначена для мониторинга сервера 1С с целью отслеживания чрезмерной нагрузки от конкретных сеансов и скорости реакции рабочих процессов.

1500 руб.

01.12.2020    13993    31    0    

46

Yellow Watcher - Жёлтый наблюдатель за информационными базами

Мониторинг Платформа 1С v8.3 Абонемент ($m)

Программный комплекс мониторинга качества работы информационных баз. Статистика возникновения управляемых блокировок (тип, последняя строка контекста, контекст). Анализ длительных запросов по данным из технологического журнала. Анализ потребления ресурсов СУБД запросами и статистика ожиданий по данным из Query Store. Монитор информационной базы - получение плана запроса для сеанса 1С.

1 стартмани

12.02.2024    2625    18    sdf1979    8    

47

Проверка доступа к интернет на сервере 1С

Мониторинг Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Инструмент для проверки интернет - соединения на сервере 1С

3 стартмани

23.11.2023    1727    5    1395969    4    

2

Магия преобразований Vector, часть 3: журнал регистрации + прямой экспорт ошибок в Sentry

Журнал регистрации Мониторинг Абонемент ($m)

Как легко и быстро с помощью специализированных решений собирать, парсить и передавать логи и метрики.

1 стартмани

19.11.2023    583    2    AlexSTAL    0    

6

Магия преобразований Vector, часть 2: технологический журнал

Технологический журнал Мониторинг Абонемент ($m)

Как легко и быстро с помощью специализированных решений собирать, парсить и передавать логи и метрики.

1 стартмани

15.11.2023    661    4    AlexSTAL    0    

8

Магия преобразований: ЖР, ТЖ, RAS/RAC, логи - универсальное решение Vector

Мониторинг Журнал регистрации Технологический журнал Абонемент ($m)

Как легко и быстро с помощью специализированных решений собирать, парсить и передавать логи и метрики.

1 стартмани

13.11.2023    2704    4    AlexSTAL    0    

42
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. dhurricane 21.10.23 00:08 Сейчас в теме
Впечатляющее желание сконструировать свой велосипед, не попытавшись при этом найти готового решения. :D Призываю Вас, откройте для себя мир фоновых заданий.

Создаем общий модуль "ДлительныеОперации", в него добавляем Ваш метод генерации сайтов, который работает очень долго:
Процедура СгенерироватьСайт() Экспорт
	
	Сообщить("Начало:" + ТекущаяДатаСеанса());
	// ........
	Сообщить("Создаем каталоги");
	// .........
	Сообщить("Выгружаем изображения");
	// .......
	Сообщить("всего время: ...")
		
КонецПроцедуры
Показать

Создаем обработку с формой. На форме кнопка для запуска генератора сайтов. Модуль формы таков:
&НаКлиенте
Перем ИдентификаторЗадания;

&НаКлиенте
Процедура СгенерироватьСайт(Команда)
	
	// Запускаем задание, сохраняем его идентификатор.
	ИдентификаторЗадания = ЗапуститьГенераторСайтаНаСервере();
	
	// Каждые две секунды проверяем, как там наше задание.
	ПодключитьОбработчикОжидания("ПроверитьСостояниеЗадания", 2);
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ЗапуститьГенераторСайтаНаСервере()
	
	Задание = ФоновыеЗадания.Выполнить("ДлительныеОперации.СгенерироватьСайт");
	
	Возврат Задание.УникальныйИдентификатор;
	
КонецФункции

&НаКлиенте
Процедура ПроверитьСостояниеЗадания()
	
	Результат = ПолучитьСостояниеЗадания(ИдентификаторЗадания);
	
	Для каждого СообщениеПользователю Из Результат.Сообщения Цикл
		СообщениеПользователю.Сообщить();
	КонецЦикла;
	
	Если Результат.ЗаданиеЗавершено Тогда
		
		ИдентификаторЗадания = Неопределено;
		ОтключитьОбработчикОжидания("ПроверитьСостояниеЗадания");
		
		Сообщить("Задание завершено");
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьСостояниеЗадания(Знач ИдентификаторЗадания)
	
	Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
	
	МассивСоощений = Задание.ПолучитьСообщенияПользователю(Истина);
	Завершено = (Задание.Состояние <> СостояниеФоновогоЗадания.Активно);
	
	Результат = Новый Структура();
	Результат.Вставить("Сообщения", МассивСоощений);
	Результат.Вставить("ЗаданиеЗавершено", Завершено);
	
	Возврат Результат;

КонецФункции
Показать

Вуаля. Интерфейс 1С не блокируется, можно перейти на другую вкладку и поделать что-нибудь там. Никаких внешних программ, все сообщения видны в том же окне. Клиент и сервер могут располагаться на разных машинах без расшаривания папок между ними. Функционала доступно больше, реализация и использование проще.
starponyx; dfgdsfgsdfg2011; flanchev; SerVer1C; shard; TerveRus; sapervodichka; independ; SpiegelWiegel; Kuzya_brаtsk; Andreyyy; ixijixi; maksa2005; Xershi; insurgut; PowerBoy; asg.aleks; Blagin; +18 Ответить
2. пользователь 21.10.23 11:24
Сообщение было скрыто модератором.
...
3. пользователь 21.10.23 12:41
Сообщение было скрыто модератором.
...
4. пользователь 21.10.23 16:33
Сообщение было скрыто модератором.
...
5. пользователь 21.10.23 18:01
Сообщение было скрыто модератором.
...
6. пользователь 22.10.23 01:31
Сообщение было скрыто модератором.
...
7. пользователь 23.10.23 03:48
Сообщение было скрыто модератором.
...
8. пользователь 23.10.23 10:12
Сообщение было скрыто модератором.
...
9. пользователь 23.10.23 10:41
Сообщение было скрыто модератором.
...
10. AlexHelmer 1686 25.10.23 12:05 Сейчас в теме
Денис, спасибо! Полезное добавление к публикации, как сделать штатными средствами оповещение с сервера. Но вот воспользоваться им во внешних обработках - не получится. Если это серьезная задача которую надо реализовать в расширении и использовать общий модуль, тогда да. А в мелких отчетах и обработках мое решение позволяет сообщить пользователю информацию, если обработке/отчету предполагается работать на известных ресурсах. Именно для этих целей она и сделана.
11. user1146461 26.10.23 10:37 Сейчас в теме
(10) в БСП есть механизм для запуска длительных операций во внешних обработках)))
12. dhurricane 26.10.23 10:37 Сейчас в теме
(10) Если имеем конфигурацию на базе БСП и можно подключать внешние обработки, то выход есть.

Создаем внешнюю обработку. В модуле объекта пишем функцию регистрации обработки и обработчик серверной команды:
Функция СведенияОВнешнейОбработке() Экспорт
	
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.1.5.0");
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
	ПараметрыРегистрации.Версия = "1.0";
	ПараметрыРегистрации.Информация = НСтр("ru = 'Пример подключаемой дополнительной обработки для демонстрации работы в фоновом режиме с отображением сообщений пользователю.'");
	
	Команда = ПараметрыРегистрации.Команды.Добавить();
	Команда.Идентификатор = "СгенерироватьСайтНаСервере";
	Команда.Представление = НСтр("ru = 'Сгенерировать сайт на сервере'");
	Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
	Команда.ПоказыватьОповещение = Ложь;
	Команда.Скрыть = Истина;
	
	Команда = ПараметрыРегистрации.Команды.Добавить();
	Команда.Идентификатор = "ОткрытьГенераторСайтов";
	Команда.Представление = НСтр("ru = 'Генератор сайтов'");
	Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
	
	Возврат ПараметрыРегистрации;
	
КонецФункции

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыКоманды) Экспорт
	
	Если ИдентификаторКоманды = "СгенерироватьСайтНаСервере" Тогда
		
		ДлительностьСозданияСайта = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыКоманды, "ДлительностьСозданияСайта", 3);
		
		СгенерироватьСайт(ДлительностьСозданияСайта);
		
	КонецЕсли;
	
КонецПроцедуры

Процедура СгенерироватьСайт(ДлительностьВСекундах)
	
	Если Не ЗначениеЗаполнено(ДлительностьВСекундах) Тогда
		Возврат;	
	КонецЕсли;
	
	ОбщегоНазначения.СообщитьПользователю("Начало выполнения: ....");
	ОбщегоНазначения.СообщитьПользователю("Процесс выполнения: ....");
	ОбщегоНазначения.СообщитьПользователю("Окончание выполнения: ....");
	
КонецПроцедуры
Показать

Создаем форму обработки, где размещаем уже собственные элементы управления генерацией сайта и команду запуска серверного обработчика. Важно здесь добавить в параметры формы ключевой параметр "ДополнительнаяОбработкаСсылка" типа "СправочникСсылка.ДополнительныеОтчетыИОбработки". Модуль формы:
&НаКлиенте
Процедура СгенерироватьСайт(Команда)
	
	// Важный момент: параметр формы "ДополнительнаяОбработкаСсылка" заполняется только при открытии подключенной к ИБ обработке.
	ПараметрыВыполненияКоманды = ДополнительныеОтчетыИОбработкиКлиент.ПараметрыВыполненияКомандыВФоне(Параметры.ДополнительнаяОбработкаСсылка);
	
	// Здесь можем добавить свои параметры для серверного обработчика.
	ПараметрыВыполненияКоманды.Вставить("ДлительностьСозданияСайта", ДлительностьСозданияСайта);
	
	// Здесь обязательно нужно правильно указать идентификатор серверной команды.
	ИдентификаторКоманды = "СгенерироватьСайтНаСервере";		
	
	// Запускаем генератор.
	ОбработчикЗавершения = Новый ОписаниеОповещения("ЗавершитьГенерациюСайта", ЭтотОбъект);
	
	ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(ИдентификаторКоманды, ПараметрыВыполненияКоманды, ОбработчикЗавершения);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьГенерациюСайта(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат.Статус = "Ошибка" Тогда
		ПоказатьПредупреждение(, Результат.КраткоеПредставлениеОшибки);
		Возврат;
	КонецЕсли;
	
	ОбщегоНазначенияКлиент.СообщитьПользователю("Готово");
	
КонецПроцедуры
Показать
Прикрепленные файлы:
ПримерПодключаемойОбработки.epf
TerveRus; artbear; +2 Ответить
13. AlexHelmer 1686 26.10.23 10:52 Сейчас в теме
Денис добрый день! Спасибо за развернутый ответ и потраченное время на отладку и написание пояснений! Думаю, что тему теперь раскрыли полностью!
Оставьте свое сообщение