OneScript.Web icon indicating copy to clipboard operation
OneScript.Web copied to clipboard

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

Open ComradLinch opened this issue 4 years ago • 2 comments

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

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

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

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

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

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

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

ComradLinch avatar Nov 06 '21 22:11 ComradLinch

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

EvilBeaver avatar Nov 08 '21 06:11 EvilBeaver

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

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

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

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

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

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

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

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

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

ComradLinch avatar Nov 08 '21 06:11 ComradLinch