Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) Можно ли выполнить процедуру/функцию у всех юзеров (число прочтений - 9357 )
КилоГрамм
Senior Member
****
Отсутствует


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

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Можно ли выполнить процедуру/функцию у всех юзеров
29. Июня 2006 :: 04:43
Печать  
Как заставить сработать процедуру/функцию (например в глобальном модуле) или изменить глобальную переменную у всех пользователей без применения других ВК?
Например вывести всем какое нибудь сообщение или обновить какой-то список, хранящийся в памяти и т.п.

  

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


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Можно ли выполнить процедуру/функцию у всех юз
Ответ #1 - 29. Июня 2006 :: 05:52
Печать  
У меня работает такой механизм, завязанный на Обработке ожидания:

1) Формирования задания в среду обмена(Справочник,Файл и т.д.)
2) Выполнение действия у выбранных юзеров
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли выполнить процедуру/функцию у всех юз
Ответ #2 - 29. Июня 2006 :: 06:14
Печать  
А ты не можешь сделать выложить свои классы этого механизма?
  

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


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Можно ли выполнить процедуру/функцию у всех юз
Ответ #3 - 29. Июня 2006 :: 07:06
Печать  
artbear писал(а) 29. Июня 2006 :: 06:14:
А ты не можешь сделать выложить свои классы этого механизма?

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

	ИмяФайлаЗапроса = глКаталогЗапросов + глПользователь.Код + ".results";
	Если ФС.СуществуетФайл(ИмяФайлаЗапроса) = 1 Тогда
		СписокОтветов = СоздатьОбъект("Текст");
		СписокОтветов.Открыть(ИмяФайлаЗапроса);
		ФС.УдалитьФайл(ИмяФайлаЗапроса);
		КоличествоСтрок = СписокОтветов.КоличествоСтрок();
		Для СчОтветов = 1 По КоличествоСтрок Цикл
			Ответ = ЗначениеИзСтроки(СписокОтветов.ПолучитьСтроку(СчОтветов));
			Если ТипЗначенияСтр(Ответ) = "СписокЗначений" Тогда
			    Запрос = Ответ.Получить("Запрос");
			    ИмяФайлаОтвета = глПолучитьКонечноеИмяФайлаДляЮзера(Ответ.Получить("ИмяФайлаОтвета"));
			    ИмяПославшейФормы = Ответ.Получить("ИмяПославшейФормы");
				Если
						(НРЕГ(Запрос) = "print")
					Или (Найти(НРЕГ(Запрос),"report") > 0)
					Тогда
					Если ФС.СуществуетФайл(ИмяФайлаОтвета) = 0 Тогда
					    Продолжить;
					КонецЕсли;
					Таб = СоздатьОбъект("Таблица");
					Таб.Опции(0,0);
					Таб.Открыть(ИмяФайлаОтвета);

					глДобавитьДопСекциюВПечатнуюФорму(Таб,ЗаголовокОтчета);

					Таб.ТолькоПросмотр(ТолькоПросмотр);

					Таб.Показать(ЗаголовокОтчета);

					ФС.УдалитьФайл(ИмяФайлаОтвета);
				ИначеЕсли НРЕГ(Запрос) = "search" Тогда
					НомерПославшейФормы = Ответ.Получить("НомерПославшейФормы");
					Если ПустоеЗначение(НомерПославшейФормы) = 1 Тогда
						Для Сч = 1 По 100 Цикл
							Если ПустоеЗначение(глСписокНомеровОткрытыхФорм.Получить(Сч)) = 1 Тогда
								НомерПославшейФормы = Сч;
							    Прервать;
							КонецЕсли;
						КонецЦикла;
					КонецЕсли;
					Если ПустоеЗначение(НомерПославшейФормы) = 1 Тогда
					    НомерПославшейФормы = 1;
					КонецЕсли;
					ИмяОткрываемойФормы = "Обработка.ОтветСервера#" + НомерПославшейФормы;
					СписокПараметров = СоздатьОбъектСписокЗначений();
					СписокПараметров.Установить("ИмяФайлаОтвета",ИмяФайлаОтвета);
					СписокПараметров.Установить("НомерПославшейФормы",НомерПославшейФормы);
					РазмерСписка = Ответ.РазмерСписка();
					Для Сч = 1 По РазмерСписка Цикл
						ИдентифЗначения = "";
						Значение = Ответ.ПолучитьЗначение(Сч,ИдентифЗначения);
						Если
								(ИдентифЗначения = "Запрос")
							Или (ИдентифЗначения = "ИмяФайлаОтвета")
							Или (ИдентифЗначения = "ИмяПославшейФормы")
							Или (ИдентифЗначения = "НомерПославшейФормы")
							Тогда
							    Продолжить;
						КонецЕсли;
						СписокПараметров.Установить(ИдентифЗначения,Значение);
					КонецЦикла;
					ОткрытьФорму(ИмяОткрываемойФормы,СписокПараметров);
				ИначеЕсли НРЕГ(Запрос) = "function" Тогда
					ИмяФункции = Ответ.Получить("ИмяФункции");
					Если ИмяФункции = "глОтветНаЗапросПоБлокирующимПользователям" Тогда
						Попытка
							глОтветНаЗапросПоБлокирующимПользователям(Ответ);
						Исключение
							глСервисныеФункции.ЗаписатьСообщение("Ошибка выполнения функции запроса (" + ИмяФункции + ") при проверке Личных сообщений - " + ОписаниеОшибки(),"!",0,1);
						КонецПопытки;
					ИначеЕсли ИмяФункции = "глОтветНаЗапросПоАктивнымПользователям" Тогда
						Попытка
							глОтветНаЗапросПоАктивнымПользователям(Ответ);
						Исключение
							глСервисныеФункции.ЗаписатьСообщение("Ошибка выполнения функции запроса (" + ИмяФункции + ") при проверке Личных сообщений - " + ОписаниеОшибки(),"!",0,1);
						КонецПопытки;
					КонецЕсли;
				ИначеЕсли ПустоеЗначение(ИмяПославшейФормы) = 0 Тогда
					ОткрытьФорму(ИмяПославшейФормы,ИмяФайлаОтвета);
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
		ОбработкаОжидания("ПроверкаЛичныхСообщений",10);
	КонецЕсли;
	Дневник = СоздатьОбъект("Справочник.Дневник");
	Дневник.ИспользоватьВладельца(глПользователь);
	Если Дневник.ВыбратьЭлементыПоРеквизиту("ВывестиНаЭкран",1,1,0) = 1 Тогда
		Параметр = СоздатьОбъектСписокЗначений();
		СписокАнкет = СоздатьОбъектСписокЗначений();
		Пока Дневник.ПолучитьЭлемент() = 1 Цикл
			Если Дневник.ПометкаУдаления() = 0 Тогда
				Параметр.ДобавитьЗначение(Дневник.ТекущийЭлемент());
				Если ТипЗначенияСтр(Дневник.БыстрыйПереход) = "Справочник" Тогда
					Если Дневник.БыстрыйПереход.Вид() = "Анкеты" Тогда
						СписокАнкет.ДобавитьЗначение(Дневник.БыстрыйПереход);
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
		Если Параметр.РазмерСписка() > 0 Тогда
		    ОткрытьФорму("Обработка.ЛичноеСообщение",Параметр);
			КоличествоАнкет = СписокАнкет.РазмерСписка();
			Для СчАнкет = 1 По КоличествоАнкет Цикл
				Анкета = СписокАнкет.ПолучитьЗначение(СчАнкет);
				Если Анкета.СостояниеАнкеты = Перечисление.СостоянияСобытия.Действует Тогда
					ОткрытьФорму(Анкета,,1);
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры // ПроверкаЛичныхСообщений() 


