|
Области видимости переменных | ☑ | ||
---|---|---|---|---|
0
never_sleep
11.04.17
✎
09:08
|
Нууу очень тупой вопрос. Есть внешняя обработка.
Структура модуля такая: Перем ФайлПрочитан; Процедура1() ..... КонецПроцедуры; Процедура2() .... КонецПроцедуры; ФайлПрочитан = Ложь; Если в любой из процедур обратиться к переменной, то получаю ошибку. Как объявить общую для процедур модуля переменную? Ну реально, везде же написано, что в начале модуля просто её прописываю и все. почему не арбайтен? |
|||
1
aka AMIGO
11.04.17
✎
09:10
|
Если клиент - работает. Если сервер - не работает.
|
|||
2
never_sleep
11.04.17
✎
09:11
|
(1) ну там есть серверные вызовы, но вся логика этой переменной только на клиенте. т.е. в моем "листинге" Процедура1/2 - на клиенте. Там есть серверные, но в них эта переменная не используется.
|
|||
3
Рэйв
11.04.17
✎
09:13
|
(2)
&НаКлиенте Перем ФайлПрочитан; а на сервер передавать параметром можно |
|||
4
Рэйв
11.04.17
✎
09:14
|
+(3)Или делай ее реквизитом формы.Через контекст оно и там и там будет видно
|
|||
5
Serg_1960
11.04.17
✎
09:20
|
ТС, используй явно директивы компиляция. Имхо, использование значений "по умолчанию" оно, конечно, облегчает написание... но лучше будет, если везде ясно и чётко указывать что где работает.
|
|||
6
Рэйв
11.04.17
✎
09:22
|
(5)Если мне не изменяет склероз, без явного указания код работает на сервере вроде
|
|||
7
never_sleep
11.04.17
✎
09:23
|
(3) Вон че. Для переменных тоже нужно контекст указывать. В очередной рад спасибо, Рейв.
|
|||
8
never_sleep
11.04.17
✎
09:23
|
(6) да, вот только что глянул. по умолчанию директива НаСервере
|
|||
9
never_sleep
11.04.17
✎
09:26
|
(5) Если честно не знал, что переменные тоже на серверные и клиентские делятся ( Хотя, конечно, это логично.
|
|||
10
Serg_1960
11.04.17
✎
09:28
|
(6) Если процедуры не видят переменную, то в алгоритме таки есть директивы. Просто автор нам их не озвучил. Умолчал :)
|
|||
11
never_sleep
11.04.17
✎
09:32
|
Вопрос еще один.
В самом конце этого "листинга" идет инициализация ФайлПрочитан = Ложь; Он где исполняется? сейчас проверил 1Ска не ругшается если в самом начале модуля объявить так: &НаКлиенте Перем ФайлПрочитан; &НаСервере Перем ФайлПрочитан; Если в конце модуля пропишу ФайлПрочитан = Ложь; Какую переменную он инициализирует? |
|||
12
Рэйв
11.04.17
✎
09:32
|
(11)Проверь.
|
|||
13
1dvd
11.04.17
✎
09:33
|
(11) Если директив нет, то по-умолчанию
|
|||
14
never_sleep
11.04.17
✎
09:35
|
(12) Вот и проверю)
|
|||
15
aka AMIGO
11.04.17
✎
09:40
|
(14) И сообщи результат сюда..
Наверняка многие уже споткнулись на этом |
|||
16
never_sleep
11.04.17
✎
09:42
|
(15) Да тут дичь какая-то) Ща сам с мыслями соберусь)
|
|||
17
Михаил 1С
11.04.17
✎
09:46
|
(16) Сделай тест:
создай новую переменную - ТестПрисвоения (также глобальную переменную для всего модуля), при ее объявлении напиши &НаКлиенте. Потом в конце напиши текст ТестПрисвоения = "Неизвестно где"; &НаКлиенте ТестПрисвоения = "На Клиенте"; Ну а в одной из своих клиентских процедур сделай вывод значения на экран: Сообщить(ТестПрисвоения); |
|||
18
never_sleep
11.04.17
✎
09:51
|
Короче, написал примерно такой код:
&НаКлиенте Перем НачальноеЧисло; &НаСервере Перем НачальноеЧисло; &НаКлиенте Процедура Процедура1() Сообщить(НачальноеЧисло); КонецПроцедуры; &НаСервере Процедура Процедура1() Сообщить(НачальноеЧисло); КонецПроцедуры; НачальноеЧисло = 101; Думал, что результат будет примерно таким: 101 Неопределено (или 0, хз как 1С по умолчанию инициализирует) А вышло: 101 101 |
|||
19
never_sleep
11.04.17
✎
09:52
|
Процедура2 на сервере, опечатался. И вызывается она из первой.
|
|||
20
never_sleep
11.04.17
✎
09:55
|
еще забавное:
http://s010.radikal.ru/i312/1704/e1/dcf351a84d3e.png И так везде, в том числе в процедурах, как в серверных так в клиентских. Хотя не думаю, что разница есть какую выбрать. Хотя кто его знает, что там у 1С в голове) |
|||
21
Михаил 1С
11.04.17
✎
09:57
|
(20) Нуу, просто, видимо, код "основной программы" вызывается два раза - сначала на сервере, потом на клиенте. И все тут.
|
|||
22
Михаил 1С
11.04.17
✎
09:59
|
(21) Но ты лучше точно напиши директивы компилятора, чтобы не запутаться.
ПС: и 1С может однажды изменить платформу, и окажется, что этот код будет запускаться только на сервере, или только на клиенте, если нет директив. |
|||
23
Любопытная
11.04.17
✎
10:00
|
Зачем ты разные переменные называешь одинаково? Сам себя запутал.
|
|||
24
Михаил 1С
11.04.17
✎
10:01
|
(23) Он тестирует платформу
|
|||
25
Любопытная
11.04.17
✎
10:09
|
(18) Какая из процедур срабатывает первой? Серверная или клиентская?
|
|||
26
never_sleep
11.04.17
✎
10:16
|
(21) Кстати, да. Это бы все объяснило. Но тогда отдельно инициализировать серверную и клиентскую процедуру не получится, если они имеют одинаковое имя (директивы ведь в "основной программе" писать нельзя?). Правда, кто в здравом уме будет такое использовать.
|
|||
27
never_sleep
11.04.17
✎
10:16
|
(25) Сначала клиент, потом из неё сервер.
|
|||
28
Михаил 1С
11.04.17
✎
10:19
|
(26) Не понятно - чего там где инициализируется?
И почему директивы писать нельзя, когда можно? |
|||
29
never_sleep
11.04.17
✎
10:20
|
(28) ну я в (17) у вас глянул, что можно. Ща попробую ваш тест запустить.
|
|||
30
shpioleg
11.04.17
✎
10:22
|
Код основной программы будет исполняться на сервере при каждом контекстном вызове.
Сделай #Если Клиент Тогда |
|||
31
never_sleep
11.04.17
✎
10:24
|
(28) А вот фига. Не дает писать директивы в "основной программе"
&НаКлиенте Перем НачальноеЧисло; &НаСервере Перем НачальноеЧисло; &НаСервере Процедура ЗапуститьНаСервере() Сообщить(НачальноеЧисло); КонецПроцедуры &НаКлиенте Процедура Запустить(Команда) Сообщить(НачальноеЧисло); ЗапуститьНаСервере(); КонецПроцедуры &НаКлиенте НачальноеЧисло = 101; &НаСервере НачальноеЧисло = 202; Ругается {ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(19,1)}: Ожидается определение процедуры/функции <<?>>НачальноеЧисло = 101; (Проверка: Сервер) {ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(19,1)}: Ожидается определение процедуры/функции <<?>>НачальноеЧисло = 101; (Проверка: Тонкий клиент) |
|||
32
Михаил 1С
11.04.17
✎
10:40
|
(31) Нуу, я чуть не так написал по синтаксису, сделай так, как пишет (30)
#Если Клиент Тогда ... #КонецЕсли Или, если надо #Если Сервер Тогда ... #КонецЕсли |
|||
33
shpioleg
11.04.17
✎
10:40
|
(31)
|
|||
34
never_sleep
11.04.17
✎
11:25
|
да, все верно.
&НаКлиенте Перем НачальноеЧисло; &НаСервере Перем НачальноеЧисло; &НаСервере Процедура ЗапуститьНаСервере() Сообщить(НачальноеЧисло); КонецПроцедуры &НаКлиенте Процедура Запустить(Команда) Сообщить(НачальноеЧисло); ЗапуститьНаСервере(); КонецПроцедуры #Если Клиент Тогда НачальноеЧисло = 101; #КонецЕсли #Если Сервер Тогда НачальноеЧисло = 202; #КонецЕсли ------------Вывод----------- 101 202 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |