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

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    31334    15    21    

68

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

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

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

1500 руб.

01.12.2020    14541    36    0    

51

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

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

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

1 стартмани

12.02.2024    3504    30    sdf1979    11    

54

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

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

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

3 стартмани

23.11.2023    1990    6    1395969    4    

2

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

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

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

1 стартмани

19.11.2023    854    3    AlexSTAL    0    

7

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

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

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

1 стартмани

15.11.2023    917    4    AlexSTAL    0    

8

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

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

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

1 стартмани

13.11.2023    3377    5    AlexSTAL    0    

46

Чем Service Discovery поможет 1С-нику и его клиентам?

Тестирование QA Мониторинг Бесплатно (free)

Если развернуть слепок рабочей среды в окружении для тестирования, тесты могут начать взаимодействовать с рабочим окружением. Расскажем о том, как автоматически перенастраивать базы 1С под окружение разработки или тестирования с помощью концепции Service Discovery.

08.11.2023    3074    ktb    0    

18
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 1734 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 1734 26.10.23 10:52 Сейчас в теме
Денис добрый день! Спасибо за развернутый ответ и потраченное время на отладку и написание пояснений! Думаю, что тему теперь раскрыли полностью!
Оставьте свое сообщение