К статье
Практический материал

Разработка и Конфигурация · 11 мин

Чтение Excel в 1С как табличный документ

Как прочитать файл Excel в 1С через объект ТабличныйДокумент: метод Прочитать, обход ячеек, работа с областями, типичные ошибки и сравнение с COM и ADO.

Чтение файла Excel как табличного документа — самый простой способ загрузить данные из xls или xlsx в 1С без установки Microsoft Office и без COM-соединения. Платформа умеет открывать файл напрямую в объект ТабличныйДокумент, после чего с ним работают как с обычным макетом: обращаются к ячейкам по координатам, читают области, проверяют типы значений.

Этот подход особенно удобен для разовых загрузок прайсов, остатков, списков контрагентов и других плоских таблиц, где структура файла известна заранее. Код работает и на клиенте, и на сервере, не требует прав администратора и не зависит от разрядности офисного пакета.

Ограничения тоже есть: табличный документ не читает формулы как вычисления (берёт сохранённый результат), не поддерживает многолистовые файлы в одном объекте и чувствителен к объединённым ячейкам. Ниже разобраны готовые примеры кода, проверка результата, типичные ошибки и ситуации, когда лучше выбрать другой способ.

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

Объект ТабличныйДокумент встроен в платформу и умеет открывать файлы форматов xls, xlsx, mxl и некоторых других. При вызове метода Прочитать() платформа сама разбирает бинарную структуру файла и переносит содержимое в ячейки табличного документа: текст, числа, даты, форматирование.

Ключевой параметр метода — способ чтения значений. Вариант СпособЧтенияЗначенийТабличногоДокумента.Значение помещает в ячейки типизированные значения (число, дата, булево), а вариант Текст — только строковое представление, как его видел бы пользователь на экране. Для загрузки в базу почти всегда нужен первый вариант: он избавляет от ручного преобразования строк в числа и даты.

Важно понимать, что читается только активный (первый) лист книги. Если данные лежат на втором или третьем листе, потребуется либо попросить поставщика файла переставить лист первым, либо использовать другой способ чтения — например, COM-объект Excel.Application, где доступны все листы.

Минимальный рабочий пример кода

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

ТабДок = Новый ТабличныйДокумент;

ТабДок.Прочитать("C:\Загрузки\Прайс.xlsx",

СпособЧтенияЗначенийТабличногоДокумента.Значение);

ВсегоСтрок = ТабДок.ВысотаТаблицы;

ВсегоКолонок = ТабДок.ШиринаТаблицы;

Для НомерСтроки = 2 По ВсегоСтрок Цикл // первая строка — шапка

Артикул = ТабДок.Область(НомерСтроки, 1).Текст;

Цена = ТабДок.Область(НомерСтроки, 3).Значение;

Если ПустаяСтрока(Артикул) Тогда

Продолжить;

КонецЕсли;

// здесь запись в регистр или справочник

КонецЦикла;

Свойства ВысотаТаблицы и ШиринаТаблицы возвращают реальные габариты заполненной области, что избавляет от угадывания количества строк. Обращение к ячейке идёт через Область(Строка, Колонка) — у неё есть свойства Текст (строка) и Значение (типизированное значение, если чтение выполнялось в режиме «Значение»).

bsl
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
ЗначениеЯчейки = ТабДок.Область(2, 1).Значение;

Чтение файла, выбранного пользователем на клиенте

В тонком и веб-клиенте сервер не имеет доступа к диску пользователя, поэтому файл сначала помещают во временное хранилище, а на сервере сохраняют во временный файл и читают. Для интерактивного выбора используют НачатьПомещениеФайла или диалог выбора файла в асинхронном режиме.

Типовая схема выглядит так: на клиенте файл помещается в хранилище и получается его адрес; адрес передаётся в серверную процедуру; там данные извлекаются через ПолучитьИзВременногоХранилища, записываются во временный файл методом Записать объекта ДвоичныеДанные, и уже этот файл передаётся в ТабДок.Прочитать(). После обработки временный файл удаляют.

&НаСервере

Процедура ЗагрузитьНаСервере(АдресХранилища)

ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);

ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");

ДвоичныеДанные.Записать(ИмяВременногоФайла);

ТабДок = Новый ТабличныйДокумент;

ТабДок.Прочитать(ИмяВременногоФайла,

СпособЧтенияЗначенийТабличногоДокумента.Значение);

// ... обход строк ...

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

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

Как правильно обходить ячейки и области

Обращение по координатам Область(Строка, Колонка) — самый быстрый способ, если структура колонок фиксирована. Когда порядок колонок может меняться, надёжнее сначала прочитать строку заголовков, построить соответствие «имя колонки → номер» и дальше обращаться по имени. Это защищает загрузку от перестановки колонок в файле поставщика.

Для больших файлов полезно читать значения не по одной ячейке, а блоками через ПолучитьОбласть с последующим обходом, однако на практике построчный обход с обращением к отдельным ячейкам работает приемлемо для файлов в десятки тысяч строк. Главный фактор скорости — не чтение, а запись в базу: оборачивайте её в транзакцию порциями, например по 1000 строк.

Отдельная ситуация — объединённые ячейки. В табличном документе значение хранится только в левой верхней ячейке объединения, остальные пустые. Если в файле объединены ячейки в данных (например, название группы товаров растянуто на несколько строк), нужно запоминать последнее непустое значение и подставлять его в следующие строки.

Сравнение с другими способами чтения Excel

Табличный документ — не единственный вариант. Выбор зависит от окружения: есть ли Office на сервере, нужно ли читать несколько листов, требуются ли вычисление формул и работа с защищёнными книгами.

СпособТребованияКогда подходитОграничения
ТабличныйДокумент.ПрочитатьТолько платформаПростые однолистовые файлы, регламентные загрузкиОдин лист, нет вычисления формул
COM Excel.ApplicationУстановленный Office, WindowsНесколько листов, формулы, сложное форматированиеМедленно, зависит от Office, риск зависших процессов
ADO (провайдер ACE/Jet)Установленный драйвер, WindowsПлоские таблицы как источник SQL-запросаПроблемы с типами колонок, разрядность драйвера
Построитель отчёта с источником «Табличный документ»Только платформаБыстрый разбор в таблицу значений по шаблонуТребует аккуратной настройки областей

На Linux-сервере или в модели сервиса фактически доступен только первый вариант — это ещё один аргумент в пользу табличного документа как универсального решения.

Сравнение вариантов

ТабличныйДокумент

Кроссплатформенно и быстро; не читает второй и последующие листы

COM Excel

Полный доступ к книге; требует Office и Windows, не подходит для веб-сервисов

ADO

Удобен для плоских таблиц SQL-запросами; капризен к типам данных и драйверам

Проверка результата и типичные ошибки

После чтения обязательно проверьте, что файл действительно открылся и содержит ожидаемые данные. Минимальный контроль — сравнить ВысотаТаблицы с ожидаемым количеством строк и убедиться, что в ключевых колонках значения нужного типа: цены — числа, даты — даты, а не строки.

Частая ошибка — читать файл в режиме «Текст» и потом пытаться преобразовывать строки функцией Число(): числа с разделителем групп или неразрывными пробелами падают с исключением. Режим «Значение» снимает эту проблему, но добавляет другую: Excel иногда хранит числа как текст (зелёный треугольник в углу ячейки), и тогда в Значение попадает строка. Поэтому перед записью в базу тип всё равно стоит проверять.

Ещё одна группа проблем — повреждённые или переименованные файлы (расширение xlsx, а внутри csv или html). Метод Прочитать в таких случаях выбрасывает исключение, поэтому вызов следует оборачивать в Попытка...Исключение с понятным сообщением пользователю.

Типичные ошибки
01
Чтение в режиме Текст и ручное преобразование чисел — ошибки на разделителях и пробелах
02
Обход с первой строки без учёта шапки — заголовки попадают в данные
03
Игнорирование объединённых ячеек — пустые значения в строках данных
04
Отсутствие Попытка/Исключение вокруг Прочитать — обработка падает на битом файле
05
Запись каждой строки отдельной транзакцией — загрузка большого файла занимает часы
Контрольные точки

Как проверить результат

ВысотаТаблицы после Прочитать
Норма

Совпадает с числом строк в файле (±шапка)

Тревожный признак

1–2 строки при большом файле — вероятно, данные на другом листе

Тип значения в колонке цен
Норма

Число

Тревожный признак

Строка — ячейки в Excel сохранены как текст

Колонка дат
Норма

Значения типа Дата

Тревожный признак

Числа вида 45000 — даты хранятся как серийные номера (режим Текст)

Ограничения и границы безопасной работы

Метод безопасен для данных: он не изменяет исходный файл, чтение идёт только в память. Риски связаны с другим — с записью загруженных данных в базу. Перед массовой загрузкой делайте резервную копию или сначала пишите данные в промежуточную таблицу значений и показывайте пользователю предпросмотр с количеством распознанных строк.

Очень большие файлы (сотни тысяч строк) табличный документ загружает целиком в память, что может привести к её нехватке на сервере. Для таких объёмов лучше конвертировать файл в CSV и читать построчно через ЧтениеТекста — это существенно экономнее по памяти.

Итог

Что важно запомнить

ТабличныйДокумент.Прочитать — самый простой кроссплатформенный способ чтения Excel в 1С без Office. Используйте режим Значение, проверяйте типы и габариты данных, оборачивайте чтение в Попытка/Исключение, а запись в базу выполняйте только после предпросмотра. Для многостраничных книг и формул потребуется COM или другой инструмент.

Частые вопросы

Нужен ли установленный Microsoft Office для чтения Excel через ТабличныйДокумент?

Нет. Платформа разбирает форматы xls и xlsx собственными средствами, поэтому метод работает на серверах без Office, включая Linux. Office нужен только для COM-подключения через Excel.Application.

Как прочитать второй или третий лист книги Excel?

ТабличныйДокумент читает только первый лист. Обходные пути: попросить переставить лист первым, сохранить нужный лист отдельным файлом, использовать COM-объект Excel.Application либо сторонние библиотеки разбора xlsx как zip-архива с XML.

Почему вместо дат загружаются числа вида 45000?

Это серийные номера дат Excel. Такое происходит, если файл прочитан в режиме «Текст» или ячейки отформатированы нестандартно. Переключитесь на СпособЧтенияЗначенийТабличногоДокумента.Значение — платформа сама преобразует такие значения в тип Дата.

Обработка падает на некоторых файлах с ошибкой чтения. В чём причина?

Чаще всего расширение файла не соответствует содержимому: например, csv или html-таблица сохранена с расширением xls. Также бывают повреждённые файлы. Оберните Прочитать в Попытка/Исключение и сообщайте пользователю, что файл не удалось распознать.

Как ускорить загрузку файла на десятки тысяч строк?

Основные тормоза — запись в базу, а не чтение. Записывайте порциями в транзакциях по 500–1000 строк, отключите интерактивные обновления формы, а для очень больших файлов переходите на CSV с построчным чтением через ЧтениеТекста — это резко снижает расход памяти.

Можно ли таким же способом сохранить данные из 1С в Excel?

Да, объект ТабличныйДокумент имеет метод Записать с указанием типа файла ТипФайлаТабличногоДокумента.XLSX. Это стандартный способ выгрузки отчётов и таблиц в Excel без установленного Office.