При организации интеграции между 1С:Предприятием 8.3 и базами на платформе 1С 7.7 через COM-соединение (OLE Automation Server) разработчики нередко сталкиваются с ситуацией, когда объект приложения успешно создается, блок перехвата ошибок отрабатывает без исключений, однако при первой же попытке вызвать CreateObject или СоздатьОбъект возникает ошибка: «Неудачная попытка создания объекта: 0».
Разберем детально, почему возникает такое поведение, проанализируем ошибки в коде инициализации и рассмотрим надежные способы настройки взаимодействия двух платформ.
Посмотрим на типичный фрагмент кода, в котором возникает ошибка:
&НаКлиенте
Перем Торг;
&НаКлиенте
Функция ПодключитьсяК77()
Пользователь = "123";
Пароль = "654258";
Торг = Новый COMОбъект("V77.Application");
СтрокаПодключения = "/D""" + КаталогИБПриемника + """ /N""" + Пользователь + """ /P""" + Пароль + """";
Попытка
Торг.Initialize(Торг.RMTrade, СтрокаПодключения, "NO_SPLASH_SHOW");
Сообщить("Связь установлена");
Возврат Истина;
Исключение
Сообщить("Связь с БД-Торговля не установлена!");
Возврат Ложь;
КонецПопытки;
КонецФункции
Проанализируем этот фрагмент. При выполнении метода Initialize в платформе 1С 7.7 в случае неудачного входа (например, неверно указан пользователь, база заблокирована или не найдена лицензия) исключение не генерируется. Метод просто возвращает булево значение Ложь. Конструкция Попытка ... Исключение считает вызов успешным и переходит к ветке «Связь установлена», хотя OLE-сервер остался неинициализированным.
Так как инициализация базы фактически не завершилась, контекст объектов 7.7 недоступен. Любой последующий вызов создания объектов, например Торг.CreateObject("Запрос") или Торг.CreateObject("Справочник.Номенклатура"), завершается аварийно с кодом ошибки 0.
Разберем по шагам правильный алгоритм подключения. Необходимо проверять результат выполнения функции 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 Цикл
// Обработка результатов
КонецЦикла;
КонецЕсли;
В некоторых случаях вызов методов OLE-объекта напрямую может вызывать сложности с трансляцией типов. В 1С 7.7 доступен альтернативный синтаксис создания объектов через интерпретатор выражений EvalExpr:
Запрос77 = Торг.EvalExpr("СоздатьОбъект(""Запрос"")");
Этот способ обращается к внутреннему механизму создания объектов платформы 7.7 в контексте запущенной базы данных.
Если проверка возвращаемого значения показывает Ложь, выясним сопутствующие причины, мешающие инициализации OLE-сервера:
V77.Application — сетевая версия, V77S.Application — версия для работы с SQL-сервером, V77L.Application — локальная версия.Initialize указывает компоненту: RMTrade («Торговля и Склад»), RMAccounts («Бухгалтерский учет»), RMEngine или RMNull (общий режим запуска). Если конфигурация не содержит выбранной компоненты, инициализация завершится ошибкой.Новый COMОбъект("V77.Application") из 64-битного клиента или сервера 1С 8.3 приведет к ошибке отсутствия класса. Для работы из 64-битного процесса требуется настройка DCOM-приложения в службах компонентов Windows через dllhost.exe.ПриНачалеРаботыСистемы модуля 7.7 вызываются предупреждения, вопросы или окно подтверждения кодовой страницы сортировки, OLE-сессия зависает и не завершает вход.1cv7.exe или 1cv7s.exe, блокирующие служебные файлы базы данных. Рекомендуется завершить фоновые процессы 1С 7.7 в диспетчере задач.