Сообщение Re[2]: Работа из VC++ с базой 1С83 через V83.COMConnector от 13.02.2015 11:23
Изменено 13.02.2015 11:30 SANblCH_SUN
Здравствуйте, saf_e, Вы писали:
_>Здравствуйте, SANblCH_SAN, Вы писали:
SAN>>Прошу помочь дописать программу VC++ 2010 MFC:
SAN>>соединение с базой 1C выполняется а как дальше, как какие-нибудь данные получить? как выполнить в базе 1с внешнюю обработку?
_>Используйте для работы с СОМ врапперы: _com_ptr_t, _variant_t, _bstr_t и т.д. ну или свои. СОМ и так своеобразен чтобы с ним вручную возится. Сделайте себе враппер для IDispatch и наступит счастье.
_>По теме, надо курить объектную модель которая торчит из IDispatch и пробовать вызывать методы. Есть подозрение что они могут быть в документации к 1С. Гугл что говорит?
так случилось что что я плохо знаю язык С++, но надо дописать программу, поэтом мне был бы понятней простой пример.
есть у меня рабочий пример работы с базой 1с через V83.Application, но он мне не нравится:
_>Здравствуйте, SANblCH_SAN, Вы писали:
SAN>>Прошу помочь дописать программу VC++ 2010 MFC:
SAN>>соединение с базой 1C выполняется а как дальше, как какие-нибудь данные получить? как выполнить в базе 1с внешнюю обработку?
_>Используйте для работы с СОМ врапперы: _com_ptr_t, _variant_t, _bstr_t и т.д. ну или свои. СОМ и так своеобразен чтобы с ним вручную возится. Сделайте себе враппер для IDispatch и наступит счастье.
_>По теме, надо курить объектную модель которая торчит из IDispatch и пробовать вызывать методы. Есть подозрение что они могут быть в документации к 1С. Гугл что говорит?
так случилось что что я плохо знаю язык С++, но надо дописать программу, поэтом мне был бы понятней простой пример.
есть у меня рабочий пример работы с базой 1с через V83.Application, но он мне не нравится:
void CExcelTestDlg::OnBnClickedTest2()
{
HRESULT hr;
VARIANT varRet;
CLSID cls8;
hr = v8COMBase.CreateInstance(L"V83.Application"); // создаем COM соединение с 1С
if( FAILED(hr) ) // проверка на присутствие 1С Automation Sever-а
{
AfxMessageBox(_T("Переустановите 1С Предприятие!"));
return;
}
CString m_strPath = _T("C:\\base");
CString m_Usr = _T("Администратор");
CString m_Pwd = _T("");
varRet = v8COMBase.Invoke(L"Connect", L"File=C:\\base;Usr=Администратор;Pwd=;");
if( (varRet.vt != VT_BOOL)||(varRet.boolVal == 0) ) // проверка удачно/не удачно
{
AfxMessageBox(_T("Невозможно подключиться к базе 1С Предприятия"));
v8COMBase.Release();
return;
}
CDispatchHelper v8SpravPol; // наш справочник
v8SpravPol = v8COMBase.Invoke(L"NewObject", L"СправочникМенеджер.Пользователи");
if( !v8SpravPol )
{
AfxMessageBox(_T("Невозможно подключиться к [Справочник.Пользователи]"));
v8COMBase.Release();
return;
}
CDispatchHelper v8Admin; // наш Админ :)
v8Admin = v8SpravPol.Invoke(L"НайтиПоНаименованию", L"Администратор", false, (IDispatch*)NULL, (IDispatch*)NULL);
if( !v8Admin )
{
AfxMessageBox(_T("Пользователь Администратор не найден"));
v8SpravPol.Release();
v8COMBase.Release();
return;
}
VARIANT varRet1; // переменная для хранения результата
varRet1 = v8Admin.Get(L"Наименование"); // получаем значение поля
AfxMessageBox(_T(CString(varRet1.bstrVal))); // выводим сообщение о прочитанном имени пользователя
v8Admin.Release(); // Админ
v8SpravPol.Release(); // справочник
}
Здравствуйте, saf_e, Вы писали:
_>Здравствуйте, SANblCH_SAN, Вы писали:
SAN>>Прошу помочь дописать программу VC++ 2010 MFC:
SAN>>соединение с базой 1C выполняется а как дальше, как какие-нибудь данные получить? как выполнить в базе 1с внешнюю обработку?
_>Используйте для работы с СОМ врапперы: _com_ptr_t, _variant_t, _bstr_t и т.д. ну или свои. СОМ и так своеобразен чтобы с ним вручную возится. Сделайте себе враппер для IDispatch и наступит счастье.
_>По теме, надо курить объектную модель которая торчит из IDispatch и пробовать вызывать методы. Есть подозрение что они могут быть в документации к 1С. Гугл что говорит?
так случилось что что я плохо знаю язык С++, но надо дописать программу, поэтом мне был бы понятней простой пример.
есть у меня рабочий пример работы с базой 1с через V83.Application, но он мне не нравится:
класс CDispatchHelper, находится тут:
Кhttp://files.rsdn.ru/120582/DispatchHelper.cpp
http://files.rsdn.ru/120582/DispatchHelper.h
Так вот, меняю я строку:
На строку:
в классе CDispatchHelper, т.е :
http://files.rsdn.ru/120582/DispatchHelper.h
меняю строку
на строку:
После этого не работает
_>Здравствуйте, SANblCH_SAN, Вы писали:
SAN>>Прошу помочь дописать программу VC++ 2010 MFC:
SAN>>соединение с базой 1C выполняется а как дальше, как какие-нибудь данные получить? как выполнить в базе 1с внешнюю обработку?
_>Используйте для работы с СОМ врапперы: _com_ptr_t, _variant_t, _bstr_t и т.д. ну или свои. СОМ и так своеобразен чтобы с ним вручную возится. Сделайте себе враппер для IDispatch и наступит счастье.
_>По теме, надо курить объектную модель которая торчит из IDispatch и пробовать вызывать методы. Есть подозрение что они могут быть в документации к 1С. Гугл что говорит?
так случилось что что я плохо знаю язык С++, но надо дописать программу, поэтом мне был бы понятней простой пример.
есть у меня рабочий пример работы с базой 1с через V83.Application, но он мне не нравится:
void CExcelTestDlg::OnBnClickedTest2()
{
HRESULT hr;
VARIANT varRet;
CLSID cls8;
hr = v8COMBase.CreateInstance(L"V83.Application"); // создаем COM соединение с 1С
if( FAILED(hr) ) // проверка на присутствие 1С Automation Sever-а
{
AfxMessageBox(_T("Переустановите 1С Предприятие!"));
return;
}
CString m_strPath = _T("C:\\base");
CString m_Usr = _T("Администратор");
CString m_Pwd = _T("");
varRet = v8COMBase.Invoke(L"Connect", L"File=C:\\base;Usr=Администратор;Pwd=;");
if( (varRet.vt != VT_BOOL)||(varRet.boolVal == 0) ) // проверка удачно/не удачно
{
AfxMessageBox(_T("Невозможно подключиться к базе 1С Предприятия"));
v8COMBase.Release();
return;
}
CDispatchHelper v8SpravPol; // наш справочник
v8SpravPol = v8COMBase.Invoke(L"NewObject", L"СправочникМенеджер.Пользователи");
if( !v8SpravPol )
{
AfxMessageBox(_T("Невозможно подключиться к [Справочник.Пользователи]"));
v8COMBase.Release();
return;
}
CDispatchHelper v8Admin; // наш Админ :)
v8Admin = v8SpravPol.Invoke(L"НайтиПоНаименованию", L"Администратор", false, (IDispatch*)NULL, (IDispatch*)NULL);
if( !v8Admin )
{
AfxMessageBox(_T("Пользователь Администратор не найден"));
v8SpravPol.Release();
v8COMBase.Release();
return;
}
VARIANT varRet1; // переменная для хранения результата
varRet1 = v8Admin.Get(L"Наименование"); // получаем значение поля
AfxMessageBox(_T(CString(varRet1.bstrVal))); // выводим сообщение о прочитанном имени пользователя
v8Admin.Release(); // Админ
v8SpravPol.Release(); // справочник
}
класс CDispatchHelper, находится тут:
Кhttp://files.rsdn.ru/120582/DispatchHelper.cpp
http://files.rsdn.ru/120582/DispatchHelper.h
Так вот, меняю я строку:
hr = v8COMBase.CreateInstance(L"V83.Application"); // создаем COM соединение с 1С
На строку:
hr = v8COMBase.CreateInstance(L"V83.COMConnector"); // создаем COM соединение с 1С
в классе CDispatchHelper, т.е :
http://files.rsdn.ru/120582/DispatchHelper.h
меняю строку
HRESULT CreateInstance(LPCOLESTR sProgID, DWORD dwClsContext = CLSCTX_LOCAL_SERVER);
на строку:
HRESULT CreateInstance(LPCOLESTR sProgID, DWORD dwClsContext = CLSCTX_INPROC_SERVER);
После этого не работает