|   |   | 
| 
 | Выполнить. Весь мозг поломал | ☑ | ||
|---|---|---|---|---|
| 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) а блин - до конца не досмотрел )     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |