При переходе на работу через веб-клиент многие разработчики сталкиваются с серьезной проблемой: привычный код для работы с Excel через COMОбъект("Excel.Application") перестает работать. Это вызывает массу вопросов, особенно когда требуется реализовать парсинг файлов на стороне клиента, не нагружая сервер установкой стороннего программного обеспечения. В данной статье мы проанализируем ситуацию, выясним причины ограничений и рассмотрим современные способы решения этой задачи.
Для начала выясним причину, по которой попытки создать COM-объект в браузере обречены на провал. Современные веб-браузеры (Google Chrome, Microsoft Edge, Mozilla Firefox) работают в изолированной среде, называемой «песочницей». Это сделано в целях безопасности: если бы любая веб-страница могла запускать локальные приложения или обращаться к системным API Windows через COM/ActiveX, это открыло бы огромную дыру для вирусов.
Раньше такая возможность существовала в Internet Explorer благодаря технологии ActiveX, но на текущий момент этот браузер устарел, а его механизмы считаются небезопасными. Таким образом, даже если на компьютере пользователя установлена ОС Windows и пакет MS Office, веб-клиент 1С, запущенный в браузере, не может «достучаться» до Excel напрямую. Нам необходимо искать другие пути, которые не зависят от клиентского окружения.
Самым эффективным и правильным способом в экосистеме 1С является использование метода Прочитать() объекта ТабличныйДокумент. Начиная с версии платформы 8.3.10, 1С умеет самостоятельно разбирать форматы .xls, .xlsx и .ods без установленного Excel.
Разберем по шагам, как реализовать этот механизм для веб-клиента. Основная идея заключается в том, что файл выбирается на клиенте, передается на сервер и там обрабатывается.
Во-первых, нам нужно организовать выбор файла на стороне пользователя:
&НаКлиенте
Процедура ЗагрузитьФайлExcel(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);
ПараметрыВыбора = Новый ПараметрыДиалогаВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ПараметрыВыбора.Фильтр = "Excel файлы (*.xls;*.xlsx)|*.xls;*.xlsx";
НачатьПомещениеФайлаНаСервер(Оповещение, , , , ПараметрыВыбора, УникальныйИдентификатор);
КонецПроцедуры
После того как пользователь выбрал файл, он автоматически помещается во временное хранилище. Рассмотрим подробнее обработку этого события в процедуре оповещения:
&НаКлиенте
Процедура ПослеВыбораФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Результат Тогда
ПарситьФайлНаСервере(Адрес);
КонецЕсли;
КонецПроцедуры
Теперь самое главное — обработка на стороне сервера. Мы используем адрес во временном хранилище, чтобы прочитать данные в ТабличныйДокумент. Важно понимать, что для этого метода не требуется установка Microsoft Excel на сервере.
&НаСервере
Процедура ПарситьФайлНаСервере(АдресХранилища)
ТабДок = Новый ТабличныйДокумент;
ДанныеФайла = ПолучитьИзВременногоХранилища(АдресХранилища);
// Создадим временный файл на сервере для чтения
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДанныеФайла.Записать(ИмяВременногоФайла);
Попытка
ТабДок.Прочитать(ИмяВременногоФайла);
// Обходим строки и колонки
Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл
Значение = ТабДок.Область(НомерСтроки, 1).Текст;
// Здесь логика обработки данных
КонецЦикла;
Исключение
Сообщить("Ошибка при чтении файла: " + ОписаниеОшибки());
КонецПопытки;
УдалитьФайлы(ИмяВременногоФайла);
КонецПроцедуры
Если специфика задачи требует обработки файла именно на стороне клиента (например, при очень слабом канале связи с сервером), мы можем проанализировать ситуацию с использованием JavaScript. В 1С это реализуется через элемент формы Поле HTML-документа.
Посмотрим на пример реализации:
ПолеHTMLДокумента.xlsx.min.js).onchange для элемента input type="file".document.location или window.external.Этот метод технически сложнее, но он позволяет производить «чистый» парсинг на клиенте без передачи бинарных данных на сервер до момента получения готового результата.
Для файлов формата .xlsx существует еще один продвинутый способ. Вспомним структуру этого формата: на самом деле это ZIP-архив, внутри которого находятся XML-файлы с данными.
Мы можем разобрать ситуацию следующим образом:
ЧтениеZipФайла для открытия документа.xl/worksheets/sheet1.xml (содержимое первого листа) и xl/sharedStrings.xml (текстовые значения).ЧтениеXML для программного разбора структуры.Этот метод работает молниеносно и потребляет минимум памяти, однако он требует глубокого понимания структуры OpenXML и не подходит для старых бинарных файлов формата .xls.
Проанализировав все варианты, можно сделать однозначный вывод: попытка реализовать Excel.Application в веб-клиенте — это тупиковый путь, противоречащий архитектуре современных браузеров.
Для большинства задач мы рекомендуем придерживаться следующего алгоритма:
НачатьПомещениеФайлаНаСервер для получения файла от пользователя.ТабличныйДокумент для чтения данных на сервере — это самый стабильный и простой в поддержке метод.Использование этих подходов позволит вашему приложению корректно работать в любом браузере, на любой операционной системе (включая Linux и мобильные платформы) и избавит от необходимости лицензирования и установки MS Office на стороне сервера.