Почему не работает CreateObject при COM-подключении из 1С 8.3 к 1С 7.7?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При организации интеграции между 1С:Предприятием 8.3 и базами на платформе 1С 7.7 через COM-соединение (OLE Automation Server) разработчики нередко сталкиваются с ситуацией, когда объект приложения успешно создается, блок перехвата ошибок отрабатывает без исключений, однако при первой же попытке вызвать CreateObject или СоздатьОбъект возникает ошибка: «Неудачная попытка создания объекта: 0».

Разберем детально, почему возникает такое поведение, проанализируем ошибки в коде инициализации и рассмотрим надежные способы настройки взаимодействия двух платформ.

Главная причина: особенности работы метода Initialize

Посмотрим на типичный фрагмент кода, в котором возникает ошибка:


&НаКлиенте
Перем Торг;

&НаКлиенте
Функция ПодключитьсяК77()
    Пользователь = "123";
    Пароль = "654258";
    Торг = Новый COMОбъект("V77.Application"); 
    СтрокаПодключения = "/D""" + КаталогИБПриемника + """ /N""" + Пользователь + """ /P""" + Пароль + """";
    Попытка
        Торг.Initialize(Торг.RMTrade, СтрокаПодключения, "NO_SPLASH_SHOW");
        Сообщить("Связь установлена");
        Возврат Истина;
    Исключение
        Сообщить("Связь с БД-Торговля не установлена!");
        Возврат Ложь;
    КонецПопытки;
КонецФункции

Проанализируем этот фрагмент. При выполнении метода Initialize в платформе 1С 7.7 в случае неудачного входа (например, неверно указан пользователь, база заблокирована или не найдена лицензия) исключение не генерируется. Метод просто возвращает булево значение Ложь. Конструкция Попытка ... Исключение считает вызов успешным и переходит к ветке «Связь установлена», хотя OLE-сервер остался неинициализированным.

Так как инициализация базы фактически не завершилась, контекст объектов 7.7 недоступен. Любой последующий вызов создания объектов, например Торг.CreateObject("Запрос") или Торг.CreateObject("Справочник.Номенклатура"), завершается аварийно с кодом ошибки 0.

Решение 1. Корректная проверка возвращаемого значения Initialize

Разберем по шагам правильный алгоритм подключения. Необходимо проверять результат выполнения функции Initialize явным образом:


&НаКлиенте
Функция УстановитьСоединениеС77(КаталогИБ, ИмяПользователя, ПарольПользователя)
    Торг = Новый COMОбъект("V77.Application");
    
    // Формируем параметры запуска базы
    СтрокаПараметров = "/D""" + СокрЛП(КаталогИБ) + """ /N""" + СокрЛП(ИмяПользователя) + """ /P""" + СокрЛП(ПарольПользователя) + """";
    
    // Проверяем булевый результат инициализации
    РезультатИнициализации = Торг.Initialize(Торг.RMTrade, СтрокаПараметров, "NO_SPLASH_SHOW");
    
    Если Не РезультатИнициализации Тогда
        Сообщить("Не удалось инициализировать базу 1С 7.7! Проверьте логин, пароль и доступ к каталогу.");
        Торг = Неопределено;
        Возврат Ложь;
    КонецЕсли;
    
    Сообщить("Соединение с 1С 7.7 успешно установлено.");
    Возврат Истина;
КонецФункции

После успешного прохождения проверки создание прикладных объектов будет отрабатывать штатно:


Запрос77 = Торг.CreateObject("Запрос");
ТекстЗапроса = 
"//{{ЗАПРОС(Сформировать)
|Период с ВыбНачПериода по ВыбКонПериода;
|Номенклатура = Регистр.ОстаткиТоваров.Номенклатура;
|Количество = Регистр.ОстаткиТоваров.Количество;
|Функция КонОст = КонОст(Количество);
|Группировка Номенклатура без групп;
//}}ЗАПРОС";

Если Запрос77.Выполнить(ТекстЗапроса) = 1 Тогда
    Пока Запрос77.Группировка() = 1 Цикл
        // Обработка результатов
    КонецЦикла;
КонецЕсли;

Решение 2. Альтернативное создание объектов через EvalExpr

В некоторых случаях вызов методов OLE-объекта напрямую может вызывать сложности с трансляцией типов. В 1С 7.7 доступен альтернативный синтаксис создания объектов через интерпретатор выражений EvalExpr:

Запрос77 = Торг.EvalExpr("СоздатьОбъект(""Запрос"")");

Этот способ обращается к внутреннему механизму создания объектов платформы 7.7 в контексте запущенной базы данных.

Дополнительные факторы, блокирующие создание объектов

Если проверка возвращаемого значения показывает Ложь, выясним сопутствующие причины, мешающие инициализации OLE-сервера:

  1. Несоответствие ProgID и установленной платформы. Проверим идентификатор COM-сервера. Для разных версий 1С 7.7 используются различные ProgID: V77.Application — сетевая версия, V77S.Application — версия для работы с SQL-сервером, V77L.Application — локальная версия.
  2. Несоответствие режима работы и установленных компонент. Первый параметр метода Initialize указывает компоненту: RMTrade («Торговля и Склад»), RMAccounts («Бухгалтерский учет»), RMEngine или RMNull (общий режим запуска). Если конфигурация не содержит выбранной компоненты, инициализация завершится ошибкой.
  3. Разрядность платформы (32-bit vs 64-bit). OLE-сервер 1С 7.7 является исключительно 32-битным приложением. Вызов Новый COMОбъект("V77.Application") из 64-битного клиента или сервера 1С 8.3 приведет к ошибке отсутствия класса. Для работы из 64-битного процесса требуется настройка DCOM-приложения в службах компонентов Windows через dllhost.exe.
  4. Модальные окна при старте. Если в процедуре ПриНачалеРаботыСистемы модуля 7.7 вызываются предупреждения, вопросы или окно подтверждения кодовой страницы сортировки, OLE-сессия зависает и не завершает вход.
  5. Зависшие процессы. Предыдущие аварийно завершенные сессии могут оставлять в памяти процессы 1cv7.exe или 1cv7s.exe, блокирующие служебные файлы базы данных. Рекомендуется завершить фоновые процессы 1С 7.7 в диспетчере задач.
← На главную