Разработка и Конфигурация · 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).Значение;
Если ПустаяСтрока(Артикул) Тогда
Продолжить;
КонецЕсли;
// здесь запись в регистр или справочник
КонецЦикла;
Свойства ВысотаТаблицы и ШиринаТаблицы возвращают реальные габариты заполненной области, что избавляет от угадывания количества строк. Обращение к ячейке идёт через Область(Строка, Колонка) — у неё есть свойства Текст (строка) и Значение (типизированное значение, если чтение выполнялось в режиме «Значение»).
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
ЗначениеЯчейки = ТабДок.Область(2, 1).Значение;Чтение файла, выбранного пользователем на клиенте
В тонком и веб-клиенте сервер не имеет доступа к диску пользователя, поэтому файл сначала помещают во временное хранилище, а на сервере сохраняют во временный файл и читают. Для интерактивного выбора используют НачатьПомещениеФайла или диалог выбора файла в асинхронном режиме.
Типовая схема выглядит так: на клиенте файл помещается в хранилище и получается его адрес; адрес передаётся в серверную процедуру; там данные извлекаются через ПолучитьИзВременногоХранилища, записываются во временный файл методом Записать объекта ДвоичныеДанные, и уже этот файл передаётся в ТабДок.Прочитать(). После обработки временный файл удаляют.
&НаСервере
Процедура ЗагрузитьНаСервере(АдресХранилища)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяВременногоФайла,
СпособЧтенияЗначенийТабличногоДокумента.Значение);
// ... обход строк ...
КонецПроцедуры
- 1Поместите файл во временное хранилище на клиенте (НачатьПомещениеФайла)
- 2На сервере извлеките двоичные данные и запишите во временный файл с нужным расширением
- 3Создайте ТабличныйДокумент и вызовите Прочитать с режимом Значение
- 4Обойдите строки от второй до ВысотаТаблицы, пропуская пустые
- 5Проверьте типы значений перед записью в базу, удалите временный файл
Как правильно обходить ячейки и области
Обращение по координатам Область(Строка, Колонка) — самый быстрый способ, если структура колонок фиксирована. Когда порядок колонок может меняться, надёжнее сначала прочитать строку заголовков, построить соответствие «имя колонки → номер» и дальше обращаться по имени. Это защищает загрузку от перестановки колонок в файле поставщика.
Для больших файлов полезно читать значения не по одной ячейке, а блоками через ПолучитьОбласть с последующим обходом, однако на практике построчный обход с обращением к отдельным ячейкам работает приемлемо для файлов в десятки тысяч строк. Главный фактор скорости — не чтение, а запись в базу: оборачивайте её в транзакцию порциями, например по 1000 строк.
Отдельная ситуация — объединённые ячейки. В табличном документе значение хранится только в левой верхней ячейке объединения, остальные пустые. Если в файле объединены ячейки в данных (например, название группы товаров растянуто на несколько строк), нужно запоминать последнее непустое значение и подставлять его в следующие строки.
Сравнение с другими способами чтения Excel
Табличный документ — не единственный вариант. Выбор зависит от окружения: есть ли Office на сервере, нужно ли читать несколько листов, требуются ли вычисление формул и работа с защищёнными книгами.
| Способ | Требования | Когда подходит | Ограничения |
|---|---|---|---|
| ТабличныйДокумент.Прочитать | Только платформа | Простые однолистовые файлы, регламентные загрузки | Один лист, нет вычисления формул |
| COM Excel.Application | Установленный Office, Windows | Несколько листов, формулы, сложное форматирование | Медленно, зависит от Office, риск зависших процессов |
| ADO (провайдер ACE/Jet) | Установленный драйвер, Windows | Плоские таблицы как источник SQL-запроса | Проблемы с типами колонок, разрядность драйвера |
| Построитель отчёта с источником «Табличный документ» | Только платформа | Быстрый разбор в таблицу значений по шаблону | Требует аккуратной настройки областей |
На Linux-сервере или в модели сервиса фактически доступен только первый вариант — это ещё один аргумент в пользу табличного документа как универсального решения.
Сравнение вариантов
Кроссплатформенно и быстро; не читает второй и последующие листы
Полный доступ к книге; требует Office и Windows, не подходит для веб-сервисов
Удобен для плоских таблиц SQL-запросами; капризен к типам данных и драйверам
Проверка результата и типичные ошибки
После чтения обязательно проверьте, что файл действительно открылся и содержит ожидаемые данные. Минимальный контроль — сравнить ВысотаТаблицы с ожидаемым количеством строк и убедиться, что в ключевых колонках значения нужного типа: цены — числа, даты — даты, а не строки.
Частая ошибка — читать файл в режиме «Текст» и потом пытаться преобразовывать строки функцией Число(): числа с разделителем групп или неразрывными пробелами падают с исключением. Режим «Значение» снимает эту проблему, но добавляет другую: Excel иногда хранит числа как текст (зелёный треугольник в углу ячейки), и тогда в Значение попадает строка. Поэтому перед записью в базу тип всё равно стоит проверять.
Ещё одна группа проблем — повреждённые или переименованные файлы (расширение xlsx, а внутри csv или html). Метод Прочитать в таких случаях выбрасывает исключение, поэтому вызов следует оборачивать в Попытка...Исключение с понятным сообщением пользователю.
Как проверить результат
Совпадает с числом строк в файле (±шапка)
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.