Отправка уведомлений с помощью командной строки, Оповещения с сервера на клиент с помощью командной строки

05.03.20

Разработка - Механизмы платформы 1С

Отправка уведомлений с помощью команды командной строки msg. Оповестить пользователей из серверного модуля или регламентного задания, с помощью командной строки msg.

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

Наименование Файл Версия Размер
Оповещения с сервера на клиент MSG
.epf 7,67Kb
16
.epf 1.2 7,67Kb 16 Скачать

Часто возникает необходимость оповестить клиента о какой нибудь информации (Например о новом сформированном документе) с сервера. На данный момент, в типовых методах 1С нет возможности оповестить клиента с сервера, в основном существующие методы оповещения построены на принципе периодического "опроса" клиента на сервер. Проще говоря "обработчики ожидания". Многие разработчики используют обработчики ожидания, либо разрабатывают\используют внешние компоненты для реализации подобной задачи. Типовые механизмы: напоминания, уведомления, задачи ... так же используют периодический зарос сервера на появление новых данных.

Далее будет показан пример, как отправить уведомление с сервера на клиент используя команду (командной строки Windows ) - MSG

"Команда MSG существовала еще в Windows 2000/XP и предназначалась для обмена сообщениями между пользователями вошедшими в систему локально и пользователями терминальных сессий ( подключившихся к удаленному рабочему столу ) . В Windows Vista и более поздних операционных системах семейства Windows команда MSG стала основным стандартным средством обмена сообщениями, поскольку команда net send в данных ОС больше не поддерживается."

Для примера возьмем небольшой код использования данного механизма:

///Модуль Web-Сервиса Пример1
                                                                                                   
Процедура СоданияДокумента(Параметры) 
                                                                                                        
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(Текст);
    
    //прочитаем начало xml файла
    Чтение.ПерейтиКСодержимому();
    
    //прочитаем начало корневого элемента
    Чтение.Прочитать();
    
    //читаем содержимое пока текущим не станет конец корневого элемента, т.к. мы писали туда только целые элементы справочника,
    //а сериализатор читает каждый из их полностью, то мы упремся именно в конец корневого
    Пока Чтение.ТипУзла<>ТипУзлаXML.КонецЭлемента Цикл
                                                                                                             
        НовыйДокумент = Документы.АвансовыйОтчет.СоздатьДокумент();

        //читаем очередной элемент справочника
        Объект = СериализаторXDTO.ПрочитатьXML(Чтение);

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

	    	Если масс.ИмяПриложения	= "1CV8C" тогда ///1С Предприятие
		    	Если масс.ИмяПользователя = "Бухгалтер" Тогда  ///Отправляем уведомление Бухгалтеру
			        ИмяКомпьютера = масс.ИмяКомпьютера;
                    СтрокаМСГ = "MSG /time:1000 /server:"+ СокрЛП(ИмяКомпьютера)+" * " + "Сформирован новый документ: " + строка(Ссылка);;
    		        ЗапуститьПриложение(СтрокаМСГ);
                КонецЕсли;
		    КонецЕсли;
	    КонецЦикла;
    Исключение
        ТекстОшибки = ОписаниеОшибки();                                                    
    КонецПопытки;


    ///Либо сразу пропишем ИмяКомпьютера "Бухгалтера" 
    ///В случае если Бухгалтер не работает в программе 1С на данный момент.
    //Попытка 

    //    ИмяКомпьютера = "buhgalter-1";
    //    СтрокаМСГ = "MSG /time:1000 /server:"+ СокрЛП(ИмяКомпьютера)+" * " + "Сформирован новый документ: " + строка(Ссылка);;
    //	ЗапуститьПриложение(СтрокаМСГ);
        
    //Исключение
    //    ТекстОшибки = ОписаниеОшибки();                                                    
    //КонецПопытки;
                                                                                                   
КонецПроцедуры

В примере рассматривается отправка уведомления Бухгалтеру.

 

 

 

 

 

 

 

 

 

 

Данную команду так же можно использовать для отправки уведомления пользователям локальной сети, как выборочно так и всем сразу. 

Пример реализации:

///Получаем имена компьютеров локальной сети
///Заносим имена в табличную часть "Компьютеры" 

&НаСервере
Процедура ПолучитьВсеКомпьютерыЛокальнойСети()
                                                                                       
	Компьютеры.Очистить();
    
    ///Для получения Списка локальных и терминальных пользователей используем команду
    /// cmd -  "Net View" 
    ///Команда net view выводит список доменов, компьютеров или общих ресурсов на данном компьютере. 
    ///Вызванная без параметров, команда net view выводит список компьютеров в текущем домене. 
                                                                                         
	objShell = Новый COMОбъект("WScript.Shell") ;
    objScriptExec = objShell.Exec("Net View") ;
    strPingResults = НРег(objScriptExec.StdOut.ReadAll());
                                                                                            
	Для Индекс = 1 По СтрЧислоСтрок(strPingResults) Цикл
        ПолучитьКомп(СтрПолучитьСтроку(strPingResults, Индекс));
    КонецЦикла;
                                                                                          
