OneScript icon indicating copy to clipboard operation
OneScript copied to clipboard

При вызове через COM пропущенные параметры получают значение Неопределено вместо значения по умолчанию

Open tormozit opened this issue 1 year ago • 7 comments

Имею ОСкрипт 1.7-9 внутри Турбоконфа. Зову из скрипта функцию базы 1С

Функция Ф(П = Ложь) Экспорт
     Сообщить(П);
КонецФункции

через COM V83.Application: COM.Ф() И вижу в отладчике что фактический параметр приходит Неопределено вместо ожидаемого Ложь.

tormozit avatar May 04 '24 06:05 tormozit

А если из другого языка вызвать, скажем, из VBScript?

EvilBeaver avatar May 06 '24 04:05 EvilBeaver

Работает ожидаемо из COM клиента 1C. Запустить обычное приложение и нажать кнопку "COM вызов" и закрыть окно нового приложения.

	Соединение = Новый COMОбъект("V83.Application");
	Соединение.Connect(СтрокаСоединенияИнформационнойБазы());
	Р = Соединение.Тест();
	Сообщить(ТипЗнч(Р));
Функция Тест(П = Ложь) Экспорт
	Возврат П;
КонецФункции  

Выводит сообщение Булево Моя.zip

tormozit avatar May 06 '24 04:05 tormozit

Не воспроизводится. Модуль 1С 8.3.24.1467:

Функция Тест(П = Истина) Экспорт
	Сообщить(Строка(ТипЗнч(П))+"="+П);
	Возврат П;
КонецФункции  

Запускается OneScript 1.9.1:

Соединение = Новый COMОбъект("V83.Application");   
Соединение.Connect("File=""C:\_lab\1S\default\""");
Рез = Соединение.Тест();
Сообщить(Строка(ТипЗнч(Рез))+"="+Рез);
Соединение = 0;

Оба сообщения: Булево=Да

Mr-Rm avatar May 16 '24 14:05 Mr-Rm

@bolsun Тогда возможно проблема в Турбоконфе, т.к. я уже десятки раз это проверял и всегда получал в этих параметрах Неопределено. Создал связанную заявку по Турбоконфу https://turboconf.ru/Tasks/9425

tormozit avatar May 16 '24 15:05 tormozit

Моя ошибка. Неверно обрезал тест. Прошу проверить новый тест. Ключевое отличие - пропуск параметра перед явно передаваемым параметром.

Функция Тест(П = Ложь, Я = Ложь) Экспорт
	Возврат П;	
КонецФункции  
Р = Соединение.Тест(, 1);

Вызов из 1С через COM опять же показывает ожидаемый результат "Булево". Моя.zip

tormozit avatar May 16 '24 17:05 tormozit

Новый тест подтверждает ошибку. Но! При аналогичном вызове из 1С v7.7 также получается Неопределено.

Mr-Rm avatar May 17 '24 06:05 Mr-Rm

При аналогичном вызове из 1С v7.7 также получается Неопределено

Потому что значение зависит от вызывающего клиента. Там в COM надо передавать специальное значение. Полагаю, v77 и 1Скрипт этого не делают, или делают способом отличным от того, что ожидает v8.

https://stackoverflow.com/questions/32521574/passing-a-com-method-default-parameter

EvilBeaver avatar May 17 '24 09:05 EvilBeaver

Проверил System.Reflection.Missing.Value как значение пропущенного параметра. Для V83.Application - исправляет рассматриваемую ошибку. На других проверенных COM-объектах также работает корректно. Для V77.Application меняет Внешнее исключение (System.ArgumentException): Значение не попадает в ожидаемый диапазон. на Внешнее исключение (System.Runtime.InteropServices.COMException): Несовпадение типов. (Исключение из HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))

В дополнение: Вызов метода с лишним пропущенным параметром

FSO = ПолучитьCOMОбъект("","Scripting.FileSystemObject");
Рез = FSO.DriveExists("C", );  // <--

вызвает падение платформы 1С по версию 8.3.25.1286 включительно.

OneScript отрабатывает в целом нормально: Внешнее исключение (System.Reflection.TargetParameterCountException): Указанное число параметров не соответствует ожидаемому числу.

Mr-Rm avatar May 20 '24 08:05 Mr-Rm

Может быть захардкодить v77, а для остальных случаев передавать Missing.Value?

nixel2007 avatar May 20 '24 09:05 nixel2007

Пока непонятно, каким значением хардкодить. Даже вызов v77 из v77 с пропущенным параметром не приводит к подстановке значения по умолчанию, остается неопределенное значение (ТипЗначения==0). Предлагаю игнорировать.

Mr-Rm avatar May 20 '24 10:05 Mr-Rm

@Mr-Rm можно попросить фикс этого для 2.0?

EvilBeaver avatar Jun 03 '24 07:06 EvilBeaver