Имя: Пароль:
1C
1С v8
Использование директивы НаСервереБезКонтекста в общих модулях.
0 SpellKeeper
 
01.08.19
15:31
Добрый день.
Есть общий модуль объявленный на сервере (галки Сервер и Вызов сервера установлены).
Некоторые процедуры из этого модуля объявлены с директивой &НаСервереБезКонтекста.
Функции в общем модуле, в основном, возвращают какие-то списки или еще что-то, и не требуют передачи контекста формы.
Почему-то при вызове этих процедур из процедур формы объявленных &НаСервере (например, ПриСозданииНаСервере) вылезает ошибка, что метод не найден.
Облазил кучу сайтов в инете (в том числе и ИТС), везде пишут только про контекст формы. Но тут, похоже, еще и глобальный контекст как-то подвязан, т.к. в процедуре ПриНачалеРаботыСистемы тоже нельзя вызвать такие процедуры.
Такая же петрушка при попытке вызвать функцию РольДоступна из процедуры без контекста.

Что я не так понимаю с этими процедурами?
Стоит ли вообще использовать директиву &НаСервереБезКонтекста в общих модулях? Может поставить везде &НаСервере и не заморачиваться?
1 palsergeich
 
01.08.19
15:34
(0) в общих модулях директивы компиляции использовать не стоит.
Код должен выполняться во всех объявленных контекстах этого модуля.
В общем модуле нет контекста в том смысле, как это есть в форме
2 palsergeich
 
01.08.19
15:37
3 fisher
 
01.08.19
15:55
(0) СП - "Общее описание встроенного языка" - "Директивы компиляции"
Общий модуль
  В общем модуле доступны директивы компиляции – &НаКлиенте, &НаСервере
4 fisher
 
01.08.19
15:57
Но так как у тебя общий модуль и так чисто серверный, то расстановка серверных директив по-процедурно никакого смысла не имеет. Они и так все на сервере будут.
5 palsergeich
 
01.08.19
16:04
(4) есть логическая ловушка в которую попадают новички
&НаСервере в модуле формы <> &НаСервере в общем модуле
&НаСервереБезКонтекста в модуле формы = &НаСервере в общем модуле с точки зрения функциональности
6 palsergeich
 
01.08.19
16:05
Вот что по этому поводу говорит дока https://its.1c.ru/db/v8std#content:439:hdoc
7 Cyberhawk
 
01.08.19
16:05
Замечу, что (2) - не единственный вариант разграничения модулей
8 palsergeich
 
01.08.19
16:06
Выдержка:
Директивы компиляции:

&НаКлиенте (&AtClient)
&НаСервере (&AtServer)
&НаСервереБезКонтекста (&AtServerNoContext)

следует применять только в коде модулей управляемых форм и в коде модулей команд. В остальных модулях рекомендуется применять инструкции препроцессору.

В серверных или клиентских общих модулях контекст исполнения очевиден, поэтому смысла в директивах компиляции нет. В общих модулях с признаками клиент и сервер применение директив компиляции затрудняет понимание, какие же процедуры (функции) доступны в конечном итоге.
9 palsergeich
 
01.08.19
16:07
(7) Для тех, кто задает такие вопросы - начинать надо с этого.
По мере роста осмысленно можно отойти, но по началу лучше придерживаться
10 fisher
 
01.08.19
16:07
(5) Да первый раз вижу, что кто-то попал в "ловушку". Очевидно же, что контекст формы никакого отношения к общим модулям не имеет. Он оттуда тупо недоступен, хоть застрелись. Общие модуля неконтекстны (относительно контекста формы) по определению.
11 palsergeich
 
01.08.19
16:08
(10) Вы много работали с новичками? я да, и каждому эту особенность обяснять приходится без исключений
12 SpellKeeper
 
01.08.19
16:09
(5) В чем ловушка?
Можно подробнее?
13 lepoissonherisson
 
