Здравствуйте, SANblCH_SAN, Вы писали:
SAN>соединение с базой 1C выполняется а как дальше, как какие-нибудь данные получить? как выполнить в базе 1с внешнюю обработку?
насчёт вопроса хз, но вот тут
SAN>
SAN> {
SAN> AfxMessageBox(_T("Невозможно подключиться к базе 1С Предприятия"));
SAN> if (pv8) pv8->Release();
SAN> CoUninitialize();
SAN> return;
SAN> }
SAN>
вы не освобождаете args.rgvarg
Re[2]: Работа из VC++ с базой 1С83 через V83.COMConnector
Здравствуйте, Sni4ok, Вы писали:
S>Здравствуйте, SANblCH_SAN, Вы писали:
SAN>>соединение с базой 1C выполняется а как дальше, как какие-нибудь данные получить? как выполнить в базе 1с внешнюю обработку?
S>насчёт вопроса хз, но вот тут
SAN>>
SAN>> {
SAN>> AfxMessageBox(_T("Невозможно подключиться к базе 1С Предприятия"));
SAN>> if (pv8) pv8->Release();
SAN>> CoUninitialize();
SAN>> return;
SAN>> }
SAN>>
S>вы не освобождаете args.rgvarg
Спасибо за поправку, согласен.
Re: Работа из VC++ с базой 1С83 через V83.COMConnector
Здравствуйте, SANblCH_SAN, Вы писали:
SAN>Прошу помочь дописать программу VC++ 2010 MFC:
SAN>соединение с базой 1C выполняется а как дальше, как какие-нибудь данные получить? как выполнить в базе 1с внешнюю обработку?
Используйте для работы с СОМ врапперы: _com_ptr_t, _variant_t, _bstr_t и т.д. ну или свои. СОМ и так своеобразен чтобы с ним вручную возится. Сделайте себе враппер для IDispatch и наступит счастье.
По теме, надо курить объектную модель которая торчит из IDispatch и пробовать вызывать методы. Есть подозрение что они могут быть в документации к 1С. Гугл что говорит?
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(); // справочник
}
Здравствуйте, SANblCH_SUN, Вы писали:
SAN>так случилось что что я плохо знаю язык С++, но надо дописать программу, поэтом мне был бы понятней простой пример.
SAN>После этого ошибка: SAN>Невозможно подключиться к базе 1С Предприятия
а что за ошибка? что говорит GetErrorInfo?
Re[4]: Работа из VC++ с базой 1С83 через V83.COMConnector
Здравствуйте, saf_e, Вы писали:
_>Здравствуйте, SANblCH_SUN, Вы писали:
SAN>>так случилось что что я плохо знаю язык С++, но надо дописать программу, поэтом мне был бы понятней простой пример.
SAN>>После этого ошибка: SAN>>Невозможно подключиться к базе 1С Предприятия
_>а что за ошибка? что говорит GetErrorInfo?
как воспользоваться командой GetErrorInfo, или как вывести ошибку?
Re[5]: Работа из VC++ с базой 1С83 через V83.COMConnector
Здравствуйте, SANblCH_SUN, Вы писали:
SAN>Здравствуйте, saf_e, Вы писали:
_>>Здравствуйте, SANblCH_SUN, Вы писали:
SAN>>>так случилось что что я плохо знаю язык С++, но надо дописать программу, поэтом мне был бы понятней простой пример.
SAN>>>После этого ошибка: SAN>>>Невозможно подключиться к базе 1С Предприятия
_>>а что за ошибка? что говорит GetErrorInfo?
SAN>как воспользоваться командой GetErrorInfo, или как вывести ошибку?
Здравствуйте, saf_e, Вы писали:
_>Здравствуйте, SANblCH_SUN, Вы писали:
SAN>>Здравствуйте, saf_e, Вы писали:
_>>>Здравствуйте, SANblCH_SUN, Вы писали:
SAN>>>>так случилось что что я плохо знаю язык С++, но надо дописать программу, поэтом мне был бы понятней простой пример.
SAN>>>>После этого ошибка: SAN>>>>Невозможно подключиться к базе 1С Предприятия
_>>>а что за ошибка? что говорит GetErrorInfo?
Здравствуйте, saf_e, Вы писали:
_>Здравствуйте, SANblCH_SUN, Вы писали:
SAN>>Здравствуйте, saf_e, Вы писали:
_>>>Здравствуйте, SANblCH_SUN, Вы писали:
SAN>>>>так случилось что что я плохо знаю язык С++, но надо дописать программу, поэтом мне был бы понятней простой пример.
SAN>>>>После этого ошибка: SAN>>>>Невозможно подключиться к базе 1С Предприятия
_>>>а что за ошибка? что говорит GetErrorInfo?
Что бы не заниматься мазохизмом лучше основную часть вынести во внешнюю обработку http://www.forum.mista.ru/topic.php?id=698585
Которую легко отлаживать в среде 1С, а из C++ сделать всего несколько операторов. Это касается не только С++ при вызове через СОМ.
и солнце б утром не вставало, когда бы не было меня
Re[9]: Работа из VC++ с базой 1С83 через V83.COMConnector
Здравствуйте, SANblCH_SUN, Вы писали:
SAN>Здравствуйте, saf_e, Вы писали:
SAN>Необработанное исключение в "0x77dc15de" в Run.exe:0xC0000005: SAN>Нарушение прав доступа при чтении "0x00000000".
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, SANblCH_SAN, Вы писали:
S>Что бы не заниматься мазохизмом лучше основную часть вынести во внешнюю обработку S>http://www.forum.mista.ru/topic.php?id=698585 S> Которую легко отлаживать в среде 1С, а из C++ сделать всего несколько операторов. Это касается не только С++ при вызове через СОМ.
Как приведенный код С# реализовать в VC++ 2010 MFC?
Я как раз и стремлюсь выполнить соединение с 1с базой и вызвать в ней внешнюю обработку, но все это сделать из VC++.
Причем хочу использовать соединение через V83.COMConnector, что получилось, но только соединится с базой а вот вызвать внешнюю обработку или глобальную функцию из 1с базы не получается.
Напротив через V83.Application смог получить имя пользователя 1с базы, но этот вариант не подходит.
Re[3]: Работа из VC++ с базой 1С83 через V83.COMConnector
Здравствуйте, SANblCH_SUN, Вы писали:
SAN>Здравствуйте, Serginio1, Вы писали:
S>>Здравствуйте, SANblCH_SAN, Вы писали:
S>>Что бы не заниматься мазохизмом лучше основную часть вынести во внешнюю обработку S>>http://www.forum.mista.ru/topic.php?id=698585 S>> Которую легко отлаживать в среде 1С, а из C++ сделать всего несколько операторов. Это касается не только С++ при вызове через СОМ.
SAN>Как приведенный код С# реализовать в VC++ 2010 MFC? SAN>Я как раз и стремлюсь выполнить соединение с 1с базой и вызвать в ней внешнюю обработку, но все это сделать из VC++. SAN>Причем хочу использовать соединение через V83.COMConnector, что получилось, но только соединится с базой а вот вызвать внешнюю обработку или глобальную функцию из 1с базы не получается.
SAN>Напротив через V83.Application смог получить имя пользователя 1с базы, но этот вариант не подходит.
Ну до динамиков в C# тоже приходилось писать через Reflection. На С++ полно враперов для упрощения работы с IDispatch. Кстати можешь и описать диспинтерфейсы. Например http://files.rsdn.ru/19608/C1InDelphi.zip правда там на Delphi.
и солнце б утром не вставало, когда бы не было меня
Re[10]: Работа из VC++ с базой 1С83 через V83.COMConnector
Продолжаю тему!
Я привел два варианта кода через V83.COMConnector и V83.Application к одному виду:
void CMy1C_V83_ApplicationDlg::OnBnClickedButton1()
{
HRESULT hr = CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
if(FAILED(hr))
{
AfxMessageBox(_T("Невозможно инициализировать COM!"));
return;
}
CLSID cls8;
hr = CLSIDFromProgID(L"V83.Application", &cls8);
if(FAILED(hr))
{
AfxMessageBox(_T("Переустановите 1С Предприятие!"));
CoUninitialize();
return;
}
IDispatch *pv8 = NULL;
hr = CoCreateInstance(cls8,NULL,CLSCTX_LOCAL_SERVER,IID_IDispatch,(void**)&pv8);
if(FAILED(hr) || !pv8)
{
AfxMessageBox(_T("Невозможно инициализировать 1С Предприятия"));
if (pv8) pv8->Release();
CoUninitialize();
return;
}
DISPID dispIDInitialize;
OLECHAR * init = L"Connect";
hr = pv8->GetIDsOfNames(IID_NULL,&init,1,LOCALE_SYSTEM_DEFAULT,&dispIDInitialize);
if (FAILED(hr))
{
AfxMessageBox(_T("Не удалось получить ID от Connect"));
if (pv8) pv8->Release();
CoUninitialize();
return;
}
// Connect принимает только 1 параметр
DISPPARAMS args = {NULL,NULL,0,0};
args.rgvarg = new VARIANT[1];
args.cArgs = 1;
VariantInit(args.rgvarg);
args.rgvarg[0].vt = VT_BSTR;
args.rgvarg[0].bstrVal = SysAllocString(L"File=\"C:\\base\";Usr=\"Администратор\"");
hr = pv8->Invoke(dispIDInitialize,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,&args,NULL,NULL,NULL);
if (FAILED(hr))
{
AfxMessageBox(_T("Невозможно подключиться к базе 1С Предприятия"));
if (pv8) pv8->Release();
delete [] args.rgvarg;
CoUninitialize();
return;
}
//------------------------------------------------------------------------------------------------
DISPID dispidFunc;
LPOLESTR sFunc = L"ExternalDataProcessors";
hr = pv8->GetIDsOfNames(IID_NULL, &sFunc, 1, 0, &dispidFunc);
if (FAILED(hr))
{
AfxMessageBox(_com_error(GetLastError()).ErrorMessage(),MB_ICONSTOP);
AfxMessageBox(_com_error(hr).ErrorMessage(),MB_ICONSTOP);
AfxMessageBox(_T("Невозможно получить ExternalDataProcessors"));
if (pv8) pv8->Release();
CoUninitialize();
return;
}
//----------------------------------------------------------------------------------
pv8->Release();
CoUninitialize();
SysFreeString(args.rgvarg[0].bstrVal);
delete [] args.rgvarg;
}
void CMy1С_V83_COMConnectorDlg::OnBnClickedButton1()
{
//для начала инициализируем COM
HRESULT hr = CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
if(FAILED(hr))
{
AfxMessageBox(_T("Невозможно инициализировать COM!"));
return;
}
CLSID cls8;
hr = CLSIDFromProgID(L"V83.COMConnector",&cls8);
if(FAILED(hr))
{
AfxMessageBox(_T("Переустановите 1С Предприятие!"));
CoUninitialize();
return;
}
IDispatch *pv8 = NULL;
hr = CoCreateInstance(cls8,NULL,CLSCTX_INPROC_SERVER,IID_IDispatch,(void**)&pv8);
if(FAILED(hr) || !pv8)
{
AfxMessageBox(_T("Невозможно инициализировать 1С Предприятия"));
if (pv8) pv8->Release();
CoUninitialize();
return;
}
DISPID dispIDInitialize;
OLECHAR * init = L"Connect";
hr = pv8->GetIDsOfNames(IID_NULL,&init,1,LOCALE_SYSTEM_DEFAULT,&dispIDInitialize);
if (FAILED(hr))
{
AfxMessageBox(_T("Не удалось получить ID от Connect"));
if (pv8) pv8->Release();
CoUninitialize();
return;
}
// Connect принимает только 1 параметр
DISPPARAMS args = {NULL,NULL,0,0};
args.rgvarg = new VARIANT[1];
args.cArgs = 1;
VariantInit(args.rgvarg);
args.rgvarg[0].vt = VT_BSTR;
args.rgvarg[0].bstrVal = SysAllocString(L"File=\"C:\\base\";Usr=\"Администратор\"");
hr = pv8->Invoke(dispIDInitialize,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,&args,NULL,NULL,NULL);
if (FAILED(hr))
{
AfxMessageBox(_T("Невозможно подключиться к базе 1С Предприятия"));
if (pv8) pv8->Release();
delete [] args.rgvarg;
CoUninitialize();
return;
}
//------------------------------------------------------------------------------------------------
DISPID dispidFunc;
LPOLESTR sFunc = L"ExternalDataProcessors";
hr = pv8->GetIDsOfNames(IID_NULL, &sFunc, 1, 0, &dispidFunc);
if (FAILED(hr))
{
AfxMessageBox(_com_error(GetLastError()).ErrorMessage(),MB_ICONSTOP);
AfxMessageBox(_com_error(hr).ErrorMessage(),MB_ICONSTOP);
if (pv8) pv8->Release();
delete [] args.rgvarg;
CoUninitialize();
return;
}
//----------------------------------------------------------------------------------
pv8->Release();
CoUninitialize();
SysFreeString(args.rgvarg[0].bstrVal);
delete [] args.rgvarg;
}
В случае V83.Application вызов метода "ExternalDataProcessors" (для запуска в базе 1с внешней обработки) проходит положительно,
а в случае V83.COMConnector получаю сообщение от hr = Unknown name.
Соединение с базой выполняется в обоих случаях без ошибок.
В других системах программирования при варианте V83.COMConnector метод "ExternalDataProcessors" вызывается, но почему тут не работает, в чем трабл?
Re[11]: Работа из VC++ с базой 1С83 через V83.COMConnector
Здравствуйте, SANblCH_SUN, Вы писали:
SAN>Продолжаю тему! SAN>Я привел два варианта кода через V83.COMConnector и V83.Application к одному виду:
SAN>В случае V83.Application вызов метода "ExternalDataProcessors" (для запуска в базе 1с внешней обработки) проходит положительно, SAN>а в случае V83.COMConnector получаю сообщение от hr = Unknown name.
SAN>Соединение с базой выполняется в обоих случаях без ошибок. SAN>В других системах программирования при варианте V83.COMConnector метод "ExternalDataProcessors" вызывается, но почему тут не работает, в чем трабл?