Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 18:28

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

Автор sobenko, 01 мар 2012, 20:30

0 Пользователей и 1 гость просматривают эту тему.

sobenko

Платформа 8.2. Архитектура- клиент-сервер. Задача: нужно чтобы сервер вызвал определенную процедуру на определенном клиенте, подключенном к серверу.
Возможно-ли это реализовать и как?
(Это что-то сродни принципу работы ICQ и тому подобного софта, когда не обработчик ожидания периодически опрашивает сервер, а сервер сам вызывает обработчик события на клиенте)

Klyacksa

С сервера клиента вызвать нельзя. Можно только ВЕРНУТЬ УПРАВЛЕНИЕ с сервера на клиента, если перед этим клиент вызвал сервер.
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

ptrts

Возможно это поможет

http://infostart.ru/public/21077/

Причем, ...

Поток на сервере, который выполняет серверный код, может либо принадлежать определенному клиенту (одному, тому который его запустил своим клиентским кодом), либо какому-нибудь регламентному заданию

sobenko

Это понятно, но здесь немного другая задача, которая состоит в том, чтобы реализовать механизм уведомлений пользователей о наступлении определенных событий. К примеру менеджер создает заявку на оплату счета или счет. Бухгалтер (находящийся далеко от менеджера) разносит банк. И когда бухгалтер проводит платежку на оплату счета менеджера- менеджеру приходит сообщение (выскакивает окошко) о том, что счет проплачен (как к примеру в ICQ и др. интернет-мессенджерах). Реализовать это можно 2-мя путями:
1) через обработку ожидания, когда клиент "тыкается" на сервер через определенный интервал времени;
2) когда клиент просто слушает сервер и когда от сервера приходит сообщение, на клиенте отрабатывает определенная процедура.

Если с системой работает пару-тройка клиентов, то в принципе 1-й вариант решения не вызовет больших проблем. Проблемы начинают возникать когда число клиентов возрастает до нескольких сотен, а иногда даже и несколько десятков могут конкретно забить трафик и загрузить сервер. Режим работы, когда клиент подписывается на список событий на сервере и дальше переходит в режим "прослушки" уменьшает бесполезный трафик в разы и не грузит сервер бесполезными запросами. К примеру зачем периодически выполнять обновление формы списка, если в нем не происходило ни каких изменений? Зачем периодически опрашивать какой-нибудь регистр сведений или задачу, когда в нем ничего не менялось? Менялось или нет знает только сервер. По этому логично чтобы не клиент посылал каждые 5 секунд на сервер запрос и получал один и тот-же ответ, а сервер при подписке на событие клиента (к примеру "при записи" для задачи) вызывал обработку этого события на подписавшихся клиентах. Вызов обработки на "заинтересованных" клиентах может происходить из обработки события клиента, инициирующего определенное событие, где можно также прописать код, который из всех подписавшихся клиентов будет выбирать только нужных.

Такой принцип работы браузеров обеспечивает технология WebSocket, которая уже в прошлом году стандартизирована (http://www.rfc-editor.org/info/rfc6455) и поддерживается 4-мя браузерами (кроме Internet Explorer). За этой технологией- будущее, т.к. она реально снижает бестолковый трафик и бестолковое "дергание" сервера клиентами для получения изменений данных.

Dethmontt

Не понятно почему нелязя для такого случая использовать событие...*??? Если счет оплатили (Или что то с ним там сделали то сообщение моментально отправляется хозяину документа (Менеджеру) и не нужно опрашивать сервер)
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Dethmontt

Всех пользователей ты можешь получить на сервере 1С:Предприятия - рой в эту сторону
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

sobenko

Цитата: Dethmontt от 05 мар 2012, 23:49
Не понятно почему нелязя для такого случая использовать событие...*??? Если счет оплатили (Или что то с ним там сделали то сообщение моментально отправляется хозяину документа (Менеджеру) и не нужно опрашивать сервер)
Какое событие? Если счет оплатили, то при проведении документа возникает событие (ПриЗаписи). Но оно возникает на клиенте, который выполняет эту запись, а мне необходимо вызвать событие на другом клиенте. Каким образом и какое сообщение отправиться хозяину документа? Можно немного по подробнее?

sobenko

Цитата: Dethmontt от 05 мар 2012, 23:56
Всех пользователей ты можешь получить на сервере 1С:Предприятия - рой в эту сторону
Ну получил я список всех подключенных пользователей и что дальше? Через как я могу с одного клиента вызвать событие на другом клиенте с определенным пользователем?

Dethmontt

Самое простое решение этой задачи это опрос клиентом сервера в интервале времени (Например регистра сведений).

Второе - это использовать ВК.

Возможно есть и еще какие то решения.
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Dethmontt

Вот еще пример без использования ВК - используя сообщения в Windows
// Оповестим пользователей о неактуальности данных.
// Если мы не хотим подключать обработчик ожидания,
//воспользуемся командой Windows
МинутаХ = Формат(НачалоМинуты(КонецМинуты(ТекущаяДата()+300)+1),"ДФ=HH:mm:ss");
Текст = " Внимание!"+Символ(13)+ "Данные в системе 1с ЗУП Тест будут неактуальны 5 минут!"+Символ(13)+"Не формируйте отчеты и документы до "+МинутаХ;
Соединения = ПолучитьСоединенияИнформационнойБазы();
КОМПЫ = Новый Соответствие ;
Для каждого ЭлементСоединения Из Соединения Цикл
    КОМПЫ.Вставить(ЭлементСоединения.ИмяКомпьютера);
КонецЦикла; 
Для  каждого Компьютер из  КОМПЫ Цикл
    СтрокаМесаги = "MSG /time:30 /server:"+ СокрЛП(Компьютер.Ключ)+" * "+Текст;
    //СтрокаМесаги = "NET SEND "+ СокрЛП(Компьютер.Ключ)+Текст;
    ЗапуститьПриложение(СтрокаМесаги);
КонецЦикла;   
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск