Приветствуем вас, коллеги! При работе в клиент-серверном варианте 1С:Предприятие разработчики и системные администраторы часто сталкиваются с неприятной ситуацией. При попытке выполнить выгрузку данных в формат Microsoft Excel на стороне сервера процесс завершается ошибкой: «Произошла исключительная ситуация (Microsoft Office Excel): Microsoft Office Excel не может открыть или сохранить документы из-за нехватки памяти или места на диске». При этом на сервере может быть свободно несколько сотен гигабайт дискового пространства и десятки гигабайт оперативной памяти.
В этой статье мы подробно разберем, почему возникает эта ложная ошибка, проанализируем системные механизмы взаимодействия 1С и Excel через COM-соединение и рассмотрим пошаговые методы устранения проблемы — от админских настроек операционной системы до правильного изменения программного кода.
Когда вы запускаете выгрузку на стороне клиента (на своем рабочем компьютере), Excel открывается в вашем пользовательском сеансе, где есть рабочий стол, графическая оболочка и все необходимые права доступа. Но когда аналогичный код выполняется на сервере (например, в фоновом задании или при вызове серверного метода), ситуация кардинально меняется.
Серверная служба 1С (обычно запущенная от имени специального пользователя USR1CV8 или системной учетной записи SYSTEM) работает в так называемой «Сессии 0» (Session 0). Это изолированное окружение, у которого нет интерактивного рабочего стола. Когда код 1С пытается инициализировать COM-объект Excel.Application, операционная система Windows и сам MS Excel пытаются обратиться к папкам профиля пользователя, запустившего процесс. Так как полноценного рабочего стола у сервисной службы нет, Excel не находит нужных системных папок и временных директорий, после чего аварийно завершает работу, выдавая неинформативную ошибку о нехватке памяти.
Проанализируем пошагово решения, которые помогут устранить эту проблему раз и навсегда.
Это самое частое и эффективное решение. Microsoft Excel при инициализации через COM-объект на стороне сервера жестко требует наличия папки Desktop в профиле пользователя, под которым работает служба. Если служба запущена от имени системного профиля, этих папок в каталогах Windows по умолчанию просто нет.
Давайте создадим их вручную. Выполним следующие шаги:
C:\Windows\SysWOW64\config\systemprofile\
Desktop.C:\Windows\System32\config\systemprofile\
Desktop.USR1CV8), убедитесь, что в свойствах созданной папки Desktop на вкладке «Безопасность» этому пользователю предоставлены полные права (Чтение, Запись, Изменение).После создания папок перезагрузка сервера 1С или операционной системы обычно не требуется — Excel сразу начинает отрабатывать корректно.
Если создание папок не помогло, проблема может быть связана с ограничениями безопасности при запуске приложений DCOM. Нам необходимо настроить права на запуск приложения Microsoft Excel от имени службы.
Рассмотрим процесс настройки по шагам:
Win + R на сервере, введите команду dcomcnfg и нажмите Enter.USR1CV8), и предоставьте ему полные права.Иногда сервер 1С или Excel блокируют временные файлы в системном кэше, что приводит к переполнению выделенного пространства под сессию. Проанализируем состояние папок TEMP:
C:\Windows\Temp.C:\Users\Имя_Пользователя_Службы\AppData\Local\Temp
\\server\share\file.xlsx), помните, что локальная служба SYSTEM не имеет доступа к сети. В этом случае необходимо переписать код так, чтобы файл сначала сохранялся локально на сервере, а затем копировался в сетевой каталог, либо запускать службу 1С от имени доменного пользователя с правами на эту сетевую папку.Если серверная часть 1С работает на 64-битной платформе, а на сервере установлен 32-битный Microsoft Office, прямое обращение через Новый COMОбъект("Excel.Application") может вызывать аппаратные конфликты и завершаться ошибками памяти.
В такой ситуации Windows пытается задействовать суррогатный хост dllhost.exe для связи 64-битного процесса 1С с 32-битной библиотекой Excel. Любой сбой в этом механизме приводит к падению процесса выгрузки. Решением здесь является либо приведение окружения к единой разрядности (установка 64-битного Office), либо отказ от COM-технологии.
Использование Microsoft Office на стороне сервера официально не поддерживается самой компанией Microsoft. Процессы Excel в фоновом режиме склонны «зависать» в памяти, блокировать файлы, вызывать утечки ресурсов и падения рабочих процессов 1С. При любом обновлении Windows настройки DCOM могут сброситься, и выгрузка снова сломается.
Самым стабильным, быстрым и современным решением является формирование отчетов и файлов с помощью встроенных механизмов 1С. Платформа 1С:Предприятие умеет самостоятельно сохранять табличные документы в формат .xlsx без использования установленного Excel.
Давайте посмотрим на пример кода, который заменяет нестабильное COM-соединение на безопасное сохранение средствами платформы:
// Вместо создания Excel.Application используем встроенный ТабличныйДокумент
ТабДок = Новый ТабличныйДокумент;
// Заполняем макет или строим отчет программно
// ... (код формирования отчета) ...
// Настройки отображения сетки, если это необходимо
ТабДок.ОтображатьСетку = Истина;
// Сохраняем файл напрямую в формате XLSX
Попытка
ТабДок.Записать(ПутьКФайлуВыгрузки, ТипФайлаТабличногоДокумента.XLSX);
Сообщить("Выгрузка успешно завершена!");
Исключение
ЗаписьЖурналаРегистрации("ВыгрузкаДанных", УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка при сохранении файла: " + ОписаниеОшибки());
ВызватьИсключение "Не удалось сохранить файл выгрузки на сервере.";
КонецПопытки;
Такой подход обладает неоспоримыми преимуществами:
ТабличныйДокумент происходит в десятки раз быстрее, чем построчная запись через COM-соединение.Применяйте эти методы на практике, настраивайте систему правильно и делайте ваши интеграции надежными!