Как исправить ошибку «Класс не зарегистрирован» (0x80040154) при вызове COM-объекта в 1С:Предприятие

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

При администрировании и разработке в среде 1С:Предприятие одной из наиболее частых проблем является сбой при попытке инициализировать внешнее соединение или прочитать файл Excel. Ситуация проявляется в виде системного сообщения: «Ошибка при вызове конструктора (COMОбъект): -2147221164(0x80040154): Класс не зарегистрирован» или аналогичной ошибки 0x80010100 («Ошибка при системном вызове»). Это происходит, когда платформа пытается запустить V83.COMConnector, обратиться к Excel.Application или связаться с OpenOffice через компонент com.sun.star.ServiceManager.

В этой статье мы подробно разберем природу данной проблемы, выясним, почему она обостряется после обновления платформы 1С, и рассмотрим пошаговые сценарии ее устранения: от классической перерегистрации библиотек до настройки службы компонентов COM+ и перехода на более современные кроссплатформенные технологии.

Шаг 1. Проверяем наличие библиотеки comcntr.dll в каталоге платформы

Прежде чем приступать к системной регистрации библиотек, нам необходимо убедиться, что файл физически присутствует на диске. Довольно часто при установке или обновлении серверной части 1С (особенно на 64-битных ОС Windows Server) библиотека comcntr.dll просто не устанавливается.

Проанализируем причину: начиная с некоторых последних релизов 1С, при стандартном запуске установщика флаг компонента «COM-соединение» может быть снят по умолчанию. Проверим и исправим это:

  1. Откроем панель управления Windows и перейдем в раздел «Программы и компоненты».
  2. Найдем в списке нужную версию платформы 1С:Предприятие и нажмем кнопку «Изменить».
  3. В появившемся окне мастера выберем режим «Изменение установленной программы».
  4. В дереве компонентов найдем пункт «COM-соединение» (или «Интеграция и администрирование») и принудительно отметим его для установки на локальный диск.
  5. Завершим установку мастера. Теперь проверим каталог C:\Program Files\1cv8\<НомерВерсии>\bin\ — файл comcntr.dll должен появиться в папке.

Шаг 2. Корректная регистрация библиотеки через командную строку (CMD)

Чаще всего ошибка 0x80040154 возникает из-за того, что в реестре Windows «зависает» связь старых версий платформы с уже удаленными файлами DLL, либо запись новой библиотеки не произошла автоматически при установке обновления.

Важнейшее правило безопасности Windows: Любые команды по регистрации системных библиотек необходимо выполнять строго в консоли командной строки (CMD), запущенной от имени Администратора. В противном случае операционная система заблокирует изменения в реестре без вывода видимых предупреждений.

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


:: Отменяем регистрацию старой библиотеки (укажите ваш предыдущий рабочий релиз)
regsvr32 /u /s "C:\Program Files\1cv8\8.3.9.1818\bin\comcntr.dll"

:: Регистрируем новую библиотеку актуального релиза платформы (64-битная версия)
regsvr32 /i "C:\Program Files\1cv8\8.3.16.1224\bin\comcntr.dll"

Если на вашем компьютере используется 32-битный клиент 1С (даже на 64-битной Windows), платформа устанавливается в каталог программ x86. В таком случае команда регистрации будет выглядеть следующим образом:

regsvr32 "C:\Program Files (x86)\1cv8\8.3.16.1224\bin\comcntr.dll"

После выполнения команд должно появиться диалоговое окно с подтверждением успешной регистрации модуля в реестре.

Шаг 3. Устранение конфликта разрядности 32/64-бит через службу компонентов COM+

Что делать, если и сервер 1С, и операционная система являются 64-битными, но вам требуется обратиться к 32-битному приложению (например, к Microsoft Excel x32) или наоборот? Напрямую процесс разной разрядности вызвать COM-объект не сможет, что неизбежно вызовет ошибку «Класс не зарегистрирован».

Для решения этой проблемы мы настроим специальный системный мост — запустим библиотеку comcntr.dll в изолированном процессе dllhost.exe под управлением службы компонентов COM+. Выполним настройку по шагам:

  1. Нажмите сочетание клавиш Win + R, введите в строке команду dcomcnfg.exe и нажмите Enter. Откроется оснастка «Службы компонентов».
  2. Перейдите по дереву каталогов: Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.
  3. Нажмите правой кнопкой мыши по разделу «Приложения COM+» и выберите Создать -> Приложение.
  4. В открывшемся мастере выберите пункт «Создать пустое приложение». Введите понятное имя, например, V83_COMConnector.
  5. На шаге «Способ активации» обязательно выберите пункт «Серверное приложение». Это заставит библиотеку работать в отдельном системном процессе dllhost.exe.
  6. На шаге «Учетная запись для запуска» выберите «Указанный пользователь». Пропишите данные пользователя Windows, под которым на сервере крутится служба 1С:Предприятие (обычно это локальный пользователь USR1CV8) и укажите его пароль. Это критично для разграничения прав доступа к файловой системе.
  7. После создания приложения откройте его ветку, найдите папку «Компоненты», нажмите правой кнопкой мыши -> Создать -> Компонент.
  8. В мастере выберите «Установка новых компонентов» и укажите путь к файлу comcntr.dll вашей рабочей платформы.
  9. Настройка политик безопасности (Критический шаг!): Нажмите правой кнопкой мыши на созданное приложение V83_COMConnector, перейдите в «Свойства» и откройте вкладку «Безопасность»:
    • Снимите флаг «Принудительная проверка доступа для приложений».
    • Установите флаг «Применить политику программных ограничений».
    • Установите уровень ограничений в положение «Неограниченный».
  10. Нажмите «Применить» и перезапустите службу сервера приложений 1С.

