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


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

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Сервис.ВыполнитьГлобальнуюПроцедуру()
06. Августа 2006 :: 17:24
Печать  
Чтобы не крутили пальцем у виска, сразу скаж: Выполнить указанную процедуру/функция у всех активных пользователей или (еще лучше) у выбранных пользователей (ползователя).
Что скажут господа разработчики, возможно ли дождаться такого?
  

Константин
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #1 - 07. Августа 2006 :: 05:38
Печать  
А ты сам подумай. Не у всех активных пользователей может быть загружена компонента.
  

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


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

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #2 - 07. Августа 2006 :: 13:45
Печать  
Цитата:
Не у всех активных пользователей может быть загружена компонента.

У кого загружена.
  

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


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

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

хоть тресни - не пойму - сам то ты как эту методику представляешь? Озадачен
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #4 - 07. Августа 2006 :: 15:11
Печать  
DrACe писал(а) 07. Августа 2006 :: 13:51:
хоть тресни - не пойму - сам то ты как эту методику представляешь? Озадачен

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

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #5 - 07. Августа 2006 :: 20:11
Печать  
В принципе, все это запросто решаемо.
Те же майлслоты, например - что может быть проще.

Или свой сервер приложений сделать - это интереснее.
Но думать надо больше.

Сейчас вот еще можно писать сервера для компоненты Степана.

Уже тыщу лет существует компонента раруса для обмена сообщениями через MSMQ.
Только пользовался ли ей кто-нибудь хоть однажды? хз.



А абстракция, по-любому будет дырявой.
Из-за протоколов, сетевых экранов и т.д.

Короче, все как всегда.


P.S.
Тока у меня через неделю отпуск (ха-ха).
Дембель в маю - дембель в маю - дембель и все по ... пиип...
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #6 - 07. Августа 2006 :: 20:16
Печать  
kms писал(а) 07. Августа 2006 :: 20:11:
Уже тыщу лет существует компонента раруса для обмена сообщениями через MSMQ.


Прошу прощения, это не у раруса, а у иксов.
И еще не уверен, что в она фриварная.
  

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


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #7 - 08. Августа 2006 :: 08:35
Печать  
kms писал(а) 07. Августа 2006 :: 20:16:

Прошу прощения, это не у раруса, а у иксов.
И еще не уверен, что в она фриварная.

