gifts2017

Информер 1С

Опубликовал Сергей Калистратов (skalistratov) в раздел Администрирование - Системное

Клиент-серверное приложение для локальной сети, показывающее в трее текстовые сообщения.

Что делает сервер Информера?

Сервер (malertsrv.exe) читает файлы сообщений в заданной папке (папка сообщений) и при обращении клиентов выдает им содержимое файлов. Клиенты отображают текст в трее.

Сервер устанавливается как сервис командой malertsrv.exe /install. Первый раз сервис запускаем вручную.

Настраивается файлом conf.ini, лежащим рядом с malertsrv.exe:

[SRV]
alertsPath=d:\malerts\
maxClientMessageSize=1024
scanInterval=5000
port=5000
verboseLog=0

где:

alertsPath - папка, где лежат файлы сообщений;
maxClientMessageSize - максимальный размер текстов для клиентов;
scanInterval - периодичность чтения файлов сообщений;
port - слушаемый порт, прописываем в брэндмауэре.

Каким образом происходит обмен с базами 1С?

В базе данных храним для каждого пользователя т.н. код авторизации (уникальный набор из 20 символов).

С кода авторизации начинаются имена файлов сообщений в папке сообщений. Вторая половина имени файла сообщения (также 20 символов) - произвольный набор для уникальности имени в папке.

Сервер 1С:Предприятия (или клиент 1С:Предприятия в файловом варианте) периодически проверяет какой-нибудь "регистр сообщений пользователям", и пишет в папку сообщений файлы.

Как клиенты авторизуются на сервере?

Клиенты (MInformer.exe) конфигурируется файлом conf.ini следующего вида:

[CLIENT]
version=3
remotePort=5000
remoteHost=SERVER1C
authCode=e2-bb03-feffea104052
reconnectTimeout=1000
pathTo1C=""C:\Program Files\1cv82\8.2.12.87\bin\1cv8c.exe" /S"SERVER1C\doc""
search1CWindowTitle=CLIP

где:

remotePort, remoteHost - имя компьютера в сети, на котором работает серверная часть.
search1CWindowTitle
- заголовок окна программы, которая станет активной при двойном клике на значок Информера в трее.
pathTo1C - путь к базе, которая будет запущена по пункту меню "Открыть внутреннюю почту", если заголовок окна не найден в запущенных программах.

Conf.ini обязательно должен располагаться в той же папке, что и MInformer.exe. Например, в папке C:\Program Files\1cv82, или любой другой.

Как устанавливаются и настраиваются клиенты?

Клиента просто записываем и запускаем.

Главное - сформировать conf.ini.

Как тестировали, известные глюки

Серверная часть тестировалась на Windows Server 2003, 2008, клиентская - на Windows XP, Vista, 7.

Сервис может подглючивать, поэтому желательно регламентно перезапускать, а также не допускать скопления "тысяч" файлов в папке сообщений. Сам сервер удаляет сообщения по истечении 90 дней.

Достоинства

Работает независимо от платформы.

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