тут повырезано много, но все равно - много мусора

Среда обмена тут: файлы и справочник, подчиненный юзеру Дневник
Виды результатов:
- таблица mxl (просто открывается пользователю - готовый отчет),
- таблица значений - выводится в специальной обработке,
- функции - выполняю
  
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


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

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Можно ли выполнить процедуру/функцию у всех юз
Ответ #4 - 30. Июня 2006 :: 13:52
Печать  
DraCE, похоже ты меня недопонял.Или я тебя. А речь вот о чем:
В базе одновременно работают несколько пользователей. Один из них выполняет какую-нибудь операцию, например записывает новый элемент справочника. Все пользователи должны получить некий "сигнал" об этом, т.е. должна сработать какаято глобальная процедура (функция). Другие ВК подключать не хочется, а они есть.
  

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



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли выполнить процедуру/функцию у всех юз
Ответ #5 - 30. Июня 2006 :: 16:50
Печать  
Ну так используй например константу или справочник. Записывай туда что хочешь, а когда требуется - проверяй на наличие такой записи...
  
Наверх
 
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Можно ли выполнить процедуру/функцию у всех юз
Ответ #6 - 01. Июля 2006 :: 04:26
Печать  
Цитата:
DraCE, похоже ты меня недопонял.Или я тебя. А речь вот о чем:
В базе одновременно работают несколько пользователей. Один из них выполняет какую-нибудь операцию, например записывает новый элемент справочника. Все пользователи должны получить некий "сигнал" об этом, т.е. должна сработать какаято глобальная процедура (функция). Другие ВК подключать не хочется, а они есть.


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

