Имя: Пароль:
1C
 
Вызов процедуры из общего модуля
0 Сергиус
 
26.01.11
13:49
Есть общий модуль в свойствах его стоит Глобальный ложь, Клиент истина, Сервер истина

В этом модуле сделал процедуру и хочу чтобы она в любом случае выполнялась на сервере. Вот так:

#Если Сервер Тогда

Процедура Тест() Экспорт

....текст процедуры

КонецПроцедуры

#КонецЕсли

Сделал обработку, в ней кнопку, при нажатии кнопки вызывается как раз эта процедура. Запускаю клиента и в итоге при нажатии получаю ошибку - типа Процедура Тест не найдена на клиенте..

Упс..но в справке четко написано следующее:

"Далее, при компиляции на стороне клиента модулей, в которых содержится обращение к данной процедуре, будет произведен ее поиск на стороне клиента. На стороне клиента таковой процедуры нет, следовательно, она не будет найдена. Тогда будет произведен поиск процедуры в общих модулях на стороне сервера, где она будет обнаружена и все вызовы будут переправляться для выполнения на сервер 1С:Предприятия."

Что я делаю не так?
1 butterbean
 
26.01.11
13:50
код вызова покажи
2 Сергиус
 
26.01.11
13:52
(1) ИмяМодуля.ИмяПроцедуры()
3 Сергиус
 
26.01.11
14:05
+(0) Может в свойствах модуля дело?
4 Rico_1C
 
26.01.11
14:09
&НаСервере
5 Rico_1C
 
26.01.11
14:11
А Вызов сервера?!..
6 Rico_1C
 
26.01.11
14:12
Иль эт 8.1?!..
7 Сергиус
 
26.01.11
14:13
(6) сорри забыл указать, да это 8.1
8 Rico_1C
 
26.01.11
14:14
Переходи на 8.2  ;))
9 Сергиус
 
26.01.11
14:16
(8) да при чем тут это)

вон в справке написано что и в 8.1 можно как то реализовать..ток как?)
10 alxbzm
 
26.01.11
14:16
(0) у модуля поставь
Глобальный ложь, Клиент ложь, Сервер истина

и убери из текста

#Если Сервер Тогда
#КонецЕсли
11 Rovan
 
гуру
26.01.11
14:22
сними птичку "Клиент"
12 Сергиус
 
26.01.11
14:22
(10) ну так то да..

Просто если все решается только галочками..зачем конструкция #Если Сервер Тогда
#КонецЕсли
?

наверно не просто так..
13 Сергиус
 
26.01.11
14:23
(11) Зачем тогда ввели #Если Сервер Тогда
#КонецЕсли ?
14 alxbzm
 
26.01.11
14:25
(13) сказать честно, сам поначалу путался... но до сих пор не могу ответить на этот вопрос ))) может кто-то из знающих просветит )))
15 Maxus43
 
26.01.11
14:25
(13) указание где код будет откомпилирован
16 Сергиус
 
26.01.11
14:28
(15) и в каком случае я могу это использовать?

В чисто серверном модуле понятно что не надо..

Значит..делаем вывод, что в модуле с признаками и Клиент и Сервер.

Тогда почему я получаю такую ошибку как в (0)?
17 Maxus43
 
26.01.11
14:29
(16) Выполняеш в контексте клиента, и этого кода на клиенте просто нет, поидее так
18 Maxus43
 
26.01.11
14:30
Это не указание где запускать код, этим рулить нельзя программно
19 skunk
 
26.01.11
14:30
(13)для того что-бы определить работает данный модуль на сервере или клиенте ...
20 Maxus43
 
26.01.11
14:34
(16) Ну пример - в модулях объектов документов (они выполняются как на клиенте так и на сервере, в зависимости от ситуации) - печать вынесена в Если Клиент, чтоб это добро отсутствовало на стороне сервера
21 Сергиус
 
