При переходе с обычных форм (например, УПП 1.3) на управляемые формы или при разработке новых обработок по загрузке данных программисты часто сталкиваются с ошибкой при инициализации COM-объектов. Рассмотрим ситуацию, когда при попытке создать подключение к Excel возникает ошибка с кодом -2147221005(0x800401F3) и описанием "Недопустимая строка с указанием класса".
Разберем подробно причины возникновения этой ошибки, контекст исполнения кода в 1С и способы решения, включая сложные случаи настройки серверного окружения.
Ошибка возникает в строке кода:
Эксель = Новый COMОбъект("Excel.Application");
Сообщение "Недопустимая строка с указанием класса" (Invalid class string) означает, что операционная система Windows не может найти в своем реестре запись, соответствующую идентификатору программы (ProgID) Excel.Application. Простыми словами: система не знает, что такое Excel, или не может его запустить в текущих условиях.
Как мы видим из обсуждения, автор темы столкнулся с этой проблемой при переносе функционала. Давайте проанализируем основные причины:
Самое правильное и простое решение для задач, требующих интерактивной работы с Excel (открытие, просмотр, загрузка файла пользователем) — это перенос кода на сторону клиента. В управляемых формах существует строгое разделение контекста.
Если на компьютере пользователя установлен Excel, а на сервере 1С его нет (что является стандартом безопасности и лицензирования), мы должны выполнять создание COM-объекта исключительно в процедурах с директивой &НаКлиенте.
Давайте посмотрим, как нужно рефакторить код. Неправильный вариант (вызов серверной процедуры из команды):
&НаКлиенте
Процедура КомандаЗагрузить(Команда)
ЗагрузитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьНаСервере()
// ОШИБКА ЗДЕСЬ: На сервере Excel скорее всего не установлен
Эксель = Новый COMОбъект("Excel.Application");
// ... чтение файла
КонецПроцедуры
Правильный вариант:
&НаКлиенте
Процедура КомандаЗагрузить(Команда)
// Создаем объект на машине пользователя
Попытка
Эксель = Новый COMОбъект("Excel.Application");
Книга = Эксель.WorkBooks.Open(ПутьКФайлу);
// Читаем данные в массив или структуру на клиенте
ДанныеФайла = ПрочитатьДанныеИзExcelНаКлиенте(Книга);
Книга.Close(0);
Эксель.Quit();
// Передаем готовые "чистые" данные на сервер для записи в БД
ОбработатьДанныеНаСервере(ДанныеФайла);
Исключение
Сообщить("Ошибка при открытии Excel: " + ОписаниеОшибки());
Если Эксель <> Неопределено Тогда
Эксель.Quit();
КонецЕсли;
КонецПопытки;
КонецПроцедуры
В этом случае код обращается к реестру Windows на компьютере пользователя, находит там установленный Office и успешно запускает его.
Иногда возникают задачи, когда файл Excel формируется или читается фоновым заданием, или регламентной процедурой, где нет клиентской части. В этом случае COMОбъект должен создаваться на сервере. Если вы получили ошибку на сервере, даже при установленном MS Office, давайте разберем, как это исправить.
1. Проблема системных папок (Desktop)
Когда Excel запускается под пользователем-службой (например, USR1CV8), ему требуется наличие папок "Рабочего стола" в системном профиле для кэширования временных файлов. Если их нет, конструктор падает с ошибкой.
Вам необходимо вручную создать папки по следующим путям (в зависимости от разрядности вашей ОС Windows Server):
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\Desktop (для 64-битных ОС)Важно: После создания папок, зайдите в их свойства и убедитесь, что пользователь, от имени которого запущена служба сервера 1С, имеет полные права на эти папки.
2. Настройка DCOM
Даже если Excel установлен, политика безопасности может запрещать его удаленный запуск. Нам нужно настроить компоненты.
Win + R, введите dcomcnfg (или mmc comexp.msc /32 для 32-битного Office на x64 системе).Использование COMОбъект("Excel.Application") на сервере считается устаревшим и ненадежным подходом (утечки памяти, зависшие процессы excel.exe, необходимость лицензии Office на сервере). Платформа 1С предлагает нативные методы работы.
Для чтения файлов .xlsx и .xls лучше использовать объект ТабличныйДокумент. Этот код работает и на клиенте, и на сервере (в том числе на Linux), и не требует установленного Excel.
Пример чтения без COM:
&НаСервере
Процедура ПрочитатьExcelБезCOM(ПутьКФайлу)
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
Сообщить("Не удалось прочитать файл: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Обход данных
ВысотаТаблицы = ТабДок.ВысотаТаблицы;
ШиринаТаблицы = ТабДок.ШиринаТаблицы;
Для НомерСтроки = 1 По ВысотаТаблицы Цикл
Для НомерКолонки = 1 По ШиринаТаблицы Цикл
Область = ТабДок.Область(НомерСтроки, НомерКолонки);
ЗначениеЯчейки = Область.Текст;
// Обработка значения...
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Этот метод избавляет вас от необходимости бороться с правами DCOM, реестром и установкой Office на сервер.
Ошибка 0x800401F3 при работе с Excel в 1С почти всегда указывает на то, что код выполняется "не там" (на сервере вместо клиента) или "не так" (нет прав, битые пути в реестре). Мы рекомендуем следующий алгоритм действий:
&НаКлиенте.ТабличныйДокумент.Прочитать().