Имя: Пароль:
1C
 
Вычислить() с программно созданными реквизитами
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
Всем спасибо. Это фича.
Будем менять на Этаформа[Реквизит]