При переносе кода, работающего с файлами Microsoft Excel, с клиентского рабочего места на сервер приложений 1С программисты часто сталкиваются с аппаратными и системными ограничениями. Одной из самых коварных является ошибка инициализации COM-объекта: -2147467262(0x80004002): Интерфейс не поддерживается. Происходит это при выполнении стандартной строки инициализации COMОбъект("Excel.Application") в контексте серверного вызова.
В этой статье мы подробно разберем, почему возникает эта проблема на операционных системах Windows Server (включая Windows Server 2012/2016/2019/2022) при работе с 64-битным сервером приложений 1С, как правильно настроить системное окружение и DCOM, а также рассмотрим современные и гораздо более надежные альтернативные способы работы с файлами Excel непосредственно средствами платформы 1С.
Основная причина сбоя кроется во взаимодействии подсистем Windows. Когда код 1С выполняется на стороне клиента (на локальном компьютере пользователя), процесс Excel запускается в интерактивной сессии текущего пользователя Windows. У этого пользователя есть свой профиль, рабочий стол (Desktop) и все необходимые права доступа.
Когда же код выполняется на сервере приложений 1С, ситуация кардинально меняется:
USR1CV8 или системной учетной записи SYSTEM) работает в так называемой неинтерактивной нулевой сессии (Session 0). В этой сессии нет полноценного графического интерфейса и привычного окружения пользователя.Давайте по шагам разберем комплексное решение этой проблемы.
Первым делом нам необходимо подготовить файловую структуру Windows Server для успешного старта неинтерактивного процесса Excel. Робот или служба, запускающие Excel, ищут папки рабочего стола в системном профиле Windows.
Выполним следующие действия:
C:\Windows\System32\config\systemprofile\ и проверим наличие папки с именем Desktop. Если папки нет, создадим ее вручную.C:\Windows\SysWOW64\config\systemprofile\ (актуально для 64-разрядных операционных систем) и также создадим в этой папке каталог Desktop, если он отсутствует.Важное дополнение по безопасности: просто создать папки недостаточно. Нам нужно убедиться, что у пользователя, под которым работает служба сервера 1С (например, USR1CV8), есть полные права на чтение и запись в эти созданные каталоги. Нажмите правой кнопкой мыши по каждой из созданных папок «Desktop», перейдите в свойства на вкладку «Безопасность», добавьте пользователя службы 1С и предоставьте ему права «Изменение», «Чтение и выполнение», «Список содержимого папки», «Чтение» и «Запись».
Для того чтобы 64-битный сервер 1С мог корректно общаться с COM-объектом Excel, настроим системную службу DCOM. Проанализируем этот процесс в зависимости от разрядности установленного офисного пакета.
Если на сервере установлена 64-битная версия MS Office, откроем стандартную консоль управления:
Нажмите сочетание клавиш Win + R, введите dcomcnfg и нажмите Enter.
Если на сервере установлена 32-битная версия MS Office на 64-разрядной ОС Windows, стандартная консоль не отобразит Excel в списке. Нам нужно запустить 32-битную версию консоли настройки DCOM. Для этого:
Нажмите сочетание клавиш Win + R, введите команду mmc comexp.msc /32 и нажмите Enter.
Выполним пошаговую настройку в открывшемся окне «Службы компонентов»:
regedit, перейдем в ветку HKEY_CLASSES_ROOT\AppID\EXCEL.EXE (если раздела нет, создадим его) и добавим строковый параметр с именем AppID и значением {00020812-0000-0000-C000-000000000046}. После этого Excel гарантированно появится в списке DCOM.USR1CV8) и установите для него разрешения: Локальный запуск и Локальная активация.В некоторых случаях после обновлений операционной системы или пакета Microsoft Office связи COM-интерфейсов могут нарушаться. Чтобы восстановить их и принудительно зарегистрировать Excel как COM-сервер, выполним простую команду:
"C:\Program Files\Microsoft Office\Office16\EXCEL.EXE" /regserver
Если у вас установлен 32-битный Office в 64-битной системе, путь будет выглядеть так:
"C:\Program Files (x86)\Microsoft Office\Office16\EXCEL.EXE" /regserver
Это важнейший шаг, без которого выполненные настройки DCOM и прав доступа к папкам могут не вступить в силу, так как служба 1С кэширует параметры безопасности процессов при запуске.
services.msc).После перезапуска службы проверьте выполнение кода создания COM-объекта — ошибка «Интерфейс не поддерживается» должна исчезнуть, и инициализация файла пройдет успешно. Для этой задачи подойдёт обработка с примерами функций чтения и записи данных через COM-соединение.
Несмотря на то, что мы подробно разобрали решение этой ошибки, использование автоматизации Microsoft Office на стороне сервера крайне не рекомендуется самой корпорацией Microsoft. Разберем ключевые проблемы этого подхода:
EXCEL.EXE «застревает» в оперативной памяти сервера навсегда. Со временем эти зомби-процессы забивают всю оперативную память сервера приложений.Начиная с версии платформы 8.3.6, разработчики 1С добавили мощный встроенный механизм для работы с файлами Microsoft Excel, который работает нативно на уровне ядра системы, не требует установленного MS Office на сервере и функционирует чрезвычайно быстро.
Рассмотрим подробнее примеры кода для работы с файлами без COM-объектов.
Вариант 1. Нативное чтение файла Excel через Табличный Документ:
ТабДок = Новый ТабличныйДокумент;
Попытка
// Читаем файл напрямую с диска, указывая способ чтения XLSX
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияТабличногоДокумента.XLSX);
// Обходим строки и колонки полученной таблицы
Для Строка = 1 По ТабДок.ВысотаТаблицы Цикл
КодТовара = ТабДок.Область(Строка, 1).Текст;
Наименование = ТабДок.Область(Строка, 2).Текст;
Цена = ТабДок.Область(Строка, 3).Текст;
Если ЗначениеЗаполнено(КодТовара) Тогда
// Выполняем логику обработки данных, например, обновление цен
КонецЕсли;
КонецЦикла;
Исключение
ЗаписьЖурналаРегистрации("ЗагрузкаДанных", УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка при чтении файла: " + ОписаниеОшибки());
ВызватьИсключение "Не удалось прочитать файл данных Excel!";
КонецПопытки;
Вариант 2. Нативная запись данных в формат XLSX:
ТабДок = Новый ТабличныйДокумент;
// Заполняем макет или ячейки табличного документа программно
ОбластьШапка = ТабДок.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.Заголовок = "Отчет по продажам";
ТабДок.Вывести(ОбластьШапка);
// Сохраняем результат в файл формата Excel без использования сторонних программ
Попытка
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Исключение
ЗаписьЖурналаРегистрации("ВыгрузкаДанных", УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка при записи файла: " + ОписаниеОшибки());
ВызватьИсключение "Ошибка сохранения отчета в формат Excel!";
КонецПопытки;
Использование встроенных объектов ТабличныйДокумент гарантирует стабильность работы фоновых заданий, не требует сложной настройки прав доступа в DCOM и исключает утечки памяти или появление зависших процессов на вашем рабочем сервере. Для этой задачи можно использовать универсальную обработку для импорта данных из Excel без установки Microsoft Office.