OneScript icon indicating copy to clipboard operation
OneScript copied to clipboard

Поведение 1С и OneScript значительно отличаются при работе с Native API компонентой

Open Sebekerga opened this issue 2 years ago • 2 comments

Опишите ошибку Хочу использовать OneScript как инструмент интеграционного тестирования библиотеки для Native API. Однако при первых попытках видно различие в работе 1С и OneSscript.

Пример фрагмента кода, где ПутьКомпоненты - путь к собранному .dll x64:

Если НЕ ПодключитьВнешнююКомпоненту(ПутьКомпоненты, "Test", ТипВнешнейКомпоненты.Native) Тогда
    ВызватьИсключение("Не удалось подключить");
Иначе
	Сообщить("Компонента успешно подключена");
КонецЕсли;
ИмяКомпоненты = "AddIn.Test.TestAddIn";
ОбъектКомпоненты = Новый(ИмяКомпоненты);

ВходнаяПеременная = "var";
ВыходнаяПеременная = "";
Результат = ОбъектКомпоненты.ПреобразоватьСтроку(ВходнаяПеременная, ВыходнаяПеременная);
Сообщить(СтрШаблон("для ""%1"" %2 результат: ""%3"" (Тип %4)", ВходнаяПеременная, ?(Результат, "успешный", "ошибочный"), ВыходнаяПеременная, ТипЗнч(ВыходнаяПеременная)));

ВходнаяПеременная = 1;
ВыходнаяПеременная = 0;
Результат = ОбъектКомпоненты.ПреобразоватьЦелое(ВходнаяПеременная, ВыходнаяПеременная);
Сообщить(СтрШаблон("для ""%1"" %2 результат: ""%3"" (Тип %4)", ВходнаяПеременная, ?(Результат, "успешный", "ошибочный"), ВыходнаяПеременная, ТипЗнч(ВыходнаяПеременная)));

ВходнаяПеременная = 1.1;
ВыходнаяПеременная = 0;
Результат = ОбъектКомпоненты.ПреобразоватьВещественное(ВходнаяПеременная, ВыходнаяПеременная);
Сообщить(СтрШаблон("для ""%1"" %2 результат: ""%3"" (Тип %4)", ВходнаяПеременная, ?(Результат, "успешный", "ошибочный"), ВыходнаяПеременная, ТипЗнч(ВыходнаяПеременная)));

ВходнаяПеременная = Истина;
ВыходнаяПеременная = Истина;
Результат = ОбъектКомпоненты.ПреобразоватьБулево(ВходнаяПеременная, ВыходнаяПеременная);
Сообщить(СтрШаблон("для ""%1"" %2 результат: ""%3"" (Тип %4)", ВходнаяПеременная, ?(Результат, "успешный", "ошибочный"), ВыходнаяПеременная, ТипЗнч(ВыходнаяПеременная)));

Данный код работает в 1С, выдавая следующее:

Компонента успешно подключена для "var" успешный результат: "Hello, "var"!" (Тип Строка) для "1" успешный результат: "2" (Тип Число) для "1.1" успешный результат: "2.2" (Тип Число) для "Да" успешный результат: "Нет" (Тип Булево)

OneScript выдает ошибку:

Конструктор не найден (AddIn.Test.TestAddIn)

Причину ошибки смог выяснить: Компонента в функции GetClassObject не использует непосредственные наименования классов, а сокращенные алиасы, н.п. 1, 2 и т.д. Поняв это, я смог обойти ошибку, заменив код инициализации компоненты на следющий:

ИмяКомпоненты = "AddIn.Test.1";
ОбъектКомпоненты = Новый(ИмяКомпоненты);

После чего код запускается, однако результат не соответствует ожидаемому:

Компонента успешно подключена для "var" успешный результат: "" (Тип Строка) для "1" успешный результат: "0" (Тип Число) для "1.1" успешный результат: "0" (Тип Число) для "True" успешный результат: "True" (Тип Булево)

Также, используя редактор OneScript, при втором запуске (нажатием кнопке "Выполнить") приложение крашится.

Воспроизведение ошибки Особых шагов не требуется.

Ожидаемое поведение Ожидаю поведения, совпадающего с 1С платформой.

Окружение

  • ОС: Windows 11 Pro 22H2 22621.2215
  • Версия OneScript: 1.8.4.5
  • Версия Платформы 1С: 8.3.19.1467

Дополнительная информация Хочу обратить внимание, что компонента использует "out параметры", т.е. работает с указателями, падающими от Платформы 1С, используя предоставляемый менеджер памяти - аллоцирует память под возвращаемую переменную, меняет указатели и деаллоцирует старую память. Однако для переенных типа число не требуется манипуляций с указателями - значение можно поменять "на месте", но даже в таком случае редактор падает.

На платформе 1С не наблюдалось нестабильной работы с такими параметрами.

Sebekerga avatar Oct 02 '23 08:10 Sebekerga

@lintest сможешь посмотреть, пожалуйста?

EvilBeaver avatar Oct 02 '23 11:10 EvilBeaver

@EvilBeaver, @Sebekerga Хорошо, посмотрю

lintest avatar Oct 08 '23 21:10 lintest