Почему не работает выгрузка и загрузка Excel на сервере 1С и как исправить ошибку?

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

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

Симптомы и причины возникновения ошибки

Проблема обычно проявляется двумя основными ошибками при выполнении серверного кода (с директивой &НаСервере):

  1. При создании или добавлении книги: «Приложению Microsoft Excel не удается открыть или сохранить документы из-за нехватки памяти или места на диске».
  2. При открытии существующего файла: «Ошибка при получении значения атрибута контекста (Workbooks)... по причине: Неизвестная ошибка».

Проанализируем основные причины, почему это происходит на сервере:

  1. Ограничения Microsoft Office для системных служб. Пакет MS Office не предназначен для запуска из-под неинтерактивных системных учеток (таких как служба USR1CV8). При попытке вызвать Excel на сервере система ищет служебные каталоги профиля, которых по умолчанию не существует.
  2. Отсутствие системных папок Desktop. Если у системного профиля Windows отсутствуют каталоги Desktop, MS Excel не может инициализировать буферы и выдает ошибку о «нехватке памяти».
  3. Прямой доступ к локальному пути клиента. При вызове Excel.Workbooks.Open(Объект.КаталогФайла) на сервере передается путь к диску пользователя (например, C:\Users\...). Сервер 1С пытается найти этот файл на своем собственном диске и не находит его.
  4. Разрядность сервера и MS Office. Если служба 1С запущен на 64-разрядной ОС, а MS Office установлен 32-разрядный, возникают сбои взаимодействия через DCOM.

Основное решение: Переход на штатный ТабличныйДокумент

Самый надежный и быстродействующий способ избавиться от зависаний и ошибок COM — полностью отказаться от вызова Excel.Application на сервере. Платформа 1С:Предприятие умеет самостоятельно читать и сохранять файлы форматов XLS и XLSX без использования установленного MS Office.

1. Выгрузка данных в Excel через ТабличныйДокумент

Рассмотрим, как сформировать данные и сохранить их в файл с помощью встроенных средств платформы:


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

2. Чтение и загрузка данных из Excel без использования COM

Для загрузки файла Excel на сервере достаточно прочитать его в объект ТабличныйДокумент. Однако предварительно файл необходимо правильно передать с клиента на сервер.

Разберем по шагам правильный алгоритм загрузки:

Шаг 1. Передача файла с клиента на сервер через временное хранилище:


&НаКлиенте
Процедура ЗагрузитьФайлКлиент()
    
    // Помещаем выбранный пользователем файл во временное хранилище
    АдресХранилища = "";
    Если Не ПоместитьФайлВХранилище(АдресХранилища, Объект.КаталогФайла, , Ложь, УникальныйИдентификатор) Тогда
        Возврат;
    КонецЕсли;
    
    ЗагрузитьФайлНаСервере(АдресХранилища);
    
КонецПроцедуры

Шаг 2. Чтение файла в ТабличныйДокумент на сервере:


&НаСервере
Процедура ЗагрузитьФайлНаСервере(Знач АдресХранилища)
    
    // Получаем двоичные данные из хранилища и сохраняем во временный файл сервера
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
    ВременныйФайл = ПолучитьИмяВременногоФайла("xlsx");
    ДвоичныеДанные.Записать(ВременныйФайл);
    
    // Загружаем файл в ТабличныйДокумент
    ТабДок = Новый ТабличныйДокумент;
    ТабДок.Прочитать(ВременныйФайл, СпособЧтенияЗначенийТабличногоДокумента.Значение);
    
    // Обходим строки полученного документа
    Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл
        ЗначениеКолонки1 = ТабДок.ПолучитьОбласть(НомерСтроки, 1).Текст;
        ЗначениеКолонки2 = ТабДок.ПолучитьОбласть(НомерСтроки, 2).Текст;
        // Обработка прочитанных данных
    КонецЦикла;
    
    // Удаляем временный файл
    УдалитьФайлы(ВременныйФайл);
    
КонецПроцедуры

Альтернативное решение: Настройка сервера для работы с COM (если COM необходим)

Если специфика задачи требует использования именно COMОбъект("Excel.Application") на сервере, выполним следующие настройки на сервере приложений:

  1. Создание каталогов Desktop. Перейдем в директории системного профиля на сервере и вручную создадим папки Desktop:
    • Для 64-битной ОС: C:\Windows\System32\config\systemprofile\Desktop
    • Для 32-битной ОС (или 32-битных компонентов): C:\Windows\SysWOW64\config\systemprofile\Desktop
  2. Настройка прав доступа. Назначим пользователю, от имени которого запущен служба сервера 1С (например, USR1CV8), полные права доступа на созданные папки Desktop.
  3. Выполнение COM на клиенте. Если логика выгрузки не привязана строго к серверу, перенесем код создания COM-объекта в контекст &НаКлиенте. На клиенте присутствует графический сеанс пользователя, благодаря чему Excel работает без системных ошибок.

Использование метода ТабличныйДокумент является наилучшей практикой, так как обеспечивает высокую скорость работы, независимость от стороннего ПО и корректную работу сервера 1С на любой операционной системе (включая Linux).

← На главную