При работе в веб-клиенте платформы 1С:Предприятие разработчики часто сталкиваются с ошибкой при попытке обращения к локальным файлам или COM-объектам на компьютере пользователя. Попытка выполнить код вида ПолучитьCOMОбъект() на стороне веб-клиента приводит к ошибке: «COM-объекты поддерживаются только в Microsoft Internet Explorer» или к блокировке вызова настройками безопасности браузера.
Разберем подробнее, почему возникают подобные ограничения и как правильно организовать импорт данных из Excel в веб-клиенте согласно стандартам 1С.
Выясним причину такого поведения веб-клиента. Использование COM-технологий (ActiveX) напрямую из браузера имеет ряд существенных ограничений:
ДиалогВыбораФайла.Выбрать() является синхронным вызовом, который заблокирован в тонком и веб-клиенте при работе в современных режимах платформы.Рассмотрим архитектурно правильный подход к решению этой задачи. Вместо попытки прочитать файл локально через COM на клиенте следует выполнить следующие действия:
ОписаниеОповещения.ТабличныйДокумент или 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).Текст;
КонецЦикла;
// Удаляем временный файл с диска сервера
УдалитьФайлы(ИмяВременногоФайла);
КонецПроцедуры
Проанализируем ситуации, когда стандартного метода чтения через ТабличныйДокумент недостаточно:
.xls: Объект ТабличныйДокумент поддерживает чтение как .xlsx, так и .xls (указывается соответствующий ТипФайлаТабличногоДокумента).Новый COMОбъект("Excel.Application") выполняют исключительно на сервере в блоке &НаСервере. На сервере должен быть предварительно установлен пакет Microsoft Office.Использование асинхронной передачи файла во временное хранилище с последующим разбиранием данных на сервере гарантирует стабильную работу вашей обработки во всех типах клиентов (включая веб-клиент) и на любых операционных системах.