При выполнении обработки по загрузке данных из файлов 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С:Предприятия, где Microsoft Office может отсутствовать.rphost.exe), а на сервере установлена 32-разрядная версия MS Excel, 64-битный процесс не сможет напрямую инициализировать 32-битный COM-объект.usr1cv8). У этой учетной записи может не быть профиля или прав на запуск компонентов DCOM.Рассмотрим подробнее три основных способа решения этой проблемы.
Платформа 1С:Предприятие 8 позволяет читать файлы табличных документов (включая форматы .xlsx и .xls) штатным объектом ТабличныйДокумент. Этот метод не требует установки MS Office ни на клиенте, ни на сервере, и работает значительно быстрее.
Посмотрим на пример кода, с помощью которого можно обходить строки документа и получать необходимые данные:
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(11)));
ТабличныйДокумент = Новый ТабличныйДокумент;
Попытка
ТабличныйДокумент.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Текст);
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
КолвоСтрокФайла = ТабличныйДокумент.ВысотаТаблицы;
Для ВремСтр = 1 По КолвоСтрокФайла Цикл
ОбластьКод = ТабличныйДокумент.ПолучитьОбласть("R" + Формат(ВремСтр, "ЧГ=") + "C1").ТекущаяОбласть;
Код = СокрЛП(ОбластьКод.Текст);
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Код = Код;
КонецЦикла;
Метод ТабличныйДокумент.Прочитать() доступен как на клиенте, так и на сервере. Это решение избавляет от зависимости от внешнего ПО и предотвращает зависание процессов excel.exe в памяти сервера.
Если бизнес-логика обязательно требует работы через COM-объект Microsoft Excel, инициализацию COM-объекта необходимо перенести в клиентскую процедуру. Так как на рабочем месте пользователя MS Excel уже установлен, инициализация пройдет успешно.
Разберем порядок действий:
&НаКлиенте создаем объект Новый ComОбъект("Excel.Application").&НаСервере) для записи справочников или документов в базу данных.Если вариант обработки файла обязательно должен выполняться на сервере через COM, необходимо выполнить следующие настройки серверного окружения:
Desktop, необходимые для фонового запуска MS Excel от имени системной службы:
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\Desktopusr1cv8) полные права на эти папки.dcomcnfg.exe в Windows) в разделе Настройка DCOM -> Microsoft Excel Application настройте права запуска и активации для учетной записи службы 1С.Важное замечание: При серверной работе с COM обязательно закрывайте приложение методом Ex.Quit() и обнуляйте переменную COM-объекта в блоке Попытка ... Исключение, чтобы не накапливать «зависшие» процессы в диспетчере задач сервера.