|  | Вычислить() с программно созданными реквизитами | ☑ | 
    
        | 0
    
        Efimoff   31.08.23✎ 08:54 | 
        Раньше на форме был заведен реквизит S.
Расчет функции проходил нормально Результат = Вычислить("S*1.5")
 Решил создать на форме реквизит S программно. Старый удалил
 Пытаюсь рассчитать строку Вычислить("S*1.5").
 Программа ругается {<Неизвестный модуль>(1,2)}: Переменная не определена (S)
 Если в Вычислить указать Вычислить("ЭтаФорма.S*1.5"), то считает нормально.
 Это баг или фича?
 Платформа 1С:Предприятие 8.3 (8.3.23.1865)
 |  | 
    
        | 1
    
        НафНаф   31.08.23✎ 09:14 | 
        (0) багофича, прими как должное     |  | 
    
        | 2
    
        Chai Nic   31.08.23✎ 09:23 | 
        Что-нибудь наоптимизировали, в результате функции Вычислить передается не реальный контекст, а какой-то его кэш     |  | 
    
        | 3
    
        RomanYS   31.08.23✎ 09:28 | 
        (2) проблема не в вычислить(). Просто в коде вероятно получишь туже ошибку и скорее всего еще во время компиляции формы. 
(1) +1
 |  | 
    
        | 4
    
        Efimoff   31.08.23✎ 09:30 | 
        (3) В коде рассчитывает правильно.
Если бы была ошибка, то конструкция Вычислить("ЭтаФорма.S*1.5") тоже бы падала. А она работает зараза!
 |  | 
    
        | 5
    
        Donkey_hot   31.08.23✎ 09:32 | 
        (0) Всегда использую для программно созданных ЭтаФорма[ИмяРеквизита]     |  | 
    
        | 6
    
        НафНаф   31.08.23✎ 09:35 | 
        Почему через ЭтыФорма? Логика простая, допустим это необязательно
Ну смотри, вот ты пишешь:
 А = 42;
 и теперь выходит как? Если программно создали реквизит А , то это обращение к нему, а если не создали - то это локальная переменная. А узнать это мы можем только в ран-тайм. Поэтому решили не заморачиваться с таким. И поэтому же нельзя удалить реквизиты, созданные "интерактивно на форме"
 |  | 
    
        | 7
    
        RomanYS   31.08.23✎ 09:39 | 
        (4) проверил в коде, как и ожидал ошибка:
 Ошибка инициализации модуля: ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма
 по причине:
 {ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(7,11)}: Переменная не определена (S)
 Рез = ""+<<?>>S;
 [ОшибкаКомпиляцииВстроенногоЯзыка]
 
 &НаСервере
 Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
 Мас = Новый Массив;
 Мас.Добавить(Новый РеквизитФормы("S", Новый ОписаниеТипов("Строка")));
 ИзменитьРеквизиты(Мас);
 Рез = ""+S;
 КонецПроцедуры
 |  | 
    
        | 8
    
        Efimoff   31.08.23✎ 09:48 | 
        Всем спасибо. Это фича.
Будем менять на Этаформа[Реквизит]
 |  | 
        Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший