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

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

1С: как прочитать файл Excel — все рабочие способы

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

Чтение файлов Excel — одна из самых частых задач при загрузке данных в 1С: прайсы поставщиков, остатки, списки сотрудников, банковские выгрузки. В зависимости от версии платформы, режима работы (тонкий клиент, веб-клиент, сервер) и формата файла (xls или xlsx) применяются разные подходы, и выбор неправильного способа приводит к ошибкам вида «метод не обнаружен» или к чтению пустых данных.

Основных способа три: чтение через объект «ТабличныйДокумент» (штатный и самый простой), чтение через COM-объект Excel.Application (гибкий, но требовательный к окружению) и чтение через ADO-драйверы (быстрый для больших файлов, но с ограничениями). Ниже разобран каждый способ с готовым кодом, условиями применимости и типичными проблемами.

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

Выбор способа чтения: что учесть до написания кода

Первый критерий — место выполнения кода. Если обработка работает на сервере 1С под Linux, COM-объект Excel недоступен в принципе. Если это файловая база на компьютере бухгалтера с установленным Microsoft Office — COM доступен, но зависит от разрядности: 32-битный клиент 1С не увидит 64-битный Excel и наоборот.

Второй критерий — формат и качество файла. Метод ТабличныйДокумент.Прочитать() поддерживает форматы xlsx и xls (через встроенный механизм платформы), но не выполняет макросы и не вычисляет формулы заново: в ячейке с формулой вы получите последнее сохранённое Excel значение. Если файл формируется сторонней программой и формулы не рассчитаны, данные будут пустыми или нулевыми.

Третий критерий — объём. Для файлов на десятки тысяч строк чтение через ТабличныйДокумент может занять заметное время и потребовать много памяти, потому что создаётся полная модель документа со всеми оформлениями. ADO читает такие файлы быстрее, но требует установленного провайдера ACE OLEDB.

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

Как выбрать способ

Нужно быстро прочитать обычный xlsx без установленного ExcelИспользуйте ТабличныйДокумент.Прочитать()
Файл содержит макросы, скрытые листы или нужно управлять ExcelИспользуйте COM-объект Excel.Application на машине с установленным Office
Файл большой, данные однородные, один лист-таблицаИспользуйте ADO с провайдером Microsoft.ACE.OLEDB
Код выполняется на сервере Linux или в веб-клиентеТолько ТабличныйДокумент; файл передавайте на сервер через временное хранилище

Чтение через ТабличныйДокумент — универсальный способ

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

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

ТабДок.Прочитать("C:\Данные\Прайс.xlsx", СпособЧтенияЗначенийТабличногоДокумента.Значение);

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

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

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

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

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

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

КонецЦикла;

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

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

Чтение на сервере и в веб-клиенте

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

В веб-клиенте прямой доступ к файловой системе пользователя закрыт, поэтому схема с временным хранилищем — единственная рабочая. Учитывайте, что большие файлы увеличивают трафик между клиентом и сервером.

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

COM-подключение запускает настоящий Excel в фоне и даёт полный доступ к файлу: листы по именам, формулы, скрытые строки, форматирование. Это самый гибкий способ, но он работает только там, где установлен Microsoft Excel, и требует совпадения разрядности офиса и клиента 1С.

Попытка

Excel = Новый COMОбъект("Excel.Application");

Исключение

Сообщить("Excel не установлен или недоступен: " + ОписаниеОшибки());

Возврат;

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

Excel.Visible = Ложь;

Excel.DisplayAlerts = Ложь;

Книга = Excel.Workbooks.Open("C:\Данные\Прайс.xlsx");

Лист = Книга.Worksheets(1);

ВсегоСтрок = Лист.UsedRange.Rows.Count;

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

Артикул = СокрЛП(Лист.Cells(НомерСтроки, 1).Value);

Цена = Лист.Cells(НомерСтроки, 3).Value;

КонецЦикла;

Книга.Close(Ложь);

Excel.Quit();

Excel = Неопределено;

Критически важно завершать работу правильно: закрыть книгу, вызвать Quit() и обнулить переменную. Если этого не сделать, в диспетчере задач останутся зависшие процессы EXCEL.EXE, которые держат файлы и накапливаются при массовой загрузке. Оборачивайте работу с COM в Попытка/Исключение и завершайте Excel в секции исключения тоже.

Для ускорения чтения больших диапазонов вместо обращения к ячейкам по одной можно выгрузить весь UsedRange в массив: Данные = Лист.UsedRange.Value. Обход массива работает на порядок быстрее цикла по Cells.

Чтение через ADO: быстрый вариант для больших таблиц

ADO обращается к файлу Excel как к базе данных: лист становится таблицей, а данные выбираются SQL-подобным запросом. Способ требует установленного провайдера Microsoft.ACE.OLEDB (ставится с Office или отдельным дистрибутивом Access Database Engine) и подходит для больших однородных файлов.

Соединение = Новый COMОбъект("ADODB.Connection");

СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Данные\Прайс.xlsx;"

+ "Extended Properties=""Excel 12.0 Xml;HDR=YES""";

Соединение.Open(СтрокаПодключения);

Набор = Новый COMОбъект("ADODB.Recordset");

Набор.Open("SELECT * FROM [Лист1$]", Соединение);