Наименование Файл Версия Размер Кол. Скачив.
Сервер информера
.exe 430,50Kb
11.10.11
30
.exe 430,50Kb 30 Скачать
Пример кода в 1с 8.2.txt
.txt 5,83Kb
27.04.11
42
.txt 5,83Kb 42 Скачать
conf.ini
.ini 0,10Kb
11.10.11
10
.ini 0,10Kb 10 Скачать
Клиент информера
.exe 425,00Kb
11.10.11
12
.exe 425,00Kb 12 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Алексей (Alav) 28.04.11 11:37
Связь с сервером по IP? Т.е. когда все это в терминале работать будет?
2. Сергей Калистратов (skalistratov) 30.04.11 15:32
Связь по IP, но для отправки сообщений ip-адреса не используются.
Клиенты "тянут" сообщения у сервера.
Поэтому в терминале работать должно.
Проверял запуском 2 разных клиентов и сервера на одной машине.
Единственно хранить minformer.exe и conf.ini придется где-нибудь в %UserProfile%.
3. ive (ive) 28.10.11 16:35
Было бы хорошо выводить во всплывающем окне текст из файла, чтобы пользователь сразу мог определить стоит ему срочно открывать почту или можно подождать.
4. Сергей Калистратов (skalistratov) 28.10.11 16:45
Во всплывающем окне выводится текст из файлов сообщений... Уточните ваш вопрос, пожалуйста.
5. ive (ive) 28.10.11 23:07
спасибо, не дожидался появления сообщения, нажимал на мигающий значок.
6. Евгений Зорин (evn-zorin) 18.11.11 09:13
Очень здорово! Удивительно почему так мало плюсов, исправляем!
7. Сергей Калистратов (skalistratov) 18.11.11 09:40
8. Евгений Зорин (evn-zorin) 18.11.11 11:51
(7) skalistratov, посмотрел пример кода в 1С и недопонял, что за переменная ГАПСервер, как ею можно воспользоваться? И если вас не затруднит, не могли бы вы привести реальный пример работы файлом *.dt, буду очень признателен.
9. Сергей Калистратов (skalistratov) 18.11.11 16:47
dt-шника не заготовил, но ГАПсервер в примере это имя общего модуля, в котором лежат вспомогательные процедуры и функции (например, получение констант, связанных с информером).
Вот примеры процедур и функций:

//регламентная процедура, выгружает вспомогательный регистр сведений в файлы
Процедура СозданиеФайловОповещенийДляИнформера() Экспорт 

	УстановитьПривилегированныйРежим(Истина);
	КаталогСообщенийДляИнформера = Константы.КаталогСообщенийДляИнформера.Получить();
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	СообщенияИнформера.ДатаВремя,
	|	СообщенияИнформера.ИмяФайла,
	|	СообщенияИнформера.Сообщение
	|ИЗ
	|	РегистрСведений.СообщенияИнформера КАК СообщенияИнформера
	|ГДЕ
	|	СообщенияИнформера.Выгружено = ЛОЖЬ";
	ТЗ = Запрос.Выполнить().Выгрузить();
	
	Для Каждого Стр Из ТЗ Цикл
		СтатусЗаписи = Ложь;
		
		ИмяФайла = Стр.ИмяФайла;
		Дата = Формат(Стр.ДатаВремя,"ДФ='dd/MM/yy HH:mm'");
		Сообщение = Стр.Сообщение;
		
		ФайлСообщения = Новый ТекстовыйДокумент;
		ФайлСообщения.ДобавитьСтроку(""+Дата+" "+Сообщение);
		
		Попытка		
			ФайлСообщения.Записать(КаталогСообщенийДляИнформера+ИмяФайла, "windows-1251");
			СтатусЗаписи = Истина;
		Исключение
			СтатусЗаписи = Ложь;
		КонецПопытки;

		Если СтатусЗаписи  Тогда
			МЗ = РегистрыСведений.СообщенияИнформера.СоздатьМенеджерЗаписи();
			МЗ.ДатаВремя = Стр.ДатаВремя;
			МЗ.ИмяФайла = ИмяФайла;
			МЗ.Прочитать();
			МЗ.Выгружено = Истина;
			МЗ.Записать();
		КонецЕсли;		
	КонецЦикла;		
КонецПроцедуры

//ехе-шник хранится в общем макете 
Функция ФайлИнформера() Экспорт 
	Возврат ПолучитьОбщийМакет("Информер");
КонецФункции

Функция ПолучитьКодАвторизацииИнформера(Пользователь = Неопределено) Экспорт
	УстановитьПривилегированныйРежим(истина);
	Если Пользователь = Неопределено Тогда
		Пользователь = ПараметрыСеанса.ТекущийПользователь;
	КонецЕсли;
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	КодыАвторизацииИнформера.КодАвторизации
	|ИЗ
	|	РегистрСведений.КодыАвторизацииИнформера КАК КодыАвторизацииИнформера
	|ГДЕ
	|	КодыАвторизацииИнформера.Пользователь = &Пользователь";
	Запрос.УстановитьПараметр("Пользователь",Пользователь);
	Рез = Запрос.Выполнить();
	Код = "";
	Если НЕ Рез.Пустой() Тогда
		Выборка = Рез.Выбрать();
		Выборка.Следующий();
		Код = ""+Выборка.КодАвторизации;
	КонецЕсли;
	УстановитьПривилегированныйРежим(Ложь);
	Возврат Код;	
КонецФункции

Функция ТекущаяВерсияИнформера() Экспорт
	Возврат Константы.ТекущаяВерсияИнформера.Получить();
КонецФункции

//удаляет файлы конкретного пользователя при открытии им задачи
Процедура УдалитьФайлыИнформераПоПользователюНаСервере(Пользователь) Экспорт
	УстановитьПривилегированныйРежим(Истина);
	Каталог = Константы.КаталогСообщенийДляИнформера.Получить();
	Код = ПолучитьКодАвторизацииИнформера(Пользователь);
	МФайлов = НайтиФайлы(Каталог,Код+"????????????????????");
	Для Каждого Ф Из МФайлов Цикл
		УдалитьФайлы(Ф.ПолноеИмя);
	КонецЦикла; 
КонецПроцедуры

// регламентная, удаляет старые файлы
Процедура УдалениеОповещенийИнформера() Экспорт
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	СообщенияИнформера.ДатаВремя,
	|	СообщенияИнформера.ИмяФайла,
	|	СообщенияИнформера.Сообщение,
	|	СообщенияИнформера.Выгружено,
	|	СообщенияИнформера.Пользователь
	|ИЗ
	|	РегистрСведений.СообщенияИнформера КАК СообщенияИнформера
	|ГДЕ
	|	СообщенияИнформера.ДатаВремя > &ДатаВремя";
	Запрос.УстановитьПараметр("ДатаВремя",ТекущаяДата()- 86400*3);
	МЗ = РегистрыСведений.СообщенияИнформера.СоздатьНаборЗаписей();
	МЗ.Загрузить(Запрос.Выполнить().Выгрузить());
	МЗ.Записать();
	
	Файлы = НайтиФайлы(Константы.КаталогСообщенийДляИнформера.Получить(),"????????????????????????????????????????.*",Ложь);
	
	Для Каждого Ф из Файлы Цикл
		//Ф = Новый Файл(); //УДАЛИТЬ!
		Если Ф.ПолучитьВремяИзменения() < НачалоДня((ТекущаяДата() - 86400*3)) Тогда 
			УдалитьФайлы(Ф.ПолноеИмя);
		КонецЕсли;
	КонецЦикла;	
КонецПроцедуры
...Показать Скрыть
10. Евгений Зорин (evn-zorin) 18.11.11 18:06
Большое человеческое спасибо!
11. kcprovod (loginfo) 06.03.12 07:40
Скажите пожалуйста, на клиенте в поле pathTo1C указан путь к базе. А что означает этот кусочек кода: /S"SERVER1C\doc"? (SERVER1C - имя комп. в сети?)

И еще один вопрос: код из файла "Пример кода в 1с 8.2.txt" нужен для работы информера? Его нужно куда-то вносить?
12. Сергей Калистратов (skalistratov) 06.03.12 10:22
что означает этот кусочек кода: /S"SERVER1C\doc"? (SERVER1C - имя комп. в сети?)

- ага, именно.

"Пример кода в 1с 8.2.txt" нужен для работы информера? Его нужно куда-то вносить?

Пример кода для работы Информера показывает как могут быть настроены автоконфигурирование и автоустановка Информера. Вносить его куда-либо не обязательно, но желательно. Иначе придется conf.ini руками править.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа