Как исправить ошибку Microsoft Excel не удается открыть или сохранить документы из-за нехватки памяти при вызове из 1С на сервере

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При вызове методов программного взаимодействия с Microsoft Excel на стороне сервера 1С:Предприятие разработчики часто сталкиваются со следующей ошибкой:

Произошла исключительная ситуация (Microsoft Excel): Приложению Microsoft Excel не удается открыть или сохранить документы из-за нехватки памяти или места на диске.

Ошибка появляется в момент выполнения строки кода Книга = Excel.WorkBooks.Add(); или при открытии файла методом Open(). При этом на серверной машине может быть достаточно оперативной памяти и свободного места на диске, а в файловом режиме базы код выполняется без нареканий.

Проанализируем причины возникновения этой проблемы и разберем по шагам эффективные варианты ее решения.

Выясним причину ошибки

Служба сервера 1С (обычно работающая под учетной записью USR1CV8) запускается в неинтерактивной сессии Windows. Когда из кода 1С, выполняемого на сервере, вызывается Новый COMОбъект("Excel.Application"), операционная система пытается инициализировать приложение Microsoft Excel без полноценного пользовательского окружения.

Основные причины сбоя:

  1. Отсутствие необходимых системных папок Desktop: Для работы COM-сервера Excel требуются специальные каталоги для хранения временных файлов и шаблонов книг. В профиле системных служб этих папок по умолчанию нет.
  2. Ограничения прав DCOM и локальных политик: Учетная запись USR1CV8 не имеет прав на запуск, активацию или интерактивное удостоверение компонента Microsoft Excel.
  3. Официальные ограничения Microsoft: Компания Microsoft официально не рекомендует использовать COM-автоматизацию продуктов MS Office на стороне сервера в фоновых службах и неинтерактивных сессиях.

Способ 1. Перенос формирования Excel на сторону клиента (Рекомендуемый)

Самое надежное и архитектурно верное решение — отказаться от запуска приложения Excel на сервере. Собрать данные можно в фоновом режиме на сервере, а сформировать сам файл — на стороне клиента.

Рассмотрим пример реализации:


&НаСервере
Функция ПолучитьДанныеДляВыгрузки()
    // Собираем необходимые данные в массив или структуру на сервере
    МассивДанных = Новый Массив;
    
    // ... Заполнение массива данными из базы ...
    
    Возврат МассивДанных;
КонецФункции

&НаКлиенте
Процедура ВыгрузитьВExcelКлиент()
    // Получаем подготовленные данные с сервера
    ДанныеВыгрузки = ПолучитьДанныеДляВыгрузки();
    
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
        Excel.DisplayAlerts = Ложь;
        Книга = Excel.WorkBooks.Add();
        Лист = Книга.Worksheets(1);
        
        // Заполняем Excel на клиенте
        Для Индекс = 0 По ДанныеВыгрузки.Количество() - 1 Цикл
            Лист.Cells(Индекс + 1, 1).Value = ДанныеВыгрузки[Индекс];
        КонецЦикла;
        
        Excel.Visible = Истина;
    Исключение
        Сообщить("Ошибка при работе с Excel: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Преимущество этого метода заключается в том, что Excel запускается в пользовательской сессии клиента, где корректно инициализированы все временные папки и реестр, благодаря чему ошибка не возникает.

Способ 2. Использование объекта ТабличныйДокумент (Без MS Office)

Если необходимо сгенерировать файл формата XLSX непосредственно на сервере и записать его на диск без установки стороннего ПО, проанализируем штатные возможности 1С. Можно использовать объект ТабличныйДокумент.


&НаСервере
Процедура СформироватьИСохранитьФайлXLSX(ПутьКФайлу)
    ТабДок = Новый ТабличныйДокумент;
    
    // Формируем структуру документа
    Область = ТабДок.ПолучитьОбласть("A1");
    ТабДок.Вывести(Область);
    
    // Сохраняем напрямую в формат XLSX без использования COM и MS Excel
    ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
КонецПроцедуры

Этот способ работает быстро, не требует наличия установленного пакета Microsoft Office на сервере и не зависит от настроек DCOM.

Способ 3. Настройка окружения сервера для работы COM Excel

Если бизнес-логика строго требует применения COM-объекта `Excel.Application` именно на стороне сервера, выполним последовательную настройку операционной системы.

Шаг 1. Создание системных папок Desktop

Создадим специальные каталоги системного профиля Windows и предоставим учетной записи USR1CV8 полные права доступа на них:

  1. Для 64-битных ОС и 32-битного Office: C:\Windows\SysWOW64\config\systemprofile\Desktop
  2. Для 64-битного Office: C:\Windows\System32\config\systemprofile\Desktop

Шаг 2. Настройка компонента DCOM

  1. Нажмите Win + R и введите dcomcnfg (если Office 32-битный на 64-битной системах, запустите оснастку командой mmc comexp.msc /32).
  2. Перейдите по пути: Службы компонентов -> Компьютеры -> Мой компьютер -> Настройка DCOM.
  3. Найдите элемент Microsoft Excel Application и откройте его Свойства.
  4. На вкладке Безопасность в разделах «Разрешения на запуск и активацию» и «Разрешения на доступ» выберите Настроить, нажмите Изменить и добавьте пользователя службы 1С (USR1CV8) с предоставлением всех прав.
  5. На вкладке Удостоверение установите значение Запускающий пользователь или Указанный пользователь (с указанием данных учетной записи службы).

Шаг 3. Проверка временных каталогов и службы Брандмауэра

  1. Проверьте права доступа пользователя USR1CV8 к папке системного кэша и временных файлов TEMP / TMP.
  2. В Windows Server убедитесь, что служба Брандмауэр Windows (MpsSvc) включена и запущена. Её полное отключение в некоторых версиях Windows Server блокирует создание временных файлов COM-объектов.
← На главную