Имя: Пароль:
1C
 
Выполнение кода на сервере
0 Zaid
 
19.05.10
16:43
Добрый день. Кто сталкивался, подскажите пожалуйста по такому вопросу.
Есть общий модуль с галками "Клиент" и "Сервер".
В нем такой код:
#Если Сервер Тогда
Функция Мояфункция() Экспорт
....
КонецФункции;
#КонецЕсли

Когда я пытаюсь вызвать эту функцию, например из обработки - пишет, что "Метод объекта не обнаружен(МояФункция)". Почему? В справке написано следующее: "он в соответствии с инструкцией препроцессора #Если Сервер Тогда … #КонецЕсли будет скомпилирован только на стороне сервера, а на стороне клиента данный фрагмент «выпадет» из компилируемого текста и, таким образом, процедура на стороне клиента не будет представлена совсем.
Далее, при компиляции на стороне клиента модулей, в которых содержится обращение к данной процедуре, будет произведен ее поиск на стороне клиента. На стороне клиента таковой процедуры нет, следовательно, она не будет найдена. Тогда будет произведен поиск процедуры в общих модулях на стороне сервера, где она будет обнаружена и все вызовы будут переправляться для выполнения на сервер 1С:Предприятия."

Что я не так делаю??
1 Сергиус
 
19.05.10
16:47
(0) смысл ставить конструкцию #Если Сервер Тогда ... #КонецЕсли, если у модуля стоят признаки клиента и сервера?

Вызываешь эту функцию на сервере (например в регламентных заданиях) - выполнится на сервере, вызовешь на клиенте - будет на клиенте выполнятся..

А так получается, что заключив ее в конструкцию данного типа из клиента ты ее просто не увидишь..точнее не получишь к ней доступ.
2 Zaid
 
19.05.10
16:49
(1) Смысл в том, чтобы данный кусок выполнялся именно на сервере.
3 Defender aka LINN
 
19.05.10
16:50
(2) Ну так и выноси в отдельный серверный модуль.
З.Ы. 8.2?
4 Сергиус
 
19.05.10
16:50
(2) это да..только и доступна она будет при работе с сервера...
5 Сергиус
 
19.05.10
16:51
+4 в (3) хорошее предложение)
6 xzorkiix
 
19.05.10
16:51
Функция Мояфункция() Экспорт
Результат = 0;
#Если Сервер Тогда
Результат = 1;
#КонецЕсли
возврат Результат;
КонецФункции;
7 Zaid
 
19.05.10
16:52
(3) и 8.2 и 8.1
Уже вынес - так работает. Теперь нужно, чтобы работало в общем Клиент-Серверном модуле. В справке ясно написано, как должно происходить. Вопрос почему не происходит так, как в справке?
8 Zaid
 
19.05.10
16:53
(6) что это?
9 Zaid
 
19.05.10
16:54
+(4) Вариант, подсказанный в (3) - работает при работе с клиента. Т.е. работа выполнение передается на сервер. Почему этого не происходит, если в модуле поставить и галочку "Клиент" тоже?
10 Сергиус
 
19.05.10
16:55
(7) что тебе смущает в справке?

"а на стороне клиента данный фрагмент «выпадет» из компилируемого текста и, таким образом, процедура на стороне клиента не будет представлена совсем."

У тебя так и происходит..как описано
11 Zaid
 
19.05.10
16:57
(10) а второй абзац? Там, где "Далее..." и далее :)
12 Ненавижу 1С
 
гуру
19.05.10
16:57
не совсем так, когда ты на клиенте пишешь:
МойМодуль.МойМетод();
то платформа интерпретирует это в первую как обращение к экземпляру (не совсем правильное выражение) модуля МойМодуль
далее видит, что он может работать на клиенте и заставляет обращаться именно с клиента, а вот сам модуль откомпилирован в соответствии с инструкцией
как-то так
13 Zaid
 
19.05.10
16:59
(12) хм... похоже на правду. Спасибо!
Не понятно, о чем они тогда пишут в справке. Вводит в заблуждение.
14 Ненавижу 1С
 
гуру
19.05.10
17:00
+(12) написал, прочитал: бред
15 Сергиус
 
19.05.10
17:01
(14) но смысл понятен))
16 ll13
 
19.05.10
17:02
(0)
Глава 4. Встроенный язык. стр.58
"Если используется неглобальный общий модуль, для которого установлено использование на клиенте (любом) и на сервере, то
методы, заключенные в условие #Если Сервер Тогда #КонецЕсли, будут доступны только в том случае, если вызов этих
методов выполняется со стороны сервера. Вызов таких методов со стороны клиента недоступен"

Вывод: поаккуратней с клиент-серверными модулями...
17 Ненавижу 1С
 
гуру
19.05.10
17:04
(16) вывод: 1С как всегда сделала хрень
18 ll13
 
19.05.10
17:05
(17) Сам недавно на этот косяк напоролся... вопрос зачем и почему это было сделано остался открыт ...
19 Zaid
 
19.05.10
17:07
(16) А откуда копипаста?
20 ll13
 
19.05.10
17:12
(19) Официальное руководство разработчика 1С (с диска ИТС)
21 NcSteel
 
19.05.10
17:15
(17) Все она сделала правильно , прописали инструкцию сосите лапу.
22 Ненавижу 1С
 
гуру
19.05.10
17:17
(21) кому это надо, это полный бред
23 a_alenkin
 
19.05.10
17:19
Может надо так?

#НаСервере
Функция МояФункция()

КонецФункции


И ее ты сможешь вызывать с клиента но выполняться она будет на сервере
И я все же так понимаю что это 8.2?
24 Zaid
 
19.05.10
17:25
(23) Да 8.2. На 8.1 тоже самое.
"Для выполнения на сервере (инструкции Сервер и НаСервере равнозначны)"

(20) Спасибо! И всем спасибо.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший