Переключение на Главную Страницу Страницы: 1 2 [3]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Сервис.ВыполнитьГлобальнуюПроцедуру() (число прочтений - 21987 )
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #30 - 12. Августа 2006 :: 09:31
Печать  
По поводу EventProxy - цитирую Steban-а:
Цитата:
Никак. 1С не генерирует событий при работе в качестве Automation-сервера.
  

Константин
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #31 - 12. Августа 2006 :: 09:35
Печать  
Для этого и нужна eventproxy
  
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #32 - 12. Августа 2006 :: 09:38
Печать  
Ну загляни же ты сюда:http://www.1cpp.ru/forum/YaBB.pl?num=1152684759/20
  

Константин
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #33 - 12. Августа 2006 :: 09:47
Печать  
Ты вечно спешишь непонятно куда...

1С + MSMQ посылает сообщение. Другой 1С + MSMQ + evenproxy (а она нужна именно для того чтобы поймать ивенты) ты поймал событие.


Странно, что как применить GTTools ты понимаешь, а все другие подобные варианты отрицаешь Улыбка

MSMQ это GTTools, только в 1000 круче Улыбка
Да простит меня БГ.
  
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #34 - 12. Августа 2006 :: 09:56
Печать  
Спешу потому, что горит. Пока я запустил то, о чем сказал чуть выше - свой мини-сервер. Работает. И я уже сказал, что обработка ожидания, которую я пока использую, меня не совсем устраивает, и я продолжаю искать.
Что касается связки "1С + MSMQ" - я еще не пробовал. Не имею достаточно информации, соответственно опыта. Пока на зуб не попробую - других не угощу. А от хорошей ссылки на применение "1С + MSMQ" ни за что не откажусь. Заранее благодарен.
  

Константин
Наверх
 
IP записан
 
1cvirus
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 89
Зарегистрирован: 24. Мая 2006
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #35 - 12. Августа 2006 :: 10:24
Печать  
Цитата:
Если кому будет интересно, то я выложу код.

интересно
  
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #36 - 12. Августа 2006 :: 10:27
Печать  
1cvirus писал(а) 12. Августа 2006 :: 10:24:
Цитата:
Если кому будет интересно, то я выложу код.

интересно

После входных выложу коды
  

Константин
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #37 - 12. Августа 2006 :: 11:13
Печать  
Цитата:
А от хорошей ссылки на применение "1С + MSMQ" ни за что не откажусь.

Э-эх. Да там кода на три копейки:
Код
Выбрать все
Перем Инфо, ОбработчикСобытийОчереди, EventProxy, Очередь;
//*******************************************
Процедура Отправить()
	Оч=Инфо.Open(2,0);
	Сообщение=СоздатьОбъект("MSMQ.MSMQMessage");
	Сообщение.Body=Тело;
	Сообщение.Send(Оч);
КонецПроцедуры

Процедура ПриОткрытии()
	//Для отсылающего приложения
	Сервер=".";
	Инфо=СоздатьОбъект("MSMQ.MSMQQueueInfo");
	Инфо.PathName=Сервер+"\private$\test";
	Попытка
		Очередь=Инфо.Open(2,0);
	Исключение
		Инфо.Create(0,-1);
	КонецПопытки;
	//Для принимающего приложения
	ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"EventProxy.dll");
	ОбработчикСобытийОчереди=СоздатьОбъект("MSMQ.MSMQEvent");
	EventProxy=СоздатьОбъект("Addin.EventProxy");
	EventProxy.ГлубинаБуфераСобытий=200;
	);
	Очередь=Инфо.Open(1,0);
	Очередь.EnableNotification(ОбработчикСобытийОчереди)
КонецПроцедуры	// ПриОткрытии	//

Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
	Если (Источник="ОчередьСообщений") и (Событие="Arrived") Тогда
		Сообщение=Очередь.ReceiveCurrent();
		//Тут обрабатываем сообщение
		Сообщить(Сообщение.Body);
		Очередь.EnableNotification(ОбработчикСобытийОчереди);
	КонецЕсли;
