Разработка и Конфигурация · 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Создайте объект: ТабДок = Новый ТабличныйДокумент
- 2Вызовите ТабДок.Прочитать() с путём к файлу и способом чтения значений
- 3Определите границы: ВысотаТаблицы и ШиринаТаблицы
- 4Обойдите строки в цикле, читая ТабДок.Область(Строка, Колонка).Текст
- 5Пропускайте пустые и служебные строки (шапку, итоги)
- 6Преобразуйте текст в нужные типы с проверкой через Попытка/Исключение
Работа с областями и именованными диапазонами
Если документ содержит именованные области (например, сохранённый макет), читать их можно по имени: ТабДок.Область("Шапка") или ТабДок.ПолучитьОбласть("СтрокаДанных"). Это удобно при разборе печатных форм, где структура известна заранее.
Для проверки наличия области перед обращением используйте метод НайтиТекст() или перебор коллекции областей — обращение к несуществующей именованной области вернёт неопределённый результат, и последующий код упадёт с ошибкой.
Метод НайтиТекст(ИскомыйТекст) полезен, когда позиция данных в файле не фиксирована: можно найти ячейку с заголовком колонки «Артикул» и начать чтение от неё, а не от жёстко заданной строки. Это делает загрузку устойчивой к сдвигу шапки в файле поставщика.
Чтение Excel-файлов через табличный документ
Чтение XLS и XLSX через ТабличныйДокумент.Прочитать() — самый простой способ загрузки Excel без установленного Microsoft Office: платформа разбирает файл самостоятельно. Это принципиальное преимущество перед COM-подключением к Excel, которое работает только на Windows с установленным офисным пакетом.
Ограничения способа: читается первый лист книги (либо лист, выбранный в соответствующих версиях платформы дополнительными средствами), объединённые ячейки и сложное форматирование могут интерпретироваться не так, как в Excel, а очень большие файлы читаются медленно. Если в книге несколько листов с данными, потребуется либо сохранение нужных листов отдельно, либо альтернативный метод чтения.
Способы прочитать Excel в 1С
Подходит для большинства загрузок: не требует Office, работает на сервере Linux. Ограничение — сложные книги и очень большие файлы.
Полный контроль: листы, формулы, форматы. Требует Windows и установленный Excel, не работает на сервере Linux.
Быстрое чтение листа как таблицы данных. Чувствителен к смешанным типам в колонках, требует провайдера OLEDB.
Проверка результата и обработка ошибок
После вызова Прочитать() убедитесь, что документ действительно наполнен: проверьте ВысотаТаблицы — при неудачном чтении она может остаться равной нулю или единице. Сам вызов чтения стоит обернуть в Попытка/Исключение, чтобы выдать пользователю понятное сообщение вместо системной ошибки:
Попытка
ТабДок.Прочитать(ИмяФайла,
СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
Сообщить("Не удалось прочитать файл: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
При преобразовании строк в числа учитывайте разделитель дробной части и неразрывные пробелы в разрядах — их лучше предварительно удалять функцией СтрЗаменить(). Для дат надёжнее разбирать строку вручную, если формат в файле известен, чем полагаться на автоматическое приведение типов.
Как проверить результат чтения
Больше нуля, соответствует числу строк в файле
0 или 1 — файл не прочитан или пуст
Ожидаемый текст или значение
Пусто, либо формула вида =A1+B1 вместо значения
Корректные значения без потери дробной части
Нули или ошибки преобразования из-за пробелов и разделителей
Типичные ошибки при чтении табличного документа
Отдельная группа проблем связана с клиент-серверной архитектурой: код ТабДок.Прочитать("C:\...") на сервере ищет файл на диске сервера, а не на компьютере пользователя. Перед переносом обработки в серверный контекст убедитесь, что файл передан на сервер через временное хранилище.
Что важно запомнить
Чтение сводится к трём шагам: Прочитать() загружает файл в объект, ВысотаТаблицы и ШиринаТаблицы задают границы обхода, Область(Строка, Колонка).Текст возвращает содержимое ячейки. Для Excel указывайте способ чтения «Значение», оборачивайте чтение в попытку и проверяйте результат до начала обработки данных.
Частые вопросы
Можно ли прочитать табличный документ без сохранения в файл?
Да. Если документ уже сформирован программно (например, отчёт выведен в реквизит формы), обходить ячейки можно напрямую через Область() без чтения из файла. Метод Прочитать() нужен только для загрузки существующих файлов MXL, Excel, ODS и других поддерживаемых форматов.
Как прочитать конкретный лист Excel-книги?
Штатный метод Прочитать() работает с одним листом. Если данных на нескольких листах, варианты такие: сохранить нужные листы отдельными файлами, использовать COM-подключение к Excel (требует Windows и установленный Office) или сторонние библиотеки разбора XLSX как ZIP-архива с XML.
Почему после чтения числа превращаются в текст?
При способе чтения «Текст» все ячейки возвращают строки. Укажите СпособЧтенияЗначенийТабличногоДокумента.Значение — тогда числа и даты будут доступны как типизированные значения. Либо преобразуйте текст функциями Число() и Дата() с предварительной очисткой от пробелов и нестандартных разделителей.
Как найти нужную колонку, если порядок столбцов в файле меняется?
Прочитайте строку заголовков в цикле по колонкам и постройте соответствие «имя колонки → номер». Дальше обращайтесь к данным по найденному номеру, а не по фиксированному. Дополнительно помогает метод НайтиТекст() для поиска ячейки с известным заголовком.
Работает ли чтение табличного документа на веб-клиенте?
Прямое чтение файла с локального диска в веб-клиенте недоступно. Файл помещается во временное хранилище через НачатьПомещениеФайла(), затем на сервере извлекается из хранилища во временный файл и читается методом Прочитать(). Обход ячеек выполняется в серверной процедуре.
Что делать, если файл читается, но данные «съехали»?
Проверьте наличие объединённых ячеек и скрытых строк в исходном файле — они могут смещать структуру при чтении. Также убедитесь, что шапка действительно занимает то количество строк, которое вы пропускаете. Надёжнее искать начало данных по маркерной ячейке через НайтиТекст(), чем полагаться на фиксированные номера строк.