Если тебе надо нечто более интерактивное, нежели периодический опрос изменений, то этот простейший вариант конечно не подойдет, но во всех остальных случаях, не завязанных жестко на времени реагирования - это имеет право на существование (у меня нормально работает, например)

кстати, под SQL-ем прекрасно работают триггеры - идеально в случае "глобальной доработки" самим сервером какого-то события изменения данных, но чтобы донести это событие до юзера - надо опять думать...
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли выполнить процедуру/функцию у всех юз
Ответ #7 - 01. Июля 2006 :: 09:25
Печать  
Можно еще дождаться когда я допишу ВК при помощи которой в 1С можно будет обрабатывать события любых COM/OLE объектов в асинхронном режиме.
Останется написать простейший COM+ сервис и придумать формат сообщений.
  

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


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

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Можно ли выполнить процедуру/функцию у всех юз
Ответ #8 - 01. Июля 2006 :: 09:30
Печать  
В том  и дело, что пока я использую периодический опрос. Объясняю ситуацию подробно:
Менеджеры по продажамполбзуются не справочником, а обработкой, на форме которой располагается ТЗ со списком номенклатуры с остатками , при открытии данные в ТЗ загружаются из глобальной индексированной таблицы (назовем ее глИТЗ). Если при каждом открытии обработки обновлять глИТЗ - чувствуется тормоз, несмотря на то, что запрос SQL, поэтому глИТЗ обновляется автоматом через некоторое. Возникают каверзы - менеджер по закупкам в это время оприходовал товар, в т.ч.новый, менеджер по продажам что-то продал и другой менеджер по продажам видит искаженную картину.
Не могу-же я заставить обновляться глИТЗ у каждого юзера через каждые 5 секунд, хочется чтоб это происходило автоматом только при движении регистров и у всех 
Использование справочников, констант и др.объетов МД исключается, использование внешних файлов заметного преимущества перед выполнением SQL-запроса при каждом открытии обработки практически не дает, хотя этот файл обрабатывается SQL-запросом. Очень большая БД.
  

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


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Можно ли выполнить процедуру/функцию у всех юз
Ответ #9 - 01. Июля 2006 :: 09:31
Печать  
steban писал(а) 01. Июля 2006 :: 09:25:
Можно еще дождаться когда я допишу ВК при помощи которой в 1С можно будет обрабатывать события любых COM/OLE объектов в асинхронном режиме.
Останется написать простейший COM+ сервис и придумать формат сообщений.

Это очень нужная фича.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли выполнить процедуру/функцию у всех юз
Ответ #10 - 01. Июля 2006 :: 09:45
Печать  
steban писал(а) 01. Июля 2006 :: 09:25:
обрабатывать события любых COM/OLE объектов в асинхронном режиме.

Такого не было в 8-ке до недавнего времени: Новые возможности бета-версии 1С:Предприятия 8.1
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли выполнить процедуру/функцию у всех юз
Ответ #11 - 01. Июля 2006 :: 10:08
Печать  
steban писал(а) 01. Июля 2006 :: 09:25:
Можно еще дождаться когда я допишу ВК при помощи которой в 1С можно будет обрабатывать события любых COM/OLE объектов в асинхронном режиме.
Останется написать простейший COM+ сервис и придумать формат сообщений.

А подробнее об этом можно?
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


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

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Можно ли выполнить процедуру/функцию у всех юз
Ответ #12 - 01. Июля 2006 :: 10:13
Печать  
Подобные приложения я встречал на 1c-proclub, по моему что-то вроде "1C Chat", но вопрос мой звучал так: Цитата:
Как заставить сработать процедуру/функцию (например в глобальном модуле) или изменить глобальную переменную у всех пользователей без применения других ВК?

Есть же в FormEx-е Сервис.ВыполнитьПроцедуру(Контекст..., а что-нибудь вроде "Сервис.ВыполнитьГлобальнуюПроцедуру(Пользователь..."?
  

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


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли выполнить процедуру/функцию у всех юз
Ответ #13 - 01. Июля 2006 :: 10:22
Печать  
Цитата:
без применения других ВК?

не знаю.
  

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



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли выполнить процедуру/функцию у всех юз
Ответ #14 - 01. Июля 2006 :: 14:14
Печать  
kms писал(а) 01. Июля 2006 :: 09:31:
Это очень нужная фича.


Я спрашивал об этом в http://itland.ru/forum//index.php?showtopic=15635&hl=
и нашел решение в http://1c.proclub.ru/modules/mydownloads/personal.php?cid=130&lid=2728

и в последствии очень всех просил реализовать подобное в 1сpp Улыбка


ULE работает на ура, очень благодарен разработчику...
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать