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

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

При работе в веб-клиенте платформы 1С:Предприятие разработчики часто сталкиваются с ошибкой при попытке обращения к локальным файлам или COM-объектам на компьютере пользователя. Попытка выполнить код вида ПолучитьCOMОбъект() на стороне веб-клиента приводит к ошибке: «COM-объекты поддерживаются только в Microsoft Internet Explorer» или к блокировке вызова настройками безопасности браузера.

Разберем подробнее, почему возникают подобные ограничения и как правильно организовать импорт данных из Excel в веб-клиенте согласно стандартам 1С.

Почему происходит ошибка при вызове COM-объектов на клиенте?

Выясним причину такого поведения веб-клиента. Использование COM-технологий (ActiveX) напрямую из браузера имеет ряд существенных ограничений:

  1. Ограничения безопасности браузеров: Современные браузеры полностью заблокировали поддержку ActiveX и COM из соображений безопасности. Даже при использовании Internet Explorer встроенные настройки зон безопасности часто запрещают создание непривилегированных локальных OLE-объектов.
  2. Кроссплатформенность: Веб-клиент 1С может запускаться в операционных системах Linux, macOS, Android и iOS, а также в различных браузерах (Chrome, Firefox, Edge, Safari), где COM-технологии Microsoft принципиально отсутствуют.
  3. Синхронность модальных диалогов: Прямой вызов диалога выбора файла ДиалогВыбораФайла.Выбрать() является синхронным вызовом, который заблокирован в тонком и веб-клиенте при работе в современных режимах платформы.

Правильный алгоритм загрузки Excel в веб-клиенте

Рассмотрим архитектурно правильный подход к решению этой задачи. Вместо попытки прочитать файл локально через COM на клиенте следует выполнить следующие действия:

  1. Запросить файл у пользователя асинхронно через ОписаниеОповещения.
  2. Поместить выбранный файл во временное хранилище на сервере.
  3. Передать адрес временного хранилища на сервер.
  4. Прочитать данные из файла на стороне сервера (например, через ТабличныйДокумент или COM-объект сервера) и заполнить необходимые структуры или табличные части.

Разбор по шагам: реализация загрузки и чтения файла

Разберем по шагам практический пример реализации этого процесса в управляемых формах 1С.

Шаг 1. Вызов диалога выбора файла на клиенте

На стороне клиента формируем обработчик для выбора файла и его отправки во временное хранилище:


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

Шаг 2. Обработка завершения выбора файла на клиенте

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


&НаКлиенте
Процедура ПослеВыбораФайлаЗавершение(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт

    Если ОписаниеПомещенногоФайла = Неопределено Или ПустаяСтрока(ОписаниеПомещенногоФайла.Адрес) Тогда
        Возврат;
    КонецЕсли;

    // Передаем адрес файла во временном хранилище на сервер
    ОбработатьФайлНаСервере(ОписаниеПомещенногоФайла.Адрес);
    
    Сообщить("Импорт данных успешно завершен!");

КонецПроцедуры

Шаг 3. Чтение файла Excel на сервере без COM-объектов

Посмотрим на пример обработки файла на сервере. Чтобы код работал стабильно и независимо от того, установлен ли Microsoft Office на сервере, рекомендуется использовать встроенный объект ТабличныйДокумент:


&НаСервере
Процедура ОбработатьФайлНаСервере(АдресФайла)

    // Двоичные данные из хранилища сохраняем во временный файл на сервере
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайла);
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
    ДвоичныеДанные.Записать(ИмяВременногоФайла);
    
    // Используем встроенный механизм чтения документов Excel
    ТабДок = Новый ТабличныйДокумент;
    Попытка
        ТабДок.Прочитать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLSX);
    Исключение
        УдалитьФайлы(ИмяВременногоФайла);
        ВызватьИсключение "Не удалось прочитать файл Excel. Проверьте формат файла.";
    КонецПопытки;
    
    // Обходим строки табличного документа
    ВысотаТаблицы = ТабДок.ВысотаТаблицы;
    Для НомерСтроки = 2 По ВысотаТаблицы Цикл
        
        ФИО = ТабДок.ПолучитьОбласть(НомерСтроки, 1).ТекущийОбъект;
        // Если область не содержит объект, читаем текст
        Если ФИО = Неопределено Тогда
            ФИО = ТабДок.ПолучитьОбласть(НомерСтроки, 1).Текст;
        КонецЕсли;
        
        Если НЕ ЗначениеЗаполнено(СокрЛП(ФИО)) Тогда
            Продолжить;
        КонецЕсли;
        
        // Заполняем табличную часть объекта
        НоваяСтрока = Объект.ТЧИсторияДанныхСотрудников.Добавить();
        НоваяСтрока.ФИОСотрудника = СокрЛП(ФИО);
        НоваяСтрока.Образование  = ТабДок.ПолучитьОбласть(НомерСтроки, 2).Текст;
        НоваяСтрока.Категория    = ТабДок.ПолучитьОбласть(НомерСтроки, 3).Текст;
        НоваяСтрока.РНН          = ТабДок.ПолучитьОбласть(НомерСтроки, 4).Текст;
        НоваяСтрока.ИНН          = ТабДок.ПолучитьОбласть(НомерСтроки, 5).Текст;
        НоваяСтрока.МВЗ          = ТабДок.ПолучитьОбласть(НомерСтроки, 6).Текст;
        
    КонецЦикла;
    
    // Удаляем временный файл с диска сервера
    УдалитьФайлы(ИмяВременногоФайла);

КонецПроцедуры

Альтернативные варианты обработки Excel на сервере

Проанализируем ситуации, когда стандартного метода чтения через ТабличныйДокумент недостаточно:

  1. Чтение файлов старого формата .xls: Объект ТабличныйДокумент поддерживает чтение как .xlsx, так и .xls (указывается соответствующий ТипФайлаТабличногоДокумента).
  2. Использование COM-объекта Excel на сервере (только для Windows-серверов): Если требуется сложная логика макросов или форматирования, вызов Новый COMОбъект("Excel.Application") выполняют исключительно на сервере в блоке &НаСервере. На сервере должен быть предварительно установлен пакет Microsoft Office.

Использование асинхронной передачи файла во временное хранилище с последующим разбиранием данных на сервере гарантирует стабильную работу вашей обработки во всех типах клиентов (включая веб-клиент) и на любых операционных системах.

← На главную