Имя: Пароль:
1C
 
Выполнить. Весь мозг поломал
0 quest
 
29.04.10
21:37
Процедура КнопкаВыполнитьНажатие(Кнопка)
// Вставить содержимое обработчика.

~метка:

часть1 = "~метка: ф = 1 ";
часть2 = " Выполнить(часть1); ф=3; перейти ~метка; вызватьисключение ""Ерор"";" ;
//

ф = 1;
Сообщить("Перед часть 1 - "+ф);
Выполнить(часть1);
Сообщить("После часть 1 - "+ф);
ф = 3;
Сообщить("Перед часть 2 - "+ф);
выполнить(часть2);
Сообщить("после часть 2 - "+ф);

КонецПроцедуры

Почему не переходит на метку? ни на реально существующую ни на определенную в выполнить до этого? почему не ругается на создание метки в часть1? почему не доходит до вызова исключения? Какое  окружение у выполнить?
1 quest
 
29.04.10
21:38
часть1 = "~метка: ф = 2 ";

сори. не с того сырца скопировал
2 nop
 
29.04.10
21:38
метки - это зло
3 quest
 
29.04.10
21:40
(2) знаю. Но вопрос не в этом. Вопрос в окружении Выполнить(). Откуда появляется, куда девается.
4 zak555
 
29.04.10
21:43
метка зачем ?
5 zak555
 
29.04.10
21:43
упс
6 nop
 
29.04.10
21:45
(3) у меня много чего работает с выполнить. Опредененные в нем переменные нормально работают. Возмножно просто дело в препроцессоре. Возможно он метки определяет 1 раз, при считывании модуля и все
7 ОбычныйЧеловек
 
29.04.10
21:46
>>Какое  окружение у выполнить?
все что внутри твоей процедуры.

Р.S.  Стаж: 4 г. 5 мес. - какие нафиг метки?!
8 quest
 
29.04.10
21:48
Тогда вопрос поставим так - при выполнении части2 куда уходит выполнение если
1. Не вызывается исключение.
2. Куда передается управление командой перейти ~метка

Как работает перейти в Выполнить?

(6) Да знаю я что работает Выполнить. Вопрос - почему в такой ситуации работает как описано работает как-то странно

(7) Обыкновенные.

Что бы закрыть вопрос про использование перейти и меток - если выгодно их использовать - буду использовать. В данном случае - просто тестовая обработка для проверки поведения инструкции выполнить.
9 nop
 
29.04.10
21:50
(8) потому что 1С
10 ОбычныйЧеловек
 
29.04.10
21:55
Зачем внутри "Выполнить" еще одно "выполнить"?! это не код - это какое то издевательство над здравым смыслом..а что касается меток - то просто нет слов..
11 quest
 
29.04.10
21:59
(10) Класный ответ. Все прояснил. Клянусь больше никогда не использовать метки и выполнить
12 ОбычныйЧеловек
 
29.04.10
22:01
(11) "Выполнить" - удобная штука, порой без нее как без рук, но метки ...
13 ОбычныйЧеловек
 
29.04.10
22:02
(11) давай лучше реальный пример
14 quest
 
