Имя: Пароль:
1C
1С v8
Запутался в директивах компиляции
,
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) Это только в твоей альтернативной реальности там ничего не работает. Желания тебе что-то доказывать нет, хочешь выглядеть глупо - валяй.
Независимо от того, куда вы едете — это в гору и против ветра!