Добрый день!
Подскажите, кеширует ли функция Выполнить() результат компиляции, или компиляция происходит каждый раз при вызове? Например, есть необходимость делать "макроподстановку" одинакового кода подряд несколько раз... Что будет происходить?
---
Да... наверное можно и так. Но есть вероятность что в конструкцию try-cath-finally что нибудь вкрутят в будущем, и это тоже отвалится. В общем, нужно отказываться от динамической генерации кода не смотря на то , что это иногда очень удобно.
---
а компиляции в данном случае вообще не будет.
---
Т.е кеширует?
---
https://www.about1c.ru/v83/language-reference/operators/execute-command
---
Текст--Строка--Строка, содержащая текст программы на встроенном языке
---
Вы не поняли вопрос... Но спасибо за участие в дискуссии :)
Речь вот о чем... Есть кусок кода, мне его надо выполнить н-ное количество раз через Выполнить(). Это все работает... Вопрос в том, сколько раз произойдет компиляция? Вот например в VFP такой фокус называется "макроподстановкой", и если код в макросе один и тот же, компиляция в байт-код произойдет всего лишь раз. А дальше система пользуется кешем. Вот я и спросил... 1С V8/3 так же себя ведет?
---
Выполнить это чистый интерпретатор без компиляции. Будет выполняться всегда.
---
Я вызывал исключения в коде вставив оператор Прервать. Система говорила об ошибке компиляции, а не интерпретации.
---
просто стандартное сообщение об исключении в модуле. Сам модуль компилируется.
---
нет.
---
а зачем? Есть же циклы. Т.е. ты написал, допустим, цикл, в котором сто раз вызываешь Вычислить или Выполнить. Так вот напиши цикл внутри Выполнить - и будет тебе счастье.
---
Привет Старик!
Все гораздо хуже :) , но это как всегда... Никогда такого не было... и вот опять! Одно лечим... другое калечим :)
В версии 8,3,18,1208 отвалилась возможность перейти на метку в модуле из кода, который скармливаем в функцию Выполнить(Строка)
Т.е такой фрагмент уже не работает

фрагмент кода некоего алгоритма

```1c
    Если НеСопоставлено.Количество()>0 Тогда
    Перейти ~метка;
    Иначе
    ...
    КонецЕсли;
```

Вызов из модуля

```1c
    ....
    Алгоритмы = ИсточникДанных.Алгоритмы;
    Если ПредставлениеИмпортируемогоОбъекта = "Оказание услуг в УЕ" Тогда
    Алгоритм = Алгоритмы.Найти(ПредставлениеИмпортируемогоОбъекта,"РежимРаботы").Алгоритм;
    Выполнить(Алгоритм);
    КонецЕсли;
    КонецЦикла;
    ~метка: Соединение = Неопределено;
    КонецПроцедуры
```

В документации на 8.3.18 в разделе 4.6 "Руководство разработчика" задекларировано

Примечание. Исполняемый код не может содержать в себе отдельных процедур или функций, т. к. исполнение кода само по себе идет в рамках процедуры или функции, в которой использован этот оператор. А также не может содержать явного объявления переменных. И ни слова про переход по метке.

В версии платформы 8,3,16,ХХ работало нормально. Сейчас ошибка компиляции

{<Неизвестный модуль>(217,1)}: Метка не определена в процедуре, функции или теле модуля (~метка)

PS. Все больше ностальгирую по VFP 9.0 Хоть и древний инструмент, зато работал так как записано в документации. И при смене версии с 3.0 по 9.0 ничего переделывать не нужно было. Покрасил и забыл...
---
если не в транзакции дело происходит, то можно сделать через перехват исключения, вместо метки написать ВызватьИсключение
---
Да... наверное можно и так. Но есть вероятность что в конструкцию try-cath-finally что нибудь вкрутят в будущем, и это тоже отвалится. В общем, нужно отказываться от динамической генерации кода не смотря на то , что это иногда очень удобно.
---
Сейчас экспериментировал с замерами производительности. И пришёл к странным результатам – что-то кэширует, что-то нет.
---
закройте конфигуратор для теста.
---
Да, не кэшируется. Дело было не в конфигураторе. Имя переменной итератора было одинаковым в коде, который я отправлял в метод Выполнить и в коде, которым я осуществлял повторения.
---
просто еще отладчик конфигуратора вносит свои правила.