Как прочитать Excel файл в 1С, если он открывается пустым из-за защищенного просмотра?

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

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

Выясним причину: почему файл кажется пустым?

Проанализируем ситуацию с двух сторон: блокировка операционной системой и внутренняя структура самого файла XLSX. Существует две основные причины такого поведения платформы.

1. Механизм Mark of the Web (MotW). Когда файл скачивается из интернета, Windows помечает его специальной меткой безопасности в файловой системе NTFS (так называемые альтернативные потоки данных). Эта метка сообщает приложениям, что файл получен из ненадежного источника. Microsoft Excel в таких случаях включает Защищенный просмотр. Платформа 1С при вызове метода Прочитать() может наталкиваться на ограничения безопасности операционной системы, что приводит к невозможности корректного доступа к содержимому архива XLSX.

2. Проблема инлайновых строк (Inline Strings). Это наиболее вероятная техническая причина. Формат XLSX представляет собой ZIP-архив с набором XML-файлов. Текстовые данные в нем могут храниться двумя способами:

  1. Shared Strings: Все уникальные строки выносятся в отдельный файл sharedStrings.xml, а в ячейках таблицы хранятся только ссылки (индексы). Платформенный метод ТабДок.Прочитать() оптимизирован именно под этот стандарт.
  2. Inline Strings: Строки хранятся непосредственно в файле листа sheet1.xml внутри тегов <is><t>. Этот метод часто используют веб-сервисы и сторонние генераторы отчетов, так как он требует меньше ресурсов при формировании файла.

Если файл сохранен с использованием Inline Strings, стандартный механизм 1С часто не может их распознать и возвращает пустую таблицу. При ручном пересохранении в Excel программа принудительно преобразует все строки в формат Shared Strings, и проблема «исчезает».

Решение 1: Программное снятие блокировки файла

Если проблема вызвана меткой безопасности Windows, мы можем программно «разблокировать» файл перед его чтением. Рассмотрим, как это сделать с помощью команды PowerShell прямо из кода 1С. Этот метод эффективен, когда файл физически есть на диске, но система считает его небезопасным.


// ПутьКФайлу - полный путь к нашему Excel файлу
КомандаРазблокировки = "powershell -Command ""Unblock-File -Path '" + ПутьКФайлу + "'""";
ЗапуститьПриложение(КомандаРазблокировки, , Истина);

После выполнения этой команды атрибут «скачано из интернета» будет удален, и ТабличныйДокумент сможет обработать файл более уверенно.

Решение 2: Чтение файла как ZIP-архива и парсинг XML

Поскольку XLSX — это архив, мы можем рассмотреть его содержимое «под микроскопом». Если стандартный метод не помогает, разберем ситуацию, когда нам нужно извлечь данные напрямую из XML. Посмотрим на пример логики, которую можно реализовать для обхода проблемы Inline Strings.

Нам потребуется объект ЧтениеZipФайла для извлечения содержимого. Основные данные хранятся по пути xl/worksheets/sheet1.xml.


Архив = Новый ЧтениеZipФайла(ПутьКФайлу);
ПапкаРаспаковки = КаталогВременныхФайлов() + "excel_data\";
Архив.ИзвлечьВсе(ПапкаРаспаковки, РежимВосстановленияИерархииПутейZipФайла.Восстанавливать);
Архив.Закрыть();

// Теперь мы можем прочитать XML напрямую
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПапкаРаспаковки + "xl/worksheets/sheet1.xml");

Пока ЧтениеXML.Прочитать() Цикл
    Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "t" Тогда
        // Именно здесь в режиме Inline Strings лежат данные
        ТекстЯчейки = ЧтениеXML.ПрочитатьСодержимое();
        Сообщить(ТекстЯчейки);
    КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();

Этот метод является самым надежным, так как он не зависит от того, как именно (в каком режиме) записаны строки в файле. Вы полностью контролируете процесс чтения каждого тега.

Решение 3: Использование сторонних библиотек (NativeXLSX)

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

Использование таких библиотек обычно сводится к подключению внешней обработки или встраиванию кода в конфигурацию. Это избавляет от необходимости «изобретать велосипед» при парсинге XML вручную.

Решение 4: Конвертация через LibreOffice (Headless mode)

Если на сервере разрешено использование альтернативного ПО, можно установить LibreOffice. Он отлично справляется с файлами, помеченными для защищенного просмотра, и умеет работать в фоновом режиме без графического интерфейса. Мы можем вызвать конвертацию проблемного файла в «эталонный» XLSX, который 1С гарантированно прочитает.


// Пример команды для конвертации через командную строку
ПутьКПрограмме = """C:\Program Files\LibreOffice\program\soffice.exe""";
Параметры = "--headless --convert-to xlsx --outdir """ + КаталогВыгрузки + """ """ + ПутьКФайлу + """";
ЗапуститьПриложение(ПутьКПрограмме + " " + Параметры, , Истина);

Важный момент: После такой обработки файл теряет все блокировки безопасности и приводится к стандартной структуре XML, что позволяет использовать привычный ТабДок.Прочитать().

Рекомендации по выбору метода

Подведем итоги нашего анализа. Выбор метода зависит от ваших условий:

  1. Если нужно быстрое решение и сервер на Windows — попробуйте сначала разблокировку через PowerShell (Решение 1).
  2. Если файлы приходят из разных источников и часто оказываются «пустыми» — оптимально использовать стороннюю библиотеку на языке 1С (Решение 3).
  3. Если вы работаете в Linux и стандартное чтение не помогает — используйте прямой парсинг XML (Решение 2) или LibreOffice (Решение 4).
  4. Всегда старайтесь копировать файл во временный каталог перед чтением. Это часто снимает проблемы прав доступа к папкам загрузок, под которыми работает служба сервера 1С.

Рассмотренные подходы позволяют гарантированно обойти ограничения «защищенного просмотра» и специфику формата XLSX, обеспечивая стабильную работу ваших интеграций.

← На главную