При вызове методов программного взаимодействия с Microsoft Excel на стороне сервера 1С:Предприятие разработчики часто сталкиваются со следующей ошибкой:
Произошла исключительная ситуация (Microsoft Excel): Приложению Microsoft Excel не удается открыть или сохранить документы из-за нехватки памяти или места на диске.
Ошибка появляется в момент выполнения строки кода Книга = Excel.WorkBooks.Add(); или при открытии файла методом Open(). При этом на серверной машине может быть достаточно оперативной памяти и свободного места на диске, а в файловом режиме базы код выполняется без нареканий.
Проанализируем причины возникновения этой проблемы и разберем по шагам эффективные варианты ее решения.
Служба сервера 1С (обычно работающая под учетной записью USR1CV8) запускается в неинтерактивной сессии Windows. Когда из кода 1С, выполняемого на сервере, вызывается Новый COMОбъект("Excel.Application"), операционная система пытается инициализировать приложение Microsoft Excel без полноценного пользовательского окружения.
Основные причины сбоя:
USR1CV8 не имеет прав на запуск, активацию или интерактивное удостоверение компонента Microsoft 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 запускается в пользовательской сессии клиента, где корректно инициализированы все временные папки и реестр, благодаря чему ошибка не возникает.
Если необходимо сгенерировать файл формата XLSX непосредственно на сервере и записать его на диск без установки стороннего ПО, проанализируем штатные возможности 1С. Можно использовать объект ТабличныйДокумент.
&НаСервере
Процедура СформироватьИСохранитьФайлXLSX(ПутьКФайлу)
ТабДок = Новый ТабличныйДокумент;
// Формируем структуру документа
Область = ТабДок.ПолучитьОбласть("A1");
ТабДок.Вывести(Область);
// Сохраняем напрямую в формат XLSX без использования COM и MS Excel
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
КонецПроцедуры
Этот способ работает быстро, не требует наличия установленного пакета Microsoft Office на сервере и не зависит от настроек DCOM.
Если бизнес-логика строго требует применения COM-объекта `Excel.Application` именно на стороне сервера, выполним последовательную настройку операционной системы.
Шаг 1. Создание системных папок Desktop
Создадим специальные каталоги системного профиля Windows и предоставим учетной записи USR1CV8 полные права доступа на них:
C:\Windows\SysWOW64\config\systemprofile\DesktopC:\Windows\System32\config\systemprofile\DesktopШаг 2. Настройка компонента DCOM
dcomcnfg (если Office 32-битный на 64-битной системах, запустите оснастку командой mmc comexp.msc /32).USR1CV8) с предоставлением всех прав.Шаг 3. Проверка временных каталогов и службы Брандмауэра
USR1CV8 к папке системного кэша и временных файлов TEMP / TMP.