При администрировании и разработке в среде 1С:Предприятие одной из наиболее частых проблем является сбой при попытке инициализировать внешнее соединение или прочитать файл Excel. Ситуация проявляется в виде системного сообщения: «Ошибка при вызове конструктора (COMОбъект): -2147221164(0x80040154): Класс не зарегистрирован» или аналогичной ошибки 0x80010100 («Ошибка при системном вызове»). Это происходит, когда платформа пытается запустить V83.COMConnector, обратиться к Excel.Application или связаться с OpenOffice через компонент com.sun.star.ServiceManager.
В этой статье мы подробно разберем природу данной проблемы, выясним, почему она обостряется после обновления платформы 1С, и рассмотрим пошаговые сценарии ее устранения: от классической перерегистрации библиотек до настройки службы компонентов COM+ и перехода на более современные кроссплатформенные технологии.
Прежде чем приступать к системной регистрации библиотек, нам необходимо убедиться, что файл физически присутствует на диске. Довольно часто при установке или обновлении серверной части 1С (особенно на 64-битных ОС Windows Server) библиотека comcntr.dll просто не устанавливается.
Проанализируем причину: начиная с некоторых последних релизов 1С, при стандартном запуске установщика флаг компонента «COM-соединение» может быть снят по умолчанию. Проверим и исправим это:
C:\Program Files\1cv8\<НомерВерсии>\bin\ — файл comcntr.dll должен появиться в папке.Чаще всего ошибка 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"
После выполнения команд должно появиться диалоговое окно с подтверждением успешной регистрации модуля в реестре.
Что делать, если и сервер 1С, и операционная система являются 64-битными, но вам требуется обратиться к 32-битному приложению (например, к Microsoft Excel x32) или наоборот? Напрямую процесс разной разрядности вызвать COM-объект не сможет, что неизбежно вызовет ошибку «Класс не зарегистрирован».
Для решения этой проблемы мы настроим специальный системный мост — запустим библиотеку comcntr.dll в изолированном процессе dllhost.exe под управлением службы компонентов COM+. Выполним настройку по шагам:
Win + R, введите в строке команду dcomcnfg.exe и нажмите Enter. Откроется оснастка «Службы компонентов».V83_COMConnector.dllhost.exe.USR1CV8) и укажите его пароль. Это критично для разграничения прав доступа к файловой системе.comcntr.dll вашей рабочей платформы.V83_COMConnector, перейдите в «Свойства» и откройте вкладку «Безопасность»:
Использование COM-технологий (таких как Excel.Application или ADO) постепенно устаревает. Они крайне нестабильно ведут себя на серверных ОС под высокой параллельной нагрузкой, вызывают утечки памяти, требуют ручного контроля зависших процессов в диспетчере задач и абсолютно несовместимы с серверами 1С под управлением Linux.
Проанализируем, какими современными способами можно прочитать файлы Excel напрямую средствами платформы 1С:Предприятие 8.3.
В современных версиях 1С реализован нативный, кроссплатформенный механизм чтения файлов форматов .xlsx и .xls без использования стороннего софта. Мы можем быстро загрузить файл в объект ТабличныйДокумент, а затем перегнать данные в удобную для обработки Таблицу Значений при помощи объекта ПостроительЗапроса.
Рассмотрим пример готовой функции:
&НаСервере
Функция ПрочитатьExcelНативно(ПутьКФайлу) Экспорт
ТабДок = Новый ТабличныйДокумент;
Попытка
// Читаем файл напрямую средствами платформы 1С
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияТабличногоДокумента.XLSX);
Исключение
ЗаписатьЛогСобытий("Ошибка чтения файла: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
// Используем ПостроительЗапроса для быстрой выгрузки области ячеек в ТЗ
Построитель = Новый ПостроительЗапроса;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());
Попытка
Построитель.Выполнить();
ТаблицаДанных = Построитель.Результат.Выгрузить();
Исключение
ЗаписатьЛогСобытий("Ошибка конвертации данных: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
Возврат ТаблицаДанных;
КонецФункции
Этот код работает на любой операционной системе (включая Linux), не требует установленного пакета Microsoft Office на сервере и выполняется в разы быстрее классического COM-соединения.
Если вы работаете исключительно в среде 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-соединений в пользу платформенного чтения файлов через объект ТабличныйДокумент, что гарантирует стабильность и кроссплатформенность ваших информационных систем.