КонецПроцедуры	// ОбработкаВнешнегоСобытия

Процедура ПроверкаАсинхронности()
	Для Сч=1 По 20 Цикл
		Оч=Инфо.Open(2,0);
		Сообщение=СоздатьОбъект("MSMQ.MSMQMessage");
		Сообщение.Body="Сообщение №"+Сч;
		Сообщение.Send(Оч);
		Сообщить(Сообщение.Body+" послано");
	КонецЦикла;
	Сообщить("что-то еще делаем");
КонецПроцедуры	// ПроверкаАсинхронности

Процедура ПриЗакрытии()
	Очередь.Close();
КонецПроцедуры	// ПриЗакрытии 

  

TestMSMQ.rar ( 2 KB | Загрузки )

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #38 - 12. Августа 2006 :: 11:41
Печать  
Цитата:
Не нужно мне 1С-ке сообщения делать, мне нужно их от нее получать: "Дружок, а у тебя в файле "Абвгд" изменения произошли, какой-то другой юзер это сделал!
"Абвгд" - естественно тот файл, ФАКТ изменения которого необходимо отслеживать, и файлов может быть несколько. Имя юзера совершенно мне не нужно.
А уж после получения сигнала я сделаю то, что мне нужно. Главное - звонок.

В локальной файловой системе можно отслеживать изменения файлов при помощи ВК от romix'а:
Отслеживание изменений в файловой системе и программирование потоков (threads)
Цитата:
При реализации обмена между программами часто требуется проинформировать принимающую систему (в нашем случае, 1С:Предприятие) о том, что файлы пришли, и их пора принимать.

Как вариант, можно сканировать папку в процедуре обработки ожидания (например, делать это каждые N секунд).

Другой, пожалуй, более правильный способ - использовать системные функции FindFirstChangeNotification, FindNextChangeNotification и FindCloseChangeNotification из Windows API (аналогичные функции есть и в ОС Unix). В данном случае, оповещения об изменении в файловой системе выполняет ядро ОС, и не надо "проделывать дырку" на жестком диске постоянными к нему обращениями.