29.04.10
22:06
ну нет реального примера. Есть то что написано в 0. В виде эксперимента.
Хочу понять почему нет зацикливания. при втором выполнить. Почему нет исключения при втором выполнить. Что внутри выполнить происходит в этот момент? Почему в области видимости функции не появляется переменная ф после первого выполнить (при условии что убрать определени ф в 5 строке. Основной вопрос - какое контекст у выполнить? у выполнить в выполнить?
15 ОбычныйЧеловек
 
29.04.10
22:10
(14) Контекст в "выполнить" такой же как и в обычной процедуре (т.е. контекст самой процедуры + глабальные переменные и общие модули экспортные разумеется), какой контекст в "выполнить_Выполнить" одному богу известно, я не представляю ситуации в которой может понадобится "Выполнить_Выполнить", сам в выполнить делал практически все что в обычной процедуре когда в этом была необходимость.
16 quest
 
29.04.10
22:12
куда деются переменные которые явно объявляются в коде выполнить? например

выполнить("ф=1");
выполнить("сообщить(ф)");
не работает. Хотя контекст функции сохранен
17 nop
 
29.04.10
22:12
(15) разве в выполнить нельзя определить переменную, и после выполнить её использовать?
18 quest
 
29.04.10
22:13
(17) в том то и дело что нет
выполнить("ф=1");
сообщить(ф);

не про1дет синтаксический контроль
19 ОбычныйЧеловек
 
29.04.10
22:14
(17) нет нельзя
20 ОбычныйЧеловек
 
29.04.10
22:17
если хочется что-то определить в "выполнить" то лучше делать это примерно так:

СтруктураПараметров=Новый Структура;

Выполнить("СтруктураПараметров.Добавить("МояНоваяПеремення", "150")");

МояНоваяПеремення=СписокПараметров.МояНоваяПеремення;
21 ОбычныйЧеловек
 
29.04.10
22:18
(16) >>куда деются переменные которые явно объявляются в коде выполнить? например
в никуда исчезают... нельзя так делать.
22 nop
 
29.04.10
22:18
а, я думал что можно почему то. Тогда и с меткой понятно что не работает
23 xoma1c
 
29.04.10
22:18
В книжке С.А. Митичкина стр. 68 пишется - "С помощью оператора Перейти можно передавать управление в пределах процедуры\функции или в пределах раздела основной программы модуля. ...Рекомендуется применять метки только для перехода в конец цикла или процедуры".
24 quest
 
29.04.10
22:19
(22) почему? мне не понятно.
и заодно тогда почему это не работает

   
   ~метка:
   
   ф = 1;
   
   если ф = 1 тогда
       ф = 2;
   иначе
       ф = 1;
   конецЕсли;
   
   сообщить("Сперва - "+ф);
   если ф = 1 тогда
       выполнить("перейти ~метка;")
   конецЕсли;
   сообщить("После "+ф);
   


(23) а чем в выполнить не область одной функции?
25 quest
 
29.04.10
22:20
если ф = 2 тогда
       выполнить("перейти ~метка;")
   конецЕсли;
26 nop
 
29.04.10
22:20
1с ещё долго будет учиться тому что придумано десятки лед назад, например #include
27 ОбычныйЧеловек
 
29.04.10
22:23
(quest) вот объясни почему именно метки?  ведь без них ну просто на порядок проще и понятнее писАть, метка и в 7ке то считалась вымершим оператором в уж зачем ее в 8ке затащи вообще не понятно.
28 nop
 
29.04.10
22:25
(27) правильно писать @ quest без пробела, вот quest
29 quest
 
29.04.10
22:37
просто именно на метках выполнить работает именно так как не ожидал. Ведь если контекст функции сохраняется то должен был передать управление на метку. Либо ту что определил сам в начале функции. Либо на ту что определяется в выполнить во второй раз. Но нитого ни другого не произошло. Как работает передача управления в выполнить?
30 ОбычныйЧеловек
 
29.04.10
22:41
(29) через переменную вне выполнить, внутри выполнить установи значение внешней переменной и уже после выхода из "выполнить" воспользуйся ее значеним
31 quest
 
29.04.10
22:44
мне не значение переменной менять надо!!!! мне перейти надо! перейти на метку которая создана в другой выполнить. Перейти на метку которая определена в функции. В конце концов увидеть исключение. Хоть что нибудь.
32 ОбычныйЧеловек
 
29.04.10
22:46
(31) >>перейти на метку которая создана в другой выполнить
вот этого ты точно не сделаешь.
33 Andry888
 
29.04.10
22:47
В (18) не совсем прав, вот так работает:

выполнить("ф=1; сообщить(ф);");
ф=ф+1;
сообщить(ф);
34 Andry888
 
29.04.10
22:48
+(33) хитрое объявление переменной:
выполнить("ф=1;");
ф=ф;
35 nop
 
29.04.10
22:49
(33) то есть переменная сохраняется после её использования? а если заменить Сообщить на х=ф+0 ?
36 ОбычныйЧеловек
 
29.04.10
22:49
делай как нить так тогда:

ИмяМетки="";
выполнить("ИмяМетки="метка1"");
Если ИмяМетки="метка1" Тогда
Перейти ~метка1
ИначеЕсли ИмяМетки="метка2" Тогда
Перейти ~метка2

и т.д.
37 quest
 
29.04.10
22:50
(33) а вот не знал. Спасибо!
38 ice777
 
29.04.10
22:51
GOTO - это зло. Старый и известный прогосрач.)

Но это зло. Есть куча операторов, заменяющих переход по меткам.
39 nop
 
29.04.10
22:52
(37) но это же сообщить() сам понимаешь Сервер и все такое ...
40 quest
 
29.04.10
22:52
(32) почему?
И почему тогда раз нельзя перейти не вызывается исключение?
часть2 = " Выполнить(часть1); ф=3; перейти ~метка; вызватьисключение ""Ерор"";" ;
куда передается управление?
41 Andry888
 
29.04.10
22:54
(39) Причем тут "сообщить" ... оно тут для наглядности...
42 ОбычныйЧеловек
 
29.04.10
22:56
(40) "Выполнить" очень специфичная вещь, в ней нельзя делать "возврат" например, куда передается управление при "перейти" - ненаю, проверять надо..сам никогда в жизни метками не пользовался поэтому мне сложно понять логику их использования.
43 quest
 
