Re[12]: Работа из VC++ с базой 1С83 через V83.COMConnector
От: SANblCH_SUN  
Дата: 19.02.15 13:24
Оценка:
Здравствуйте, saf_e, Вы писали:

_>Здравствуйте, SANblCH_SUN, Вы писали:


SAN>>Продолжаю тему!

SAN>>Я привел два варианта кода через V83.COMConnector и V83.Application к одному виду:

SAN>>В случае V83.Application вызов метода "ExternalDataProcessors" (для запуска в базе 1с внешней обработки) проходит положительно,

SAN>>а в случае V83.COMConnector получаю сообщение от hr = Unknown name.

SAN>>Соединение с базой выполняется в обоих случаях без ошибок.

SAN>>В других системах программирования при варианте V83.COMConnector метод "ExternalDataProcessors" вызывается, но почему тут не работает, в чем трабл?

_>Посмотрите какие методы доступны у этого объекта.


_>http://stackoverflow.com/questions/2112302/enumerate-com-object-idispatch-methods-using-atl последний ответ COMTools::GetIDispatchMethods. Там же сможете расковырять параметры которые ожидаются.



Мое приложение в MFC построено, а там идет речь за ATL
Re[13]: Работа из VC++ с базой 1С83 через V83.COMConnector
От: saf_e  
Дата: 19.02.15 13:35
Оценка:
Здравствуйте, SANblCH_SUN, Вы писали:

SAN>Здравствуйте, saf_e, Вы писали:


_>>Посмотрите какие методы доступны у этого объекта.


_>>http://stackoverflow.com/questions/2112302/enumerate-com-object-idispatch-methods-using-atl последний ответ COMTools::GetIDispatchMethods. Там же сможете расковырять параметры которые ожидаются.


SAN>Мое приложение в MFC построено, а там идет речь за ATL


Это просто пример кода, тоже самое можно на голом СОМ сделать. И исключительно с целью отладки.
Re[3]: Работа из VC++ с базой 1С83 через V83.COMConnector
От: Alex668  
Дата: 20.12.21 22:48
Оценка:
Здравствуйте, SANblCH_SUN, Вы писали:

SAN>Здравствуйте, saf_e, Вы писали:


_>>Здравствуйте, SANblCH_SAN, Вы писали:


SAN>>>Прошу помочь дописать программу VC++ 2010 MFC:


SAN>>>соединение с базой 1C выполняется а как дальше, как какие-нибудь данные получить? как выполнить в базе 1с внешнюю обработку?


_>>Используйте для работы с СОМ врапперы: _com_ptr_t, _variant_t, _bstr_t и т.д. ну или свои. СОМ и так своеобразен чтобы с ним вручную возится. Сделайте себе враппер для IDispatch и наступит счастье.


_>>По теме, надо курить объектную модель которая торчит из IDispatch и пробовать вызывать методы. Есть подозрение что они могут быть в документации к 1С. Гугл что говорит?



SAN>так случилось что что я плохо знаю язык С++, но надо дописать программу, поэтом мне был бы понятней простой пример.


SAN>есть у меня рабочий пример работы с базой 1с через V83.Application, но он мне не нравится:


SAN>
SAN>void CExcelTestDlg::OnBnClickedTest2()
SAN>{

SAN>    HRESULT hr;
SAN>    VARIANT varRet;
 
SAN>        CLSID cls8;



SAN>        hr = v8COMBase.CreateInstance(L"V83.Application"); // создаем COM соединение с 1С
SAN>    if( FAILED(hr) ) // проверка на присутствие 1С Automation Sever-а
SAN>    {
SAN>        AfxMessageBox(_T("Переустановите 1С Предприятие!"));
SAN>        return;
SAN>    }

SAN>    CString m_strPath = _T("C:\\base");
SAN>    CString m_Usr = _T("Администратор");
SAN>    CString m_Pwd = _T("");

SAN>    varRet = v8COMBase.Invoke(L"Connect", L"File=C:\\base;Usr=Администратор;Pwd=;");

SAN>    if( (varRet.vt != VT_BOOL)||(varRet.boolVal == 0) ) // проверка удачно/не удачно
SAN>    {
SAN>        AfxMessageBox(_T("Невозможно подключиться к базе 1С Предприятия"));
SAN>        v8COMBase.Release();
SAN>        return;
SAN>    }
SAN>    CDispatchHelper v8SpravPol; // наш справочник
 
SAN>    v8SpravPol = v8COMBase.Invoke(L"NewObject", L"СправочникМенеджер.Пользователи");
SAN>    if( !v8SpravPol )
SAN>    {
SAN>        AfxMessageBox(_T("Невозможно подключиться к [Справочник.Пользователи]"));
SAN>        v8COMBase.Release();
SAN>        return;
SAN>    }

SAN>    CDispatchHelper v8Admin; // наш Админ :)
 
SAN>    v8Admin = v8SpravPol.Invoke(L"НайтиПоНаименованию", L"Администратор", false, (IDispatch*)NULL, (IDispatch*)NULL);
SAN>    if( !v8Admin )
SAN>    {
SAN>        AfxMessageBox(_T("Пользователь Администратор не найден"));
SAN>        v8SpravPol.Release();
SAN>        v8COMBase.Release();
SAN>        return;
SAN>    }
SAN>    VARIANT varRet1; // переменная для хранения результата
 
SAN>    varRet1 = v8Admin.Get(L"Наименование"); // получаем значение поля
SAN>    AfxMessageBox(_T(CString(varRet1.bstrVal))); // выводим сообщение о прочитанном имени пользователя

SAN>    v8Admin.Release(); // Админ
SAN>    v8SpravPol.Release(); // справочник
SAN>}
SAN>


SAN>класс CDispatchHelper, находится тут:

SAN>http://files.rsdn.ru/120582/DispatchHelper.cpp
SAN>http://files.rsdn.ru/120582/DispatchHelper.h


SAN>Так вот, меняю я строку:

SAN>
SAN>hr = v8COMBase.CreateInstance(L"V83.Application"); // создаем COM соединение с 1С
SAN>


SAN>На строку:


SAN>
SAN>hr = v8COMBase.CreateInstance(L"V83.COMConnector"); // создаем COM соединение с 1С
SAN>


SAN>в классе CDispatchHelper, т.е :


SAN>http://files.rsdn.ru/120582/DispatchHelper.h


SAN>меняю строку


SAN>
SAN>HRESULT CreateInstance(LPCOLESTR sProgID, DWORD dwClsContext = CLSCTX_LOCAL_SERVER);
SAN>



SAN>на строку:


SAN>
SAN>HRESULT CreateInstance(LPCOLESTR sProgID, DWORD dwClsContext = CLSCTX_INPROC_SERVER);
SAN>



SAN>После этого ошибка:

SAN>Невозможно подключиться к базе 1С Предприятия

При COM соединении функция v8COMBase.Invoke(L"Connect", ... ) возвращает не VARIANT, а IDispatch*. т.е. писать надо так:


CDispatchHelper v8Connector = v8COMBase.Invoke(L"Connect", L"File=C:\\base;Usr=Администратор;Pwd=;");


Кроме того в ф-ции VARIANT Get(LPOLESTR sParam) и VARIANT Invoke(LPOLESTR sFunc, ...) необходимо добавить строку:

varRet.vt = 0;
Re[13]: Работа из VC++ с базой 1С83 через V83.COMConnector
От: Doom100500 Израиль  
Дата: 21.12.21 08:10
Оценка:
Здравствуйте, SANblCH_SUN, Вы писали:

SAN>Мое приложение в MFC построено, а там идет речь за ATL


MFC — это GUI нашлёпка над ATL.

Например CString — это ATL, CWnd — MFC
Спасибо за внимание
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.