Вход | Регистрация


1С:Предприятие ::

Метки: 

Области видимости переменных

Я
   never_sleep
 
11.04.17 - 09:08
Нууу очень тупой вопрос. Есть внешняя обработка.
Структура модуля такая:

Перем ФайлПрочитан;

Процедура1()
.....
КонецПроцедуры;

Процедура2()
....
КонецПроцедуры;

ФайлПрочитан = Ложь;

Если в любой из процедур обратиться к переменной, то получаю ошибку.
Как объявить общую для процедур модуля переменную? Ну реально, везде же написано, что в начале модуля просто её прописываю и все. почему не арбайтен?
 
 
   aka AMIGO
 
1 - 11.04.17 - 09:10
Если клиент - работает. Если сервер - не работает.
   never_sleep
 
2 - 11.04.17 - 09:11
(1) ну там есть серверные вызовы, но вся логика этой переменной только на клиенте. т.е. в моем "листинге" Процедура1/2 - на клиенте. Там есть серверные, но в них эта переменная не используется.
   Рэйв
 
3 - 11.04.17 - 09:13
(2)
&НаКлиенте
Перем ФайлПрочитан;


а на сервер передавать параметром можно
   Рэйв
 
4 - 11.04.17 - 09:14
+(3)Или делай ее реквизитом формы.Через контекст оно и там и там будет видно
   Serg_1960
 
5 - 11.04.17 - 09:20
ТС, используй явно директивы компиляция. Имхо, использование значений "по умолчанию" оно, конечно, облегчает написание... но лучше будет, если везде ясно и чётко указывать что где работает.
   Рэйв
 
6 - 11.04.17 - 09:22
(5)Если мне не изменяет склероз, без явного указания код работает на сервере вроде
   never_sleep
 
7 - 11.04.17 - 09:23
(3) Вон че. Для переменных тоже нужно контекст указывать. В очередной рад спасибо, Рейв.
   never_sleep
 
8 - 11.04.17 - 09:23
(6) да, вот только что глянул. по умолчанию директива НаСервере
   never_sleep
 
9 - 11.04.17 - 09:26
(5) Если честно не знал, что переменные тоже на серверные и клиентские делятся ( Хотя, конечно, это логично.
   Serg_1960
 
10 - 11.04.17 - 09:28
(6) Если процедуры не видят переменную, то в алгоритме таки есть директивы. Просто автор нам их не озвучил. Умолчал :)
 
  Рекламное место пустует
   never_sleep
 
11 - 11.04.17 - 09:32
Вопрос еще один.
В самом конце этого "листинга" идет инициализация ФайлПрочитан = Ложь; 
Он где исполняется?
сейчас проверил 1Ска не ругшается если в самом начале модуля объявить так:
&НаКлиенте
Перем ФайлПрочитан;
&НаСервере
Перем ФайлПрочитан;
Если в конце модуля пропишу ФайлПрочитан = Ложь; Какую переменную он инициализирует?
   Рэйв
 
12 - 11.04.17 - 09:32
(11)Проверь.
   1dvd
 
13 - 11.04.17 - 09:33
(11) Если директив нет, то по-умолчанию
   never_sleep
 
14 - 11.04.17 - 09:35
(12) Вот и проверю)
   aka AMIGO
 
15 - 11.04.17 - 09:40
(14) И сообщи результат сюда..
Наверняка многие уже споткнулись на этом
   never_sleep
 
16 - 11.04.17 - 09:42
(15) Да тут дичь какая-то) Ща сам с мыслями соберусь)
   Михаил 1С
 
17 - 11.04.17 - 09:46
(16) Сделай тест:
создай новую переменную - ТестПрисвоения (также глобальную переменную для всего модуля), при ее объявлении напиши &НаКлиенте.

Потом в конце напиши текст

ТестПрисвоения = "Неизвестно где";

&НаКлиенте
ТестПрисвоения = "На Клиенте";

Ну а в одной из своих клиентских процедур сделай вывод значения на экран:
Сообщить(ТестПрисвоения);
   never_sleep
 
