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

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

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

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

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

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

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

Что такое табличный документ и когда его нужно читать

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

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

Чтение табличного документа из файла

Основной способ — метод Прочитать(). Он принимает имя файла и необязательный параметр способа чтения значений. Минимальный пример:

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

ТабДок.Прочитать("C:\Данные\Прайс.mxl");

Если файл имеет формат Excel (XLS, XLSX) или ODS, платформа определит формат по расширению автоматически. Для файлов Excel рекомендуется явно указывать способ чтения значений, чтобы в ячейках оказались вычисленные значения, а не формулы:

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

ТабДок.Прочитать("C:\Данные\Прайс.xlsx",

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

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

Обход ячеек и извлечение данных

После чтения данные доступны через свойство Область(). Размеры документа определяют свойства ВысотаТаблицы (число строк) и ШиринаТаблицы (число колонок). Классический обход выглядит так:

Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл

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

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

Если ПустаяСтрока(Наименование) Тогда

Продолжить;

КонецЕсли;

// обработка данных: поиск номенклатуры, создание элемента

КонецЦикла;

Обратите внимание: Область(Строка, Колонка) возвращает объект области, и у него нужно брать свойство Текст. Частая ошибка — присваивать саму область строковой переменной и удивляться пустому результату.

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

Порядок чтения табличного документа
  1. 1
    Создайте объект: ТабДок = Новый ТабличныйДокумент
  2. 2
    Вызовите ТабДок.Прочитать() с путём к файлу и способом чтения значений
  3. 3
    Определите границы: ВысотаТаблицы и ШиринаТаблицы
  4. 4
    Обойдите строки в цикле, читая ТабДок.Область(Строка, Колонка).Текст
  5. 5
    Пропускайте пустые и служебные строки (шапку, итоги)
  6. 6
    Преобразуйте текст в нужные типы с проверкой через Попытка/Исключение

Работа с областями и именованными диапазонами

Если документ содержит именованные области (например, сохранённый макет), читать их можно по имени: ТабДок.Область("Шапка") или ТабДок.ПолучитьОбласть("СтрокаДанных"). Это удобно при разборе печатных форм, где структура известна заранее.

Для проверки наличия области перед обращением используйте метод НайтиТекст() или перебор коллекции областей — обращение к несуществующей именованной области вернёт неопределённый результат, и последующий код упадёт с ошибкой.

Метод НайтиТекст(ИскомыйТекст) полезен, когда позиция данных в файле не фиксирована: можно найти ячейку с заголовком колонки «Артикул» и начать чтение от неё, а не от жёстко заданной строки. Это делает загрузку устойчивой к сдвигу шапки в файле поставщика.

Чтение Excel-файлов через табличный документ

Чтение XLS и XLSX через ТабличныйДокумент.Прочитать() — самый простой способ загрузки Excel без установленного Microsoft Office: платформа разбирает файл самостоятельно. Это принципиальное преимущество перед COM-подключением к Excel, которое работает только на Windows с установленным офисным пакетом.

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

Способы прочитать Excel в 1С

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

Подходит для большинства загрузок: не требует Office, работает на сервере Linux. Ограничение — сложные книги и очень большие файлы.

COM-объект Excel.Application

Полный контроль: листы, формулы, форматы. Требует Windows и установленный Excel, не работает на сервере Linux.

ADO (Recordset)

Быстрое чтение листа как таблицы данных. Чувствителен к смешанным типам в колонках, требует провайдера OLEDB.

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

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

Попытка

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

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

Исключение

Сообщить("Не удалось прочитать файл: " + ОписаниеОшибки());

Возврат;

КонецПопытки;

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

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

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

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

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

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

0 или 1 — файл не прочитан или пуст

Содержимое первой ячейки с данными
Норма

Ожидаемый текст или значение

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

Пусто, либо формула вида =A1+B1 вместо значения

Числа после преобразования
Норма

Корректные значения без потери дробной части

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

Нули или ошибки преобразования из-за пробелов и разделителей

Типичные ошибки при чтении табличного документа

Типичные ошибки
01
Чтение Excel без указания способа чтения значений — в ячейках оказываются формулы или текст вместо вычисленных значений
02
Обращение к ТабДок.Область(Строка, Колонка) без свойства Текст — переменная получает объект области, а не содержимое
03
Жёсткая привязка к номерам строк шапки — при добавлении строки в файл поставщиком загрузка смещается и читает мусор
04
Игнорирование Попытка/Исключение — пользователь видит техническую ошибку платформы вместо понятного сообщения
05
Чтение файла на клиенте там, где файл лежит на сервере (и наоборот) — ошибка «файл не найден» в клиент-серверном режиме

Отдельная группа проблем связана с клиент-серверной архитектурой: код ТабДок.Прочитать("C:\...") на сервере ищет файл на диске сервера, а не на компьютере пользователя. Перед переносом обработки в серверный контекст убедитесь, что файл передан на сервер через временное хранилище.

Итог

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

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

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

Можно ли прочитать табличный документ без сохранения в файл?

Да. Если документ уже сформирован программно (например, отчёт выведен в реквизит формы), обходить ячейки можно напрямую через Область() без чтения из файла. Метод Прочитать() нужен только для загрузки существующих файлов MXL, Excel, ODS и других поддерживаемых форматов.

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

Штатный метод Прочитать() работает с одним листом. Если данных на нескольких листах, варианты такие: сохранить нужные листы отдельными файлами, использовать COM-подключение к Excel (требует Windows и установленный Office) или сторонние библиотеки разбора XLSX как ZIP-архива с XML.

Почему после чтения числа превращаются в текст?

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

Как найти нужную колонку, если порядок столбцов в файле меняется?

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

Работает ли чтение табличного документа на веб-клиенте?

Прямое чтение файла с локального диска в веб-клиенте недоступно. Файл помещается во временное хранилище через НачатьПомещениеФайла(), затем на сервере извлекается из хранилища во временный файл и читается методом Прочитать(). Обход ячеек выполняется в серверной процедуре.

Что делать, если файл читается, но данные «съехали»?

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