Здравствуйте, 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;