![]() |
![]() |
![]() |
|
Выполнить. Весь мозг поломал | ☑ | ||
---|---|---|---|---|
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
|
Вывод сделан v8: Выполнить() и кривой код
|
|||
57
quest
30.04.10
✎
11:01
|
(56) Опоздал. Ночью таких тем с этим перейти напридумывал.... Не покидает идея попасть в другое выполнить. То есть сохранить контекст.
|
|||
58
Aprobator
30.04.10
✎
11:09
|
(43) про ВызватьИсключение в курсе?
|
|||
59
Aprobator
30.04.10
✎
11:10
|
+(58) а блин - до конца не досмотрел )
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |