Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Необычное поведение Выполнить() #92

Open
ComradLinch opened this issue Nov 6, 2021 · 2 comments
Open

Необычное поведение Выполнить() #92

ComradLinch opened this issue Nov 6, 2021 · 2 comments

Comments

@ComradLinch
Copy link

Столкнулся с необычным поведением метода Выполнить() в OneScript.Web. Когда использую его внутри объекта (из папки Classes), то если в коде выполнения используется вызов общего модуля, контекст выполнения кода перемещается из объекта куда-то в другое место. Т.е. после вызова обращение к переменным объекта приводит к ошибке. При этом, если вызвать любой метод заранее сохраненного в переменной объекта, контекст возвращается обратно.

Например, такой код в модуле объекта:

ПолеОбъекта = 1;
Сообщить(ТипЗнч(ЭтотОбъект));
ОбщийМодуль.КакойтоМетод();
Сообщить(ТипЗнч(ЭтотОбъект));
ПолеОбъекта = 2;

Первое сообщение выводит тип объекта, как положено, второе - "Сценарий", а на последней строке вылетает ошибка (System.IndexOutOfRangeException): Index was outside the bounds of the array.

При этом, если сделать вот так, то код работает:

ПеременнаяСОбъектом = ЭтотОбъект;
ПолеОбъекта = 1;
Сообщить(ТипЗнч(ЭтотОбъект));
ОбщийМодуль.КакойтоМетод();
ПеременнаяСОбъектом.ЛюбойМетод();
Сообщить(ТипЗнч(ЭтотОбъект));
ПолеОбъекта = 2;

Рабочий пример для OneScript.Web 0.9.1 разместил здесь, добавил два контроллера, с ошибкой и без.

@EvilBeaver
Copy link
Owner

Эти фрагменты кода выполняются через Выполнить? Не вижу, где тут Выполнить

@ComradLinch
Copy link
Author

Вот модуль объекта из примера

Перем ПолеОбъекта;

Процедура ВыполнитьСОшибкой() Экспорт
	
	КодВыполнения = "ПолеОбъекта = 1;
	|Сообщить(ТипЗнч(ЭтотОбъект));
	|ПростоМодуль.Тест();
	|Сообщить(ТипЗнч(ЭтотОбъект));
	|ПолеОбъекта = 2;";

	Выполнить(КодВыполнения);

КонецПроцедуры

Процедура ВыполнитьБезОшибки() Экспорт
	
	КодВыполнения = "ПолеОбъекта = 1;
	|О = ЭтотОбъект;
	|Сообщить(ТипЗнч(ЭтотОбъект));
	|ПростоМодуль.Тест();
	|О.ПростоМетод();
	|Сообщить(ТипЗнч(ЭтотОбъект));
	|ПолеОбъекта = 2;";

	Выполнить(КодВыполнения);

КонецПроцедуры

Процедура ПростоМетод() Экспорт
	
КонецПроцедуры

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants