Имя: Пароль:
1C
1С v8
Очень быстрый способ проверить, что код выполняется в фоновом задании
,
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) Кэширование возвращаемых значений общего модуля выполняется отдельно для каждой комбинации сеанс+контекст, т.е. при выполнении в одном сеансе сервере будет свой кэш, а на клиенте свой.
AdBlock убивает бесплатный контент. 1Сергей