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

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

Как в 1С прочитать файл Excel как табличный документ

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

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

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

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

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

Объект «ТабличныйДокумент» в 1С — это универсальное представление таблицы: ячейки, области, форматирование. Платформа умеет загружать в него файлы форматов xlsx, xls, mxl, ods и некоторых других. При чтении Excel содержимое листа превращается в ячейки табличного документа, где каждая ячейка хранит текст и, при соответствующем способе чтения, типизированное значение.

Метод Прочитать() принимает два ключевых параметра: путь к файлу и способ чтения значений. Способ СпособЧтенияЗначенийТабличногоДокумента.Значение пытается интерпретировать содержимое ячеек как типизированные значения (числа, даты, булево), а СпособЧтенияЗначенийТабличногоДокумента.Текст возвращает всё как строки. Для загрузки данных в базу обычно удобнее первый вариант, но если в файле смешанные форматы, текстовое чтение с последующим ручным преобразованием даёт больше контроля.

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

Минимальный код: читаем файл в несколько строк

Базовый пример чтения файла на сервере выглядит так:

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

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

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

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

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

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

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

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

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

// дальше — поиск или создание номенклатуры

КонецЦикла;

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

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

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

Как обойти строки и распознать типы данных

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

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

Типичные ошибки
01
Чтение со способом «Текст» и попытка сразу сложить цены как числа — получается конкатенация строк или ошибка преобразования
02
Отсутствие проверки пустых строк — создаются пустые элементы справочника или документы с нулевыми суммами
03
Игнорирование ведущих нулей в артикулах и штрихкодах — теряется часть кода, номенклатура не находится при поиске
04
Чтение файла напрямую с клиентского диска в серверном вызове — ошибка доступа к файлу

Для штрихкодов, артикулов и кодов всегда читайте Текст ячейки, а не Значение — это сохранит строковое представление без потерь. Для сумм и количеств, наоборот, берите Значение и проверяйте, что это число, иначе обрабатывайте строку, убирая пробелы-разделители разрядов и заменяя запятую на точку перед Число().

Проверка результата и обработка ошибок

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

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

Контрольные точки

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

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

Больше нуля, соответствует числу строк в файле

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

Ноль или ошибка чтения — файл пуст, повреждён или не тот формат

Значения числовых колонок
Норма

ТипЗнч возвращает Число, суммы сходятся с исходником

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

Строки с пробелами-разделителями, ошибки преобразования

Артикулы и штрихкоды
Норма

Совпадают посимвольно с файлом, ведущие нули на месте

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

Потеряны нули, появилась экспоненциальная запись

Даты
Норма

Тип Дата, значения в ожидаемом диапазоне

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

Числа вместо дат или сдвиг на десятилетия

Ограничения способа и когда он не подходит

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

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

Альтернативные способы загрузки Excel в 1С

Кроме табличного документа, существуют другие варианты, которые стоит знать, чтобы выбрать подходящий под задачу.

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

ТабличныйДокумент.Прочитать()

Универсально, не требует Excel, работает на клиенте и сервере. Ограничение — медленно на очень больших файлах, один лист за раз

Чтение через COM-объект Excel.Application

Полный доступ к листам, формулам, форматам. Требует установленный Excel на машине, где выполняется код, не работает на Linux-сервере, уязвимо к зависаниям

Предварительное сохранение в CSV

Быстро и просто для плоских данных, легко читается построчно через ЧтениеТекста. Теряются типы и форматирование, проблемы с разделителями и кодировками

Типовые обработки загрузки (например, «Загрузка данных из табличного документа»)

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

Выбор зависит от условий: если файл присылают регулярно в одном формате — пишите загрузку через табличный документ; если это разовая операция и конфигурация типовая — проще воспользоваться встроенной обработкой загрузки; если файлы огромные — рассмотрите CSV или потоковое чтение.

Маршрут решения

Как выбрать действие

Файл до нескольких тысяч строк, один лист, регулярная загрузкаИспользуйте ТабличныйДокумент.Прочитать() со способом чтения «Значение»
Нужны данные с конкретного листа многолистовой книгиСохраните лист отдельным файлом или используйте COM-доступ к Excel
Файл больше сотни тысяч строкКонвертируйте в CSV и читайте построчно через ЧтениеТекста
Разовая загрузка в типовую конфигурацию без доработокВоспользуйтесь типовой обработкой загрузки данных из табличного документа

Практический порядок внедрения загрузки

Чтобы загрузка работала стабильно, действуйте последовательно: сначала получите образец реального файла от тех, кто будет его присылать, и зафиксируйте структуру колонок. Затем напишите чтение и обход строк с выводом распознанных значений в сообщения — это позволит увидеть, как платформа интерпретировала данные, до записи в базу.

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

Закрепите договорённость о формате файла с теми, кто его готовит: фиксированный порядок колонок, отсутствие объединённых ячеек в области данных, единый формат дат и чисел. Большинство проблем загрузки из Excel — это не ошибки кода, а «плавающая» структура исходного файла.

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

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

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

Нет. Метод ТабличныйДокумент.Прочитать() работает средствами платформы 1С и не требует установленного Microsoft Excel ни на клиенте, ни на сервере. Это одно из главных преимуществ способа перед COM-соединением.

Почему числа из Excel читаются как строки?

Чаще всего потому, что в файле ячейки отформатированы как текст, либо выбран способ чтения «Текст». Переключитесь на СпособЧтенияЗначенийТабличногоДокумента.Значение, а если значения всё равно строковые — убирайте пробелы-разделители разрядов, заменяйте запятую на точку и преобразуйте через Число() внутри Попытка/Исключение.

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

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

Что делать, если файл не открывается и возникает ошибка чтения?

Проверьте, что файл действительно в формате xlsx или xls, а не переименованный файл другого типа, что он не защищён паролем и не занят другим приложением. Защищённые паролем книги платформа не читает — пароль нужно снять до загрузки.

Как не потерять ведущие нули в артикулах и штрихкодах?

Читайте такие колонки через свойство Текст области, а не Значение. Если файл формируете вы сами, заранее установите для этих колонок текстовый формат ячеек в Excel — тогда данные сохранятся корректно при любом способе чтения.

Подходит ли способ для регламентной загрузки больших прайсов?

Для файлов умеренного размера — да, особенно если загрузка выполняется на сервере фоновым заданием. Для очень больших файлов табличный документ медленный и требователен к памяти: в этом случае лучше конвертировать прайс в CSV и читать построчно.

Итог

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

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