|
Запутался в директивах компиляции | ☑ | ||
---|---|---|---|---|
0
depthzer0
11.10.13
✎
15:52
|
Платформа 8.3.3.658.
В модуле управляемого приложения ПередНачаломРаботыСистемы хочу проверить заполнился ли ПараметрСеанса.ТекущийПользователь. В самой процедуре этот параметр не видно. Создал функцию в общем модуле с пометками Клиент(управляемое приложение), Сервер, Внешнее соединение, ВызовСервера. Функцию назвал ПроверитьПараметрСеанса, указал директиву &НаСервере, поставил Экспорт. При запуске приложения ругается, говорит, что процедура не найдена: Ошибка инициализации модуля: ОбщийМодуль.УправлениеПользователями.Модуль по причине: {ОбщийМодуль.УправлениеПользователями.Модуль(243,10)}: Процедура или функция с указанным именем не определена (ПроверитьПараметрСеанса) Возврат <<?>>ПроверитьПараметрСеанса(); Поизвращался ещё, теперь код такой: в модуле управляемого приложения Процедура ПередНачаломРаботыСистемы(Отказ) Если Не ПроверитьПараметрТекущийПользователь() Тогда ОбщегоНазначения.СообщитьПользователю("Не удалось установить текущего пользователя!",,,, Отказ); КонецЕсли; КонецПроцедуры Функция ПроверитьПараметрТекущийПользователь() Возврат УправлениеПользователями.ПараметрСеансаТекущийПользовательЗаполненКлиент(); КонецФункции в общем модуле УправлениеПользователями: &НаКлиенте Функция ПараметрСеансаТекущийПользовательЗаполненКлиент() Экспорт Возврат ПараметрСеансаТекущийПользовательЗаполненСервер(); КонецФункции &НаСервере Функция ПараметрСеансаТекущийПользовательЗаполненСервер() Экспорт Возврат ЗначениеЗаполнено(ПараметрыСеанса.ТекущийПользователь); КонецФункции но результат тот же. Ума не приложу, что делать. Помогите, пожалуйста! |
|||
1
Fragster
модератор
11.10.13
✎
15:53
|
||||
2
Fragster
модератор
11.10.13
✎
15:53
|
ПередНачаломРаботыСистемы - это на сервере
|
|||
3
MrStomak
11.10.13
✎
15:53
|
снять галочку Клиент(управляемое приложение)
|
|||
4
Fragster
модератор
11.10.13
✎
15:54
|
а где у тебя определена функция ПроверитьПараметрСеанса()?
|
|||
5
MrStomak
11.10.13
✎
15:55
|
(2) Модуль управляемого приложения на сервере? С каких пор?
|
|||
6
depthzer0
11.10.13
✎
15:58
|
(2) точно? а почему тогда на ПараметрыСеанса ругается?
(3) да, возможно, но обязательно ли? если обе галки стоят, то разве этот модуль не должен и такие, и такие процедуры поддерживать? (4) "Поизвращался ещё, теперь код такой:" (3) (3) (2) |
|||
7
MrStomak
11.10.13
✎
16:00
|
(6) Одновременное наличие галочек "Клиент управляемое приложение" и "Вызов сервера" взаимоисключающее. Система будет использовать первый вариант - то есть модуль с процедурами &НаКлиенте. Процедуры &НаСервере в этом случае не компилируются и их не видно с клиента.
|
|||
8
Fragster
модератор
11.10.13
✎
16:03
|
(7) о! смотрю есть понимание, как работает. вопрос - в (1) можно избавиться от промежуточной процедуры УходимНаСервер() при "автоматическом" определении места выполнения кода?
|
|||
9
Defender aka LINN
11.10.13
✎
16:03
|
(0) А для нафига его вообще проверять, давай с этого начнем?
|
|||
10
Defender aka LINN
11.10.13
✎
16:04
|
(7) О. И давно у нас в общих модулях начали всяческие &НаКлиенте работать, с прошлого четверга?
|
|||
11
depthzer0
11.10.13
✎
16:07
|
(7) Странно, в этом модуле есть другие процедуры и функции, и с теми, и с другими директивами, и они работают.
(9) Чтобы для определённых ролей программа с незаполненным параметром сеанса ТекущийПользователь не запускалась. |
|||
12
Defender aka LINN
11.10.13
✎
16:08
|
(11) И как он может быть не заполнен?
|
|||
13
depthzer0
11.10.13
✎
16:09
|
(12) очень просто. я его "вручную" заполняю, и если, к примеру, получилось так, что добавили Пользователя ИБ в конфигураторе (!?), вместо того, чтобы создать в приложении, то человек заходит в программу, а пользователя нет.
|
|||
14
depthzer0
11.10.13
✎
16:11
|
(1) спасибо, за ссылку!
|
|||
15
Defender aka LINN
11.10.13
✎
16:12
|
(13) Ну, за такое ТЕБЯ скорее ногами бить надо. Что мешает создавать пользователя в справочнике, если не находится?
|
|||
16
MrStomak
11.10.13
✎
16:16
|
(10) Утверждать что-то в вопросе, в котором ты ничего не понимаешь - это наверное прикольно, да?
|
|||
17
depthzer0
11.10.13
✎
16:17
|
(15) действительно... а что мешает? блин... подумаю об этом
но на ноги я категорически не согласен! и хотелось бы разобраться всё-таки с директивами |
|||
18
Defender aka LINN
11.10.13
✎
16:20
|
(16) Ты мне расскажи, тебе виднее.
|
|||
19
MrStomak
11.10.13
✎
16:24
|
(18) Зачем? Мне за это денег не платят. Иди, экспериментируй, убеждайся, удивляйся.
|
|||
20
Defender aka LINN
11.10.13
✎
16:27
|
(19) Вообще-то собирался посоветовать то же самое. Ну, чтобы ты в следующий раз менее глупо выглядел.
|
|||
21
MrStomak
11.10.13
✎
16:31
|
(8) Обработку не видел, но общий модуль, в отличие от формы, компилируется где-то в одном месте и вызывать из клиентских процедур серверные не получится.
|
|||
22
MrStomak
11.10.13
✎
16:32
|
(20) Ты не поленись, проверь всё-таки, это 5 минут займёт ;)
|
|||
23
Fragster
модератор
11.10.13
✎
16:34
|
(21) не, там фишка в инструкциях препроцессору + директивах компиляции. почему-то не совсем работает :(
|
|||
24
depthzer0
11.10.13
✎
16:51
|
так, я разделил общий модуль на два. у одного галка Клиент, у другого Сервер + ВызовСервера. функции и процедуры разделил соответственно. всё за работало.
но будьте любезны, объясните почему, или где почитать? |
|||
25
Defender aka LINN
11.10.13
✎
16:55
|
(21) Ничего,что я об этом самом и толкую?
|
|||
26
depthzer0
11.10.13
✎
17:06
|
(21) ааааа! вот оно чё!
а есть где-нибудь систематизированная информация по этим всем вещам? |
|||
27
MrStomak
11.10.13
✎
17:11
|
(24) Когда мы используем модуль формы, он компилируется сразу в двух экземплярах - на клиенте и на сервере. Каждый содержит процедуры и функции, которые ему положено содержать в соответствии с директивами. При этом платформа берет на себя процесс вызова серверной процедуры с клиента - для этого она обеспечивает уникальность имен в пределах модуля.
В случае с модулями платформа на себя ничего такого не берёт. Когда ты объявляешь модуль доступным на клиенте и на сервере, это значит, что платформа будет пытаться его компилировать оттуда, откуда произошёл вызов. В результат компиляции попадёт только тот кусок, который проходит директивы и инструкции. Никакого второго варианта этого модуля на сервере, как в случае с формой, здесь не создаётся. Чтобы его создать, нужно самостоятельно вызывать его из другого контекста - с серверного. Но когда ты обращаешься к этому же модулю с его клиентской части, то это еще один клиентский вызов и компиляции сервера не происходит. Не видел про это описания какого-то, но, по-моему, Гилев эту тему затрагивал в своих курсах. |
|||
28
MrStomak
11.10.13
✎
17:14
|
(25) Ты толкуешь в (10) о том, что директивы компиляции в общих модулях не работают, т.е. несешь чушь, дальше слушать смысла нет.
|
|||
29
depthzer0
11.10.13
✎
18:09
|
(27) огромное спасибо от всего нашего коллектива! :)
|
|||
30
Defender aka LINN
11.10.13
✎
21:52
|
(28) &НаКлиенте - не директива компиляции, окда?
|
|||
31
MrStomak
12.10.13
✎
18:43
|
(30) Директива. И, что характерно, работает.
|
|||
32
Defender aka LINN
12.10.13
✎
19:10
|
(31) #Если Клиент Тогда <- Директива компиляции
&НаКлиенте - инструкция препроцессора ИЧСХ, спец по техническим вопросам не у меня |
|||
33
MrStomak
12.10.13
✎
19:21
|
СП:
Инструкции препроцессору Для указания разрешения использования процедур и функций общих модулей и модулей объектов используют инструкции препроцессору. Синтаксис: #Если <Логическое выражение> Тогда #ИначеЕсли <Логическое выражение> Тогда … #Иначе #КонецЕсли где: <Логическое выражение> = [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора>]…] <Символ препроцессора> = {НаКлиенте | НаСервере | ТолстыйКлиентОбычноеПриложение | ТолстыйКлиентУправляемоеПриложение | Клиент | Сервер | ВнешнееСоединение } <Булева операция> = {И | ИЛИ} Директивы компиляции Каждая процедура и функция модуля формы, модуля команды и общего модуля управляемого приложения предваряется директивой компиляции, определяющей среду исполнения данной процедуры. Директива предваряется символом "&". Допустимые директивы: &НаКлиенте (&AtClient) — определяет клиентскую процедуру (функцию); &НаСервере (&AtServer) — определяет серверную процедуру (функцию); |
|||
34
MrStomak
12.10.13
✎
19:22
|
Лучше прекращай позориться и покидай ветку.
|
|||
35
Defender aka LINN
12.10.13
✎
22:58
|
(34) Ок, перепутал. Но &НаКлиенте по прежнему в общих модулях не работает, вот беда :)
|
|||
36
MrStomak
13.10.13
✎
00:27
|
(35) Это только в твоей альтернативной реальности там ничего не работает. Желания тебе что-то доказывать нет, хочешь выглядеть глупо - валяй.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |