Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Использование директивы НаСервереБезКонтекста в общих модулях.

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

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

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

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.