При интеграции 1С:Предприятия с почтовым клиентом Lotus Notes (HCL Notes) разработчики часто сталкиваются с системной ошибкой -2147221164(0x80040154): Класс не зарегистрирован. Эта ошибка возникает на самом первом этапе — при попытке инициализировать COM-объект в коде 1С. В данной статье мы подробно разберем, почему возникает эта проблема, и проанализируем пошаговые сценарии ее решения, основываясь на техническом устройстве операционной системы Windows и платформы 1С.
Первым делом проанализируем ситуацию, в которой возникает ошибка. В коде 1С инициализация выглядит следующим образом:
Попытка
Лотус = Новый COMОбъект("Lotus.NotesSession");
Исключение
Сообщить("Ошибка при создании объекта: " + ОписаниеОшибки());
КонецПопытки;
Система выдает сообщение о том, что класс не зарегистрирован, хотя сам клиент Lotus Notes установлен на компьютере и успешно функционирует. Основная причина кроется в разрядности (битности) приложений. Исторически клиент Lotus Notes (даже версии 8.5, 9.0 и выше) является 32-битным (x86) приложением. Современные версии 1С:Предприятия 8.3 часто устанавливаются как 64-битные (x64) приложения. В архитектуре Windows 64-битный процесс не может напрямую загрузить 32-битную DLL-библиотеку COM-сервера. Выясним, как это проверить: откроем диспетчер задач и найдем процесс 1cv8.exe или 1cv8c.exe. Если рядом с названием нет пометки "32 бита", значит, ваша 1С работает в 64-битном режиме, что и вызывает конфликт с 32-битным COM-объектом Lotus.
Если нам необходимо оставить 64-битную платформу 1С, но при этом заставить ее работать с 32-битным Lotus Notes, мы можем использовать технологию COM+. Она позволяет создать специальную «обертку», которая будет работать как отдельный процесс, транслирующий вызовы между 1С и Lotus. Разберем этот процесс по шагам:
Win + R и введем команду dcomcnfg. Откроется окно «Службы компонентов».LotusNotesWrapper) и установим тип «Серверное приложение».domobj.tlb или основная библиотека notes32.dll, расположенная в папке установки Lotus Notes (например, C:\Program Files (x86)\IBM\Lotus\Notes).После этой настройки Windows будет пробрасывать вызовы от 64-битной 1С к 32-битной библиотеке через суррогатный процесс dllhost.exe. Проанализируем ситуацию: теперь 1С будет обращаться не к реестру напрямую, а к настроенному компоненту COM+.
Иногда ошибка вызвана тем, что библиотеки Lotus Notes просто не прописаны в системном реестре должным образом. Рассмотрим, как исправить это вручную. Нам понадобится утилита regsvr32, запущенная от имени администратора. Однако стоит помнить, что основные функции Lotus Notes находятся в библиотеке nnotes.dll, которая не является стандартным COM-сервером для regsvr32, но она должна быть доступна системе через переменную окружения PATH.
Проверим и настроим переменные окружения:
Path.C:\Lotus\Notes.PATH необходимо обязательно перезагрузить компьютер или как минимум перезапустить службу 1С:Предприятия (если код выполняется на сервере).Также разберем работу с файлом notes32.reg. В папке с установленным клиентом часто идет файл регистрации реестра. Откройте его через текстовый редактор и убедитесь, что все пути к файлам внутри него соответствуют реальности. После проверки запустите его от имени администратора.
Посмотрим на пример из практики. Если объект Lotus.NotesSession упорно отказывается создаваться, мы можем проверить доступность интерфейсного объекта. Это поможет понять, в чем проблема: в отсутствии регистрации библиотек или в правах доступа к Backend-части почтового клиента.
Попробуем следующий код в 1С:
// Попытка инициализировать интерфейсный объект
ЛотусUI = Новый COMОбъект("Notes.NotesUIWorkspace");
Если ЛотусUI <> Неопределено Тогда
Сообщить("Интерфейсный объект успешно создан, проблема в регистрации объектной модели (Backend)");
КонецЕсли;
Если Notes.NotesUIWorkspace создается, а Lotus.NotesSession — нет, это верный признак того, что библиотека типов domobj.tlb не зарегистрирована или не видна 1С из-за разницы в битности. В этом случае наиболее надежным методом остается использование решения с COM+.
Проанализируем особенности работы в Windows 10. В этой операционной системе контроль учетных записей (UAC) работает довольно жестко. Даже если вы являетесь администратором, 1С может не иметь прав на чтение определенных веток реестра HKEY_CLASSES_ROOT. Рассмотрим шаги для исключения этой причины:
notes.ini и он корректно настроен.Рассмотрим правильную структуру кода для подключения к Lotus с учетом обработки ошибок. Мы рекомендуем всегда использовать блок Попытка...Исключение, так как внешние COM-объекты — это всегда зона риска.
Функция ПодключитьсяКЛотусу()
Попытка
// Пытаемся создать сессию
Session = Новый COMОбъект("Lotus.NotesSession");
// Инициализируем сессию (требуется пароль пользователя)
// Если пароль не указан, Lotus может выдать диалоговое окно
Session.Initialize("ВашПароль");
Возврат Session;
Исключение
Сообщить("Не удалось подключиться к Lotus Notes!");
Сообщить("Код ошибки: " + ПодробноеОписаниеОшибки(ИнформацияОбОшибке()));
Возврат Неопределено;
КонецПопытки;
КонецФункции
В данном примере функция Initialize является критически важной. Без вызова этого метода многие свойства объекта Session будут недоступны, что может быть ошибочно принято за "пустой" объект или ошибку регистрации класса.
Подводя итог, можно сказать, что решение проблемы с подключением к Lotus Notes почти всегда сводится к правильной настройке взаимодействия 32-битных и 64-битных систем. Используя COM+ или обеспечив запуск 1С в 32-битном режиме, вы гарантированно избавитесь от ошибки 0x80040154 и сможете успешно работать с почтовой базой данных.