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

20.10.23

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

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

Файлы

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

Наименование Скачано Купить файл
msg_from_1c.exe утилита вывода сообщений
.zip 869,78Kb ver:v1.2 от 21/10/23
0 3 000 руб. Купить
обработка 1с с макетом
.epf 292,06Kb
0 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

Механизм

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

Механизм передачи сообщения прост. Сохраняем в текстовый файл сообщение, в каталог где лежит 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С:Предприятие 8 1С 8.3 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:Библиотека стандартных подсистем 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)

Создайте свой функциональный интерфейс в любой конфигурации 1С с помощью расширения Infostart Dashboard. Настраивайте панели виджетов с метриками, индикаторами и показателями на начальном экране. Узнайте возможность внедрения подсистемы у себя в конфигурации с помощью бесплатной обработки "Анализ внедрения подсистемы 1С Infostart Dashboard"!

29280 руб.

27.03.2025    70324    42    29    

55

Перенос данных 1C Мониторинг Программист 1С 8.3 1С:Документооборот 1С:ERP Управление предприятием 2 Россия Абонемент ($m)

Простое расширение конфигурации с регламентным заданием для мониторинга ошибок типового обмена с уведомлением на почту.

1 стартмани

29.01.2026    293    1    Triplexx    0    

2

Мониторинг Системный администратор Программист Бесплатно (free)

Описания проблем и решений при настройке мониторинга. Мои подготовительные мероприятия.

23.01.2026    478    ImHunter    5    

1

Технологический журнал Мониторинг Системный администратор Программист Бесплатно (free)

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

29.12.2025    6248    leongl    0    

18

HighLoad оптимизация Мониторинг Системный администратор Программист Бесплатно (free)

Делимся опытом поддержки баз 1С с более чем 6 000 одновременно работающих пользователей и рассказываем о ключевых подходах к контролю высоконагруженных систем. Рассмотрим реальные кейсы и дадим ответ на вопрос о том,: что точно надо контролировать. Сравним ElasticSearch и ClickHouse, дадим ссылки на статьи и репозитарии для быстрого старта, а также посмотрим на примеры рабочих столов для анализа логов технологического журнала в ElasticSearch.

19.12.2025    1782    Sergey.Noskov    2    

11

Администрирование СУБД Технологический журнал Мониторинг Системный администратор Программист Бесплатно (free)

Рассказываем, почему высоконагруженным бэкендам на 1С нужен регулярный мониторинг и что происходит, когда его нет: производительность и стабильность деградируют, а обращения пользователей копятся. Показываем, как построили легкую систему наблюдаемости для бэкендов корпоративных порталов. Она включает сбор метрик из технологического журнала, Apdex, журнала регистрации и динамики размеров таблиц с последующим анализом в связке ClickHouse и служебной информационной базы на 1С. Объясняем, какие отчеты и метрики быстрее всего помогают находить критичные проблемы производительности, и демонстрируем интерфейс расследования. Разбираем несколько кейсов оптимизации, найденных по итогам мониторинга, включая доработки функционала БСП «управление доступом» и «присоединенные файлы».

15.12.2025    3897    tystik    1    

8

Мониторинг Системный администратор 1С 8.3 Россия Бесплатно (free)

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

03.12.2025    9806    user798823    2    

4

Мониторинг Журнал регистрации Технологический журнал Системный администратор Программист Бесплатно (free)

Мониторинг в ландшафте 1С помогает не только вовремя выявлять проблемы и повышать SLA, но и укреплять информационную безопасность. Разбираем источники данных, ограничения штатных инструментов и современные практики мониторинга на базе Prometheus, ClickHouse и Grafana. А также рассказываем о коробочном решении «Оркестратор 1С-систем» и планах его развития.

29.10.2025    2099    Sibars    0    

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

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

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

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

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

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

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

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

Вуаля. Интерфейс 1С не блокируется, можно перейти на другую вкладку и поделать что-нибудь там. Никаких внешних программ, все сообщения видны в том же окне. Клиент и сервер могут располагаться на разных машинах без расшаривания папок между ними. Функционала доступно больше, реализация и использование проще.
simuljakr; starponyx; dfgdsfgsdfg2011; flanchev; SerVer1C; shard; TerveRus; sapervodichka; independ; SpiegelWiegel; Kuzya_brаtsk; Andreyyy; ixijixi; maksa2005; Xershi; insurgut; PowerBoy; asg.aleks; Blagin; +19 Ответить
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 2095 25.10.23 12:05 Сейчас в теме
Денис, спасибо! Полезное добавление к публикации, как сделать штатными средствами оповещение с сервера. Но вот воспользоваться им во внешних обработках - не получится. Если это серьезная задача которую надо реализовать в расширении и использовать общий модуль, тогда да. А в мелких отчетах и обработках мое решение позволяет сообщить пользователю информацию, если обработке/отчету предполагается работать на известных ресурсах. Именно для этих целей она и сделана.
11. tarasovt 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
Apiar; TerveRus; artbear; +3 Ответить
13. AlexHelmer 2095 26.10.23 10:52 Сейчас в теме
Денис добрый день! Спасибо за развернутый ответ и потраченное время на отладку и написание пояснений! Думаю, что тему теперь раскрыли полностью!
Для отправки сообщения требуется регистрация/авторизация