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

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% из Базы знаний

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

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

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

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

Механизм

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

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

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

31720 руб.

27.03.2025    89523    68    44    

75

Инструменты администратора БД Корректировка данных Мониторинг Учет документов 1С 8.3 1С:Управление торговлей 10 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Розница 3.0 Платные (руб)

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

6100 руб.

11.06.2026    658    2    0    

4

DevOps и автоматизация разработки Мониторинг Тестирование QA Программист 1С:Предприятие 8 Бесплатно (free)

Платформа 1С давно вышла за рамки учетных систем. Сегодня это полноценная среда для создания сложных, высоконагруженных и распределенных приложений. А значит, и стек технологий современного разработчика кардинально изменился. Систематизируем весь инструментарий, который превращает 1С-программиста в инженера: от EDT и Git до автотестов на YAxUnit, контейнеризации приложений в Docker, мониторинга в Prometheus и организации шины данных на Kafka. Разберемся, зачем каждый инструмент нужен, как он вписывается в жизненный цикл разработки и с чего начать его внедрение.

вчера в 17:48    5626    mrXoxot    12    

33

Технологический журнал Мониторинг Мессенджеры и боты Системный администратор Программист 1С 8.3 1С 8.5 Россия Абонемент ($m)

Лёгкое расширение для 1С, которое ловит ошибки — включая упавшие внутри транзакции проведения и не замеченные типовыми средствами — и сразу шлёт алерты в Telegram и на почту. Не заимствует ни одного объекта конфигурации, ставится на любую базу (типовую или самописную, с БСП или без) за 5 минут. Дедуплицирует повторы, не спамит при шторме ошибок, маскирует персональные данные перед отправкой наружу. Работает даже при отключённом администратором штатном Журнале регистрации — у расширения есть собственный независимый журнал самодиагностики.

10 стартмани

вчера в 12:20    99    0    KonMa    0    

2

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

Почему счётчики кластера не отвечают на вопрос и как спросить по-человечески. Подход вопрос вместо метрики, семь вопросов о нагрузке, и техника, без которой это не работает: зерно снимка агрегат, сетевой каталог для многоузлового кластера, определение своей базы по сеансу, версия RAS под сервер.

вчера в 11:30    161    nedomolkov.ivan    0    

0

Мониторинг Системный администратор Программист 1С 8.3 Абонемент ($m)

Мониторинг нагрузки кластера, который отвечает на человеческие вопросы: кто блокировал базу, кто грузил сервер, что было ночью. Диаграмма с именами людей вместо столбцов счётчиков. Штатный АдминистрированиеСервера, без rac.exe и COM, к СУБД не обращается. С регламентным сбором истории.

10 стартмани

вчера в 10:30    142    3    nedomolkov.ivan    1    

0

Файловый обмен (TXT, XML, DBF), FTP Мониторинг Системный администратор Программист 1С 8.3 Бесплатно (free)

Три пакетных файла проверили на то, что они на самом деле возвращают. Один сообщал об ошибке при успешном завершении, два возвращали ноль после провала. Мониторинг по кодам возврата на этой цепочке горел бы красным там, где всё хорошо, и молчал бы там, где работа не делалась тридцать пять дней. Началось всё со скучной сверки расписания с журналом, а кончилось матрицей, в которой два шага из пяти стоят с нулём при шести прогонах из шести у соседей. Шаг, отработавший шесть раз, всё это время строил результат по срезу от десятого июня: сорок один день одних и тех же данных. Разбираю три механизма, каждый из которых превращал провал в зелёную строку отчёта, и почему единственная метрика, которая поймала бы всё сразу, - возраст данных внутри результата. Плюс честные границы: что после починки не замерили и какой вывод статьи на площадке так и не внедрили.

вчера в 09:00    182    nedomolkov.ivan    0    

1

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

Мониторинг блокировок сам оказался старейшей открытой транзакцией в базе: сеанс спит, блокировок по нему ноль, транзакция висит четверо с половиной суток. Порог в его собственном запросе - пять секунд, свою транзакцию он продержал порядка восьмидесяти тысяч таких порогов и себя ни разу не заметил. Ни в один отчёт "кто кого блокирует" такой сеанс не попадает: никто никого не ждёт. Это четвёртый из четырёх механизмов, разобранных в статье. Остальные три: один текст ошибки на две совершенно разные причины, из-за которого уходят в разбор графов вместо одной правки обработчика; кольцевой буфер диагностики, обнуляемый переключением основного узла; события, записанные под чужим именем базы, из-за чего запрос отдаёт ноль строк там, где данные лежат. По каждому разобрано, как он выглядит, чем отличается от настоящей пустоты и что с ним делать.

21.08.2026    623    nedomolkov.ivan    0    

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

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

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

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

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

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

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

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

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