Действительно у Икс-технологии.
Они декларировали, что компонента распространяется бесплатно по запросу.
Когда-то я их закидал запросами - и ничего. Никакого ответа - ни положительного, ни отрицательного.
Зато теперь для обмена через MSMQ есть EventProxy.dll Улыбка
  

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


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

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #8 - 08. Августа 2006 :: 17:18
Печать  
Да, задуматься есть над чем. А если пойти через наоборот, не от меня всем, а от всех ко мне?
Ведь журнал регистрации отслеживает все события. Вот как бы их отловить, причем фильтрованно: напр. проведение документа. Периодический просмотр MLG до конца проблемы не решит. Как бы это в "он-лайн" отследить? Или движение регистров, операции,  тогда и модификации при прямом доступе к БД можно отловить.
  

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


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #9 - 09. Августа 2006 :: 03:02
Печать  
Асинхронный обмен данными можно сделать на NetaInet.dll  (http://1c.proclub.ru/modules/mydownloads/personal.php?cid=81&lid=2691). Хоть от от одного ко всем, хоть от всех к одному, хоть от всех ко всем  (это уже будет DOS-атака Улыбка)).  Геморно правда, но можно. Самое х#ровое во всём этом - это то, что 1С ни разу не многопоточная система, и при асинхроне происходят иногда странные глюки. Забавно наблюдать, как валятся какие-то мессаги в окне сообщений, в то время как ты шарахаешься по менюшкам.
И что касается отладки...  ну, кто хоть раз в жизни отлаживал асинхронные системы, тот меня поймёт  Улыбка
  
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


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

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #10 - 09. Августа 2006 :: 09:44
Печать  
ADirks писал(а) 09. Августа 2006 :: 03:02:
наблюдать, как валятся какие-то мессаги в окне сообщений  Улыбка

В принципе мне не нужны сообщения и т.п. Я хочу только одного: отловить момоент изменения (delete,insert,update) в выбранной таблице БД , напр. в регистре остатков, чтобы не делать периодически запрос к ней, а именно "получить сигнал"и уже по нему выполнить запрос
  

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



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


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

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

Не нужно мне 1С-ке сообщения делать, мне нужно их от нее получать: "Дружок, а у тебя в файле "Абвгд" изменения произошли, какой-то другой юзер это сделал!
"Абвгд" - естественно тот файл, ФАКТ изменения которого необходимо отслеживать, и файлов может быть несколько. Имя юзера совершенно мне не нужно.
А уж после получения сигнала я сделаю то, что мне нужно. Главное - звонок.
  

Константин
Наверх
 
IP записан
 
Valet
Full Member
***
Отсутствует



Сообщений: 141
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #13 - 10. Августа 2006 :: 06:35
Печать  
Действительно ставишь тригер на любое событие.
чтобы при срабатывании писал инфу в таблицу (свою или справочник)
затем в обработке ожидания проверяешь наличие инфы в этой таблицы.
Если есть инфа, то звонок. Пехота вперед...
  

/ Лень - двигатель прогресса. /
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #14 - 10. Августа 2006 :: 06:41
Печать  
Кстати, забавно, что 1С проверяет наличие изменений именно методом, описанным Valet. Ужас
Код
Выбрать все
Select NETCHGCN from _1SUSERS(NOLOCK)
 


и никаких триггеров.


Но только это опять вариация с ОбработкойОжидания.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


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

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #15 - 11. Августа 2006 :: 04:25
Печать  
По всей вероятности мой вопрос не понят до конца или я не пойму всех вас.
Меня не устраивает периодическое отслеживание события, а обработка ожидания это оно и есть, т.е. обращение к гл.процедуре с заданным интервалом. Нужен запуск "спящей" глобальной процедуры/функции у всех пользователей по команде (по срабатыванию триггера) у любого из пользователей. Не могу же я в ПриНачалеРаботыСистемы написать "ОбработкаОжидания("НужнаяПроцедура",Интервал)", вернее можно все, но сисма только и будет заниматься тем, что ждать, когда кто-нибудь сделает то, что мне нужно знать.
  

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


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

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


чего ты боишься? периодического запуска некоей процедуры? если написать ее оптимально, то потерь на общей производительности ты не заметишь - 100% доказано многолетним опытом работы!

Более того - все абстракции в системе, реализующие асинхронность событий основаны на подобных периодических опросах (прерываниях и т.д.), так зачем тебе нужна еще одна абстракция? она может протечь в любой момент!  Подмигивание
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #17 - 11. Августа 2006 :: 05:27
Печать  
DrACe писал(а) 11. Августа 2006 :: 04:48:
Более того - все абстракции в системе, реализующие асинхронность событий основаны на подобных периодических опросах
Не согласен. Не все. А как же CallBack-вызовы?
  

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


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

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #18 - 11. Августа 2006 :: 08:42
Печать  
Цитата:
чего ты боишься? периодического запуска некоей процедуры?

Не боюсь. Просто при большом периоде опроса данные в этом промежутке могут быть, да скорее всего будут неактуальны. Уменьшение периода до тех пределов, когда интервал становится соизмеримым с со временем выполнения самой процедуры - абсурд какой-то Вот и уперся я, чтоб процедура выполнялась по сигналу извне, а команда поступает именно по ФАКТУ исполнения любым юзером некоей операции.
  

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


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

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #19 - 11. Августа 2006 :: 09:18
Печать  
Цитата:
Цитата:
чего ты боишься? периодического запуска некоей процедуры?

Не боюсь. Просто при большом периоде опроса данные в этом промежутке могут быть, да скорее всего будут неактуальны. Уменьшение периода до тех пределов, когда интервал становится соизмеримым с со временем выполнения самой процедуры - абсурд какой-то Вот и уперся я, чтоб процедура выполнялась по сигналу извне, а команда поступает именно по ФАКТУ исполнения любым юзером некоей операции.


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


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

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #20 - 11. Августа 2006 :: 10:11
Печать  
Пример займет много места, я хочу, чтобы меня поняли.
У менеджера постоянно открыта обработка, на форме которой имеется ТП с поставщиком данных ODBC, В ТП выведен список товаров с остатками, которые непрерывно меняются, и поэтому ТП тоже обновляется. Обновление происходит с некоторой периодичностью. Очень часто бывает так что остатки изменились в промежутке между обращениями к БД и юзер видит неверные остатки, а другой раз вообще нет движения и процдура обновления проходит впустую. Вся задача как раз в том, чтобы ТП обновлялась не периодически, а после любого движения в ренистре остатков, которое вызвано любым из пользователей. Я из этой ситуации вижу только один выход - применение какого-нибудь внешнего приложения с использованием сетевых протоколов. Вот и хочу услышать что-нибудь другое, может сообща получится?
  

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


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

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #21 - 11. Августа 2006 :: 10:56
Печать  
тогда очевидный тупой вопрос: когда менеджеру нужны Актуальные остатки(а не просто подбор номенклатуры)  - почему бы не нажать кнопку "Обновить"?  Ужас
Ведь все равно при проведении документа остатки будут контролироваться снова и может так получиться, что кто-нибудь из юзеров успеет списать остаток во время заполнения документа при имевшихся в наличии мгновение назад на форме подбора остатках.

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


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

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #22 - 11. Августа 2006 :: 11:37
Печать  
Цитата:
...или менеджер, как в матрице(или на бирже) - просто смотрит на бегущие цифры

Абсолютно в точку. Сидит и тупо обслуживает клиентов не закрывая вышеуказанной мною обработки, только быстренько вводит клиента, перебрасывает из ТП в другую таблицу выбранные товары, вводит их количество. Естественно после "ОК" ТП обновляется, БД автоматом тоже обновляется. Клиент идет с распечатанными бумагами на склад получать товары. А его оказывается там уже нет потому, что ТП вовремя не обновилась, и товар, который уже отгрузил другой такой-же менагер, из ТП не скрылся.
Кто виноват? - конечно тупой программист.
  

Константин
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #23 - 11. Августа 2006 :: 11:39
Печать  
Цитата:
Кто виноват? - конечно тупой программист.

Конечно! А кто будет остатки контролировать?! В твоем случае это лучше делать при печати. Причем сразу в этот момент сохранять и проводить документ.
  

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


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

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

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


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

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #25 - 11. Августа 2006 :: 12:35
Печать  
kms писал(а) 10. Августа 2006 :: 06:41:
Кстати, забавно, что 1С проверяет наличие изменений именно методом, описанным Valet. Ужас
Код
Выбрать все
Select NETCHGCN from _1SUSERS(NOLOCK)
 


и никаких триггеров.



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

А пока решил попробовать GTTools, я ее с Проклуба скачал. Может быть кто-то уже пробовал ее в деле?
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #26 - 11. Августа 2006 :: 18:44
Печать  
О GTTools пролетала тема http://www.1cpp.ru/forum/YaBB.pl?num=1152733087/5
  

De quelle planète es-tu?
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


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

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

Да, спасибо. Идея очень заманчивая. Вот только запустить ее я так и не смог (отсутствует CLSID), несмотря на то, что выполнил все инструкции, расписанные в комментариях к ВК на Проклубе. Ищу что-нибудь похожее.
  

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



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #28 - 12. Августа 2006 :: 08:58
Печать  
steban писал(а) 08. Августа 2006 :: 08:35:
Зато теперь для обмена через MSMQ есть EventProxy.dll Улыбка


Вот готовое решение. Чем не нравится? Проще пользовать готовое решение микрософта по обмену сообщениями, чем ВК.
  
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


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

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Сервис.ВыполнитьГлобальнуюПроцедуру()
Ответ #29 - 12. Августа 2006 :: 09:26
Печать  
Утро вечера мудреней...
Для себя решил я эту задачу, взяв идею из GTTools о своем мини-сервере. Правда без обработки ожидания не получается, но при малой периодичности опроса риск промахнуться сведен до минимума. Идея такова: создается файл формата БД, мето расположения выбирается любое удобное, можно и в БД. Поля: Имя пользователя, Флаг присутствия и поля, нужные для использования, напр. Флаг движения рег.остатков ТМЦ, Сообщение и т.д.. При начале работы системы у каждого, кто ее запускает, в записи с ID этого пользователя устанавливается флаг 1 или 2 (монопольно). При завершении - флаг 0 (аналог 1SUsers). При выполнении операции, которую должны заметить все, или выбранные юзеры, в этом сервере далаются записи в поле "Флаг операции ХХХ". При переодическом опросе у тех юзеров, кому этот сигнал предназначен, получают его. После приема сигнала значение в поле обнуляется. При повторном опросе, если записи нет ничего не происходит и так, до следующего сигнала.
Если кому будет интересно, то я выложу код. Работает зараза: и запускает процедуры, и выдает сообщения, и открывает формы - прямо конференция в 1С (прямо хоть патентуй), причем необязательно использование никаких ВК (для DBF), в т.ч. 1С++, одно только могу сказать, что прямой запрос конечно на все головы выше обычноых методов работы с DBF.
Жаль только, что не получилось использовать 1С в асинхронном режиме, но раз Drace сказал, что бояться использования обработки ожидания через каждую секунду не нужно - Let it be.
  

Константин
Наверх
 
IP записан
 
КилоГрамм
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] 
ОтправитьПечать