Работа с внешними файлами Microsoft Excel — одна из самых частых задач для разработчика 1С. Однако использование технологии COM (Component Object Model) часто сопровождается труднообъяснимыми ошибками. Одной из наиболее неприятных является ошибка с кодом -21472210005 (0x800401F3): Недопустимая строка с указанием класса. В этой статье мы подробно разберем, почему она возникает, как настроить системное окружение и какие существуют современные альтернативы, позволяющие забыть о проблемах с COM-объектами навсегда.
Когда мы пишем в коде команду Новый COMОбъект("Excel.Application"), операционная система Windows обращается к реестру, чтобы найти программный идентификатор (ProgID) под названием Excel.Application. Если система выдает ошибку «Недопустимая строка с указанием класса», это означает, что запись в реестре либо отсутствует, либо недоступна для текущего процесса 1С.
Рассмотрим основные причины возникновения этой ситуации:
USR1CV8), может не иметь прав на запуск DCOM-компонентов или на чтение соответствующих веток реестра.Проанализируем самый эффективный способ решения проблемы, к которому в итоге пришел автор темы на форуме. Начиная с версии платформы 8.3, 1С умеет читать файлы .xlsx напрямую, без установленного Excel и без использования COM. Это самый надежный метод, который работает и на Windows, и на Linux.
Разберем по шагам, как реализовать чтение файла через ТабличныйДокумент:
&НаСервере
Процедура ПрочитатьФайлExcelНаСервере(ПутьКФайлу)
// Создаем объект Табличный документ
ТабДок = Новый ТабличныйДокумент;
Попытка
// Читаем файл напрямую. Платформа сама определит формат .xlsx
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
Сообщить("Не удалось прочитать файл: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Определяем границы заполненной области
ВсегоСтрок = ТабДок.ВысотаТаблицы;
ВсегоКолонок = ТабДок.ШиринаТаблицы;
// Обходим строки и читаем данные из ячеек
Для НомерСтроки = 1 По ВсегоСтрок Цикл
Для НомерКолонки = 1 По ВсегоКолонок Цикл
ЗначениеЯчейки = ТабДок.Область(НомерСтроки, НомерКолонки).Текст;
// Обработка данных...
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Важный нюанс: Этот метод идеально подходит для стандартных таблиц. Однако, если файл содержит сложные макросы, защищенные листы или специфическое форматирование SAP, ТабличныйДокумент может не справиться. В таких случаях стоит рассмотреть другие варианты.
Если вам критически важно использовать именно COMОбъект (например, для сложного форматирования или работы с макросами), нам необходимо подружить 64-битную 1С с 32-битным Excel. Проанализируем, как это сделать через оснастку «Службы компонентов».
Win + R и введите команду comexp.msc /32 (если Office 32-битный) или просто dcomcnfg.USR1CV8 (или того, под кем работает сервер) и дайте ему полные права.В обсуждении на форуме автор столкнулся со второй проблемой: при попытке открыть файл на сервере возникала ошибка «Каталог не обнаружен», хотя путь был верным. Это классическая проблема Excel, работающего как сервис. Excel требует наличия папки Desktop в системном профиле пользователя, даже если он не собирается ничего выводить на рабочий стол.
Выясним, как это исправить. Вам необходимо вручную создать следующие каталоги:
C:\Windows\SysWOW64\config\systemprofile\DesktopC:\Windows\System32\config\systemprofile\DesktopПосле создания этих пустых папок и перезагрузки сервера (или службы 1С), Excel магическим образом начинает «видеть» файлы и открывать их без ошибок доступа.
Рассмотрим еще один профессиональный подход — чтение Excel как базы данных. Этот метод не требует запуска тяжелого процесса excel.exe в памяти сервера, работает быстрее и стабильнее COM.
// Пример подключения через ADO
Connection = Новый COMОбъект("ADODB.Connection");
ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ПутьКФайлу + ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";";
Попытка
Connection.Open(ConnectionString);
Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = Connection;
Command.CommandText = "SELECT * FROM [Лист1$]"; // Обратите внимание на знак $
Recordset = Command.Execute();
Пока НЕ Recordset.EOF() Цикл
// Читаем Recordset.Fields.Item(0).Value
Recordset.MoveNext();
КонецЦикла;
Connection.Close();
Исключение
Сообщить("Ошибка ADO: " + ОписаниеОшибки());
КонецПопытки;
Для работы этого метода на сервере должен быть установлен Microsoft Access Database Engine соответствующей разрядности. Это гораздо более легкий компонент, чем весь пакет MS Office.
Мы проанализировали ситуацию и выяснили, что ошибка 21472210005 — это симптом «разрыва связи» между 1С и компонентами Windows. Резюмируем наши действия:
ТабличныйДокумент.Прочитать(). Это избавит вас от зависимости от Microsoft Office, проблем с разрядностью и прав доступа.Desktop в systemprofile.C:\Windows\Temp.Следуя этим рекомендациям, вы сможете построить отказоустойчивую систему загрузки данных, которая не будет «падать» при каждом обновлении Windows или смене разрядности платформы 1С.