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

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

Closed
tormozit opened this issue May 4, 2024 · 11 comments

Comments

@tormozit
Copy link

tormozit commented May 4, 2024

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

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

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

@EvilBeaver
Copy link
Owner

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

@tormozit
Copy link
Author

tormozit commented May 6, 2024

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

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

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

@Mr-Rm
Copy link
Collaborator

Mr-Rm commented May 16, 2024

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

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

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

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

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

@tormozit
Copy link
Author

tormozit commented May 16, 2024

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

@tormozit
Copy link
Author

tormozit commented May 16, 2024

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

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

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

@Mr-Rm
Copy link
Collaborator

Mr-Rm commented May 17, 2024

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

@EvilBeaver
Copy link
Owner

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

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

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

@Mr-Rm
Copy link
Collaborator

Mr-Rm commented May 20, 2024

Проверил 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): Указанное число параметров не соответствует ожидаемому числу.

@nixel2007
Copy link
Collaborator

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

@Mr-Rm
Copy link
Collaborator

Mr-Rm commented May 20, 2024

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

EvilBeaver added a commit that referenced this issue May 21, 2024
fix #1405: значение для  пропущенного параметра
@EvilBeaver
Copy link
Owner

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

EvilBeaver added a commit that referenced this issue Jun 3, 2024
fix #1405 для v2: значение для пропущенного параметра +рефакторинг
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

4 participants