Имя: Пароль:
1C
 
Как подпиской ПриЗаписи Оповестить клиента?
0 Вася Теркин
 
08.02.19
07:49
Хочу чтобы при записи какого-то документа у всех пользователей во всех клиентах обновлялся динсписок документов.
Оповестить годное или надо РС с заданиями оповещения пилить и читать оттуда чего и как обновить каждым клиентом через обработкуожидания?
1 Вася Теркин
 
08.02.19
07:51
В БСП такое есть? НаСервере в подписке надо сформировать Оповестить у всех открытых клиентов?
Типа БСП.СформироватьОповеститьВсехКлиентов(ИмяСобытия, Параметр, источник);
2 Вася Теркин
 
08.02.19
07:52
Не хочу Автообновление динсписка. Много народу. Хочу чтобы по оповещению все обновлялось.
3 catena
 
08.02.19
07:52
Думаете будет быстрее, чем штатное автообновление динамеческого списка?
4 Вася Теркин
 
08.02.19
07:54
Второй вариант - параметр сеанса делаю СобытияПрочитаныДо.
Пишу все оповещения в РС, обработками ожидания читаю на каждом клиенте (или на каждой форме)
(3) Нагрузка меньше будет я думаю. Зачем мне лишние перечитывания. У меня динсписки сложные тяжелые запросы могут содержать.
5 Вася Теркин
 
08.02.19
07:55
Штатное идет интервалом. а я хочу либо по оповещению, либо, что хуже, клевать только один РС специальный.
6 Вася Теркин
 
08.02.19
07:55
И только когда реально что-то изменилось обновлять динсписок.
7 Вася Теркин
 
08.02.19
07:56
В БСП это уже реализовано? Всех оповестить с сервера?
8 Вася Теркин
 
08.02.19
07:56
Там же какие-то оповещения можно рассылать вроде массово?
9 Вася Теркин
 
08.02.19
07:58
+4 При открытии форм придется создать переменную и запоминать последнее обработанное событие РС.
А при следующей обработке ожидания докачивать из РС недостающее. Т.е. РС будет что-то типа журнала логов.
10 Вася Теркин
 
08.02.19
07:59
Логи писать подпиской придется если нельзя напрямую всем оповещения разослать.
11 PuhUfa
 
08.02.19
08:00
(4) >> Нагрузка меньше будет я думаю
Что будет если 5 человек поменяют данные связанные с 1 списком... и прилетит 5 оповещений с разницей в 1 сек?
12 Вася Теркин
 
08.02.19
08:02
У меня 200 менеджеров ,у всех открыт журнал заяваок. Там "вычисляемые" колонки статус, остаток ,и т.д.
Просто 5 сек автообновление даст ГАРАНТИРОВАНО 1000 запросов в сек на сервер.
"Что будет если 5 человек поменяют данные связанные с 1 списком... и прилетит 5 оповещений с разницей в 1 сек?" - но не каждую секунду, но прилетят.
Думаешь виснуть будет интерфейс?
13 Вася Теркин
 
08.02.19
08:04
"1000 запросов" = "100 запросов"
Это все равно нагрузка.
Заявки не меняются каждую секунду.
14 Вася Теркин
 
08.02.19
08:06
(11) Надо тогда каждые 5 сек делать выборку из логов, Сворачивать срезом последних по источнику. И решать один раз в пять секунд обновлять форму или нет.
15 Вася Теркин
 
08.02.19
08:08
Клевать одну РС проще чем все таблицы автообновлением насиловать.
16 Mort
 
08.02.19
08:14
интересно, а нахрена? Не, у меня тоже по молодости возникали такие хотелки, которые как мне сейчас кажется придурь полная, но может быть с тех времен что-то изменилось...
17 unregistered
 
08.02.19
08:43
(12) >> журнал заяваок. Там "вычисляемые" колонки статус, остаток ,и т.д.

Если возникает реальная проблема с производительностью (а не просто блажь, как думает(16)), то правильнее будет переделать этот журнал. Отказаться от вычисляемых колонок. Например, журнал заявок реализовать в виде отдельного регистра сведений, содержащего в готовом виде все эти вычисляемые поля.
18 mikecool
 
08.02.19
09:00
(15) клевать одну таблицу 200 клиентами - думаю тоже весело
19 Deon
 
08.02.19
09:03
Так а разве "система взаймодействия" не для этого предназначена в том числе?
20 Вася Теркин
 
08.02.19
10:53
(14, 17) Проблема в том что у нас разделенный и очень интенсивный  режим работы с одними и теми же заявками. Работа ведется в разных системах - САП, 1С, другие системы типа сторонних CRM и прочее.
Пользователи не будут постоянно нажимать обновить во всех журналах. Например, открыто сразу 3-4 основных списка и их надо постоянно держать актуальными. Для 200 рабочих мест просто включать автообновление на формах каждые 5 сек это не правильно.
Вот хочется "универсальный" механизм обновлений. Может в РС писать подпиской поможет?

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

