Имя: Пароль:
1C
1С v8
Исключение из COM на C#
0 oleg_km
 
29.03.14
13:01
Есть COM на C#, используемый в 1С. Хочу из кода этого объекта создать исключение 1С. Просто throw завершает 1С. Или для этого нужно писать ВК?
1 H A D G E H O G s
 
29.03.14
13:10
(0)

Все код процедуры COM объекта берем в try/except

Где - то внутри возбуждаем свое собственное исключение.

Выполнение переходит в блок except (при любом исключении).
Если это - твое исключение - процедура возвращает в 1С ЛОЖЬ, 1С читает КодОшибки и ОписаниеОшибки из свойства COM объекта.

При начале выполнения COM процедуры, она сбрасывает переменные, хранящие Код и Описание ошибки (предыдущие)
2 oleg_km
 
29.03.14
13:19
(1) Не все так просто. Процедура, это событие. Причем событие генерится внутри COM. В 1С ссылки на этот объект уже нет, например форма уже закрыта. Чувствую, что наверное хочу невозможного.
3 Serginio1
 
08.04.14
11:29
Сделай ВК. Вернее передай в свой COM AppDispatch из которого вытащи IErrorLog

Для сообщения пользователю информации о своей работе объект может использовать интерфейс IErrorLog, стандартный для OLE (описание метода AddError интерфейса IErrorLog приводится здесь исключительно для удобства работы). Возникающие сообщения обработываются как в течение работы

программы (при асинхронном помещении их в очередь), так и в следующих случаях: при возврате из метода инициализации Init ( см. стр. * ) и при возврате из метода расширения . Все сообщения помещаются в очередь и обрабатываются по порядку появления. Количество запоминаемых сообщений не ограничено.

HRESULT AddError(BSTR pszPropName, LPEXCEPINFO pExcepInfo)

Добавить сообщение.

Параметры:


pszPropName

В настоящей реализации параметр  pszPropName игнорируется.


pExcepInfo

Указатель на структуру EXCEPINFO .
4 Serginio1
 
08.04.14
11:30
Или из AppDispatch пиши в журнал регистрации
5 Serginio1
 
08.04.14
12:01
6 oleg_km
 
08.04.14
17:19
ВК не хочется, хочется, чтобы события были ограниченны формой, владельцем ActiveX. Ладно, пока не особо актуально
7 Serginio1
 
08.04.14
17:29
(6) Так ты сделай ВК из которой будешь добывать AppDispatch  и передавать её в свой COM объект.
Я например уже 13 лет пользуюсь  ВК которая загружает Объект Автоматизации поддерживающий ITypeInfo и выполняет все его свойства и методы через IlanguageExtender.
http://1c.proclub.ru/modules/mydownloads/personal.php?cid=115&lid=2019


В самом COM объекте нужно только добавить метод  void InitFrom1C(object Object1C)

например

public void InitFrom1C(object Object1C)
        {
            try
            {
                Event = new AutoResetEvent(false);

                EventTo1C = Object1C as IAsyncEvent;




                SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext());
                Sc = SynchronizationContext.Current;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                throw e;

            }
          
            
           // обработкаСобытий();
        }


Помню еще на 7 ке я просто возвращал Object1C в 1С и использовал его обычных сом объектах
8 oleg_km
 
08.04.14
17:44
(8) А, да так можно сделать. Буду иметь ввиду