При разработке под тонкий клиент программисты 1С часто используют привычный механизм COMОбъект для работы с Microsoft Excel. Однако при попытке запустить тот же код в веб-клиенте (через браузер) неизбежно возникает критическая ошибка: "Automation server can't create object". Рассмотрим подробнее, почему это происходит и как правильно организовать чтение данных из Excel, чтобы код работал во всех типах клиентов.
Основная причина кроется в архитектуре безопасности современных веб-браузеров. Веб-клиент 1С работает внутри браузера в изолированной среде, так называемой «песочнице». В целях безопасности браузеры блокируют прямой доступ к локальным системным компонентам (ActiveX и COM-объектам) операционной системы. Попытка создать объект Excel.Application напрямую на стороне клиента в браузере обречена на провал, так как у веб-страницы нет прав на запуск приложений, установленных на компьютере пользователя.
Более того, для работы COM-объекта на компьютере пользователя обязательно должен быть установлен Microsoft Office. В случае с веб-клиентом мы не можем гарантировать наличие установленного ПО у пользователя, поэтому использование этой технологии считается устаревшим и нецелесообразным.
Единственный надежный и кроссплатформенный способ прочитать Excel в веб-клиенте — это передать файл с локального компьютера пользователя на сервер 1С и обработать его там встроенными средствами платформы. Проанализируем этот процесс по шагам:
ТабличныйДокумент для программного разбора файла.Платформа 1С:Предприятие, начиная с версии 8.3.10, умеет нативно (без установленного Excel) читать файлы форматов .xlsx и .xls на стороне сервера. Проанализируем пример кода, который решает поставленную задачу.
Сначала на стороне клиента нам нужно получить файл и поместить его во временное хранилище:
&НаКлиенте
Процедура ЗагрузитьExcel(Команда)
// Подключаем расширение работы с файлами, если оно еще не подключено
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
НачатьПомещениеФайла(ОписаниеОповещения, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Результат Тогда
// Файл успешно помещен в хранилище, вызываем серверную процедуру
ПрочитатьФайлНаСервере(Адрес);
КонецЕсли;
КонецПроцедуры
Теперь рассмотрим серверную часть, где происходит основная магия. Мы создаем объект ТабличныйДокумент и используем его метод Прочитать(). Это позволяет извлечь данные без использования COM-интерфейсов.
&НаСервере
Процедура ПрочитатьФайлНаСервере(АдресХранилища)
// Получаем данные из хранилища
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
// Создаем временный файл на сервере
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ТабДок = Новый ТабличныйДокумент;
Попытка
// Метод Прочитать определяет формат файла автоматически
ТабДок.Прочитать(ИмяВременногоФайла);
// Перебираем строки и колонки
ВсегоСтрок = ТабДок.ВысотаТаблицы;
Для НомерСтроки = 1 По ВсегоСтрок Цикл
// Получаем значение из первой колонки
ЗначениеЯчейки = ТабДок.Область(НомерСтроки, 1).Текст;
// Здесь выполняем логику обработки данных
Сообщить("Прочитана строка: " + ЗначениеЯчейки);
КонецЦикла;
Исключение
Сообщить("Ошибка при чтении файла: " + ОписаниеОшибки());
КонецПопытки;
// Удаляем временный файл после работы
УдалитьФайлы(ИмяВременногоФайла);
КонецПроцедуры
Рассмотрим, почему этот метод лучше использования COM-объектов:
.xlsx (NativeXLSX) работает значительно быстрее, чем запуск тяжелого приложения Excel через COM.EXCEL.EXE в памяти сервера или клиента.Если вам требуется обрабатывать очень большие файлы (десятки тысяч строк), загрузка всего файла в ТабличныйДокумент может занять много оперативной памяти. В таких случаях проанализируем альтернативный подход: работу с файлом .xlsx как с ZIP-архивом. Внутри формата Office Open XML данные хранятся в виде обычных XML-файлов. Платформа 1С позволяет использовать ЧтениеXML для последовательного разбора этих данных, что значительно снижает нагрузку на сервер.
Подводя итог, можно сказать: если вы столкнулись с ошибкой создания объекта в веб-клиенте, забудьте про COMОбъект. Используйте механизм помещения файлов во временное хранилище и штатный метод Прочитать() объекта ТабличныйДокумент на стороне сервера. Это современный стандарт разработки в системе 1С:Предприятие 8.3.