При переходе с файлового варианта работы базы на клиент-серверный программисты часто сталкиваются с неприятной ситуацией: отлаженный код загрузки данных из Excel перестает работать. Вместо привычного открытия файла система выдает ошибку: «Ошибка при вызове конструктора (ComОбъект): -2147467262(0x80004002): No such interface supported». Ситуация осложняется тем, что на сервере Microsoft Excel установлен, а под учетной записью администратора всё работает корректно.
В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем механизмы взаимодействия 1С с COM-объектами и рассмотрим несколько эффективных способов решения проблемы — от настройки прав доступа до полного отказа от использования Excel как внешнего приложения.
Разберем природу ошибки 0x80004002. Она буквально означает, что запрашиваемый интерфейс не поддерживается. В контексте клиент-серверной архитектуры 1С это чаще всего происходит по трем причинам:
rphost) обычно запущен от имени специальной системной учетной записи (например, USR1CV8), у которой нет прав на запуск интерактивных приложений, таких как Excel.Новый COMОбъект может завершиться неудачей из-за невозможности «пробросить» интерфейс между процессами разной разрядности.Если ваша логика завязана на специфических функциях Excel и вы не можете быстро переписать код, попробуем настроить серверную среду. Рассмотрим по шагам, что нужно сделать.
Во-первых, создадим необходимые директории. Проанализируем структуру профилей Windows. Даже если служба работает в неинтерактивном режиме, Excel требует наличия папки Desktop. Вам необходимо создать её вручную по следующим путям:
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\Desktop (для 64-битных систем)После создания обязательно назначьте полные права на эти папки для учетной записи, от которой запущен сервер 1С (например, USR1CV8 или LocalSystem).
Во-вторых, настроим службу компонентов (DCOM). Выполним следующие действия:
Win + R, введите dcomcnfg и нажмите Enter.Проанализируем современный подход. Начиная с платформы 8.3.6, 1С умеет читать файлы .xlsx и .xls напрямую, не используя установленный на компьютере Microsoft Excel. Это самый стабильный и быстрый метод для сервера.
Рассмотрим пример кода, который заменит создание COM-объекта:
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
// Теперь мы можем обходить строки и колонки ТабДока
Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл
ТекЗначение = ТабДок.Область(НомерСтроки, 1).Текст;
// Ваша логика обработки
КонецЦикла;
Исключение
Сообщить("Ошибка при чтении файла: " + ОписаниеОшибки());
КонецПопытки;
Преимущества этого метода:
EXCEL.EXE в диспетчере задач, которые «пожирают» память сервера.Если файл Excel очень большой, чтение через ТабличныйДокумент может быть медленным. В таком случае разберем использование технологии ADO. Этот метод позволяет обращаться к листу Excel с помощью SQL-запросов.
Посмотрим на пример реализации:
Connection = Новый COMОбъект("ADODB.Connection");
ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ПутьКФайлу + ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";";
Попытка
Connection.Open(ConnectionString);
Recordset = Новый COMОбъект("ADODB.Recordset");
ТекстЗапроса = "SELECT * FROM [Лист1$]";
Recordset.Open(ТекстЗапроса, Connection);
Пока НЕ Recordset.EOF Цикл
ЗначениеПоля = Recordset.Fields.Item(0).Value;
Recordset.MoveNext();
КонецЦикла;
Recordset.Close();
Connection.Close();
Исключение
Сообщить("Ошибка ADO: " + ОписаниеОшибки());
КонецПопытки;
При использовании этого метода важно помнить, что на сервере должен быть установлен соответствующий драйвер (Microsoft Access Database Engine). Это гораздо «легче» для системы, чем установка полноценного офисного пакета.
Часто ошибка при чтении возникает из-за того, что путь C:\Users\User\Documents\file.xlsx, который ввел пользователь, просто не существует на сервере. В клиент-серверном варианте сервер 1С не имеет доступа к локальным дискам вашего компьютера.
Рассмотрим правильный алгоритм работы:
ПоместитьФайл() или НачатьПомещениеФайла().ПолучитьИзВременногоХранилища().Проанализируем этот момент: если вы используете Новый COMОбъект("Excel.Application") в серверном модуле, убедитесь, что переменная ПутьКФайлу ведет к файлу, который физически лежит на серверной машине, и у пользователя USR1CV8 есть права на чтение этой папки.
Мы рассмотрели несколько путей решения проблемы. Использование Excel.Application на сервере — это «путь боли», связанный с настройкой прав доступа (DCOM) и нестабильностью работы серверных процессов.
Наш совет: используйте метод ТабличныйДокумент.Прочитать(). Это наиболее «чистый» способ с точки зрения архитектуры 1С, который избавит вас от большинства проблем с правами и разрядностью. Если же вам требуется высокая скорость на огромных файлах — обратите внимание на ADODB или внешние компоненты для прямого парсинга XML (для формата XLSX).