При разработке механизмов выгрузки данных из 1С:Предприятия в формат Excel программисты часто сталкиваются с ситуацией, когда код идеально работает на клиенте, но выдает критическую ошибку при выполнении в серверном контексте или в фоновом задании. Одной из самых коварных является ошибка: Произошла исключительная ситуация (Microsoft Excel): Приложению Microsoft Excel не удается открыть или сохранить документы из-за нехватки памяти или места на диске. Разберем подробно, почему это происходит и как решить проблему несколькими способами.
Рассмотрим стандартную ситуацию: сервер 1С пытается инициализировать COM-объект Excel.Application и создать новую рабочую книгу методом Add(). Несмотря на наличие гигабайтов свободной оперативной памяти и терабайтов дискового пространства, система выдает ошибку нехватки ресурсов. Выясним причину: Microsoft Excel — это интерактивное приложение, которое при запуске от имени системной службы (каковой является сервер 1С) не находит необходимых элементов окружения рабочего стола (Desktop) в профиле пользователя.
Проанализируем ситуацию глубже: даже если вы не записываете файл в данный момент, метод Add() заставляет Excel создавать временные копии и инициализировать структуры для отображения листов. Если папки рабочего стола для системного профиля отсутствуют, Excel блокирует операцию, выдавая ложное сообщение о нехватке памяти.
Для исправления этой ошибки нам необходимо вручную создать папки, которые Excel ожидает увидеть в профиле пользователя, под которым запущена служба ragent. Выполним следующие действия:
C:\Windows\SysWOW64\config\systemprofile\Desktop.C:\Windows\System32\config\systemprofile\Desktop.Desktop для пользователя, от имени которого запускается сервер 1С (обычно это USR1CV8 или NetworkService).После создания папок перезагрузка сервера обычно не требуется, и метод Add() начинает отрабатывать корректно.
Если ваша платформа 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.
Иногда создание папки Desktop недостаточно из-за ограничений безопасности DCOM. Рассмотрим, как настроить права на запуск компонента:
Win + R, введите dcomcnfg и нажмите Enter.USR1CV8.Если по каким-то причинам вы обязаны использовать именно COM (например, для сложного форматирования, которое не поддерживает нативный экспорт 1С), убедитесь, что ваш код правильно управляет памятью и отключает интерактивные сообщения. Посмотрим на правильную инициализацию:
Попытка
Excel = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Не удалось инициализировать Excel: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Обязательные настройки для серверной работы
Excel.DisplayAlerts = Ложь;
Excel.ScreenUpdating = Ложь;
Excel.Visible = Ложь;
Попытка
РабочаяКнига = Excel.Workbooks.Add();
// Обработка листов
Лист = РабочаяКнига.Sheets(1);
// ... ваш код заполнения ...
РабочаяКнига.SaveAs(ПутьКФайлу);
Исключение
Сообщить("Ошибка при работе с книгой: " + ОписаниеОшибки());
КонецПопытки;
// Обязательное завершение процесса
Excel.Quit();
Excel = Неопределено;
Выясним краткую последовательность действий при возникновении ошибки на сервере:
%TEMP%).Desktop в профиле systemprofile.ПакетОтображаемыхДокументов.EXCEL.EXE, которые могут блокировать доступ к файлам или памяти.Подводя итог, можно сказать, что наиболее стабильным и современным решением является переход на встроенные средства 1С. Это избавляет от необходимости администрирования прав доступа к системным папкам Windows и гарантирует работоспособность кода при любых обновлениях безопасности операционной системы.