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

20.10.23

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
msg_from_1c.exe утилита вывода сообщений
.zip 869,78Kb ver:v1.2 от 21/10/23
0
0 Скачать (2 SM) Купить за 2 150 руб.
обработка 1с с макетом
.epf 292,06Kb
0
0 Скачать (1 SM) Купить за 1 850 руб.

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

Механизм

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

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

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

9000 руб.

28.08.2019    33922    22    21    

74

Учет доходов и расходов Логистика, склад и ТМЦ Маркетплейсы Мониторинг Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Расширение модуля Synchrozon для удобного контроля габаритов на Ozon! Разработка позволяет мгновенно сравнивать установленные габариты товаров, с габаритами, указанными на Ozon, чтобы выявлять любые несоответствия. Поможет сократить расходы на логистику, гарантируя, что все данные о товарах остаются точными и актуальными.

3600 руб.

31.10.2024    337    1    0    

3

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

Обработка позволяет использовать подобные КОРП-функциональности механизмы контроля расхода памяти (сеансом на 1 вызов и рабочими процессами), реагируя завершением "тяжелых" вызовов, перезапуском рабочих процессов при чрезмерном потреблении этого важного ресурса.

3600 руб.

03.05.2023    5101    3    0    

3

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

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

1500 руб.

01.12.2020    15988    38    0    

56

Логистика, склад и ТМЦ Мониторинг Маркетплейсы Комплексное управление ресурсами (ERP) Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Платные (руб)

Разработка «Ловец коэффициентов складов Wildberries» — расширение для 1С, которое автоматически «отлавливает» тарифы складов с наиболее выгодными коэффициентами для ваших товаров на маркетплейсе Wildberries. С помощью этого инструмента вы сможете легко находить и выбирать склады с лучшими условиями для максимизации своей прибыли. Удобная интеграция позволяет настроить регулярный поиск складов по выгодным коэффициентам в виде регламентного задания в 1С, что существенно экономит время и автоматизирует процесс принятия решений по размещению товаров. Всегда будьте на шаг впереди конкурентов и повышайте эффективность своего бизнеса с помощью «Ловца коэффициентов складов Wildberries»!

3600 руб.

14.11.2024    220    0    0    

2

Мониторинг Анализ продаж Платформа 1С v8.3 Конфигурации 1cv8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Розница 3.0 Управленческий учет Платные (руб)

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

24000 руб.

11.11.2024    181    0    0    

0

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

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

1 стартмани

18.07.2024    847    7    moolex    0    

5

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

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

1 стартмани

13.06.2024    4974    37    Garilia    3    

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