КонецПроцедуры

Процедура ПолучитьКомп(ММ)  ///Форматируем имя компьютера (Удаляем лишние символы)

    ///Имя компьютера в локальной сети будет иметь вид: "\\Admin"      
	НачСлова = СтрНайти(ММ,"\\");

	Если НачСлова = 0 тогда
		возврат;
	КонецЕсли;

	КонСлова = СтрНайти(ММ," ",,НачСлова);

	Комп = СокрЛП(Сред(ММ,НачСлова+2,КонСлова - НачСлова));	

	Компьютеры.Добавить().ИмяКомпьютера = Комп;
КонецПроцедуры

///В итоге получаем Таблицу с именами компьютеров в локальной сети
///Далее, выбираем нужных пользователей и отправляем уведомление             

&НаСервере
Процедура ОтправитьУведомленияНаСервере()
                                                                                            
	Для каждого стр из Компьютеры цикл   ///Пометка - вторая колонка Табличной части, для ручного выбора пользователей
		Если стр.Пометка тогда    
			СтрокаМСГ = "MSG /time:1000 /server:"+ СокрЛП(стр.ИмяКомпьютера)+" * " + Сообщение;
    		ЗапуститьПриложение(СтрокаМСГ);
		КонецЕсли;
	КонецЦикла;
                                                                                              
КонецПроцедуры

&НаКлиенте
Процедура ОтправитьУведомления(Команда)
                                                                                              
	Если ПустаяСтрока(Сообщение) тогда
		ПоказатьОповещениеПользователя("Отсутсвует сообщение!");
		возврат;
	КонецЕсли;
                                                                                               
	ОтправитьУведомленияНаСервере();
                                                                                             
КонецПроцедуры

 

 

 

Параметры MSG и Возможные ошибки:

Нынешняя реализация msg.exe прекрасно подходит для обмена сообщениями между сеансами локальных и терминальных пользователей в пределах одной системы, однако, в случаях обмена между разными компьютерами локальной сети, потребуется изменить некоторые настройки безопасности, принятые по умолчанию в операционных системах Windows Vista, 7 и более поздних.

При стандартных настройках, отправка сообщения пользователям удаленных компьютеров не выполняется и сопровождается сообщением:

Ошибка 1722 при получении имен сеанса

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

на каждом компьютере, которому будут отправляться сообщения, добавить в раздел реестра HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server параметр AllowRemoteRPC типа REG_DWORD и равный 1 Для изменения настроек можно использовать .reg-файл следующего содержания:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]
"AllowRemoteRPC"=dword:00000001


В ОС Windows Vista, Windows 7, 8, 10 ключ реестра AllowRemoteRPC существует, но имеет значение равное 0 , что необходимо исправить. Для применения изменений требуется перезагрузка.

поскольку для обмена сообщениями утилита msg.exe использует протокол SMB (Server Message Block ), на каждом компьютере, которому будут отправляться сообщения, должен быть открыт TCP порт 445


Примеры использования MSG:

msg * /server:Server "Тестовое сообщение " - отправить тестовое сообщение всем пользователям компьютера Server

msg * /server:192.168.0.1 "Тестовое сообщение " - отправить тестовое сообщение всем пользователям компьютера с IP-адресом 192.168.0.1

msg RDP-Tcp#0 /server:TSServer "Тестовое сообщение" - отправить тестовое сообщение пользователю терминальной сессии с именем RDP-Tcp#0 на компьютере TSServer

msg console /server:Windows7 "Тестовое сообщение" - отправить тестовое сообщение текущему локальному пользователю компьютера Windows7

msg console "Тестовое сообщение" - отправка тестового сообщения от пользователя сеанса RDP локальному пользователю. Если эта команда выполняется не пользователем терминальной сессии, то сообщение будет отправлено локальным пользователем самому себе.

Для выполнения команды msg от имени другого пользователя можно воспользоваться утилитой PSExec из пакета PSTools или штатным средством runas.exe

psexec -u otheruser -p otherpass msg * /server:win10 TEST message

runas /user:otheruser "msg * /server:win10 Test message"

Сообщения, отправляемые командой msg локальному пользователю компьютера с операционной системой Windows XP, который отсутствует ( еще не вошел в Windows ) отображаются в окне с приглашением к регистрации в системе и могут быть доступны посторонним.

Источник MSG.

К данной статье прикреплена обработка для отправки уведомления. Обработка тестировалась на конфигурации ЗУП (3.1.9.108).

Универсальная, подходит конфигурациям на управляемых формах.

Оповестить пользователей из серверного модуля или регламентного задания сервер клиент уф

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4620    dsdred    53    

73

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5309    YA_418728146    25    

64

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6436    dsdred    36    

112

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

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

06.10.2023    18504    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12111    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8849    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6288    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    16018    SeiOkami    31    

103