При разработке механизмов загрузки данных из внешних файлов Microsoft Excel программисты часто сталкиваются со следующей проблемой: код отлично отрабатывает на клиенте или в файловом варианте базы данных, но при переносе выполнения на сервер 1С (особенно в трехзвенной архитектуре под управлением x64-платформ) вылетает критическая ошибка безопасности при попытке создания объекта Excel.Application.
В этой статье мы подробно проанализируем причины возникновения этой ошибки, разберем пошаговый алгоритм настройки операционной системы Windows Server для предоставления необходимых прав учетной записи службы 1С, а также рассмотрим современные альтернативные программные решения, которые позволяют полностью отказаться от нестабильной технологии COM-объектов при импорте таблиц Excel.
Для начала разберем природу этого сбоя. Когда вы вызываете конструктор Новый COMОбъект("Excel.Application") в контексте &НаСервере, операционная система пытается запустить экземпляр приложения Microsoft Excel от имени той учетной записи, под которой работает служба сервера 1С (по умолчанию это системный пользователь USR1CV8).
Поскольку Microsoft Excel изначально проектировался как офисное интерактивное приложение для настольных ПК, его запуск в фоновом (неинтерактивном) режиме операционной системы сопряжен со строгими ограничениями безопасности Windows. Служба 1С не имеет полноценного окружения рабочего стола и необходимых токенов аутентификации DCOM (Distributed Component Object Model). Как результат — система безопасности блокирует запуск процесса EXCEL.EXE, возвращая ошибку доступа.
Ниже представлены проверенные шаги администрирования DCOM и операционной системы, которые гарантированно решают проблему с правами, а также альтернативные способы чтения файлов без вызова COM.
Чаще всего предоставления прав пользователю USR1CV8 на запуск компонента в стандартной оснастке DCOM оказывается недостаточно, так как Excel пытается стартовать от имени запускающего пользователя, не имеющего графической сессии. Мы исправим это через принудительное назначение удостоверения:
dcomcnfg и нажмите Enter. Если у вас установлена 64-разрядная операционная система, а MS Office установлен в 32-разрядной версии, запустите 32-битную консоль DCOM командой: mmc comexp.msc /32.USR1CV8 (или создайте для этих целей отдельного администратора) и введите его пароль. Это заставит Excel запускаться в строго определенном контексте безопасности, независимо от того, кто инициировал вызов из 1С.USR1CV8, предоставив ему полные права (Локальный запуск, Локальная активация).Excel при запуске инициализирует свои внутренние структуры данных и временные файлы, обращаясь к специальным папкам рабочего стола системного профиля Windows. Если этих папок физически нет на диске, Excel завершит работу аварийно еще до открытия файла.
Важным нюансом является языковая локализация операционной системы Windows Server. Создавать нужно как англоязычную папку Desktop, так и русскоязычную Рабочий стол:
C:\Windows\System32\config\systemprofile\.Desktop и Рабочий стол.C:\Windows\SysWOW64\config\systemprofile\ (актуально для 64-битных ОС).Desktop и Рабочий стол.USR1CV8 (или ту, под которой работает служба сервера 1С), предоставив ей права Полный доступ (Full Control) на эти каталоги.Чтобы служба 1С могла корректно вызывать подсистемы DCOM, ее учетная запись должна обладать необходимыми привилегиями на уровне операционной системы:
secpol.msc.USR1CV8 добавлен в этот список.При отладке механизмов COM на сервере из-за постоянных аварийных завершений процедур в диспетчере задач сервера могут накапливаться десятки «висящих» фоновых процессов EXCEL.EXE. Они продолжают удерживать монопольный доступ к COM-интерфейсам ядра и вызывают ложные ошибки «Недостаточно прав».
Перед каждым тестированием настроек DCOM выполняйте принудительное завершение всех фоновых процессов Excel. Для этого откройте командную строку (CMD) на сервере от имени Администратора и выполните инструкцию:
taskkill /im excel.exe /f
Использование COM-объектов на сервере считается устаревшим подходом, так как это снижает стабильность работы сервера 1С, привязывает систему исключительно к Windows-окружению (не работает на Linux-серверах) и требует дорогостоящего лицензирования Microsoft Office на серверные мощности.
Если ваша задача — получить список листов Excel для последующего выбора пользователем (как у автора темы), мы можем решить эту задачу современными методами без обращения к механизмам COM.
В современных версиях платформы 1С:Предприятие 8.3 встроенный объект ТабличныйДокумент при чтении многостраничных файлов .xlsx автоматически преобразует листы книги в системные именованные области. Мы можем прочитать файл напрямую на сервере и получить реальные имена листов без вызова Excel:
&НаСервере
Функция ПолучитьСписокЛистовЧерезТабДок(ПутьКФайлу) Экспорт
СписокЛистов = Новый СписокЗначений;
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияТабличногоДокумента.XLSX);
Исключение
ЗаписатьЛогСобытий("Ошибка чтения файла: " + ОписаниеОшибки());
Возврат СписокЛистов;
КонецПопытки;
// Каждая именованная область в прочитанном документе соответствует листу Excel
Для Каждого Область Из ТабДок.Области Цикл
// Исключаем системные служебные области, если они есть
Если Найти(Область.Имя, "Print_Area") = 0 Тогда
СписокЛистов.Добавить(Область.Имя, Область.Имя);
КонецЕсли;
КонецЦикла;
Возврат СписокЛистов;
КонецФункции
Современные файлы Excel с расширением .xlsx физически представляют собой упакованный ZIP-архив. Информация о листах книги хранится внутри этого архива в текстовом файле формата XML по пути xl/workbook.xml.
Этот способ работает невероятно быстро, не требует установленного пакета MS Office на сервере и стабильно функционирует даже на серверах под управлением Linux:
&НаСервере
Функция ПолучитьИменаЛистовИзАрхиваXLSX(ПутьКФайлу) Экспорт
СписокЛистов = Новый СписокЗначений;
// Создаем временную директорию для распаковки структуры XML
ВременныйКаталог = ПолучитьИмяВременногоФайла("");
СоздатьКаталог(ВременныйКаталог);
// Распаковываем xlsx как стандартный ZIP-архив
Архив = Новый ЧтениеZipФайла;
Попытка
Архив.Открыть(ПутьКФайлу);
// Извлекаем только файл структуры книги
Архив.Извлечь(Архив.Элементы.Найти("xl/workbook.xml"), ВременныйКаталог, РежимВосстановленияПутейФайловZip.Восстанавливать);
Архив.Закрыть();
Исключение
ВызватьИсключение "Не удалось распаковать структуру Excel файла: " + ОписаниеОшибки();
КонецПопытки;
ФайлСтруктуры = Новый Файл(ВременныйКаталог + "/xl/workbook.xml");
Если Не ФайлСтруктуры.Существует() Тогда
Возврат СписокЛистов;
КонецЕсли;
// Читаем XML файл парсером 1С
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ФайлСтруктуры.ПолноеИмя);
Пока ЧтениеXML.Прочитать() Цикл
// Ищем узлы с описанием листов книги <sheet name="..." ... />
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "sheet" Тогда
Если ЧтениеXML.ПрочитатьАтрибут() Тогда
ИмяЛиста = ЧтениеXML.Значение;
СписокЛистов.Добавить(ИмяЛиста, ИмяЛиста);
КонецЕсли;
КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();
// Очищаем временную папку за собой
Попытка
УдалитьФайлы(ВременныйКаталог);
Исключение
// Игнорируем ошибки удаления временных файлов
КонецПопытки;
Возврат СписокЛистов;
КонецФункции
Использование предложенных бескомпьютерных альтернатив чтения файлов Excel позволяет полностью обезопасить серверную часть приложения 1С от сбоев, зависших фоновых процессов, уязвимостей в безопасности DCOM и необходимости сложной системной настройки прав при каждом обновлении или переносе платформы 1С.