.NET и 1С V82.COMConnector ошибка при вызове .ПолучитьОбъект #683477


#0 by developer1
Добрый день, возникла следующая проблема. Имеется модуль с простыми функциями типа отметить документ на удаление по номеру или провести документ по номеру. Проблема с методом .ПолучитьОбъект - при вызове функции ПометитьРасходнаяНакладная через COM из .NET приложения вылетает исключение, которое не перехватывается в теле функции ПометитьРасходнаяНакладная и более того некорректно сериализуется. То есть на стороне .NET приходит объект Exception с указателями-null'ами, не несущий никакой информации. Что интересно: - если эти функции вызываются непосредственно из 1С, то все прекрасно работает. - если изменить тип документа с РасходнаяНакладная на некоторый другой, то все выполняется корректно. Есть еще как минимум один тип, для которого это также не работает. Заметить отличия этих типов документов от других, с которыми все ок, не удалось - гарантируется, что сам вызов через COM осуществляется, если убрать проблемный вызов .ПолучитьОбъект, то вызов отрабатывает корректно -COM соединение выполняется под тем же аккаунтом, под которым функция корректно работает при выполнении через 1С:Предприятие -другие методы типа .ПолучитьФорму этой же ссылки работают корректно Итого: непонятная ошибка, которая не ловится trycatch и возникает при вызове метода .ПолучитьОбъект на ссылках документа типа РасходнаяНакладная при соединении через COM. .NET код: Могу выложить код GetConnection если необхдимо
#1 by ДенисЧ
Сначала найти, потом проверить найденность, потому уже получать объект
#2 by developer1
Гарантируется, что объект с заданным номером в базе есть и, повторюсь, этот код с такими же параметрами корректно отрабатывает будучи вызванным через 1С Предприятие. Да и наверняка тогда поймалось бы исключение в самой функции ПометитьРасходнаяНакладная
#3 by Serginio1
Посмотри подписчики при записи. И посмотри стоит ли у этих модулей галка внешнее соединение
#4 by Serginio1
Или смотри модуль РасходнаяНакладная, что там вызывается при инициализации в модуле расходной накладной
#5 by developer1
Спасибо за помощь, но не вижу каких-либо проблем. Насчет ПриЗаписи, причем оно тут? Галка "Внешнее соединение" установлена, однако и с ней и без нее эффект одинаковый. Работает с другими документами и другими методами и без "внешнего соединения". В модуле РасходнаяНакладная вообще нет никаких функций, связанных с инициализацией (или я их не вижу). Вообще чисто гипотетически как может возникнуть описанная ситуация? 1) не ловится исключение в ПометитьРасходнаяНакладная 2) работает через 1С Предприятие 3) не работает через COM и только для некоторых типов документов
#6 by hhhh
НайтиПоНомеру(Номер) - это гарантированно не найдет. Пиши не через задницу, а по-человечески НайтиПоНомеру(Номер, Дата)
#7 by developer1
четвертый день вижу 1С, НайтиПоНомеру(Номер) находит то, что нужно, повторюсь, код работает будучи вызванным через 1С Предприятие. Поискал по коду 1С - почти всюду НайтиПоНомеру используется без второго аргумента. Из того, что сейчас прочитал - второй аргумент целесообразен при использовании периодичной нумерации (так?). В свойствах РасходнаяНакладная Периодичность "Непериодический". Готов попробовать тем не менее. Не представляю только какую дату указывать. Дата?
#8 by Serginio1
Не функций а кода который вызывает функции из других модулей. Код инициализации это код после последней процедуры функции модуля
#9 by developer1
Спасибо за пояснение. В модуле объекта РасходнаяНакладная кроме процедур и одной глобальной переменной нет никакого другого кода.
#10 by Serginio1
Сделай проверку на неопределено Если док=неопределено Тогда возврат "Не найден документ"; а на строчке документ=Док.ПолучитьОбъект; в отладчике "Шагнуть В";
#11 by developer1
Изменил: Запустил под отладчиком привязав вызов ПроведениеДокументов.ПометитьРасходнаяНакладная("00008121",Истина,Ложь); к одному из событий интерфейса. В результате ПолучитьОбъект отработал корректно. При "Шагнуть В" вход внутрь не выполнился. Я не знаю типично ли это для системных вызовов в 1С или мне нужно изменить какие-то настройки отладчика. Проверил и вызов через COM - все то же исключение, которое даже не удается идентифицировать.
#12 by Serginio1
в руки и трассируй
#13 by developer1
не понимаю смысла. я и так знаю какой оператор приводит к ошибке, как мне мои же сообщения в журнале должны помочь? более реально было бы запустить отладчик удаленно, но в моей ситуации на одном физическом сервере запущены две базы (Dev и Production). Как я понимаю, переключение сервера в режим Debug приведет к замедлению в работе Production базы
#14 by Serginio1
Ну хотя бы в Исключение ЗаписьЖурналаРегистрации("ПометитьРасходнаяНакладная", А откуда знаешь, если отладчиком не пользуешься?
#15 by developer1
первый пост, объяснил все там. Как до этого дошел - опытным путем, вызывая разные методы вместо .ПолучитьОбъект и проверяя другие типы документов (не РасходнаяНакладная). Возвращается "Ok" (ну или я ставил Возвраты сразу до или после оператора с .ПолучитьОбъект). Если документ не найден, вызывается некорректный метод или не указаны обязательный аргументы (что я только не делал) и т.д. и т.п., то исключение в ПометитьРасходнаяНакладная перехватывается и мне на .NET клиент возвращается ошибка "Описание='" + Инфо.Описание + "'"; Еще раз - ошибка в .ПолучитьОбъект для документа типа РасходнаяНакладная при соединении через COM. Это ОЧЕНЬ странно и именно поэтому я пишу все это. Я не вижу никакого смысла имея Исключение писать
#16 by hhhh
ну разобрались же. Дату надо указать. Почему странно? Детский сад. ведь понятно же и во всех букварях написано, что по COM надо все параметры указывать, а иначе будет параметр NULL.
#17 by developer1
разобрались? По-моему нет. Дальше начала не продвинулись
#18 by Serginio1
Не пиши. А вообще то всегда хорошо регистрировать ошибки и знать почему и когда они произошли. При этом ошибка у тебя не возвращается. Хозяин барин.
#19 by Славен
имхо, тут бесполезно что-то пояснять
#20 by developer1
добавил, проверил, предсказуемо в журнал ничего не добавилось. Проблема все та же - невозможно даже перехватить КОНКРЕТНО ЭТО исключение в 1С, соответственно ничего не возвращается и не пишется в журнал. Писал выше, что другие ситуации типа некорректного метода или некорректных параметров отлично перехватываются и на стороне .NET'а (даже) я получаю соответствующую диагностику. Почему так - не знаю, это и хотел понять малой кровью.
#21 by shurikvz
НЕ а         Если ссылка = Неопределено ИЛИ ссылка.Пустая -------------
#22 by Serginio1
Ну можно еще потрассировать ЗаписьЖурналаРегистрации("ПометитьРасходнаяНакладная",
#23 by shurikvz
А, и попробуйте не ИнформацияОбОшибке, а ОписаниеОшибки.
#24 by zladenuw
а какая платформа точно ? ТИИ делал базы ?
#25 by developer1
заметил появление записи в журнале "Описание='Error calling context method (ПолучитьОбъект)" появляется она далеко не всегда и не сразу после вызова (то есть я уже получил результат, а запись в журнале появляется с приличной задержкой). Получается, Ваша правда. Что можно об этом сказать? Насчет ТИИ - узнал об этом только сейчас, запустил тестирование и, может быть, зря - уже несколько минут конфигуратор висит.
#26 by Serginio1
Добавь еще  Инфо.Описание + "'"+Инфо.ИмяМодуля+ "'"+Инфо.НомерСтроки
#28 by wPa
точнее
#29 by developer1
"Описание='Error calling context method (ПолучитьОбъект)'; 'ОбщийМодуль.ПроведениеДокументов.Модуль'; 22;" Строка 22 это документ = ссылка.ПолучитьОбъект;
#30 by Славен
тебе уже сказали нихрена он сылку не получил, без указания  периода найтипономеру не работает по ком
#31 by developer1
а вот это сработало, вопрос как быть дальше? в интерфейсе 1C Предприятия этот документ есть и без каких-либо видимых проблем, также наблюдаю его в базе уже давно исправил, так что мимо
#32 by ilya_i
вызов .ПолучитьОбъект выполняет код вне процедур в модуле объекта, может туда копать.
#33 by Serginio1
Посмотри подписчики. Ошибка может  происходить при компиляции модуля
#34 by Serginio1
Установи в конфигураторе ПараметрыМодулипроверка галку напротив внешнее соединение. И сделай проверку модуля или проверка модулей в меню конфигурация
#35 by developer1
Я ошибся с утверждением насчет ЗначениеЗаполнено(ссылка). Все нормально и через COM. сделал, в модуле РасходнаяНакладная нашлась ошибка {Документ.РасходнаяНакладная.МодульОбъекта(201,98)}: Переменная не определена (глВалютаУпр) глВалютаУпр как я понял - глобальная переменная, устанавливаемая при запуске приложения строка 201 с ошибкой это в Процедура ОбработкаПроведения вызов которой так и не осуществляется, ошибка в ПолучитьОбъект - раньше, может ли все равно это быть причиной? Заметил, что подобной ошибки для "Толстый клиент" нет. И тем не менее. Как-то удалось получить подробную ошибку в журнале {ОбщийМодуль.ПроведениеДокументов.Модуль}: Error calling context method (ПолучитьОбъект)             документ = ссылка.ПолучитьОбъект; because: No element selected! то есть проверка ЗначениеЗаполнено(ссылка) проходит, а дальше не удается получить объект.
#36 by developer1
Так, это все в модуле "Модуль обычного приложения", а в "Модуль внешнего соединения" ничего нет. Режим запуска приложения - "Обычное приложение". В этом причина?
#37 by developer1
Да :). там уже другие ошибки, но они хотя бы "постоянны" и информативны. Спасибо
#38 by Serginio1
Для интереса сделай так #Если НЕ ВнешнееСоединение Тогда Запрос.УстановитьПараметр("Курс",(КурсДокумента/КратностьДокумента)/ПолучитьКурсКратностьВалюты(глВалютаУпр,Дата)); #иначе Запрос.УстановитьПараметр("Курс",(КурсДокумента/КратностьДокумента)/ПолучитьКурсКратностьВалюты(Константы.ВалютаУправленческогоУчета.Получить,Дата)); #КонецЕсли
#39 by Serginio1
Или пропиши в модуле внешнего соединения эту переменную и метод
#40 by developer1
ну я сразу так и сделал, таким образом заработало
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С