Как исправить ошибку Invalid class string при загрузке из Excel в 1С на сервере?

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

При выполнении обработки по загрузке данных из файлов MS Excel в клиент-серверной базе 1С разработчики часто сталкиваются с ошибкой вида: {ВнешняяОбработка...}: Ошибка при вызове конструктора (ComОбъект) Ex = Новый ComОбъект("Excel.Application"); reason: -2147221005(0x800401F3): Invalid class string. Проанализируем, почему возникает эта ошибка и какими способами её можно устранить.

Выясним причину возникновения ошибки

Код Новый ComОбъект("Excel.Application") обращается к зарегистрированному в операционной системе COM-серверу Microsoft Excel. Код ошибки 0x800401F3 (Invalid class string) означает, что операционная система не может найти запись о классе Excel.Application в системном реестре Windows.

Разберем основные причины, почему это происходит в серверном контексте:

  1. На сервере не установлен MS Excel. В файловом варианте код исполняется на локальном компьютере пользователя, где приложение MS Office установлено. Но при переходе в клиент-серверный режим процедура с директивой &НаСервере выполняется на сервере 1С:Предприятия, где Microsoft Office может отсутствовать.
  2. Несовпадение разрядности 1С и MS Office. Если служба 1С работает в 64-разрядном режиме (процесс rphost.exe), а на сервере установлена 32-разрядная версия MS Excel, 64-битный процесс не сможет напрямую инициализировать 32-битный COM-объект.
  3. Ограничения учетной записи службы 1С. Служба сервера 1С:Предприятия обычно работает от имени системного пользователя (например, usr1cv8). У этой учетной записи может не быть профиля или прав на запуск компонентов DCOM.

Рассмотрим подробнее три основных способа решения этой проблемы.

Способ 1. Чтение файла средствами 1С без использования COM (Рекомендуемый)

Платформа 1С:Предприятие 8 позволяет читать файлы табличных документов (включая форматы .xlsx и .xls) штатным объектом ТабличныйДокумент. Этот метод не требует установки MS Office ни на клиенте, ни на сервере, и работает значительно быстрее.

Посмотрим на пример кода, с помощью которого можно обходить строки документа и получать необходимые данные:


ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(11)));

ТабличныйДокумент = Новый ТабличныйДокумент;

Попытка
    ТабличныйДокумент.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Текст);
Исключение
    Сообщить(ОписаниеОшибки());
    Возврат;
КонецПопытки;

КолвоСтрокФайла = ТабличныйДокумент.ВысотаТаблицы;

Для ВремСтр = 1 По КолвоСтрокФайла Цикл
    ОбластьКод = ТабличныйДокумент.ПолучитьОбласть("R" + Формат(ВремСтр, "ЧГ=") + "C1").ТекущаяОбласть;
    Код = СокрЛП(ОбластьКод.Текст);
    
    НоваяСтрока = ТЗ.Добавить();
    НоваяСтрока.Код = Код;
КонецЦикла;

Метод ТабличныйДокумент.Прочитать() доступен как на клиенте, так и на сервере. Это решение избавляет от зависимости от внешнего ПО и предотвращает зависание процессов excel.exe в памяти сервера.

Способ 2. Выполнение обращения к Excel на стороне клиента

Если бизнес-логика обязательно требует работы через COM-объект Microsoft Excel, инициализацию COM-объекта необходимо перенести в клиентскую процедуру. Так как на рабочем месте пользователя MS Excel уже установлен, инициализация пройдет успешно.

Разберем порядок действий:

  1. В процедуре с директивой &НаКлиенте создаем объект Новый ComОбъект("Excel.Application").
  2. Считываем необходимые данные из файла во временную структуру или массив на клиенте.
  3. Передаем подготовленные данные в серверную процедуру (&НаСервере) для записи справочников или документов в базу данных.

Способ 3. Настройка серверов и компонента DCOM

Если вариант обработки файла обязательно должен выполняться на сервере через COM, необходимо выполнить следующие настройки серверного окружения:

  1. Установите на сервер экземпляр MS Excel той же разрядности, что и служба 1С:Предприятия (для 64-разрядного сервера 1С требуется 64-разрядная версия MS Office).
  2. Создайте системные каталоги Desktop, необходимые для фонового запуска MS Excel от имени системной службы:
    • C:\Windows\System32\config\systemprofile\Desktop
    • C:\Windows\SysWOW64\config\systemprofile\Desktop
  3. Предоставьте учетной записи службы 1С (например, usr1cv8) полные права на эти папки.
  4. Через оснастку управления DCOM (команда dcomcnfg.exe в Windows) в разделе Настройка DCOM -> Microsoft Excel Application настройте права запуска и активации для учетной записи службы 1С.

Важное замечание: При серверной работе с COM обязательно закрывайте приложение методом Ex.Quit() и обнуляйте переменную COM-объекта в блоке Попытка ... Исключение, чтобы не накапливать «зависшие» процессы в диспетчере задач сервера.

← На главную