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

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

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

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

Загрузка данных из Excel — одна из самых частых задач при обмене с контрагентами, банками и поставщиками: прайсы, выписки, заявки и спецификации почти всегда приходят в формате XLS или XLSX. В платформе 1С:Предприятие есть штатный механизм, который позволяет открыть такой файл напрямую как табличный документ, без установленного Microsoft Office и без внешних компонент.

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

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

Когда чтение через табличный документ — правильный выбор

Метод Прочитать() табличного документа — не единственный способ забрать данные из Excel. Есть как минимум три альтернативы: COM-объект Excel.Application, подключение через ADO с драйвером ACE/OLEDB и сторонние библиотеки. У каждого варианта свои ограничения, и выбор зависит от среды, где выполняется код.

Чтение в табличный документ выигрывает, когда код выполняется на сервере 1С под Linux, на тонком или веб-клиенте, либо когда на машине просто не установлен Microsoft Office. Поскольку платформа парсит файл самостоятельно, никаких внешних зависимостей не требуется. Дополнительный плюс — безопасность: макросы и формулы не выполняются, читаются только данные.

Сравнение способов чтения Excel

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

Работает везде, включая Linux и веб-клиент, не требует Excel. Ограничение: весь файл грузится в память, читается один лист за вызов.

COM Excel.Application

Полный доступ к листам, форматам и формулам. Требует установленный Office и Windows, не работает на сервере Linux, медленный на больших файлах.

ADO (ACE OLEDB)

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

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

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

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

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

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

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

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

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

Для НомерСтроки = 2 По ВсегоСтрок Цикл

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

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

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

КонецЦикла;

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

Начинать обход обычно следует со второй строки, если первая — шапка с заголовками колонок. Но надёжнее не зашивать номер строки константой, а определять начало данных по содержимому: например, искать строку, где в первой колонке стоит известный заголовок «Артикул» или «Номенклатура».

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

Чтение конкретного листа и работа на клиенте

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

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

&НаСервере

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

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

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

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

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

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

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

// ... обработка ТабДок ...

УдалитьФайлы(ИмяВременногоФайла);

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

Типы данных: числа, даты и подводные камни

Свойство Текст области всегда возвращает строку, поэтому числа и даты придётся преобразовывать самостоятельно. Для чисел главная ловушка — разделитель дробной части и неразрывные пробелы в качестве разделителя разрядов: строка «1 234,56» не пройдёт через Число() без предварительной очистки.

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

Функция СтрокаВЧисло(Знач Строка)

Строка = СтрЗаменить(Строка, Символ(160), "");

Строка = СтрЗаменить(Строка, " ", "");

Строка = СтрЗаменить(Строка, ",", ".");

Возврат Число(Строка);

КонецФункции

Ещё одна частая ситуация — артикулы и коды, которые Excel услужливо превратил в числа: ведущие нули потеряны, а длинные коды показаны в экспоненциальной записи. Если такая колонка критична, читайте её со способом Текст в отдельный табличный документ или просите поставщика присылать колонку в текстовом формате. Полностью восстановить утерянные ведущие нули на стороне 1С невозможно без дополнительных правил.

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

Объединённые ячейки, скрытые строки и «грязные» файлы

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

Правило для объединений: значение находится только в левой верхней ячейке объединённой области, остальные ячейки пустые. Если в файле многоуровневая шапка, читайте обе строки заголовков и склеивайте их. Для строк-разделителей и итогов добавьте фильтр: пропускать строки, где ключевые колонки пустые или содержат служебные слова вроде «Итого».

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

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

Производительность и большие файлы

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

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

Отдельно контролируйте память при серверной загрузке: табличный документ с сотнями тысяч ячеек съедает заметный объём ОЗУ рабочего процесса. После обработки явно обнуляйте переменную (ТабДок = Неопределено), а массовые загрузки запускайте фоновым заданием, чтобы не блокировать сеанс пользователя.

Проверка результата перед записью в базу

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

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

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

Количество прочитанных строк
Норма

Совпадает с числом строк данных в файле за вычетом шапки

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

Меньше — обрезан файл или неверно определена область; больше — захвачены итоги и пустые строки

Типы ключевых колонок
Норма

Числа преобразуются без ошибок, даты распознаются

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

Число() падает или возвращает 0 — в данных текст, разделители или пустые значения

Контрольная сумма
Норма

Сумма по колонке «Сумма» совпадает с итогом в файле

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

Расхождение — пропущены строки, скрытые данные или неверный разбор чисел

Заголовки колонок
Норма

Тексты заголовков совпадают с ожидаемым макетом

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

Поставщик изменил структуру файла — загрузку нужно остановить

Хорошая практика — показать пользователю предварительный результат: таблицу значений с распознанными данными, подсветкой строк с ошибками и итоговой суммой. Только после его подтверждения выполнять запись. Это резко снижает количество инцидентов «загрузилось не то» и разгружает поддержку.

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

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

Метод ТабличныйДокумент.Прочитать с поддержкой форматов Excel доступен начиная с платформы 8.3.6. На более ранних версиях придётся использовать COM-соединение с установленным Excel или внешние компоненты. Проверить версию платформы можно в свойствах информационной базы или через системную информацию.

Можно ли прочитать файл XLSM или XLSB этим способом?

Файлы XLSM (книги с макросами) обычно читаются так же, как XLSX, — макросы просто игнорируются. Бинарный формат XLSB штатно не поддерживается: такой файл нужно предварительно пересохранить в XLSX средствами Excel или конвертера, либо читать через COM/ADO.

Почему вместо дат читаются странные числа вроде 45000?

Так происходит, когда ячейка с датой отдаётся как числовое значение внутреннего представления Excel (количество дней от базовой даты). Решение — читать со способом Текст, чтобы получить отформатированное представление, либо пересчитывать число в дату с учётом точки отсчёта Excel (1 января 1900 года с известной поправкой на ошибку високосности в самом Excel).

Как прочитать Excel на сервере 1С под Linux?

Именно для этого сценария чтение через табличный документ подходит лучше всего: платформа парсит файл сама, никаких офисных пакетов и драйверов на сервере не требуется. Важно только, чтобы учётная запись агента сервера 1С имела доступ к каталогу с файлом, а пути указывались в нотации Linux.

Что делать, если файл защищён паролем?

Штатный метод Прочитать не умеет открывать зашифрованные паролем книги — чтение завершится ошибкой. Варианты: попросить отправителя присылать незащищённый файл, снять защиту скриптом на стороне Windows через COM с указанием пароля, либо использовать сторонние библиотеки разбора формата.

Можно ли читать сразу несколько листов книги?

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

Итог

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

Чтение Excel через ТабличныйДокумент.Прочитать — универсальный способ без зависимости от Office, работающий на клиенте и сервере. Ключевые моменты: используйте способ чтения Значение, определяйте границы через ВысотаТаблицы, очищайте числа от разделителей, проверяйте заголовки и контрольные суммы перед записью, а большие загрузки выполняйте фоновым заданием с порционной фиксацией.