|
Использование директивы НаСервереБезКонтекста в общих модулях. | ☑ | ||
---|---|---|---|---|
0
SpellKeeper
01.08.19
✎
15:31
|
Добрый день.
Есть общий модуль объявленный на сервере (галки Сервер и Вызов сервера установлены). Некоторые процедуры из этого модуля объявлены с директивой &НаСервереБезКонтекста. Функции в общем модуле, в основном, возвращают какие-то списки или еще что-то, и не требуют передачи контекста формы. Почему-то при вызове этих процедур из процедур формы объявленных &НаСервере (например, ПриСозданииНаСервере) вылезает ошибка, что метод не найден. Облазил кучу сайтов в инете (в том числе и ИТС), везде пишут только про контекст формы. Но тут, похоже, еще и глобальный контекст как-то подвязан, т.к. в процедуре ПриНачалеРаботыСистемы тоже нельзя вызвать такие процедуры. Такая же петрушка при попытке вызвать функцию РольДоступна из процедуры без контекста. Что я не так понимаю с этими процедурами? Стоит ли вообще использовать директиву &НаСервереБезКонтекста в общих модулях? Может поставить везде &НаСервере и не заморачиваться? |
|||
1
palsergeich
01.08.19
✎
15:34
|
(0) в общих модулях директивы компиляции использовать не стоит.
Код должен выполняться во всех объявленных контекстах этого модуля. В общем модуле нет контекста в том смысле, как это есть в форме |
|||
2
palsergeich
01.08.19
✎
15:37
|
https://its.1c.ru/db/v8std#content:469:hdoc
Начни с этого |
|||
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) Какой контекст вы хотите увидеть в общем модуле?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |