Переход с толстого клиента 1С на веб-клиент часто сопровождается техническими сложностями, одной из которых является отказ работы привычных инструментов автоматизации. Типичная ситуация: обработка, использующая COMОбъект("Excel.Application"), прекрасно работала в локальной сети, но при запуске через браузер выдает ошибку "Интерфейс не поддерживается". Разберем подробно, почему это происходит и какие существуют современные способы решения этой задачи.
Проанализируем архитектуру веб-клиента. В отличие от тонкого или толстого клиента, веб-клиент исполняется внутри браузера (Google Chrome, Firefox, Safari). Современные стандарты безопасности браузеров работают по принципу "песочницы": веб-приложение не имеет прямого доступа к ресурсам операционной системы пользователя. Инициализация COM-объектов требует прямого обращения к системным библиотекам Windows, что в браузере заблокировано на программном уровне.
Важно понимать: даже если код выполняется с директивой &НаСервере, вызов Excel.Application может завершиться ошибкой, если на сервере не установлен пакет Microsoft Office или не настроены права доступа для учетной записи, под которой запущен процесс rphost. Рассмотрим альтернативные пути, которые позволят загрузить данные без использования нестабильных COM-технологий.
Начиная с версии платформы 8.3.6, в 1С реализован нативный механизм чтения файлов Excel. Это самый надежный и быстрый способ, который работает даже на серверах под управлением Linux, так как не требует установленного Excel. Рассмотрим алгоритм реализации:
ТабличныйДокумент, который считывает данные из временного файла.Пример кода для реализации этого механизма:
// На клиенте инициируем выбор файла
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораФайла(Результат, Адрес, ВыбранноеИмяФайла, ДопПараметры) Экспорт
Если Результат Тогда
ОбработатьФайлНаСервере(Адрес);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбработатьФайлНаСервере(АдресХранилища)
ТабДок = Новый ТабличныйДокумент;
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
// Создаем временный файл на сервере для чтения
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
Попытка
ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
// Далее перебираем строки Табличного Документа
Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл
ЗначениеЯчейки = ТабДок.Область(НомерСтроки, 1).Текст;
// Обработка данных...
КонецЦикла;
Исключение
Сообщить("Ошибка чтения файла: " + ОписаниеОшибки());
КонецПопытки;
УдалитьФайлы(ИмяВременногоФайла);
КонецПроцедуры
При использовании метода Прочитать() часто возникает ситуация, когда даты превращаются в числа (например, 45285). Выясним причину: Excel хранит даты как количество дней, прошедших с 30 декабря 1899 года. Если 1С не смогла автоматически распознать формат ячейки, нам придется пересчитать значение вручную.
Рассмотрим функцию для преобразования "числовой" даты Excel в тип Дата 1С:
&НаСервере
Функция ПреобразоватьДатуExcel(ЗначениеЧислом)
// Базовая дата Excel для Windows — 30.12.1899
БазоваяДата = Дата(1899, 12, 30);
// Умножаем на количество секунд в сутках (86400)
Возврат БазоваяДата + (Окр(ЗначениеЧислом, 0) * 86400);
КонецФункции
Важный нюанс: Если в файле используется "система дат 1904" (часто для файлов, созданных на компьютерах Mac), то базовой датой в формуле должна быть 01.01.1904.
Если файлов немного и они имеют простую структуру, проанализируем вариант с ручным копированием. На форме обработки размещается поле с типом ТабличныйДокумент. Пользователь открывает файл Excel у себя на компьютере, выделяет нужную область, копирует (Ctrl+C) и вставляет в поле 1С (Ctrl+V). После этого программисту остается только программно обойти заполненный табличный документ на форме.
Этот способ исключает любые ошибки прав доступа, разрядности систем и настройки DCOM, так как данные передаются через интерфейс пользователя.
Если необходимо использовать именно COMОбъект (например, для сложного форматирования или использования макросов), выполнение кода должно происходить строго на сервере. Однако здесь мы столкнемся с "подводными камнями":
Новый COMОбъект вернет ошибку. Рекомендуется использовать 64-битные версии MS Office.USR1CV8) должна иметь права на запуск Excel. Это настраивается в консоли dcomcnfg (Настройка служб компонентов -> Компьютеры -> Мой компьютер -> Настройка DCOM -> Microsoft Excel Application).C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\Desktop (для 64-битных ОС)Подведем итог. Для работы в веб-клиенте наиболее современным и правильным подходом является отказ от технологии COM в пользу метода ТабличныйДокумент.Прочитать(). Это обеспечит стабильную работу системы независимо от того, какой браузер использует клиент и какая операционная система установлена на сервере. Помните, что COMОбъект — это технология прошлого десятилетия, которая вносит лишние зависимости в вашу конфигурацию и усложняет администрирование системы.