При организации обмена данными между платформами 1С 8 и 1С 7.7 разработчики часто сталкиваются с ошибкой инициализации OLE-соединения. Попытка создать объект через конструктор COMОбъект завершается исключением: «Ошибка при вызове конструктора (COMОбъект): Недопустимая строка с указанием класса». Разберем по шагам, почему возникает эта неполадка, как правильно зарегистрировать библиотеки «семерки» в операционной системе и как грамотно написать код инициализации базы.
Платформа 1С:Предприятие 7.7 выступает в роли локального OLE Automation сервера. Чтобы внешнее приложение (в данном случае процесс 1С 8) смогло обнаружить и запустить сервер 7.7 по его программному идентификатору (ProgID), в системном реестре Windows должны присутствовать соответствующие записи с указанием уникального идентификатора класса (CLSID) и пути к исполняемому файлу программы.
Ошибка «Недопустимая строка с указанием класса» сообщает о том, что переданный идентификатор не найден в системном реестре. Основные причины такого поведения:
Проанализируем строку инициализации. Часто разработчики пытаются поочередно перебирать все возможные классы. Важно точно знать, какая именно редакция платформы 7.7 установлена на рабочей станции:
1cv7s.exe).1cv7.exe).Если на компьютере установлена сетевая версия, вызов V77S.Application гарантированно вызовет ошибку отсутствия класса.
Рассмотрим способы внесения сведений о COM-сервере в реестр Windows.
Способ 1. Однократный интерактивный запуск от имени администратора.
При штатном старте исполняемый файл 1С 7.7 проверяет наличие своих записей в реестре и пытается зарегистрировать их автоматически. Однако в современных версиях Windows (начиная с Windows 7) механизм UAC блокирует запись в защищенные системные ветки, если программа запущена обычным пользователем.
1cv7.exe и 1cv7s.exe в диспетчере задач.C:\Program Files (x86)\1Cv77\BIN\1cv7.exe).Способ 2. Регистрация через командную строку.
Если запускать интерфейс не требуется, выполним прямую саморегистрацию через ключ /regserver:
cd /d "C:\Program Files (x86)\1Cv77\BIN"
1cv7.exe /regserver
Для SQL-версии аналогично выполняем 1cv7s.exe /regserver. Команда отработает в фоновом режиме без вывода сообщений.
В 64-разрядных операционных системах сведения о COM-сервере запишутся в подраздел HKEY_LOCAL_MACHINE\Software\Classes\WOW6432Node\CLSID.
Посмотрим на пример процедуры подключения к информационной базе 7.7 из кода 1С 8. Проанализируем алгоритм последовательного перебора версий платформы и процедуру инициализации сеанса через метод Initialize:
Функция ПодключитьБазу77(ПутьКБазе, ИмяПользователя = "", Пароль = "") Экспорт
База77 = Неопределено;
// Последовательно проверяем доступные классы OLE-сервера
Попытка
База77 = Новый COMОбъект("V77.Application");
Исключение
Попытка
База77 = Новый COMОбъект("V77S.Application");
Исключение
Попытка
База77 = Новый COMОбъект("V77L.Application");
Исключение
ВызватьИсключение "Не удалось инициализировать COM-объект 1С 7.7. Убедитесь, что сервер зарегистрирован в системе.";
КонецПопытки;
КонецПопытки;
КонецПопытки;
// Формируем параметры запуска
// Ключ NO_SPLASH_SHOW отключает показ заставки при старте
ПараметрыЗапуска = "/D""" + СокрЛП(ПутьКБазе) + """ /N""" + СокрЛП(ИмяПользователя) + """ /P""" + СокрЛП(Пароль) + """";
Результат = База77.Initialize(База77.RMTrade, ПараметрыЗапуска, "NO_SPLASH_SHOW");
Если Не Результат Тогда
База77 = Неопределено;
ВызватьИсключение "Ошибка авторизации или блокировки информационной базы 1С 7.7.";
КонецЕсли;
Возврат База77;
КонецФункции
Разберем важные нюансы, с которыми можно столкнуться после успешной регистрации класса:
Новый COMОбъект завершится ошибкой. В таком случае код подключения необходимо переносить на 32-разрядный клиент (в контекст НаКлиенте) либо настраивать COM+ приложение-суррогат через оснастку dcomcnfg (Службы компонентов), чтобы запуск происходил в отдельном процессе dllhost.exe.Неопределено, чтобы процесс 1cv7.exe корректно завершил свою работу.OrdNoChk.prm.