|
Очень быстрый способ проверить, что код выполняется в фоновом задании | ☑ | ||
---|---|---|---|---|
0
TormozIT
гуру
19.11.14
✎
13:35
|
Есть варианты?
|
|||
1
TormozIT
гуру
19.11.14
✎
13:36
|
Естественно нужно как можно универсальнее.
|
|||
2
vde69
19.11.14
✎
13:37
|
текущийПользователь()
|
|||
3
YFedor
19.11.14
✎
13:38
|
(2) Кстати, а что он вернет в фоновом задании?
|
|||
4
TormozIT
гуру
19.11.14
✎
13:38
|
(2) Фоновое задание запущенное пользователем, вернет его имя, а не пустое.
|
|||
5
Fragster
гуру
19.11.14
✎
13:40
|
Запись в ЖР, чтение из ЖР :)
|
|||
6
vde69
19.11.14
✎
13:40
|
если СеансИнформационнойБазы.ИмяПриложения = ImplAppID тогда
|
|||
7
TormozIT
гуру
19.11.14
✎
13:41
|
(6) Ну это известный и очень медленный способ.
|
|||
8
Ёпрст
19.11.14
✎
13:41
|
В попытке обратиться к клиентской проце, разве что.. если прокатывает - не фоновое
|
|||
9
YFedor
19.11.14
✎
13:42
|
(8) А как обратиться с сервера к клиентской? Даже если не фоновое, то ошибка будет
|
|||
10
Fragster
гуру
19.11.14
✎
13:44
|
ну или через НомерСоединенияИнформационнойБазы() и соединение с менеджером кластера
|
|||
11
Snorkler
19.11.14
✎
13:44
|
(7) Тогда необходимо определение что есть такое "немедленный процесс"…
|
|||
12
vde69
19.11.14
✎
13:44
|
(7) запихни это в общий модуль с галкой "повторное использование"
|
|||
13
TormozIT
гуру
19.11.14
✎
13:44
|
(10) Еще медленнее, чем (6).
|
|||
14
Ёпрст
19.11.14
✎
13:45
|
(9) через выполнить
|
|||
15
Ёпрст
19.11.14
✎
13:45
|
+14 ну, или какой там аналог клюшечного шаблона ?
|
|||
16
vde69
19.11.14
✎
13:45
|
(12)+
функция ЭтоФон() экспорт возврат СеансИнформационнойБазы.ИмяПриложения = "ImplAppID"; конецФункции |
|||
17
TormozIT
гуру
19.11.14
✎
13:47
|
(16) Да, подходит. Только у тебя идентификатор не тот.
|
|||
18
vde69
19.11.14
✎
13:49
|
(17) ну я не проверял, так "на глазок" :)
|
|||
19
vde69
19.11.14
✎
13:51
|
(16)+ кстати в этом общем модуле можно дополнительно поставить галку "привелегированый" и тогда будет работать даже без прав :)
|
|||
20
TormozIT
гуру
19.11.14
✎
13:52
|
(19) Но только на севере, что не универсально.
|
|||
21
Ymryn
19.11.14
✎
13:57
|
(20) а бывает фоновый вызов клиента? Или я где-то торможу, не могу понять в чем тут потеря универсальности?
|
|||
22
TormozIT
гуру
19.11.14
✎
13:58
|
(21) Есть код, который может выполняться в произвольном контексте. В нем надо проверить (0) с наименьшими затратами.
|
|||
23
18_plus
19.11.14
✎
13:59
|
а если так обернуть?
|
|||
24
18_plus
19.11.14
✎
14:00
|
с названием ошибся, но я думаю понятно о чём речь
|
|||
25
TormozIT
гуру
19.11.14
✎
14:01
|
(20) В общем все получилось. Надо вызывать кэшированный модуль в текущем контексте, а из него уже звать привилегированный серверный модуль. Тогда расходы будут стабильно низкими независимо от того, вызывается проверка на сервере или клиенте.
|
|||
26
Ymryn
19.11.14
✎
14:05
|
(25) А через #Если Клиент Иначе - чтобы сразу вызывать кешированный серверный модуль не быстрее будет? (Могу ошибаться, сугубо предполагаю)
|
|||
27
TormozIT
гуру
19.11.14
✎
14:11
|
В общем сделал
КэшированныйМодуль (Клиент,Сервер и др.) Функция ЭтоФоновоеЗаданиеИис() Экспорт Результат = СерверныйМодуль.ЭтоФоновоеЗаданиеИис(); Возврат Результат; КонецФункции // ЭтоФоновоеЗаданиеИис() СерверныйМодуль (Сервер, Привилегированный) Функция ЭтоФоновоеЗаданиеИис() Экспорт НомерСеанса = НомерСеансаИнформационнойБазы(); Сеансы = ПолучитьСеансыИнформационнойБазы(); Для Каждого Сеанс Из Сеансы Цикл Если Сеанс.НомерСеанса = НомерСеанса Тогда Результат = НРег(Сеанс.ИмяПриложения) = НРег("BackgroundJob"); Прервать; КонецЕсли; КонецЦикла; Возврат Результат; КонецФункции // ЭтоФоновоеЗаданиеИис() Теперь зову везде (на клиенте, на сервере) КэшированныйМодуль.ЭтоФоновоеЗаданиеИис() |
|||
28
vde69
19.11.14
✎
14:21
|
(27) а ты проверил? кешированый модуль действительно разные значения выдает если запуск рег задания делает юзер?
может лучше так КэшированныйМодуль (Клиент,Сервер и др.) Функция ЭтоФоновоеЗаданиеИис(НомерСеанса) Экспорт Результат = СерверныйМодуль.ЭтоФоновоеЗаданиеИис(НомерСеанса ); Возврат Результат; КонецФункции // ЭтоФоновоеЗаданиеИис() СерверныйМодуль (Сервер, Привилегированный) Функция ЭтоФоновоеЗаданиеИис(НомерСеанса ) Экспорт Сеансы = ПолучитьСеансыИнформационнойБазы(); Для Каждого Сеанс Из Сеансы Цикл Если Сеанс.НомерСеанса = НомерСеанса Тогда Результат = НРег(Сеанс.ИмяПриложения) = НРег("BackgroundJob"); Прервать; КонецЕсли; КонецЦикла; Возврат Результат; КонецФункции // ЭтоФоновоеЗаданиеИис() Теперь зову везде (на клиенте, на сервере) КэшированныйМодуль.ЭтоФоновоеЗаданиеИис(НомерСеансаИнформационнойБазы()) |
|||
29
TormozIT
гуру
19.11.14
✎
14:23
|
(28) Функция НомерСеансаИнформационнойБазы() контекстно независима, т.е. в серверном контексте она выдаст тот же номер, что и в клиентском. Поэтому НомерСеанса передавать нет смысла.
|
|||
30
olegves
19.11.14
✎
14:24
|
#Если НЕ ЭтоКЛиентскоеПриложение
|
|||
31
olegves
19.11.14
✎
14:28
|
(30) ЭтоКЛиентскоеПриложение = НаКлиенте
|
|||
32
vde69
19.11.14
✎
14:46
|
(29) по моему регламентное задание выполняется в отдельном сеансе?
|
|||
33
TormozIT
гуру
19.11.14
✎
14:48
|
(32) Да. Но какое это имеет значение?
|
|||
34
H A D G E H O G s
19.11.14
✎
14:55
|
(33) Зачем 2 модуля?
|
|||
35
Гёдза
19.11.14
✎
14:57
|
А для каждого фонового задания свой кэш процедур? или тот же что и вызвавший процесс
|
|||
36
TormozIT
гуру
19.11.14
✎
15:01
|
(34)
- кэшированный модуль должен быть всеконтекстным и потому не может быть привилегированным - привилегированный модуль нужен, чтобы пользователь без административных прав мог вызывать ПолучитьСеансыИнформационнойБазы() |
|||
37
TormozIT
гуру
19.11.14
✎
15:03
|
(35) Кэширование возвращаемых значений общего модуля выполняется отдельно для каждой комбинации сеанс+контекст, т.е. при выполнении в одном сеансе сервере будет свой кэш, а на клиенте свой.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |