OneScript icon indicating copy to clipboard operation
OneScript copied to clipboard

1.9.3 При вызове метода COM-объекта вместо Непоределено в приемник приходит число -2147352572 (E_ABORT)

Open tormozit opened this issue 3 months ago • 16 comments

Опишите ошибку При вызове метода COM-объекта вместо Непоределено в приемник приходит число -2147352572=0x80000004=E_ABORT

Воспроизведение ошибки

  1. В модуле приложения базы 1С объявить метод
Функция ОткрытьПоискВМодулях(Знач ЧтоИскать = Неопределено, Знач Автозапуск = Истина) Экспорт 
ЗаписьЖурналаРегистрации("Вон", УровеньЖурналаРегистрации.Предупреждение,,, ЧтоИскать);
КонецФункции
  1. Через COm V83.Application подключиться к этой базе и вызвать COM.ОткрытьПоискВМодулях(Неопределено, Ложь)
  2. В журнале регистрации видно событие "Вон" с числом -2147352572
Image Image

Ожидаемое поведение Приход в первом параметре значения Неопределено.

Окружение

  • ОС: Windows 10
  • Версия: 1.9.3
  • Турбоконф 6.4.9

Ошибка является следствием правок в 1.9.2, т.к. в Турбоконфе с ОСкрипт 1.9.1 она не возникает.

tormozit avatar Sep 13 '25 20:09 tormozit

5 часов вылавливал ошибки в работе своего скрипта для Турбоконфа, порожденные этой ошибкой. Это было трудно. Удалось в обоих местах решить возникшие ошибки правкой скрипта. И пока еще нет полной уверенности что все повреждения найдены, т.к. скрипт большой и имеет очень много точек входа.

Ошибка весьма трудоемкая в плане отлова всех ее проявлений. Поэтому считаю ошибку серьезной и требующей выпуска исправительной версии. Подозреваю, что и в версию 2.* ее тоже занесли.

tormozit avatar Sep 14 '25 21:09 tormozit

Обошел эту ошибку в обнаруженных местах ее проявления в скрипте путем устранения передачи Неопределено и проверкой на число -2147352572 на принимающей вызов стороне.

tormozit avatar Sep 15 '25 04:09 tormozit

Нашел еще одно место в своем скрипте, где передавалось Неопределено. Опять же искать пришлось сложно и долго. И похоже оно не последнее. Можно надеяться на скорое исправление или лучше откатываться на 1.9.1?

tormozit avatar Sep 16 '25 03:09 tormozit

Нашел еще одно место в своем скрипте, где передавалось Неопределено. В этот раз правда быстро нашел причину. Но думаю что это - не последнее место.

tormozit avatar Sep 18 '25 20:09 tormozit

^ не связано с обработкой параметров по умолчанию. это правки по nativeapi

nixel2007 avatar Sep 19 '25 11:09 nixel2007

@tormozit вот твой же комментарий

Тут что то про параметры по умолчанию

nixel2007 avatar Sep 21 '25 06:09 nixel2007

Сначала ContextValuesMarshaller.ConvertToClrObject() превращает Неопределено в Null https://github.com/EvilBeaver/OneScript/blob/3845405819e3f6f5dacf6dad110c2bbf5d27ef1d/src/ScriptEngine/Machine/Contexts/ContextValuesMarshaller.cs#L371 А затем этот Null в COMWrapperContext.MarshalIValue() превращается в Missing.Value, т.е. <пропущенный параметр> https://github.com/EvilBeaver/OneScript/blob/3845405819e3f6f5dacf6dad110c2bbf5d27ef1d/src/ScriptEngine/Machine/Contexts/COMWrapperContext.cs#L161C17-L161C94 retValue = ContextValuesMarshaller.ConvertToClrObject(val) ?? Missing.Value;;

tormozit avatar Sep 21 '25 06:09 tormozit

Выяснилось новое обстоятельство. Работало корректно на версии 1.9.1, а не 1.9.2. Поэтому проблема есть следствие этой правки в 1.9.2 https://github.com/EvilBeaver/OneScript/issues/1405

tormozit avatar Sep 21 '25 08:09 tormozit

  • v2 и v1.9.2+ работают одинаково
  • число -2147352572 == 0x80020004 не E_ABORT, а DISP_E_PARAMNOTFOUND, что логично
  • если функцию вызывать с параметром, не имеющим значения по умолчанию, не в виде литерала Неопределено, а переменной со значением Неопределено, то вызова не произойдет, а скрипт упадет с ошибкой Внешнее исключение (System.Runtime.InteropServices.COMException): Параметр является обязательным. (Исключение из HRESULT: 0x8002000F (DISP_E_PARAMNOTOPTIONAL))
  • если Неопределено передавать в вызов V83.Application как null - всё работает, 1С интерпретирует его именно как Неопределено
  • в свою очередь, переданное Missing.Value работает в 1С как пропущенный параметр

Резюмируя: пропущенный в скрипте параметр (DataType.NotAValidValue) надо пробрасывать до вызова функций COM-объекта. При этом не сломать вызовы других (каких?) динамических объектов.

Mr-Rm avatar Sep 25 '25 14:09 Mr-Rm

если функцию вызывать с параметром не в виде литерала Неопределено, а переменной со значением Неопределено, то вызова не произойдет, а скрипт упадет с ошибкой

У меня в обоих случаях передается число -2147352572 и ошибки вызова не возникает. Решение я предложил тут https://github.com/EvilBeaver/OneScript/issues/1405

tormozit avatar Sep 25 '25 14:09 tormozit

Решение из #1405 не сработает, преобразование DataType.NotAValidValue -> DataType.Undefined выполняется раньше

Mr-Rm avatar Sep 25 '25 14:09 Mr-Rm

@Mr-Rm можешь указать о каком месте в коде речь? Я поискал по "DataType.NotAValidValue", но не смог найти.

tormozit avatar Sep 25 '25 15:09 tormozit

При возврате значений из COM, включая значения свойств, такая же беда - все значения Неопределено превращаются в -2147352572

tormozit avatar Oct 07 '25 12:10 tormozit

Вероятно связанная проблема https://github.com/EvilBeaver/OneScript/issues/1597

tormozit avatar Oct 19 '25 08:10 tormozit

Дед мороз, сделаешь сборку 1.9.4 с этими фиксами на новый год? А то я все еще продолжаю находить повреждения в коде скрипта, вызванные этими ошибками. Уже скоро 20 шт будет.

tormozit avatar Dec 10 '25 20:12 tormozit

Да, как раз собираюсь сегодня-завтра

EvilBeaver avatar Dec 11 '25 07:12 EvilBeaver

@tormozit выпущено.

EvilBeaver avatar Dec 24 '25 08:12 EvilBeaver

@Mr-Rm я же правильно понимаю, что это можно закрыть?

EvilBeaver avatar Dec 24 '25 08:12 EvilBeaver

Проверил. Исправлено.

tormozit avatar Dec 24 '25 09:12 tormozit