Как прочитать файл Excel в веб-клиенте 1С:Предприятие 8.3?

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

При разработке под тонкий клиент программисты 1С часто используют привычный механизм COMОбъект для работы с Microsoft Excel. Однако при попытке запустить тот же код в веб-клиенте (через браузер) неизбежно возникает критическая ошибка: "Automation server can't create object". Рассмотрим подробнее, почему это происходит и как правильно организовать чтение данных из Excel, чтобы код работал во всех типах клиентов.

Выясним причину ошибки: почему COM-объекты не работают в браузере?

Основная причина кроется в архитектуре безопасности современных веб-браузеров. Веб-клиент 1С работает внутри браузера в изолированной среде, так называемой «песочнице». В целях безопасности браузеры блокируют прямой доступ к локальным системным компонентам (ActiveX и COM-объектам) операционной системы. Попытка создать объект Excel.Application напрямую на стороне клиента в браузере обречена на провал, так как у веб-страницы нет прав на запуск приложений, установленных на компьютере пользователя.

Более того, для работы COM-объекта на компьютере пользователя обязательно должен быть установлен Microsoft Office. В случае с веб-клиентом мы не можем гарантировать наличие установленного ПО у пользователя, поэтому использование этой технологии считается устаревшим и нецелесообразным.

Разберем правильный алгоритм решения задачи

Единственный надежный и кроссплатформенный способ прочитать Excel в веб-клиенте — это передать файл с локального компьютера пользователя на сервер 1С и обработать его там встроенными средствами платформы. Проанализируем этот процесс по шагам:

  1. Выбор файла пользователем: Используем диалог выбора файла на клиенте.
  2. Помещение файла во временное хранилище: Передаем двоичные данные файла с клиента на сервер.
  3. Чтение данных на сервере: Используем объект ТабличныйДокумент для программного разбора файла.

Реализация чтения через Табличный документ (рекомендуемый способ)

Платформа 1С:Предприятие, начиная с версии 8.3.10, умеет нативно (без установленного Excel) читать файлы форматов .xlsx и .xls на стороне сервера. Проанализируем пример кода, который решает поставленную задачу.

Сначала на стороне клиента нам нужно получить файл и поместить его во временное хранилище:


&НаКлиенте
Процедура ЗагрузитьExcel(Команда)
    
    // Подключаем расширение работы с файлами, если оно еще не подключено
    ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
    НачатьПомещениеФайла(ОписаниеОповещения, , , Истина, УникальныйИдентификатор);
    
КонецПроцедуры

&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
    
    Если Результат Тогда
        // Файл успешно помещен в хранилище, вызываем серверную процедуру
        ПрочитатьФайлНаСервере(Адрес);
    КонецЕсли;
    
КонецПроцедуры

Теперь рассмотрим серверную часть, где происходит основная магия. Мы создаем объект ТабличныйДокумент и используем его метод Прочитать(). Это позволяет извлечь данные без использования COM-интерфейсов.


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

Преимущества использования Табличного документа

Рассмотрим, почему этот метод лучше использования COM-объектов:

Использование технологии NativeXLSX для больших файлов

Если вам требуется обрабатывать очень большие файлы (десятки тысяч строк), загрузка всего файла в ТабличныйДокумент может занять много оперативной памяти. В таких случаях проанализируем альтернативный подход: работу с файлом .xlsx как с ZIP-архивом. Внутри формата Office Open XML данные хранятся в виде обычных XML-файлов. Платформа 1С позволяет использовать ЧтениеXML для последовательного разбора этих данных, что значительно снижает нагрузку на сервер.

Подводя итог, можно сказать: если вы столкнулись с ошибкой создания объекта в веб-клиенте, забудьте про COMОбъект. Используйте механизм помещения файлов во временное хранилище и штатный метод Прочитать() объекта ТабличныйДокумент на стороне сервера. Это современный стандарт разработки в системе 1С:Предприятие 8.3.

← На главную