При работе с внешними обработками в клиент-серверном варианте 1С:Предприятие разработчики часто сталкиваются с ситуацией, когда код выгрузки или загрузки через COMОбъект("Excel.Application") успешно работает в файловой базе, но на сервере завершается ошибкой. Рассмотрим причины появления этой проблемы и разберем способы ее правильного решения.
Проблема обычно проявляется двумя основными ошибками при выполнении серверного кода (с директивой &НаСервере):
Проанализируем основные причины, почему это происходит на сервере:
USR1CV8). При попытке вызвать Excel на сервере система ищет служебные каталоги профиля, которых по умолчанию не существует.Excel.Workbooks.Open(Объект.КаталогФайла) на сервере передается путь к диску пользователя (например, C:\Users\...). Сервер 1С пытается найти этот файл на своем собственном диске и не находит его.Самый надежный и быстродействующий способ избавиться от зависаний и ошибок COM — полностью отказаться от вызова Excel.Application на сервере. Платформа 1С:Предприятие умеет самостоятельно читать и сохранять файлы форматов XLS и XLSX без использования установленного MS Office.
Рассмотрим, как сформировать данные и сохранить их в файл с помощью встроенных средств платформы:
&НаСервере
Процедура ВыгрузитьНачисленияНаСервере()
ТабДок = Новый ТабличныйДокумент;
// Формируем структуру документа (заполняем области данными)
Область = ТабДок.ПолучитьОбласть("R1C1:R1C2");
Область.Область(1, 1).Текст = "Сотрудник";
Область.Область(1, 2).Текст = "Сумма";
ТабДок.Вывести(Область);
// Сохраняем файл во временную директорию или запрашиваем путь
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
КонецПроцедуры
Для загрузки файла Excel на сервере достаточно прочитать его в объект ТабличныйДокумент. Однако предварительно файл необходимо правильно передать с клиента на сервер.
Разберем по шагам правильный алгоритм загрузки:
Шаг 1. Передача файла с клиента на сервер через временное хранилище:
&НаКлиенте
Процедура ЗагрузитьФайлКлиент()
// Помещаем выбранный пользователем файл во временное хранилище
АдресХранилища = "";
Если Не ПоместитьФайлВХранилище(АдресХранилища, Объект.КаталогФайла, , Ложь, УникальныйИдентификатор) Тогда
Возврат;
КонецЕсли;
ЗагрузитьФайлНаСервере(АдресХранилища);
КонецПроцедуры
Шаг 2. Чтение файла в ТабличныйДокумент на сервере:
&НаСервере
Процедура ЗагрузитьФайлНаСервере(Знач АдресХранилища)
// Получаем двоичные данные из хранилища и сохраняем во временный файл сервера
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
ВременныйФайл = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные.Записать(ВременныйФайл);
// Загружаем файл в ТабличныйДокумент
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ВременныйФайл, СпособЧтенияЗначенийТабличногоДокумента.Значение);
// Обходим строки полученного документа
Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл
ЗначениеКолонки1 = ТабДок.ПолучитьОбласть(НомерСтроки, 1).Текст;
ЗначениеКолонки2 = ТабДок.ПолучитьОбласть(НомерСтроки, 2).Текст;
// Обработка прочитанных данных
КонецЦикла;
// Удаляем временный файл
УдалитьФайлы(ВременныйФайл);
КонецПроцедуры
Если специфика задачи требует использования именно COMОбъект("Excel.Application") на сервере, выполним следующие настройки на сервере приложений:
Desktop:
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\DesktopUSR1CV8), полные права доступа на созданные папки Desktop.&НаКлиенте. На клиенте присутствует графический сеанс пользователя, благодаря чему Excel работает без системных ошибок.Использование метода ТабличныйДокумент является наилучшей практикой, так как обеспечивает высокую скорость работы, независимость от стороннего ПО и корректную работу сервера 1С на любой операционной системе (включая Linux).