Шаг 4. Современные кроссплатформенные альтернативы без COM-технологий

Использование COM-технологий (таких как Excel.Application или ADO) постепенно устаревает. Они крайне нестабильно ведут себя на серверных ОС под высокой параллельной нагрузкой, вызывают утечки памяти, требуют ручного контроля зависших процессов в диспетчере задач и абсолютно несовместимы с серверами 1С под управлением Linux.

Проанализируем, какими современными способами можно прочитать файлы Excel напрямую средствами платформы 1С:Предприятие 8.3.

Вариант А. Чтение файлов Excel через ТабличныйДокумент

В современных версиях 1С реализован нативный, кроссплатформенный механизм чтения файлов форматов .xlsx и .xls без использования стороннего софта. Мы можем быстро загрузить файл в объект ТабличныйДокумент, а затем перегнать данные в удобную для обработки Таблицу Значений при помощи объекта ПостроительЗапроса.

Рассмотрим пример готовой функции:


&НаСервере
Функция ПрочитатьExcelНативно(ПутьКФайлу) Экспорт

    ТабДок = Новый ТабличныйДокумент;
    Попытка
        // Читаем файл напрямую средствами платформы 1С
        ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияТабличногоДокумента.XLSX);
    Исключение
        ЗаписатьЛогСобытий("Ошибка чтения файла: " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;

    // Используем ПостроительЗапроса для быстрой выгрузки области ячеек в ТЗ
    Построитель = Новый ПостроительЗапроса;
    Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());
    
    Попытка
        Построитель.Выполнить();
        ТаблицаДанных = Построитель.Результат.Выгрузить();
    Исключение
        ЗаписатьЛогСобытий("Ошибка конвертации данных: " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;

    Возврат ТаблицаДанных;

КонецФункции

Этот код работает на любой операционной системе (включая Linux), не требует установленного пакета Microsoft Office на сервере и выполняется в разы быстрее классического COM-соединения.

Вариант Б. Чтение больших файлов через Microsoft.ACE.OLEDB (ADO)

Если вы работаете исключительно в среде Windows, а файлы Excel настолько велики, что вызывают нехватку оперативной памяти при загрузке в табличный документ, мы можем применить технологию ADO с провайдером Microsoft.ACE.OLEDB.12.0.

Посмотрим, как выглядит программный код подключения к файлу как к базе данных SQL:


&НаСервере
Процедура ЧтениеExcelЧерезADO(ПутьКФайлу)

    Connection = Новый COMОбъект("ADODB.Connection");
    Recordset = Новый COMОбъект("ADODB.Recordset");

    // Формируем строку подключения с поддержкой современных форматов xlsx
    СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ПутьКФайлу + ";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";";

    Попытка
        Connection.Open(СтрокаПодключения);
        // Запрос к первому листу книги Excel (символ $ в конце обязателен)
        Recordset.Open("SELECT * FROM [Лист1$]", Connection, 3, 1);
        
        Пока НЕ Recordset.EOF() Цикл
            // Извлекаем значение первой колонки текущей строки
            ЗначениеКолонки = Recordset.Fields(0).Value;
            
            // Переходим к следующей строке
            Recordset.MoveNext();
        КонецЦикла;
        
        Recordset.Close();
        Connection.Close();
    Исключение
        Сообщить("Ошибка работы с базой ADO: " + ОписаниеОшибки());
    КонецПопытки;

EndПроцедуры

Резюме

Мы подробно разобрали причины возникновения ошибки 0x80040154 при работе с COM-объектами в 1С. Для оперативного восстановления работоспособности обменов используйте ручную регистрацию comcntr.dll через CMD от имени администратора или настройте изолированную службу компонентов COM+. В долгосрочной перспективе мы рекомендуем полностью отказаться от COM-соединений в пользу платформенного чтения файлов через объект ТабличныйДокумент, что гарантирует стабильность и кроссплатформенность ваших информационных систем.

← На главную