Информация об изменениях

Сообщение Re[2]: Работа из VC++ с базой 1С83 через V83.COMConnector от 13.02.2015 11:23

Изменено 13.02.2015 11:32 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, но он мне не нравится:

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);



После этого не работает
Re[2]: Работа из VC++ с базой 1С83 через V83.COMConnector
Здравствуйте, saf_e, Вы писали:

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



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