01.08.19
16:09
Чо ?
14 palsergeich
 
01.08.19
16:10
(12) На форме есть контекст формы, а в общем модуле контекста формы нет.
см (5)
15 palsergeich
 
01.08.19
16:11
(14) По началу понимание того что такое &НаСервере - это вон на той черной машине, потом идет открытие что есть такая штука как контекст и мозг чуть чуть не понимает
16 fisher
 
01.08.19
16:12
(11) Потому что сначала надо было объяснить про контекст формы и принципы клиент-серверного взаимодействия.
17 palsergeich
 
01.08.19
16:13
(16) А работать мне когда?)
Сначала самостоятельная работа, потом коррекция
18 fisher
 
01.08.19
16:16
(8) Это вы немного из контекста вырвали. В этой статье ИТС в принципе предостерегают от создания общих модулей, компилируемых одновременно на клиенте и сервере. Чтобы типа не усложнять. В свете этого и рекомендация.
19 fisher
 
01.08.19
16:18
(18) + Вернее, чтобы не было таких клиент-серверных модулей, где одни функции компилируются только на клиенте, а другие - только на сервере. Типа сразу разносить надо. А если нужно ВНУТРИ клиент-серверной процедуры отразить отличия между клиентом и сервером - тогда само собой инструкции препроцессору.
20 palsergeich
 
01.08.19
16:18
(18) Нет, там 2 логические ветки:
- В серверных или клиентских общих модулях контекст исполнения очевиден - смысла нет
- Не следует использовать инструкции препроцессора в клиент-серверных общих модулях для проверки клиентского и серверного контекстов (#Если Сервер, #Если Клиент) ввиду невозможности надежного определения контекста исполнения - потом сложно будет понять что из какого конеткста вызывать.
От использования одновременно КлиентСервер никто не предостерегает.
21 palsergeich
 
01.08.19
16:19
(19) И как это к теме относится и к рекомендации не использовать директивы компиляции в Общих модулях?
22 SpellKeeper
 
01.08.19
16:21
(20)Я бы не сказал, что контекст очевиден.
Если я на форме вызываю процедуру из общего модуля на сервере, 1С потащит на сервер контекст формы или нет?
23 palsergeich
 
01.08.19
16:21
(21) код должен выполняться во всех объявленных контекстах компиляции этого модуля без ошибок.
Будет ли это благодаря директивам препроцессору или использованию доступных во всех контекстах механизмах - это уже к вопросу реализации
24 palsergeich
 
01.08.19
16:22
(22) Очевидно. Общий модуль ничего не знает о том откуда он вызван.
связь через параметры и если это функция, то возврат водителю через ключевое слово ВОЗВРАТ
25 fisher
 
01.08.19
16:24
(21) Рекомендация не использовать директивы компиляции в общих модулях дается не потому, что директивы компиляции "плохие". А потому, что они могут быть использованы в общих модулях для единственной цели - совмещения в одном модуле одновременно и клиентских и серверных процедур. А 1С их рекомендует разносить по разным модулям, чтобы не разбираться с их общей свалкой в одном модуле. Другими словами, использование инструкций препроцессора для компиляции разных процедур из одного модуля на клиенте и сервере 1С тоже не одобряет.
26 palsergeich
 
01.08.19
16:25
(25) Я тебе про одно, ты мне про другое, ок.
27 Cyberhawk
 
01.08.19
16:28
(22) Нет
28 fisher
 
01.08.19
16:29
(22) Не потащит. "Тащить" контекст имеет смысл только с одной целью - если нужно с ним работать. А работать с контекстом формы в общем модуле ты не можешь при всем желании. Только явно через параметры.
29 SpellKeeper
 
01.08.19
16:31
(28) пока писал вопрос, получил ответ.
Спасибо.
30 Aleksandr N
 
01.08.19
16:36
(0) Какой контекст вы хотите увидеть в общем модуле?