Имя: Пароль:
1C
1С v8
Области видимости переменных
,
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)

#Если Клиент Тогда
НачальноеЧисло = 101;
#КонецЕсли
34 never_sleep
 
11.04.17
11:25
да, все верно.
&НаКлиенте
Перем НачальноеЧисло;
&НаСервере
Перем НачальноеЧисло;

&НаСервере
Процедура ЗапуститьНаСервере()
    Сообщить(НачальноеЧисло);
КонецПроцедуры
    

&НаКлиенте
Процедура Запустить(Команда)
    Сообщить(НачальноеЧисло);
    ЗапуститьНаСервере();
КонецПроцедуры

#Если Клиент Тогда
    НачальноеЧисло = 101;
#КонецЕсли

#Если Сервер Тогда
    НачальноеЧисло = 202;
#КонецЕсли

------------Вывод-----------
101
202