Процедура ОповеститьФормыПриЗаписиПриЗаписи(Источник, Отказ) Экспорт
    ЗаписатьСобытияДляОповещенияФорм("UpdateListsOfDocs", Источник.Метаданные().Имя, Источник);
КонецПроцедуры
21 Вася Теркин
 
08.02.19
10:53
(18) Ну сделать таблицу примитивной - самое простое решение. Нет?
22 Вася Теркин
 
08.02.19
10:55
(19) Можно поподробнее? По каждому модифицированному объекту отправлять уведомления только определенному кругу лиц?
23 Вафель
 
08.02.19
10:59
нужно сервер взаимодействия ставить
24 Вася Теркин
 
08.02.19
10:59
(18) Там может и больше быть если на многие формы повешу обработку ожидания и перечитывание заданий каждые 5 сек.
25 Вася Теркин
 
08.02.19
10:59
(23) Вот это уже мысль какая-то...
26 Вафель
 
08.02.19
10:59
(18) как раз если только читать, то очень легко для сервера.
ибо в кэше будет все лежать
27 Вася Теркин
 
08.02.19
11:01
(26) У меня режим совместимости 8.3.6 и выше не пойдет. А так релиз 8.3.14
28 Вася Теркин
 
08.02.19
11:02
"Сервер взаимодействия Для платформы 8.3.11 реализована тестовая версия сервера взаимодействия." - оно в режиме совместимости крутится полноценно? Расширения и весь остальной современный ништяк мне не доступны.
29 Вафель
 
08.02.19
11:05
(28) ну если не доступно, тогда через long polling (те с клиента инициируй опрос регистра на наличие записей)
30 Вася Теркин
 
08.02.19
11:25
С клиента буду срезом последних. Но куда лучше прикрутить обработку ожидания. Если с каждой открытой формы запускать,то:

до 200 клиентов
до 4-5 форм списков открытых,
каждые 5 сек, не чаще.

200 запросов в сек.

По идее просто срез последних должен справиться. Железо очень хорошее везде.
31 Mort
 
08.02.19
17:27
Либо автор пилит что-то для центра управления полетами, когда все посекундно отслеживают инфу, либо... хз. Какой эффект от того что юзеры видят актуальную инфу? Как это влияет на бизнес, сколько рублей приносит гипотетических?
32 Mort
 
08.02.19
17:30
Если это дейтвительно важно, например, капнула важная срочная заявка, танцы со списком не спасут, мало кто лупится в список весь день. Обычно это открыл - закрыл. Тут уже надо думать о других способах оповещения, почта, смс. Вот опишите пример где (0) приносит профит.
33 Вася Теркин
 
12.02.19
09:05
Чего-то я туплю - как оповещение работает?
Его все открытые формы получат или только какая-то одна? Или только текущая активная форма?
У меня есть Обработка оповещения на трех открытых формах, а оповещение возникает когда активна четвертая. Все три получат оповещение?
34 Вася Теркин
 
12.02.19
09:06
Оповещение и обработка оповещения работает широковещательно в пределах сеанса или нет?
35 Вася Теркин
 
12.02.19
11:23
Проклятая копипаста. ОбработкаОжидания в модуль скопирована, а к форме не подключена...
36 Вася Теркин
 
12.02.19
11:27
Работает платформа оказываица...
37 Вася Теркин
 
12.02.19
11:40
Все работает отлично. Делайте так:


Создает параметр сеанса ПоследняяЗаписьСобытияДляОповещенияФорм дата время.
Создаем РС СобытияДляОповещенияФорм
ИмяСобытия - строка
ИмяИсточника - строка
ИмяИсточника - любая ссыль
МоментРегистрации - датавремя

В любом модуле формы достаточно добавить

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ПодключитьОбработчикОжидания("СформироватьОповещенияПроверкиОбновленийФормы",5);
КонецПроцедуры

&НаКлиенте
Процедура СформироватьОповещенияПроверкиОбновленийФормы()
    МойИнтерфейсКлиент.ОбработатьОповещенияПроверкиОбновленийФормы();    
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = "UpdateListsOfDocs" Тогда
        ЭтаФорма.ОбновитьОтображениеДанных();
    КонецЕсли;
КонецПроцедуры
  

В модуле МойИнтерфейсКлиент

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

В модуле  МойИнтерфейсВызовСервера


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

Процедура ОповеститьФормыПриЗаписиПриЗаписи(Источник, Отказ) Экспорт
    ЗаписатьСобытияДляОповещенияФорм("UpdateListsOfDocs", Источник.Метаданные().Имя, Источник);
КонецПроцедуры

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


Теперь можете помещать в регистр любые объекты,
        rms_УпрощенныйИнтерфейсВызовСервера.ОповеститьФормыПриЗаписиПриЗаписи(СтрокаРС.СсылкаДокумента, Ложь);


документы ,справочники и по имени метеданных или по самому источнику, например, понимать надо ли обновлять список.
38 Вася Теркин
 
12.02.19
11:41
В митоге все формы будут работать на автообновление всех активных форм, а те только самой себя, каждые 5 сек.
При этом они не будут долбить основные таблицы, а только наш РС. И при необходимости мгновенно обновляться по оповещению.
39 Вася Теркин
 
12.02.19
11:43
ИмяИсточника - любая ссыль = Источник - любая ссылька.
Источник и момент регистрации - это ресурсы
40 тарам пам пам
 
12.02.19
12:13
(37) Поздравляю, ты изобрел журнал регистрации. А теперь представь количество записей в этом регистре через пару месяцев, например. Да даже через пару дней, если у тебя реально 200 пользователей сидят и набивают данные.

И соответственно скорость получения среза последних и скорость записи в этот регистр.
41 Вася Теркин
 
12.02.19
12:14
(40) Ну ежеутречно можно его резать. Представь...
42 Вася Теркин
 
12.02.19
12:14
Зачем мне история?
43 Вася Теркин
 
12.02.19
12:15
Я не изобрел, а украл идею. Но ЖР резать евридей нельзя. А то бы я его.....
44 Вася Теркин
 
12.02.19
12:16
Вообще если ЖР так активно теребить система наверняка загнется.
45 Вафель
 
12.02.19
12:19
(43) можно конечно же.
поставь старый формат и раздление по дням. и он сам будет резаться. только успевай  файлы удалять
46 Вася Теркин
 
12.02.19
12:21
(45) Я не про то, если в него читать раз двести в секунду, то серверу 1С это сильно может не понравиться...
47 тарам пам пам
 
12.02.19
12:22
(42) Ну так не я же регистр периодическим сделал. Он по твоему коду такой.
Я к тому, что тебе в регистре дата нужна в реквизите, а не в измерениях. Да и источник тоже. В итоге в регистре будет храниться время последнего изменения каждого из типов документов, а не вообще вся история. И чистить его не нужно будет, там от силы 100 записей будет.
48 Вася Теркин
 
12.02.19
12:22
(45) См  (30)
"Если с каждой открытой формы запускать,то:

до 200 клиентов
до 4-5 форм списков открытых,
каждые 5 сек, не чаще.

200 запросов в сек. "
49 Вася Теркин
 
12.02.19
12:25
(47) Нет, это прототип. Я ещё хочу формы отдельных документов (ну там не совсем формы документов, а произвольные, которые создают оригинальный интерфейс). Там надо будет оповещением конкретно отправлять какой источник (ГУИД).
Это я просто примерчик облегченный накидал. А настоящая болезнь проникала в организм глубже.
50 Вася Теркин
 
12.02.19
12:28
При обновлении любой заявки рассылать как оповещение о том, что обновились списки такого типа, так и расслать другое оповещение что конкретно такой-то документ. Просто я не могу в документы юзеров пускать чтобы их не лочили. Мне с нескольких систем надо параллельно иметь возможность проводит-писать документ. Поэтому юзер видит только отображение документа, а не формуДокумента. Поэтому в форме списка объекты могут появляться исчезать и статусы менять даже пока их "тут" пытаются править.
51 Вася Теркин
 
12.02.19
12:31
Юзер правит документ, а в это время его с другой системы кто-то модифицирует через вебсервис. Сложная духовная жизнь.
52 Вася Теркин
 
12.02.19
12:34
Кто-нибудь знает - ОбработкаПроверкиЗаполнения у модуля набора записей РС срабатывает если вебсервисом в него писать?
53 тарам пам пам
 
12.02.19
12:43
(52)
Описание:

Вызывается расширением формы при необходимости проверки заполнения реквизитов при записи в форме, а также при выполнении метода ПроверитьЗаполнение.


То есть нет, ОбработкаПроверкиЗаполнения из веб-сервиса не вызывается, нужно вручную ПроверитьЗаполнение вызывать.
54 Вася Теркин
 
12.02.19
12:46
Ну это я читал. Но ведь и тайный смысл бывает, всякие недокументированные невероятности.
Просто я написал
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    Для каждого стр из ЭтотОбъект Цикл
        МойИнтерфейсВызовСервера.ОповеститьФормыПриЗаписиПриЗаписи(стр.Заявка, Ложь);
    КонецЦикла;
КонецПроцедуры

и был счастлив.
А теперь в вебсервис тоже придется строку вставлять

    МойИнтерфейсВызовСервера.ОповеститьФормыПриЗаписиПриЗаписи(Док.Ссылка, Ложь);

А это же уже дополнительная работа.
55 Вася Теркин
 
12.02.19
12:46
Не, лучше я напрямую вызову процедуру.
56 Вася Теркин
 
12.02.19
12:47
Хотя     Рег.ПроверитьЗаполнение();
короче и красивше...