Как загрузить данные из Excel в веб-клиенте 1С без использования COM-объекта?

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

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

Почему COM-объекты не работают в веб-клиенте?

Для начала выясним причину, по которой попытки создать COM-объект в браузере обречены на провал. Современные веб-браузеры (Google Chrome, Microsoft Edge, Mozilla Firefox) работают в изолированной среде, называемой «песочницей». Это сделано в целях безопасности: если бы любая веб-страница могла запускать локальные приложения или обращаться к системным API Windows через COM/ActiveX, это открыло бы огромную дыру для вирусов.

Раньше такая возможность существовала в Internet Explorer благодаря технологии ActiveX, но на текущий момент этот браузер устарел, а его механизмы считаются небезопасными. Таким образом, даже если на компьютере пользователя установлена ОС Windows и пакет MS Office, веб-клиент 1С, запущенный в браузере, не может «достучаться» до Excel напрямую. Нам необходимо искать другие пути, которые не зависят от клиентского окружения.

Решение 1: Использование встроенного объекта ТабличныйДокумент

Самым эффективным и правильным способом в экосистеме 1С является использование метода Прочитать() объекта ТабличныйДокумент. Начиная с версии платформы 8.3.10, 1С умеет самостоятельно разбирать форматы .xls, .xlsx и .ods без установленного Excel.

Разберем по шагам, как реализовать этот механизм для веб-клиента. Основная идея заключается в том, что файл выбирается на клиенте, передается на сервер и там обрабатывается.

Во-первых, нам нужно организовать выбор файла на стороне пользователя:


&НаКлиенте
Процедура ЗагрузитьФайлExcel(Команда)
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);
    ПараметрыВыбора = Новый ПараметрыДиалогаВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ПараметрыВыбора.Фильтр = "Excel файлы (*.xls;*.xlsx)|*.xls;*.xlsx";
    
    НачатьПомещениеФайлаНаСервер(Оповещение, , , , ПараметрыВыбора, УникальныйИдентификатор);
КонецПроцедуры

После того как пользователь выбрал файл, он автоматически помещается во временное хранилище. Рассмотрим подробнее обработку этого события в процедуре оповещения:


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

Теперь самое главное — обработка на стороне сервера. Мы используем адрес во временном хранилище, чтобы прочитать данные в ТабличныйДокумент. Важно понимать, что для этого метода не требуется установка Microsoft Excel на сервере.


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

Решение 2: Интеграция с JavaScript (библиотека SheetJS)

Если специфика задачи требует обработки файла именно на стороне клиента (например, при очень слабом канале связи с сервером), мы можем проанализировать ситуацию с использованием JavaScript. В 1С это реализуется через элемент формы Поле HTML-документа.

Посмотрим на пример реализации:

  1. В форму добавляется ПолеHTMLДокумента.
  2. В него загружается HTML-код, содержащий скрипт библиотеки SheetJS (известной как xlsx.min.js).
  3. В скрипте настраивается событие onchange для элемента input type="file".
  4. Библиотека парсит Excel-файл прямо в браузере и возвращает JSON-строку в 1С через механизм document.location или window.external.

Этот метод технически сложнее, но он позволяет производить «чистый» парсинг на клиенте без передачи бинарных данных на сервер до момента получения готового результата.

Решение 3: Чтение XLSX как ZIP-архива

Для файлов формата .xlsx существует еще один продвинутый способ. Вспомним структуру этого формата: на самом деле это ZIP-архив, внутри которого находятся XML-файлы с данными.

Мы можем разобрать ситуацию следующим образом:

  1. Использовать объект ЧтениеZipФайла для открытия документа.
  2. Извлечь файл xl/worksheets/sheet1.xml (содержимое первого листа) и xl/sharedStrings.xml (текстовые значения).
  3. Использовать ЧтениеXML для программного разбора структуры.

Этот метод работает молниеносно и потребляет минимум памяти, однако он требует глубокого понимания структуры OpenXML и не подходит для старых бинарных файлов формата .xls.

Итоги и рекомендации

Проанализировав все варианты, можно сделать однозначный вывод: попытка реализовать Excel.Application в веб-клиенте — это тупиковый путь, противоречащий архитектуре современных браузеров.

Для большинства задач мы рекомендуем придерживаться следующего алгоритма:

Использование этих подходов позволит вашему приложению корректно работать в любом браузере, на любой операционной системе (включая Linux и мобильные платформы) и избавит от необходимости лицензирования и установки MS Office на стороне сервера.

← На главную