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

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

При разработке механизмов выгрузки данных из 1С:Предприятия в формат Excel программисты часто сталкиваются с ситуацией, когда код идеально работает на клиенте, но выдает критическую ошибку при выполнении в серверном контексте или в фоновом задании. Одной из самых коварных является ошибка: Произошла исключительная ситуация (Microsoft Excel): Приложению Microsoft Excel не удается открыть или сохранить документы из-за нехватки памяти или места на диске. Разберем подробно, почему это происходит и как решить проблему несколькими способами.

Причина возникновения ошибки при вызове метода Add

Рассмотрим стандартную ситуацию: сервер 1С пытается инициализировать COM-объект Excel.Application и создать новую рабочую книгу методом Add(). Несмотря на наличие гигабайтов свободной оперативной памяти и терабайтов дискового пространства, система выдает ошибку нехватки ресурсов. Выясним причину: Microsoft Excel — это интерактивное приложение, которое при запуске от имени системной службы (каковой является сервер 1С) не находит необходимых элементов окружения рабочего стола (Desktop) в профиле пользователя.

Проанализируем ситуацию глубже: даже если вы не записываете файл в данный момент, метод Add() заставляет Excel создавать временные копии и инициализировать структуры для отображения листов. Если папки рабочего стола для системного профиля отсутствуют, Excel блокирует операцию, выдавая ложное сообщение о нехватке памяти.

Решение №1: Настройка системного профиля (Классический метод)

Для исправления этой ошибки нам необходимо вручную создать папки, которые Excel ожидает увидеть в профиле пользователя, под которым запущена служба ragent. Выполним следующие действия:

  1. Определим разрядность установленного пакета Microsoft Office и операционной системы.
  2. Если у вас 64-битная Windows и 32-битный Office, создайте папку по пути: C:\Windows\SysWOW64\config\systemprofile\Desktop.
  3. Если у вас 64-битный Office, создайте папку по пути: C:\Windows\System32\config\systemprofile\Desktop.
  4. Важно: Установите полные права доступа на созданную папку Desktop для пользователя, от имени которого запускается сервер 1С (обычно это USR1CV8 или NetworkService).

После создания папок перезагрузка сервера обычно не требуется, и метод Add() начинает отрабатывать корректно.

Решение №2: Использование нативных средств 1С (Пакет отображаемых документов)

Если ваша платформа 1С версии 8.3.10 и выше, использование COM-объекта Excel.Application на сервере считается «плохим тоном» и потенциальной точкой отказа. Разберем, как реализовать задачу сохранения нескольких табличных документов на разные листы одной книги Excel без использования установленного Microsoft Office.

Для этого в платформе существует объект ПакетОтображаемыхДокументов. Посмотрим на пример кода, который позволяет объединить несколько табличных документов:


// Создаем объект пакета
Пакет = Новый ПакетОтображаемыхДокументов;

// Формируем или получаем первый табличный документ
ТабДок1 = СформироватьОтчетПоПродажам();
ЭлементПакета1 = Пакет.Состав.Добавить();
ЭлементПакета1.Данные = ПоместитьВоВременноеХранилище(ТабДок1);
ЭлементПакета1.Наименование = "Продажи";

// Формируем или получаем второй табличный документ
ТабДок2 = СформироватьОтчетПоОстаткам();
ЭлементПакета2 = Пакет.Состав.Добавить();
ЭлементПакета2.Данные = ПоместитьВоВременноеХранилище(ТабДок2);
ЭлементПакета2.Наименование = "Остатки";

// Сохраняем все вместе в один файл XLSX
// ТипФайлаПакетаОтображаемыхДокументов.XLSX позволяет создать многолистовую книгу
Пакет.Записать("C:\Temp\Report.xlsx", ТипФайлаПакетаОтображаемыхДокументов.XLSX);

Этот метод обладает огромным преимуществом: он работает в десятки раз быстрее, чем COM, не требует наличия установленного Excel на сервере и не зависит от прав доступа к системным профилям Windows.

Решение №3: Настройка DCOM для Microsoft Excel

Иногда создание папки Desktop недостаточно из-за ограничений безопасности DCOM. Рассмотрим, как настроить права на запуск компонента:

  1. Нажмите Win + R, введите dcomcnfg и нажмите Enter.
  2. Перейдите в Службы компонентов -> Компьютеры -> Мой компьютер -> Настройка DCOM.
  3. Найдите в списке Microsoft Excel Application.
  4. В свойствах на вкладке Удостоверение выберите "Данный пользователь" и укажите учетные данные администратора или пользователя, от которого работает 1С. Это позволит Excel запускаться в стабильном окружении.
  5. На вкладке Безопасность в разделах "Разрешения на запуск и активацию" добавьте пользователя USR1CV8.

Проанализируем программный подход через COM

Если по каким-то причинам вы обязаны использовать именно COM (например, для сложного форматирования, которое не поддерживает нативный экспорт 1С), убедитесь, что ваш код правильно управляет памятью и отключает интерактивные сообщения. Посмотрим на правильную инициализацию:


Попытка
    Excel = Новый COMОбъект("Excel.Application");
Исключение
    Сообщить("Не удалось инициализировать Excel: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Обязательные настройки для серверной работы
Excel.DisplayAlerts = Ложь;
Excel.ScreenUpdating = Ложь;
Excel.Visible = Ложь;

Попытка
    РабочаяКнига = Excel.Workbooks.Add();
    // Обработка листов
    Лист = РабочаяКнига.Sheets(1);
    // ... ваш код заполнения ...
    РабочаяКнига.SaveAs(ПутьКФайлу);
Исключение
    Сообщить("Ошибка при работе с книгой: " + ОписаниеОшибки());
КонецПопытки;

// Обязательное завершение процесса
Excel.Quit();
Excel = Неопределено;

Сводная таблица действий

Выясним краткую последовательность действий при возникновении ошибки на сервере:

Подводя итог, можно сказать, что наиболее стабильным и современным решением является переход на встроенные средства 1С. Это избавляет от необходимости администрирования прав доступа к системным папкам Windows и гарантирует работоспособность кода при любых обновлениях безопасности операционной системы.

← На главную