18 - 11.04.17 - 09:51
Короче, написал примерно такой код:

&НаКлиенте
Перем НачальноеЧисло;
&НаСервере
Перем НачальноеЧисло;

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

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

НачальноеЧисло = 101;

Думал, что результат будет примерно таким:
101
Неопределено (или 0, хз как 1С по умолчанию инициализирует)
А вышло:
101
101
   never_sleep
 
19 - 11.04.17 - 09:52
Процедура2 на сервере, опечатался. И вызывается она из первой.
   never_sleep
 
20 - 11.04.17 - 09:55
еще забавное:
http://s010.radikal.ru/i312/1704/e1/dcf351a84d3e.png
И так везде, в том числе в процедурах, как в серверных так в клиентских. Хотя не думаю, что разница есть какую выбрать. Хотя кто его знает, что там у 1С в голове)
   Михаил 1С
 
21 - 11.04.17 - 09:57
(20) Нуу, просто, видимо, код "основной программы" вызывается два раза - сначала на сервере, потом на клиенте. И все тут.
   Михаил 1С
 
22 - 11.04.17 - 09:59
(21) Но ты лучше точно напиши директивы компилятора, чтобы не запутаться.
ПС: и 1С может однажды изменить платформу, и окажется, что этот код будет запускаться только на сервере, или только на клиенте, если нет директив.
   Любопытная
 
23 - 11.04.17 - 10:00
Зачем ты разные переменные называешь одинаково? Сам себя запутал.
   Михаил 1С
 
24 - 11.04.17 - 10:01
(23) Он тестирует платформу
   Любопытная
 
25 - 11.04.17 - 10:09
(18) Какая из процедур срабатывает первой? Серверная или клиентская?
   never_sleep
 
26 - 11.04.17 - 10:16
(21) Кстати, да. Это бы все объяснило. Но тогда отдельно инициализировать серверную и клиентскую процедуру не получится, если они имеют одинаковое имя (директивы ведь в "основной программе" писать нельзя?). Правда, кто в здравом уме будет такое использовать.
   never_sleep
 
27 - 11.04.17 - 10:16
(25) Сначала клиент, потом из неё сервер.
   Михаил 1С
 
28 - 11.04.17 - 10:19
(26) Не понятно - чего там где инициализируется?
И почему директивы писать нельзя, когда можно?
   never_sleep
 
29 - 11.04.17 - 10:20
(28) ну я в (17) у вас глянул, что можно. Ща попробую ваш тест запустить.
   shpioleg
 
30 - 11.04.17 - 10:22
Код основной программы будет исполняться на сервере при каждом контекстном вызове.
Сделай
#Если Клиент Тогда
   never_sleep
 
31 - 11.04.17 - 10:24
(28) А вот фига. Не дает писать директивы в "основной программе"
&НаКлиенте
Перем НачальноеЧисло;
&НаСервере
Перем НачальноеЧисло;

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

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

&НаКлиенте
НачальноеЧисло = 101;
&НаСервере
НачальноеЧисло = 202;


Ругается 
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(19,1)}: Ожидается определение процедуры/функции
<<?>>НачальноеЧисло = 101; (Проверка: Сервер)
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(19,1)}: Ожидается определение процедуры/функции
<<?>>НачальноеЧисло = 101; (Проверка: Тонкий клиент)
   Михаил 1С
 
32 - 11.04.17 - 10:40
(31) Нуу, я чуть не так написал по синтаксису, сделай так, как пишет (30)

#Если Клиент Тогда
...
#КонецЕсли

Или, если надо

#Если Сервер Тогда
...
#КонецЕсли
   shpioleg
 
33 - 11.04.17 - 10:40
(31)
#Если Клиент Тогда

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

 
  Рекламное место пустует
   never_sleep
 
34 - 11.04.17 - 11:25
да, все верно.
&НаКлиенте
Перем НачальноеЧисло;
&НаСервере
Перем НачальноеЧисло;

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

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

#Если Клиент Тогда 

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


#Если Сервер Тогда 

    НачальноеЧисло = 202;
#КонецЕсли


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



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