Если все твои пользователи - терминальные (т.е. работают с одной и той же локальной ФС), то можно применить эту ВК для уведомления об изменении остатков.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #39 - 12. Августа 2006 :: 13:05
Печать  
Спасибо Steban.
MSMQ пока еще щупаю, а с обработкой ожидания я решил обойтись без применения других ВК. Получилось, даже замечательно. Смотрю интерес (маленький такой) есть, поэтому привожу код для DBF, здесь только сообщалка, каждый сделает себе то, что ему надо.
Глобальный модуль:
Код
Выбрать все
Перем Записи 	  Экспорт;
Перем Юзер     	Экспорт;
//_____________________________________________________________________________
Процедура ПриНачалеРаботыСистемы()
	СМС = КаталогИБ() + "_1SMS.dbf";
	Если ФС.СуществуетФайл(СМС) = 0
	Тогда
		ДБ = СоздатьОбъект("xBase");
		ДБ.ДобавитьПоле("USER",2,24,0);
		ДБ.ДобавитьПоле("MESS",2,50,0);
		ДБ.СоздатьФайл(СМС);
		ДБ.ЗакрытьФайл();
	КонецЕсли;
	Юзер = Лев(ИмяПользователя()+"				",24);

	БазаДанных = СоздатьОбъект("ODBCDatabase");
	Рез = БазаДанных.Соединение("DRIVER=Microsoft Visual FoxPro Driver;
	|Deleted=Yes;
	|Null=Yes;
	|Collate=RUSSIAN;
	|BackgroundFetch=Yes;
	|Exclusive=No;
	|SourceType=DBF;
	|SourceDB=" + КаталогИБ());
	Если Рез <> 0 Тогда
		Записи = СоздатьОбъект("ODBCRecordSet");
		Записи.УстБД(БазаДанных);

		Если МонопольныйРежим() = 1
		  Тогда
			Записи.Выполнить("DELETE FROM _1SMS");
		  Иначе
		    Записи.УстановитьТекстовыйПараметр("Юзер",Юзер);
			Записи.Выполнить("INSERT INTO _1SMS VALUES (:Юзер,'')");
		    ОбработкаОжидания("Опрос",5);
		  КонецЕсли;

	КонецЕсли;
КонецПроцедуры //ПриНачалеРаботыСистемы
//_____________________________________________________________________________
Процедура Опрос() Экспорт
	Записи.УстановитьТекстовыйПараметр("Юзер",Юзер);
	  ТЗ = Записи.ВыполнитьИнструкцию("SELECT MESS FROM _1SMS WHERE _1SMS.USER = :Юзер AND _1SMS.MESS <> ''");
	Если ТЗ.КоличествоСтрок() <> 0
	Тогда
	    Стр = ТЗ.ПолучитьЗначение(1,"MESS");
		Записи.УстановитьТекстовыйПараметр("Юзер",Юзер);
		Записи.УстановитьТекстовыйПараметр("Сообщение","Это послание всем");
	    Записи.Выполнить("UPDATE _1SMS SET _1SMS.MESS = '' WHERE _1SMS.USER = :Юзер");
		Сообщить(Стр);
	КонецЕсли;
КонецПроцедуры //Опрос
//_____________________________________________________________________________
Процедура ПриЗавершенииРаботыСистемы()
	Если ПустоеЗначение(Записи) = 0
	Тогда
		Записи.УстановитьТекстовыйПараметр("Юзер",Юзер);
	    Записи.Выполнить("DELETE FROM _1SMS WHERE _1SMS.USER = :Юзер");
	КонецЕсли;
КонецПроцедуры //ПриЗавершенииРаботыСистемы
 


И есть обработка:
Код
Выбрать все
//_____________________________________________________________________________
Процедура ПередатьСообщение()
	Записи.УстановитьТекстовыйПараметр("Сообщение",Сообщение);
	Если КонкретномуАдресату = 1
	Тогда
		Записи.УстановитьТекстовыйПараметр("Юзер",Адресат);
		  Записи.Выполнить("UPDATE _1SMS SET _1SMS.MESS = :Сообщение WHERE _1SMS.USER = :Юзер");
	Иначе //если всем, кроме меня
		Записи.УстановитьТекстовыйПараметр("Юзер",Юзер);
		  Записи.Выполнить("UPDATE _1SMS SET _1SMS.MESS = :Сообщение WHERE _1SMS.USER <> :Юзер");
	КонецЕсли;
КонецПроцедуры //ПередатьСообщение
 


Мне нравится (сам себя не похвалишь...)
« Последняя редакция: 12. Августа 2006 :: 15:10 - КилоГрамм »  

Константин
Наверх
 
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #40 - 25. Августа 2008 :: 10:08
Печать  
DrACe писал(а) 07. Августа 2006 :: 13:51:
метод конечно нужный и востребованный, но никак не пойму - чем его реализация может принципиально отличаться от пертурбаций с ОбработкойОжидания() или посылки/обработки внешних событий?.. Опять же для последнего, насколько я понимаю, нужно использовать какой-нибудь сетевой протокол, или создавать свой, опять же порты - какие использовать?..

хоть тресни - не пойму - сам то ты как эту методику представляешь? Озадачен


ОбработкаОжидания() ведь ждет пока не освободится 1С, а вот если бы сразу не смотря на то, что в этот момент юзер формирует отчет Улыбка
  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #41 - 25. Августа 2008 :: 11:10
Печать  
pavlo писал(а) 25. Августа 2008 :: 10:08:
ОбработкаОжидания() ведь ждет пока не освободится 1С, а вот если бы сразу не смотря на то, что в этот момент юзер формирует отчет Улыбка

А ты сам попробуй Улыбка
У ФормЕкс обработка ожидания или Таймер не ждут освобождения 1С Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #42 - 27. Августа 2008 :: 02:01
Печать  
хм, у Формекс не пробовал, спасибо, попробую Улыбка
  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 
ОтправитьПечать