OneScript icon indicating copy to clipboard operation
OneScript copied to clipboard

Несовместимое поведение Выполнить, закрепленное в тестах eval

Open EvilBeaver opened this issue 1 year ago • 9 comments

Существующий тест eval https://github.com/EvilBeaver/OneScript/blob/develop/tests/eval.os#L270 описывает поведение, которое не поддерживается в 1С. И судя по тесту, он тестирует не очень хорошую особенность работы ВМ 1Скрипт, исправляемую в рамках #1000 и #268

image

1C работает логично и не выполняет данный код из теста eval

EvilBeaver avatar Jun 01 '24 21:06 EvilBeaver

Reopen, всё хуже.

Процедура Вторая(Пар)	        
	Выполнить "сообщить(ТипЗнч(Рез)); Лок = Пар + 1;";
КонецПроцедуры

Процедура ТестДолжен_ПроверитьВложенныеВызовыВыполнить()
	Рез = 1;
	Выполнить "сообщить(ТипЗнч(Рез)); Вторая(2);";
КонецПроцедуры

ТестДолжен_ПроверитьВложенныеВызовыВыполнить()

OneScript после внесенных исправлений: Число {Модуль {}:2: / Ошибка в строке: 1,17 / Неизвестный символ: Рез} что ожидаемо. Теперь 1С: Число Не определено т. е. переменная Рез при вложенном вызове в контексте Выполнить существует, но имеет значение Неопределено

Mr-Rm avatar Jun 03 '24 18:06 Mr-Rm

А может ну его нафиг? На лицо протекание области видимости переменной, причём ничем не обоснованное

nixel2007 avatar Jun 03 '24 20:06 nixel2007

Ну дык я это и спилил

EvilBeaver avatar Jun 04 '24 09:06 EvilBeaver

т. е. переменная Рез при вложенном вызове в контексте Выполнить существует, но имеет значение Неопределено

Так было всегда испокон в 1Скрипте и это не про Выполнить, а вообще про разные моменты инициализации переменных

А = А + 1; // Приведение к типу Число невозможно

1Скрипт

А = А + 1; // Неизвестный символ А

P.S.

Посмотрел повнимательнее, кажется, надо лучше изучить поведение 1С. То, что раньше у нас было, как у них - это чистая случайность.

EvilBeaver avatar Jun 04 '24 09:06 EvilBeaver

Переоткрыл по причине: "Надо изучить доскональнее поведение 1С"

EvilBeaver avatar Jun 04 '24 09:06 EvilBeaver

Итак, поиск странностей. Проверялось в Onescript v1.9.1 latest, v2-rc3 develop, 1С v8.3.2.1286; модули содержит только показанные фрагменты кода.

// обращение к переменной _как бы_ до объявления.
Выполнить "Сообщить(""ТП:""+ТипЗнч(ТП)+""=""+ТП);";
ТП = -10;

ТП:Неопределено= у всех. В общем, объяснимо.

Mr-Rm avatar Jun 05 '24 11:06 Mr-Rm

А вот это работает только в 1С:

// проброс переменной модуля внутрь процедуры и её возврат 
Процедура Проброс()
	ТП2 = 2;
	Выполнить "сообщить(""<ТП=""+ТП+"":""+ТипЗнч(ТП));" // Onescript падает здесь
	" ТП2 = ТП+1; ТП = ложь;"
	" сообщить("">ТП=""+ТП+"":""+ТипЗнч(ТП));";
	сообщить("локальная ТП2="+ТП2+":"+ТипЗнч(ТП2));
КонецПроцедуры

ТП = -9;
Проброс();
Выполнить "сообщить(""после вызова ТП=""+ТП+"":""+ТипЗнч(ТП));";

<ТП=-9:Число >ТП=Нет:Булево локальная ТП2=-8:Число после вызова ТП=Нет:Булево

Mr-Rm avatar Jun 05 '24 11:06 Mr-Rm

(опуская примеры, краткий вывод) В 1С в контексте Выполнить на любом уровне доступны переменные модуля, как глобальные, так и собственные, если они не перекрыты локальными переменными или параметрами текущей процедуры.

Mr-Rm avatar Jun 05 '24 12:06 Mr-Rm

@Mr-Rm спасибо за анализ!

EvilBeaver avatar Jun 06 '24 13:06 EvilBeaver