При вызове через COM пропущенные параметры получают значение Неопределено вместо значения по умолчанию
Имею ОСкрипт 1.7-9 внутри Турбоконфа. Зову из скрипта функцию базы 1С
Функция Ф(П = Ложь) Экспорт
Сообщить(П);
КонецФункции
через COM V83.Application:
COM.Ф()
И вижу в отладчике что фактический параметр приходит Неопределено вместо ожидаемого Ложь.
А если из другого языка вызвать, скажем, из VBScript?
Работает ожидаемо из COM клиента 1C. Запустить обычное приложение и нажать кнопку "COM вызов" и закрыть окно нового приложения.
Соединение = Новый COMОбъект("V83.Application");
Соединение.Connect(СтрокаСоединенияИнформационнойБазы());
Р = Соединение.Тест();
Сообщить(ТипЗнч(Р));
Функция Тест(П = Ложь) Экспорт
Возврат П;
КонецФункции
Выводит сообщение Булево Моя.zip
Не воспроизводится. Модуль 1С 8.3.24.1467:
Функция Тест(П = Истина) Экспорт
Сообщить(Строка(ТипЗнч(П))+"="+П);
Возврат П;
КонецФункции
Запускается OneScript 1.9.1:
Соединение = Новый COMОбъект("V83.Application");
Соединение.Connect("File=""C:\_lab\1S\default\""");
Рез = Соединение.Тест();
Сообщить(Строка(ТипЗнч(Рез))+"="+Рез);
Соединение = 0;
Оба сообщения: Булево=Да
@bolsun Тогда возможно проблема в Турбоконфе, т.к. я уже десятки раз это проверял и всегда получал в этих параметрах Неопределено. Создал связанную заявку по Турбоконфу https://turboconf.ru/Tasks/9425
Моя ошибка. Неверно обрезал тест. Прошу проверить новый тест. Ключевое отличие - пропуск параметра перед явно передаваемым параметром.
Функция Тест(П = Ложь, Я = Ложь) Экспорт
Возврат П;
КонецФункции
Р = Соединение.Тест(, 1);
Вызов из 1С через COM опять же показывает ожидаемый результат "Булево". Моя.zip
Новый тест подтверждает ошибку.
Но! При аналогичном вызове из 1С v7.7 также получается Неопределено.
При аналогичном вызове из 1С v7.7 также получается Неопределено
Потому что значение зависит от вызывающего клиента. Там в COM надо передавать специальное значение. Полагаю, v77 и 1Скрипт этого не делают, или делают способом отличным от того, что ожидает v8.
https://stackoverflow.com/questions/32521574/passing-a-com-method-default-parameter
Проверил 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): Указанное число параметров не соответствует ожидаемому числу.
Может быть захардкодить v77, а для остальных случаев передавать Missing.Value?
Пока непонятно, каким значением хардкодить. Даже вызов v77 из v77 с пропущенным параметром не приводит к подстановке значения по умолчанию, остается неопределенное значение (ТипЗначения==0). Предлагаю игнорировать.
@Mr-Rm можно попросить фикс этого для 2.0?