Пока НЕ Набор.EOF Цикл

Артикул = Набор.Fields(0).Value;

Набор.MoveNext();

КонецЦикла;

Набор.Close();

Соединение.Close();

Параметр HDR=YES означает, что первая строка — заголовки колонок. С ним удобно обращаться к полям по имени, но есть подводный камень: если в колонке смешаны числа и текст, драйвер определяет тип по первым строкам и может вернуть пустые значения для «неподходящих» ячеек. Лечится параметром IMEX=1 в строке подключения, который принудительно читает всё как текст.

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

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

Работает везде без Office, простой код. Медленнее на больших файлах, не пересчитывает формулы.

COM Excel.Application

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

ADO (ACE OLEDB)

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

Обработка данных после чтения: типы и проверки

Всё, что прочитано из Excel, по умолчанию — строка или число без гарантий. Перед загрузкой в базу каждое значение нужно привести к нужному типу и проверить. Числа приводите через ОписаниеТипов или функцию с обработкой исключения: строка «1 234,56» с неразрывным пробелом не преобразуется напрямую, пробелы нужно убрать.

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

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

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

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

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

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

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

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

Числовые колонки
Норма

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

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

Числа пришли строками с пробелами или обрезаны

Даты
Норма

Все даты в ожидаемом диапазоне

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

Появились даты 01.01.0001 или смещение на годы

Ссылочные данные
Норма

Все артикулы/ИНН сопоставлены с базой

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

Есть несопоставленные строки — их нужно показать пользователю

Типичные ошибки и их причины

Ошибка «Ошибка при вызове конструктора (COMОбъект)» означает, что Excel не установлен, разрядность не совпадает или COM-регистрация повреждена. Проверяется установкой Excel на той же машине, где выполняется код — на сервере, а не на компьютере разработчика.

Ошибка «Файл не обнаружен» при чтении на сервере — классическая ситуация: путь «C:\Данные\...» существует на клиенте, но не на сервере. Решение — передача файла через временное хранилище, а не по сетевому пути.

Пустые значения вместо данных чаще всего означают одно из трёх: формулы не рассчитаны в файле, данные не на первом листе, либо при чтении через ADO сработало автоопределение типов. Диагностируйте, открыв файл в Excel вручную и проверив, что видно в ячейках и на каком листе лежат данные.

Типичные ошибки
01
Не закрывать Excel после COM-чтения — накапливаются зависшие процессы EXCEL.EXE и блокировки файлов
02
Читать файл на сервере по локальному клиентскому пути — ошибка «файл не обнаружен»
03
Не учитывать строку заголовков — первая строка данных попадает в базу или заголовки загружаются как данные
04
Доверять автоопределению типов в ADO — смешанные колонки читаются с пустыми значениями
05
Загружать данные сразу в документы без предварительного показа таблицы сопоставления — ошибки приходится исправлять в учёте

Проверка результата и границы самостоятельной работы

Минимальный контроль после загрузки: сверить количество загруженных строк с количеством строк в файле и сравнить 2–3 контрольные суммы (например, итог по колонке «Сумма») с итогом в Excel. Расхождение даже в одной строке — повод найти причину до продолжения работы.

Самостоятельно безопасно разрабатывать и отлаживать загрузку на копии базы. В рабочей базе любую новую обработку сначала запускайте в режиме «только чтение и показ данных», без записи документов. Если файл приходит от внешнего поставщика, учитывайте, что его структура может измениться без предупреждения — добавьте проверку наличия нужных колонок по заголовкам.

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

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

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

Можно ли прочитать xlsx без установленного Excel?

Да. Метод ТабличныйДокумент.Прочитать() работает с xlsx штатными средствами платформы и не требует Office. Это основной способ для серверов и веб-клиента. COM и ADO без установленного Excel или провайдера ACE работать не будут.

Почему вместо значений читаются пустые ячейки?

Чаще всего в ячейках формулы, которые не были рассчитаны при сохранении файла — 1С читает последнее сохранённое значение, а его нет. Откройте файл в Excel, пересохраните и прочитайте снова. Вторая причина — данные находятся не на первом листе.

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

Через COM-объект лист выбирается по имени или индексу: Книга.Worksheets("Прайс"). При чтении через ADO имя листа указывается в запросе с символом доллара: [ИмяЛиста$]. ТабличныйДокумент по умолчанию читает первый лист, поэтому для многостраничных файлов удобнее COM.

Что делать с ошибкой создания COMОбъект("Excel.Application")?

Проверьте три вещи: установлен ли Microsoft Excel именно на той машине, где выполняется код (на сервере — при серверном вызове); совпадает ли разрядность Excel и клиента 1С; не заблокирован ли COM политиками безопасности. Если условия не выполняются, переходите на чтение через ТабличныйДокумент.

Как ускорить чтение большого файла на сотни тысяч строк?

Используйте ADO — он читает файл потоково, без построения модели документа. При COM-чтении выгружайте диапазон целиком в массив через UsedRange.Value вместо обращения к ячейкам по одной. Для ТабличногоДокумента ускорения почти нет — на очень больших файлах лучше предварительно конвертировать их в CSV.

Стоит ли конвертировать Excel в CSV перед загрузкой?

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

Итог

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

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