Поведение 1С и OneScript значительно отличаются при работе с Native API компонентой
Опишите ошибку Хочу использовать 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С не наблюдалось нестабильной работы с такими параметрами.
@lintest сможешь посмотреть, пожалуйста?
@EvilBeaver, @Sebekerga Хорошо, посмотрю