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