В данной статье показано, как можно работать с 1С Предприятием из С++ с помощью OLE DB. Дело в том, что 1С не предоставляет для своих пользователей библиотеки импорта (*.tlb), поэтому единственный способ работы (если не использовать какие либо обёртки) - это позднее связывание.

Мы организуем всю необходимую работу с 1С в виде отдельной экспортируемой функции глобального модуля (я надеюсь, Вы уже научились открывать в 1С Глобальный модуль и добавлять в него экспортируемые функции). Мы будем вызывать нужную функцию глобального модуля, которая будет возвращать нужное значение. Для многих практических приложений этого вполне достаточно.

1: #include <objbase.h>
2: #include <comdef.h>
3:
//для начала инициализируем COM
4: HRESULT hr = CoInitialize(NULL);
5: if(FAILED(hr))
6: {
7:     AfxMessageBox("Невозможно инициализировать COM!");
8:     return FALSE;
9: }
10:
11: //Получаем ID сервера OLE Automation 1С Предприятия.
12: CLSID cls77;
13: hr = CLSIDFromProgID(L"V77.Application", &cls77);
14: if(FAILED(hr))
15: {
16:     AfxMessageBox("Переустановите 1С Предприятие!");
17:     CoUninitialize();
18:     return FALSE;
19: }
20:
21: //основной интерфейс IDispatch
22: IDispatch *pDispV77;
23: //CLSCTX_LOCAL_SERVER - запуск в отдельном процесе
24: hr = CoCreateInstance(cls77, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch,
25:    (void**)&pDispV77);
26:
27: if(FAILED(hr))
28: {
29:     AfxMessageBox("Невозможно инициализировать интерфейс 1С.");
30:     CoUninitialize();
31:     return FALSE;
32: }
33:
34: /* 1С предоставляет для запуска приложения функцию Initialize.
35: Вызов этой функции выглядит в VB вот так:
36: V7.Initialize(V7.RMTrade,"D:\1C\Base /N"+UserName ,"NO_SPLASH_SHOW");
37: В C++ мы должны помнить, что аргументы необходимо заталкивать задом наперёд и
38: RMTrade - это тоже IDispatch интерфейс и его сперва нужно получить.*/
39:
40: VARIANT vRet;
41: DISPID dispIDRmTrade, dispIDInitialize;
42: DISPPARAMS args = {0, 0, 0, 0};
43: VARIANT vars[3];  // Параметры для вызова Initialize
44: //Мы получим IDispatch интерфейс от RMTrade сразу в vars[2]
45: BSTR rmTrade = L"RMTrade";
46:
47: hr = pDispV77->GetIDsOfNames(IID_NULL, &rmTrade, 1, 0, &dispIDRmTrade);
48: if (FAILED(hr))
49: {
50:     AfxMessageBox("Невозможно получить ID от RMTrade");
51:     if (pDispV77)
52:         pDispV77->Release();
53:     CoUninitialize();
54:     return FALSE;
55: }
56:
57: hr = pDispV77->Invoke(dispIDRmTrade, IID_NULL, 0, DISPATCH_PROPERTYGET, &args,
58:     &vars[2], NULL, NULL);
59: if (FAILED(hr))
60: {
61:     AfxMessageBox("Невозможно получить интерфейс от RMTrade");
62:     if (pDispV77)
63:         pDispV77->Release();
64:     CoUninitialize();
65:     return FALSE;
66: }
67:
68: //нужно получить ID для Initialize(..);
69: BSTR init = L"Initialize";
70:
hr = pDispV77->GetIDsOfNames(IID_NULL, &init, 1, 0, &dispIDInitialize);
71: if (FAILED(hr))
72: {
73:     AfxMessageBox("Не удалось получить ID от Initialize")
74:     if (pDispV77)
75:         pDispV77->Release();
76:     CoUninitialize();
77:     return FALSE;
78: }
79:
80: //теперь - вызваем Initialize(..)
81: //но сперва необходимо заполнить массив аргументов функций
82: args.cArgs = 3;
83: args.rgvarg = vars;
84: vars[0] = _variant_t("NO_SPLASH_SHOW");
85: vars[1] = _variant_t("/D D:\1S /N Denis /P Denis ");
86: /*vars[2] - у нас уже есть, мы его получили при запросе
87: интерфейса RMTrade в момент предыдущего Invoke*/
88:
89: hr = pDispV77->Invoke(dispIDInitialize, IID_NULL, 0, DISPATCH_PROPERTYGET, &args,
90:      &vRet, NULL, NULL);
91: if(FAILED(hr)
92: {
93:     AfxMessageBox("Невозможно запустить 1С Предприятие");
94: }

После этих действий должно появиться окно, предлагающее задать имя базы, имя пользователя и т.п., возможно, это такая особенность дизайна 1С.
На сегодня все.