Почему не работает COMОбъект Excel в веб-клиенте 1С:Фреш и как загрузить файл?

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

При адаптации внешних обработок и расширений для работы в облачном сервисе 1С:Предприятие 8 через Интернет (1С:Фреш) разработчики часто сталкиваются с ошибкой при попытке создания COM-соединения с Microsoft Excel. В локальной файловой или клиент-серверной базе под управлением тонкого клиента Windows код выполняется штатно, но в браузере при выполнении команды возникает исключение.

Рассмотрим типовой фрагмент кода, приводящий к ошибке:


&НаКлиенте
Процедура ВвестиДокументы(Команда)
    Попытка 
        Excel = Новый COMОбъект("Excel.Application"); 
    Исключение 
        Сообщить("Не удалось инициализировать Excel"); 
        Возврат; 
    КонецПопытки;
КонецПроцедуры

Выясним причину такого поведения платформы и разберем архитектурно правильные способы загрузки данных из таблиц Excel, полностью совместимые с требованиями облачного сервиса.

Причины недоступности COM-объектов в веб-клиенте и 1С:Фреш

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

  1. Ограничения веб-браузеров: Исторически вызов COM-объектов в веб-клиенте 1С опирался исключительно на технологию ActiveX, которая поддерживалась только в устаревшем браузере Microsoft Internet Explorer. В современных веб-браузерах (Google Chrome, Яндекс.Браузер, Mozilla Firefox, Microsoft Edge) поддержка интерфейсов ActiveX и плагинов NPAPI полностью упразднена разработчиками браузеров из соображений безопасности. Платформа 1С технически не может запустить процесс операционной системы из контекста веб-страницы.
  2. Особенности серверной инфраструктуры 1С:Фреш: Кластеры серверов в облачных сервисах работают под управлением операционных систем на базе Linux. В среде Linux пакет Microsoft Office отсутствует, а механизмы Windows COM/OLE недоступны на системном уровне. Создать COM-объект на стороне сервера в облаке невозможно.
  3. Безопасный режим исполнения: Все дополнительные отчеты и обработки в сервисе 1С:Фреш подключаются и выполняются с параметром БезопасныйРежим = Истина. В безопасном режиме платформой принудительно заблокированы обращения к COM-объектам, запуск внешних исполняемых файлов через ЗапуститьПриложение и прямой доступ к системным ресурсам.

Таким образом, прямое чтение файлов через COM в веб-клиенте невозможно. Для работы в облаке необходимо перестроить логику: передавать файл с клиентского компьютера на сервер через временное хранилище и разбирать его кроссплатформенными средствами платформы 1С.

Штатный способ: чтение Excel через ТабличныйДокумент

Начиная с версии 8.3.6 платформа 1С:Предприятие обладает встроенной поддержкой чтения файлов форматов .xls и .xlsx напрямую в объект ТабличныйДокумент. Этот механизм не требует установленного офисного пакета, работает на серверах под управлением Linux и полностью совместим с безопасным режимом 1С:Фреш.

Разберем по шагам реализацию загрузки файла:

  1. Пользователь выбирает файл на клиенте и помещает его во временное хранилище с помощью асинхронного метода.
  2. Серверная процедура извлекает двоичные данные, сохраняет их во временный файл и загружает в ТабличныйДокумент с помощью метода Прочитать().
  3. Выполняется обход ячеек таблицы и заполнение нужных документов или справочников.
  4. Временные файлы на сервере корректно удаляются.

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


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

&НаКлиенте
Процедура ПослеВыбораФайла(Результат, ДополнительныеПараметры) Экспорт
    Если Результат = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    ПрочитатьФайлНаСервере(Результат.Адрес);
    ПоказатьОповещениеПользователя("Загрузка", , "Данные успешно загружены!");
КонецПроцедуры

Теперь рассмотрим серверную процедуру, которая принимает адрес временного хранилища и считывает данные:


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

Параметр СпособЧтенияЗначенийТабличногоДокумента.Значение позволяет получать в ячейках исходные типы (числа, даты), а не только строковые представления, что упрощает дальнейшую валидацию данных.

Альтернативные варианты чтения данных

В зависимости от архитектуры задачи и формата исходных документов можно использовать и другие подходы, поддерживаемые в 1С:Фреш:

  1. Подсистема БСП «Загрузка данных из файла»: Большинство конфигураций в сервисе 1С:Фреш содержат Библиотеку стандартных подсистем. Рекомендуется использовать встроенные механизмы БСП, которые уже включают готовый диалог сопоставления колонок, парсинг табличных документов и проверку корректности заполнения реквизитов.
  2. Прямой разбор XLSX через ZIP и XML: Файл формата .xlsx является стандартным ZIP-архивом, содержащим XML-структуры. Платформа 1С позволяет открыть его с помощью объектов ЧтениеZipФайла и ЧтениеXML, после чего прочитать узлы xl/sharedStrings.xml и данные листов. Этот метод требует написания собственного парсера, но работает максимально быстро при больших объемах данных и не потребляет лишнюю оперативную память.
  3. Использование формата CSV: Если источник формирования файлов можно настроить, оптимально перевести выгрузку в формат текстовых файлов с разделителями (CSV). Для их разбора на сервере используется объект ЧтениеТекста, который гарантирует максимальную производительность без необходимости разбора бинарных таблиц.

Важный вывод: отказ от технологии COM в пользу платформенных методов (ТабличныйДокумент.Прочитать или механизмов БСП) обеспечивает полную универсальность кода: обработка будет одинаково стабильно работать в веб-клиенте, тонком клиенте Windows, macOS и Linux, а также успешно пройдет аудит для публикации в сервисе 1С:Фреш.

← На главную