29.04.10
23:02
в выполнить перейти офигенно специфична.
Возможно такое
текст2 = "попытка
|    сообщить(""До перехода"");
|    перейти ~метка;
|    сообщить(""После перехода"");
|исключение
|    ~метка:
|    сообщить(ОписаниеОшибки());
|    ВызватьИсключение ; конецпопытки;";

выполнить(текст2);
коректно вызовет исключение и попытается прочесть описание ошибки...
44 Andry888
 
29.04.10
23:06
(43) Исключение не вызывается а переход по метке срабатывает... че удивительного то?
45 Andry888
 
29.04.10
23:08
(43) Просто переход по метке ограничен по области действия. Область в "выполнить" своя особонная, НО "своя" поэтому в другую область управление передать нельзя тчк
46 quest
 
29.04.10
23:12
получается что при таком
выполнить("ф=1; сообщить(ф);");
ф=ф+1;
сообщить(ф);

происходит резервирование адреса а выполнить просто инициализирует переменную. То есть место под нее уже есть. куда писать значение платформа знает. А с метками просто забывает их по итогу выполнения? верно понял?
47 quest
 
29.04.10
23:19
и кстати, если код из (43) попытаться вне выполнить сделать, то есть просто попытаться сохранить в чистом виде в обработке то выдается ошибка.
Получается что интерпретация кода в выполнить() происходит с какими-то допущениями?
48 Andry888
 
29.04.10
23:21
(46) "Выполнить" вещица так сказать в себе, я ее понимаю так: на входе она получает контекст, а на выходе дополняет контекст тогого контекста из которого эта "выполнить" вызывалась, НО повторюсь на этапе выполнения команд содержащихся в "выполнить" она выполняется в своем (пусть и в дублированном) конт-те соответственно перейти не срабатывает.

Единственное, почему не вызывается ошибка при необявленой метке текст "перейти" непонятно... Я так думаю, что перейти срабатывает, НО куда она переходит загадка...)
49 quest
 
29.04.10
23:27
я так думаю - вызывается исключение в интерпретаторе но оно не транслируется дальше выполняемому коду. Просто тупо прерывается выполнение кода. и у каждого выполнить свой контекст. который не виден после окончания интерпритации кода.
50 quest
 
29.04.10
23:29
млять. И чего только в голову не придет. Лишь бы не работать :)
51 nop
 
29.04.10
23:30
пойдемте v8: Как добраться до реквизита документа извне? там прикольнее. Там автор сделал 365 реквизитов документу, и продублировал то же в регистре. Мы должны узнать "зачем" !! Есть картинки
52 Andry888
 
29.04.10
23:38
(49) Не думаю, что исключение, ведь (43) работает...
53 quest
 
29.04.10
23:44
в (43) метка определена тут же в блоке выполнить. Найти ее можно. вообще если метка определена в тексте - ходит по ней нормально. Хуже если метки нет. На операторе перейти прервается выполнение. И такая конструкция тоже не работатет

текст = "
| w = 0;
|для х = 1 по 10 цикл
| сообщить(""х -""+х);
|~метка:
|конеццикла;
| Х = 1;
| если w = 0 тогда w = 1;
|перейти ~метка; конецЕсли;
|Сообщить(""1"")";
выполнить(текст);

вешает платформу :)
54 Andry888
 
30.04.10
00:04
(53) Переход выполняется, тока вызывает ошибку (т.к. передали управление в тело цикла). Т.е. в "выполнить" не производится должный синтаксический контроль...
55 quest
 
30.04.10
00:11
х = 2;                
текст = "
| w = 0;
| сообщить(""х перед- ""+х);
|пока  х = 1 цикл
| сообщить(""х - ""+х);
| х = 2;
|~метка:
|конецЦикла;
| х = 1;
| если w = 0 тогда w = 1; сообщить(""поперлись"");
|перейти ~метка; конецЕсли;
|Сообщить(""Выполнили"")";
выполнить(текст);

сообщить(" х = "+х);


текст = "
| w = 0;
| сообщить(""х перед- ""+х);
|пока  истина цикл
| х = 2;
| сообщить(""х внутри - ""+х);
| перейти ~метка;
|конецЦикла;
|~метка:
| х = 1;
|Сообщить(""Выполнили"")";
выполнить(текст);

сообщить(" х = "+х);

это работает.

получается что платформа при сохранении анализирует метки и их расположение. Не при выполнении.
56 Ненавижу 1С
 
гуру
30.04.10
10:59
57 quest
 
30.04.10
11:01
(56) Опоздал. Ночью таких тем с этим перейти напридумывал.... Не покидает идея попасть в другое выполнить. То есть сохранить контекст.
58 Aprobator
 
30.04.10
11:09
(43) про ВызватьИсключение в курсе?
59 Aprobator
 
30.04.10
11:10
+(58) а блин - до конца не досмотрел )