OneScript
OneScript copied to clipboard
Несовместимое поведение Выполнить, закрепленное в тестах eval
Существующий тест eval https://github.com/EvilBeaver/OneScript/blob/develop/tests/eval.os#L270 описывает поведение, которое не поддерживается в 1С. И судя по тесту, он тестирует не очень хорошую особенность работы ВМ 1Скрипт, исправляемую в рамках #1000 и #268
1C работает логично и не выполняет данный код из теста eval
Reopen, всё хуже.
Процедура Вторая(Пар)
Выполнить "сообщить(ТипЗнч(Рез)); Лок = Пар + 1;";
КонецПроцедуры
Процедура ТестДолжен_ПроверитьВложенныеВызовыВыполнить()
Рез = 1;
Выполнить "сообщить(ТипЗнч(Рез)); Вторая(2);";
КонецПроцедуры
ТестДолжен_ПроверитьВложенныеВызовыВыполнить()
OneScript после внесенных исправлений:
Число
{Модуль {Рез при вложенном вызове в контексте Выполнить существует, но имеет значение Неопределено
А может ну его нафиг? На лицо протекание области видимости переменной, причём ничем не обоснованное
Ну дык я это и спилил
т. е. переменная Рез при вложенном вызове в контексте Выполнить существует, но имеет значение Неопределено
Так было всегда испокон в 1Скрипте и это не про Выполнить, а вообще про разные моменты инициализации переменных
1С
А = А + 1; // Приведение к типу Число невозможно
1Скрипт
А = А + 1; // Неизвестный символ А
P.S.
Посмотрел повнимательнее, кажется, надо лучше изучить поведение 1С. То, что раньше у нас было, как у них - это чистая случайность.
Переоткрыл по причине: "Надо изучить доскональнее поведение 1С"
Итак, поиск странностей. Проверялось в Onescript v1.9.1 latest, v2-rc3 develop, 1С v8.3.2.1286; модули содержит только показанные фрагменты кода.
// обращение к переменной _как бы_ до объявления.
Выполнить "Сообщить(""ТП:""+ТипЗнч(ТП)+""=""+ТП);";
ТП = -10;
ТП:Неопределено= у всех. В общем, объяснимо.
А вот это работает только в 1С:
// проброс переменной модуля внутрь процедуры и её возврат
Процедура Проброс()
ТП2 = 2;
Выполнить "сообщить(""<ТП=""+ТП+"":""+ТипЗнч(ТП));" // Onescript падает здесь
" ТП2 = ТП+1; ТП = ложь;"
" сообщить("">ТП=""+ТП+"":""+ТипЗнч(ТП));";
сообщить("локальная ТП2="+ТП2+":"+ТипЗнч(ТП2));
КонецПроцедуры
ТП = -9;
Проброс();
Выполнить "сообщить(""после вызова ТП=""+ТП+"":""+ТипЗнч(ТП));";
<ТП=-9:Число >ТП=Нет:Булево локальная ТП2=-8:Число после вызова ТП=Нет:Булево
(опуская примеры, краткий вывод)
В 1С в контексте Выполнить на любом уровне доступны переменные модуля, как глобальные, так и собственные, если они не перекрыты локальными переменными или параметрами текущей процедуры.
@Mr-Rm спасибо за анализ!