26.01.11
14:35
(17) Т.е. ты хочешь сказать что я с клиента могу запустить код на Сервере только из серверного модуля и данная конструкция( #Если Сервер Тогда #КонецЕсли ) мне никак не поможет? А из модуля с признаками и Клиент и Сервер, когда я на клиенте, запуск исполнения на Сервере невозможен?

Как тогда понять вот это:
"При запуске конфигурации на выполнение производится загрузка и компиляция конфигурации. Экземпляры всех общих модулей создаются как на серверной, так и на клиентской стороне. Если в каком-то из общих модулей содержится приведенный фрагмент кода, то он в соответствии с инструкцией препроцессора #Если Сервер Тогда … #КонецЕсли будет скомпилирован только на стороне сервера, а на стороне клиента данный фрагмент «выпадет» из компилируемого текста и, таким образом, процедура на стороне клиента не будет представлена совсем.

Далее, при компиляции на стороне клиента модулей, в которых содержится обращение к данной процедуре, будет произведен ее поиск на стороне клиента. На стороне клиента таковой процедуры нет, следовательно, она не будет найдена. Тогда будет произведен поиск процедуры в общих модулях на стороне сервера, где она будет обнаружена и все вызовы будут переправляться для выполнения на сервер 1С:Предприятия.

" ?
22 Maxus43
 
26.01.11
14:42
>>Тогда будет произведен поиск процедуры в общих модулях на стороне сервера, где она будет обнаружена и все вызовы будут переправляться для выполнения на сервер 1С:Предприятия

До этого всё вроде правильно, а это уже не сходится с моей практикой... хз. Если б это было так то не было бы ошибки (0)
23 Сергиус
 
26.01.11
14:48
(22) О том вот и речь..
24 hhhh
 
26.01.11
14:55
(21) ну тебе надо перейти на сервер, тогда будут видны процедуры, которые на стороне сервера, если ты находишься на стороне клиента, то будут видны процедуры, которые на стороне клиента. Чего же тут непонятного?
25 Rovan
 
гуру
26.01.11
14:56
(22) видимо 1C ка поискала код в этом модуле на стороне клиента - не нашла
и еще раз в этом же модуле но уже на сервере искать не будет
26 Maxus43
 
26.01.11
15:02
(24) Фраза из СП (22) непонятно
27 mazaloff
 
26.01.11
15:19
клиент ее не видит из-за того что ты не поставил галочку - "вызов сервера", то есть у тебя этот модуль виден только в контексте сервера.
28 mazaloff
 
26.01.11
15:23
а так же из-за #Если Сервер Тогда  этот текст компилируется только на сервере клиент его тоже не видит.

в общем надо убрать #Если Сервер Тогда и поставить галочку "вызов сервера"

#Если Сервер Тогда - вообще не имеет смысла писать в общих модулях, если стоят галочки в модуле "клиент" "сервер" - то выполнение производится на той стороне, кто вызвал, например если твою процедуру вызывает серверная процедура то на сервере, а если клиентская то соответственно выполняется на клиенте.
29 Сергиус
 
26.01.11
15:32
(28) ты читал что написано об этом в СП?

Как то немного отличается от твоей версии..я специально привел текст в (21)
30 Сергиус
 
26.01.11
15:33
(25) Т.е. СП противоречит сам себе?..Ибо там написано:"Далее, при компиляции на стороне клиента модулей, в которых содержится обращение к данной процедуре, будет произведен ее поиск на стороне клиента. На стороне клиента таковой процедуры нет, следовательно, она не будет найдена. Тогда будет произведен поиск процедуры в общих модулях на стороне сервера, где она будет обнаружена и все вызовы будут переправляться для выполнения на сервер 1С:Предприятия. "
31 H A D G E H O G s
 
26.01.11
15:58
Ключевое слово "ПриКомпиляции"
32 Сергиус
 
26.01.11
15:59
+(30)Короче выяснилось что СП подгоняет насчет этого конкретненько..
33 Сергиус
 
26.01.11
15:59
(31) О, где ж ты был?))
34 Сергиус
 
26.01.11
16:01
+(33) Щаз опять начнешь советовать все бросить и бежать бежать от 1с?)))

Ну а если по делу..да, при компиляции..что это меняет в данном случае?
35 H A D G E H O G s
 
26.01.11
16:02
У тебя Синтаксис - контроль будет ругаться, если ты, к примеру, в модуле документа пропишешь вызов Клиентского общего модуля.
36 Сергиус
 
26.01.11
16:04
(35) Почему это?

Если я с клиента захочу вызвать что то из клиентского модуля НЕглобального..что же в это такого?
37 Maxus43
 
26.01.11
16:11
(36) а если с сервера то будет ругаться, чего быть не должно, потому и печать в документах компилируется только на клиенте специально
38 DmitrO
 
26.01.11
16:48
Просто надо понимать что есть два явления:
1. Компиляция модуля для контекста выполнения (клиент, сервер и т.п.) - этим управляет именно препроцессор, он просто вырезает код из модуля.

2. передача управления с клиента на сервер (1С использует такой термин, но я бы это назвал: переход выполнения кода с клиента на сервер) - этим препроцессор НЕ УПРАВЛЯЕТ. Единственная возможность в 8.1 передать управление на сервер - вызвать процедуру общего модуля у которого стоит только один флажок "Сервер".
Независимо от того, куда вы едете — это в гору и против ветра!